示例#1
0
 private XElement GenerateOverriddenMemberElement(ReflectedObject overriddenMember)
 {
     return(new XElement(
                "OverriddenMember",
                new XAttribute("type", overriddenMember.GetProperty("MemberType")),
                new XAttribute("name", overriddenMember.GetProperty("Name"))
                ));
 }
        public void GetProperty_ExistingProperty()
        {
            var reflectedObject = new ReflectedObject("string");
            var output          = reflectedObject.GetProperty("Length");

            Assert.That(output.To <int>(), Is.EqualTo(6));
        }
示例#3
0
        private XElement CreateDependencyElement(ReflectedObject targetCallDependencyDefinition)
        {
            var targetClassDefinition = _mixinDefinition.GetProperty("TargetClass");
            var requiredType          = targetCallDependencyDefinition.GetProperty("RequiredType").GetProperty("Type").To <Type> ();
            var element = new XElement("Dependency",
                                       new XAttribute("assembly-ref",
                                                      _assemblyIdentifierGenerator.GetIdentifier(requiredType.Assembly)),
                                       new XAttribute("metadataToken", requiredType.MetadataToken),
                                       new XAttribute("namespace", requiredType.Namespace),
                                       new XAttribute("name", _outputFormatter.GetShortFormattedTypeName(requiredType)),
                                       new XAttribute("is-interface", requiredType.IsInterface));

            if (requiredType.IsInterface)
            {
                var implementedByTarget    = targetClassDefinition.GetProperty("ImplementedInterfaces").Any(i => i.To <Type> () == requiredType);
                var addedByMixin           = targetClassDefinition.GetProperty("ReceivedInterfaces").Any(i => i.GetProperty("InterfaceType").To <Type> () == requiredType);
                var implementedDynamically = !implementedByTarget && !addedByMixin;

                element.Add(new XAttribute("is-implemented-by-target", implementedByTarget));
                element.Add(new XAttribute("is-added-by-mixin", addedByMixin));
                element.Add(new XAttribute("is-implemented-dynamically", implementedDynamically));
            }

            return(element);
        }
 private string GetRelationName(ReflectedObject mixinContext)
 {
     if (mixinContext.GetProperty("MixinKind").ToString().Equals("Extending"))
     {
         return("Extends");
     }
     return("Used by");
 }
        private XElement GenerateMixinElement(ReflectedObject mixinContext)
        {
            var mixinType = mixinContext.GetProperty("MixinType").To <Type>();

            var mixinElement = new XElement(
                "Mixin",
                new XAttribute("ref", _involvedTypeIdentifierGenerator.GetIdentifier(mixinType)),
                new XAttribute("index", "n/a"),
                new XAttribute("relation", GetRelationName(mixinContext)),
                // property MixinType on mixinContext always return the generic type definition, not the type of the actual instance
                new XAttribute("instance-name", _outputFormatter.GetShortFormattedTypeName(mixinType)),
                new XAttribute("introduced-member-visibility", mixinContext.GetProperty("IntroducedMemberVisibility").ToString().ToLower()),
                new AdditionalDependencyReportGenerator(
                    mixinContext.GetProperty("ExplicitDependencies"), _involvedTypeIdentifierGenerator, _outputFormatter).GenerateXml()
                );

            if (_involvedType.HasTargetClassDefintion)
            {
                var mixinDefinition = _involvedType.TargetClassDefinition.CallMethod(
                    "GetMixinByConfiguredType", mixinContext.GetProperty("MixinType").To <Type>());

                // set more specific name for mixin references
                mixinElement.SetAttributeValue("instance-name", _outputFormatter.GetShortFormattedTypeName(mixinDefinition.GetProperty("Type").To <Type>()));
                // set mixin index
                mixinElement.SetAttributeValue("index", mixinDefinition.GetProperty("MixinIndex").To <int>());

                mixinElement.Add(
                    new InterfaceIntroductionReportGenerator(mixinDefinition.GetProperty("InterfaceIntroductions"), _interfaceIdentifierGenerator).
                    GenerateXml());
                mixinElement.Add(
                    new AttributeIntroductionReportGenerator(
                        mixinDefinition.GetProperty("AttributeIntroductions"), _attributeIdentifierGenerator, _remotionReflector).GenerateXml());
                mixinElement.Add(
                    new MemberOverrideReportGenerator(mixinDefinition.CallMethod("GetAllOverrides")).GenerateXml());
                mixinElement.Add(new TargetCallDependenciesReportGenerator(mixinDefinition, _assemblyIdentifierGenerator, _remotionReflector, _outputFormatter).GenerateXml());
            }

            return(mixinElement);
        }
        public void GetProperty_NonExistingProperty()
        {
            var reflectedObject = new ReflectedObject("string");

            try
            {
                reflectedObject.GetProperty("nonExistingProperty");
                Assert.Fail("expected exception not thrown");
            }
            catch (MissingMethodException missingMethodException)
            {
                Assert.That(missingMethodException.Message, Is.EqualTo("Method 'get_nonExistingProperty' not found on type 'System.String'."));
            }
        }
        private void SetMixinOverride(ReflectedObject targetMemberDefinition)
        {
            if (targetMemberDefinition == null)
            {
                return;
            }

            var baseMember = targetMemberDefinition.GetProperty("BaseAsMember");

            if (baseMember == null)
            {
                return;
            }

            AddOverriddenMember(baseMember.GetProperty("MemberInfo").To <MemberInfo> (), OverridingMemberInfo.OverrideType.Mixin);
        }
        private XElement CreateDependencyElement(ReflectedObject targetCallDependencyDefinition)
        {
            var targetClassDefinition = _mixinDefinition.GetProperty ("TargetClass");
              var requiredType = targetCallDependencyDefinition.GetProperty ("RequiredType").GetProperty ("Type").To<Type> ();
              var element = new XElement("Dependency",
                                 new XAttribute("assembly-ref",
                                                _assemblyIdentifierGenerator.GetIdentifier(requiredType.Assembly)),
                                 new XAttribute("metadataToken", requiredType.MetadataToken),
                                 new XAttribute("namespace", requiredType.Namespace),
                                 new XAttribute("name", _outputFormatter.GetShortFormattedTypeName(requiredType)),
                                 new XAttribute("is-interface", requiredType.IsInterface));
              if (requiredType.IsInterface)
              {
            var implementedByTarget = targetClassDefinition.GetProperty ("ImplementedInterfaces").Any (i => i.To<Type> () == requiredType);
            var addedByMixin = targetClassDefinition.GetProperty ("ReceivedInterfaces").Any (i => i.GetProperty ("InterfaceType").To<Type> () == requiredType);
            var implementedDynamically = !implementedByTarget && !addedByMixin;

            element.Add (new XAttribute ("is-implemented-by-target", implementedByTarget));
            element.Add (new XAttribute ("is-added-by-mixin", addedByMixin));
            element.Add (new XAttribute ("is-implemented-dynamically", implementedDynamically));
              }

              return element;
        }
        public InvolvedType[] FindInvolvedTypes()
        {
            var involvedTypes = new InvolvedTypeStore();
            var classContexts = _mixinConfiguration.GetProperty("ClassContexts");

            foreach (var assembly in _assemblies)
            {
                try
                {
                    foreach (var type in assembly.GetTypes())
                    {
                        var classContext = classContexts.CallMethod("GetWithInheritance", type);
                        if (classContext != null)
                        {
                            var involvedType          = involvedTypes.GetOrCreateValue(type);
                            var targetClassDefinition = GetTargetClassDefinition(type, classContext);
                            involvedType.ClassContext          = classContext;
                            involvedType.TargetClassDefinition = targetClassDefinition;

                            foreach (var mixinContext in classContext.GetProperty("Mixins"))
                            {
                                var mixinType = mixinContext.GetProperty("MixinType").To <Type> ();
                                var mixin     = involvedTypes.GetOrCreateValue(mixinType);
                                mixin.TargetTypes.Add(involvedType, GetMixinDefiniton(mixinType, targetClassDefinition));
                            }
                        }

                        // also add classes which inherit from Mixin<> or Mixin<,>, but are actually not used as Mixins (not in ClassContexts)
                        if (_remotionReflector.IsInheritedFromMixin(type) && !_remotionReflector.IsInfrastructureType(type))
                        {
                            involvedTypes.GetOrCreateValue(type);
                        }
                    }
                }
                catch (ReflectionTypeLoadException ex)
                {
                    var loaderExceptionLog = new StringBuilder();
                    foreach (var loaderException in ex.LoaderExceptions)
                    {
                        loaderExceptionLog.AppendFormat("   {1}{0}", Environment.NewLine, loaderException.Message);
                    }

                    XRef.Log.SendWarning("Unable to analyze '{1}' in '{2}' because some referenced assemblies could not be loaded: {0}{3}",
                                         Environment.NewLine, assembly.FullName, assembly.Location, loaderExceptionLog);
                }
            }

            var additionalTypesCollector = new AdditionalTypesCollector();

            foreach (IVisitableInvolved involvedType in involvedTypes)
            {
                involvedType.Accept(additionalTypesCollector);
            }

            foreach (var additionalType in additionalTypesCollector.AdditionalTypes)
            {
                involvedTypes.GetOrCreateValue(additionalType);
            }

            AddGenericDefinitionsRecursively(involvedTypes);

            return(involvedTypes.ToArray());
        }
