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)); }
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()); }
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; }
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")); }