Example #1
0
        private IGrouping <int, MethodDefinition> ChooseCandidateGroup(
            IEnumerable <IGrouping <int, MethodDefinition> > candidatesByInheritanceOffset,
            MethodInfo interfaceMethod,
            RequirementDefinitionBase requirement)
        {
            try
            {
                return(candidatesByInheritanceOffset.OrderBy(group => group.Key).First()); // take the group with the lowest distance from the target class
            }
            catch (InvalidOperationException)
            {
                string requiringEntityString = requirement.GetRequiringEntityDescription();
                // In practice, every requirement should know its requiring entities. However, this is not enforced, so provide a fallback...
                if (string.IsNullOrEmpty(requiringEntityString))
                {
                    requiringEntityString = "<unknown>";
                }

                string message = string.Format(
                    "The dependency '{0}' (required by {1} on class '{2}') is not fulfilled - public or protected method '{3}' could not be "
                    + "found on the target class.",
                    requirement.Type.Name,
                    requiringEntityString,
                    requirement.TargetClass,
                    interfaceMethod);
                throw new ConfigurationException(message);
            }
        }
Example #2
0
        private void CheckSomeRequiringMixin(RequirementDefinitionBase requirement, MixinDefinition expectedRequiringMixin)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);
            ArgumentUtility.CheckNotNull("expectedRequiringMixin", expectedRequiringMixin);

            var requirers = requirement.GetRequiringEntityDescription().Split(new[] { ", " }, StringSplitOptions.None);

            Assert.That(requirers, Has.Member("mixin '" + expectedRequiringMixin.FullName + "'"));
        }
Example #3
0
        private void CheckSomeRequiringComposedInterface(RequirementDefinitionBase requirement, Type expectedRequiringComposedInterface)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);
            ArgumentUtility.CheckNotNull("expectedRequiringComposedInterface", expectedRequiringComposedInterface);

            var requirers = requirement.GetRequiringEntityDescription().Split(new[] { ", " }, StringSplitOptions.None);

            Assert.That(requirers, Has.Member("composed interface '" + expectedRequiringComposedInterface.FullName + "'"));
        }
Example #4
0
        private MethodDefinition FindMethod(MethodInfo interfaceMethod, RequirementDefinitionBase requirement)
        {
            var candidatesByInheritanceOffset = from candidate in _allTargetMethodsByName[interfaceMethod.Name]
                                                where s_signatureComparer.Equals(candidate.MethodInfo, interfaceMethod)
                                                let offset = GetInheritanceOffset(candidate.MethodInfo.DeclaringType)
                                                             group candidate by offset;

            IGrouping <int, MethodDefinition> candidateGroup = ChooseCandidateGroup(candidatesByInheritanceOffset, interfaceMethod, requirement);

            // Unless the signature comparer is broken, each group can only hold one match.
            return(candidateGroup.Single());
        }
Example #5
0
        public void Apply(RequirementDefinitionBase requirement)
        {
            if (requirement.IsEmptyInterface || !requirement.Type.IsInterface)
            {
                return;
            }

            var methodCollector = GetMethodCollector(requirement);

            foreach (var requiredMethodDefinition in methodCollector.CreateRequiredMethodDefinitions(requirement))
            {
                requirement.Methods.Add(requiredMethodDefinition);
            }
        }
Example #6
0
        private void CheckAllRequiringEntities(RequirementDefinitionBase requirement, params MixinDefinition[] expectedRequiringMixins)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);
            ArgumentUtility.CheckNotNull("expectedRequiringMixins", expectedRequiringMixins);

            var requiringEntityDescription      = requirement.GetRequiringEntityDescription();
            var requiringEntityDescriptionItems = requiringEntityDescription.Split(new[] { ", " }, StringSplitOptions.None);

            foreach (var mixinDefinition in expectedRequiringMixins)
            {
                CheckSomeRequiringMixin(requirement, mixinDefinition);
            }

            Assert.That(requiringEntityDescriptionItems, Has.Length.EqualTo(expectedRequiringMixins.Length), requiringEntityDescription);
        }