示例#10
0
        private void SetMixinOverride(ReflectedObject targetMemberDefinition)
        {
            if (targetMemberDefinition == null)
            return;

              var baseMember = targetMemberDefinition.GetProperty ("BaseAsMember");

              if (baseMember == null)
            return;

              AddOverriddenMember(baseMember.GetProperty ("MemberInfo").To<MemberInfo> (), OverridingMemberInfo.OverrideType.Mixin);
        }
        public void GetProperty_NonExistingProperty()
        {
            var reflectedObject = new ReflectedObject ("string");

              try
              {
            reflectedObject.GetProperty ("nonExistingProperty");
            Assert.Fail ("expected exception not thrown");
              }
              catch (MissingMethodException missingMethodException)
              {
            Assert.That (missingMethodException.Message, Is.EqualTo ("Method 'get_nonExistingProperty' not found on type 'System.String'."));
              }
        }
 private string GetRelationName(ReflectedObject mixinContext)
 {
     if (mixinContext.GetProperty ("MixinKind").ToString ().Equals ("Extending"))
     return "Extends";
       return "Used by";
 }
        private XElement GenerateMixinElement(ReflectedObject mixinContext)
        {
            var mixinType = mixinContext.GetProperty ("MixinType").To<Type>();

              var mixinElement = new XElement (
              "Mixin",
              new XAttribute ("ref", _involvedTypeIdentifierGenerator.GetIdentifier (mixinType)),
              new XAttribute ("index", "n/a"),
              new XAttribute ("relation", GetRelationName(mixinContext)),
              // property MixinType on mixinContext always return the generic type definition, not the type of the actual instance
              new XAttribute ("instance-name", _outputFormatter.GetShortFormattedTypeName (mixinType)),
              new XAttribute ("introduced-member-visibility", mixinContext.GetProperty ("IntroducedMemberVisibility").ToString().ToLower()),
              new AdditionalDependencyReportGenerator (
              mixinContext.GetProperty ("ExplicitDependencies"), _involvedTypeIdentifierGenerator, _outputFormatter).GenerateXml()
              );

              if (_involvedType.HasTargetClassDefintion)
              {
            var mixinDefinition = _involvedType.TargetClassDefinition.CallMethod (
            "GetMixinByConfiguredType", mixinContext.GetProperty ("MixinType").To<Type>());

            // set more specific name for mixin references
            mixinElement.SetAttributeValue ("instance-name", _outputFormatter.GetShortFormattedTypeName (mixinDefinition.GetProperty ("Type").To<Type>()));
            // set mixin index
            mixinElement.SetAttributeValue ("index", mixinDefinition.GetProperty ("MixinIndex").To<int>());

            mixinElement.Add (
            new InterfaceIntroductionReportGenerator (mixinDefinition.GetProperty ("InterfaceIntroductions"), _interfaceIdentifierGenerator).
                GenerateXml());
            mixinElement.Add (
            new AttributeIntroductionReportGenerator (
                mixinDefinition.GetProperty ("AttributeIntroductions"), _attributeIdentifierGenerator, _remotionReflector).GenerateXml());
            mixinElement.Add (
            new MemberOverrideReportGenerator (mixinDefinition.CallMethod ("GetAllOverrides")).GenerateXml());
            mixinElement.Add (new TargetCallDependenciesReportGenerator (mixinDefinition, _assemblyIdentifierGenerator, _remotionReflector, _outputFormatter).GenerateXml ());
              }

              return mixinElement;
        }
示例#14
0
 public override ICollection <Type> GetComposedInterfaces(ReflectedObject classContext)
 {
     return(classContext.GetProperty("ComposedInterfaces").To <ICollection <Type> >());
 }
        public override ReflectedObject GetTargetCallDependencies(ReflectedObject mixinDefinition)
        {
            ArgumentUtility.CheckNotNull ("mixinDefinition", mixinDefinition);

              return mixinDefinition.GetProperty ("TargetCallDependencies");
        }
 public override ICollection<Type> GetComposedInterfaces(ReflectedObject classContext)
 {
     return classContext.GetProperty ("CompleteInterfaces").To<ICollection<Type>>();
 }
        public void GetProperty_ExistingProperty()
        {
            var reflectedObject = new ReflectedObject ("string");
              var output = reflectedObject.GetProperty ("Length");

              Assert.That (output.To<int>(), Is.EqualTo (6));
        }
        public override ReflectedObject GetTargetCallDependencies(ReflectedObject mixinDefinition)
        {
            ArgumentUtility.CheckNotNull("mixinDefinition", mixinDefinition);

            return(mixinDefinition.GetProperty("TargetCallDependencies"));
        }