Example #7
0
 private IRequiredMethodDefinitionCollector GetMethodCollector(RequirementDefinitionBase requirement)
 {
     if (requirement.TargetClass.ImplementedInterfaces.Contains(requirement.Type))
     {
         return(_implementedInterfaceMethodCollector);
     }
     else if (requirement.TargetClass.ReceivedInterfaces.ContainsKey(requirement.Type))
     {
         return(_introducedInterfaceMethodCollector);
     }
     else
     {
         return(_duckTypingMethodCollector);
     }
 }
        private DependencyDefinitionBase BuildDependency(Type type, DependencyDefinitionBase aggregator)
        {
            ArgumentUtility.CheckNotNull("type", type);

            RequirementDefinitionBase requirement = GetRequirement(type);

            if (requirement == null)
            {
                requirement = CreateRequirement(type);
                AddRequirement(requirement);
            }
            DependencyDefinitionBase dependency = CreateDependency(requirement, aggregator);

            requirement.RequiringDependencies.Add(dependency);
            CheckForAggregate(dependency);
            return(dependency);
        }
        private static void CheckRequiredMethods(RequirementDefinitionBase requirement, ClassDefinitionBase implementer, string memberPrefix)
        {
            BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            Assert.That(requirement.Methods.Count, Is.EqualTo(5));

            RequiredMethodDefinition method = requirement.Methods[typeof(IMixinRequiringAllMembersRequirements).GetMethod("Method", bf)];

            Assert.That(method, Is.Not.Null);
            Assert.That(method.InterfaceMethod, Is.EqualTo(typeof(IMixinRequiringAllMembersRequirements).GetMethod("Method", bf)));
            Assert.That(method.ImplementingMethod, Is.SameAs(implementer.Methods[implementer.Type.GetMethod(memberPrefix + "Method", bf)]));

            RequiredMethodDefinition propertyGetter = requirement.Methods[typeof(IMixinRequiringAllMembersRequirements).GetMethod("get_Property", bf)];

            Assert.That(propertyGetter, Is.Not.Null);
            Assert.That(propertyGetter.InterfaceMethod, Is.EqualTo(typeof(IMixinRequiringAllMembersRequirements).GetMethod("get_Property", bf)));
            Assert.That(propertyGetter.ImplementingMethod, Is.SameAs(implementer.Properties[implementer.Type.GetProperty(memberPrefix + "Property", bf)].GetMethod));

            RequiredMethodDefinition propertySetter = requirement.Methods[typeof(IMixinRequiringAllMembersRequirements).GetMethod("set_Property", bf)];

            Assert.That(propertySetter, Is.Not.Null);
            Assert.That(propertySetter.InterfaceMethod, Is.EqualTo(typeof(IMixinRequiringAllMembersRequirements).GetMethod("set_Property", bf)));
            Assert.That(propertySetter.ImplementingMethod, Is.SameAs(implementer.Properties[implementer.Type.GetProperty(memberPrefix + "Property", bf)].SetMethod));

            RequiredMethodDefinition eventAdder = requirement.Methods[typeof(IMixinRequiringAllMembersRequirements).GetMethod("add_Event", bf)];

            Assert.That(eventAdder, Is.Not.Null);
            Assert.That(eventAdder.InterfaceMethod, Is.EqualTo(typeof(IMixinRequiringAllMembersRequirements).GetMethod("add_Event", bf)));
            Assert.That(eventAdder.ImplementingMethod, Is.SameAs(implementer.Events[implementer.Type.GetEvent(memberPrefix + "Event", bf)].AddMethod));

            RequiredMethodDefinition eventRemover = requirement.Methods[typeof(IMixinRequiringAllMembersRequirements).GetMethod("remove_Event", bf)];

            Assert.That(eventRemover, Is.Not.Null);
            Assert.That(eventRemover.InterfaceMethod, Is.EqualTo(typeof(IMixinRequiringAllMembersRequirements).GetMethod("remove_Event", bf)));
            Assert.That(eventRemover.ImplementingMethod, Is.SameAs(implementer.Events[implementer.Type.GetEvent(memberPrefix + "Event", bf)].RemoveMethod));
        }
        public IEnumerable <RequiredMethodDefinition> CreateRequiredMethodDefinitions(RequirementDefinitionBase requirement)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);

            Assertion.IsTrue(requirement.Type.IsInterface);

            InterfaceIntroductionDefinition introduction = requirement.TargetClass.ReceivedInterfaces[requirement.Type];

            foreach (EventIntroductionDefinition eventIntroduction in introduction.IntroducedEvents)
            {
                yield return(new RequiredMethodDefinition(requirement, eventIntroduction.InterfaceMember.GetAddMethod(), eventIntroduction.ImplementingMember.AddMethod));

                yield return(new RequiredMethodDefinition(requirement, eventIntroduction.InterfaceMember.GetRemoveMethod(), eventIntroduction.ImplementingMember.RemoveMethod));
            }

            foreach (PropertyIntroductionDefinition propertyIntroduction in introduction.IntroducedProperties)
            {
                var getMethod = propertyIntroduction.InterfaceMember.GetGetMethod();
                if (getMethod != null)
                {
                    yield return(new RequiredMethodDefinition(requirement, getMethod, propertyIntroduction.ImplementingMember.GetMethod));
                }

                var setMethod = propertyIntroduction.InterfaceMember.GetSetMethod();
                if (setMethod != null)
                {
                    yield return(new RequiredMethodDefinition(requirement, setMethod, propertyIntroduction.ImplementingMember.SetMethod));
                }
            }

            foreach (MethodIntroductionDefinition methodIntroduction in introduction.IntroducedMethods)
            {
                yield return(new RequiredMethodDefinition(requirement, methodIntroduction.InterfaceMember, methodIntroduction.ImplementingMember));
            }
        }
 protected abstract DependencyDefinitionBase CreateDependency(RequirementDefinitionBase requirement, DependencyDefinitionBase aggregator);
 protected abstract void AddRequirement(RequirementDefinitionBase requirement);
        protected override DependencyDefinitionBase CreateDependency(RequirementDefinitionBase requirement, DependencyDefinitionBase aggregator)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);

            return(new MixinDependencyDefinition((RequiredMixinTypeDefinition)requirement, _mixin, (MixinDependencyDefinition)aggregator));
        }
        protected override void AddRequirement(RequirementDefinitionBase requirement)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);

            _mixin.TargetClass.RequiredMixinTypes.Add((RequiredMixinTypeDefinition)requirement);
        }
Example #15
0
        public IEnumerable <RequiredMethodDefinition> CreateRequiredMethodDefinitions(RequirementDefinitionBase requirement)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);

            Assertion.IsTrue(requirement.Type.IsInterface);

            return(from interfaceMethod in requirement.Type.GetMethods()
                   let implementingMethod = FindMethod(interfaceMethod, requirement)
                                            select new RequiredMethodDefinition(requirement, interfaceMethod, implementingMethod));
        }
Example #16
0
 public static void AddRequiringDependency(RequirementDefinitionBase requirement, DependencyDefinitionBase dependency)
 {
     PrivateInvoke.InvokeNonPublicMethod(requirement.RequiringDependencies, "Add", dependency);
 }
 protected override void AddRequirement(RequirementDefinitionBase requirement)
 {
     _targetClass.RequiredTargetCallTypes.Add((RequiredTargetCallTypeDefinition)requirement);
 }
Example #18
0
        public IEnumerable <RequiredMethodDefinition> CreateRequiredMethodDefinitions(RequirementDefinitionBase requirement)
        {
            ArgumentUtility.CheckNotNull("requirement", requirement);

            Assertion.IsTrue(requirement.Type.IsInterface);
            Assertion.IsTrue(requirement.TargetClass == _targetClassDefinition);
            Assertion.IsTrue(requirement.TargetClass.ImplementedInterfaces.Contains(requirement.Type));

            InterfaceMapping interfaceMapping = _targetClassDefinition.GetAdjustedInterfaceMap(requirement.Type);

            for (int i = 0; i < interfaceMapping.InterfaceMethods.Length; ++i)
            {
                var interfaceMethod    = interfaceMapping.InterfaceMethods[i];
                var implementingMethod = _allTargetClassMethods[interfaceMapping.TargetMethods[i]];

                yield return(new RequiredMethodDefinition(requirement, interfaceMethod, implementingMethod));
            }
        }
 protected override DependencyDefinitionBase CreateDependency(RequirementDefinitionBase requirement, DependencyDefinitionBase aggregator)
 {
     return(new ComposedInterfaceDependencyDefinition((RequiredTargetCallTypeDefinition)requirement, _composedInterface, aggregator));
 }