public void AddNode( TypeDescriptor node ) { if( !myDescriptors.ContainsKey( node.Id ) ) { myDescriptors.Add( node.Id, node ); } myGraphBuilder.TryAddNode( node.Id ); }
public void AddEdge( TypeDescriptor source, TypeDescriptor target ) { if( !myDescriptors.ContainsKey( source.Id ) ) { myDescriptors.Add( source.Id, source ); } if( !myDescriptors.ContainsKey( target.Id ) ) { myDescriptors.Add( target.Id, target ); } myGraphBuilder.TryAddEdge( source.Id, target.Id ); }
private void ProcessType( Type type ) { if( type.Namespace == null ) { // some .net internal implementation detail ... return; } if( IgnoreType( type ) ) { return; } var name = type.Name; var typeDesc = new TypeDescriptor( type ); myBuilder.TryAddNode( typeDesc.Id ); myIdToTypeMap[ typeDesc.Id ] = typeDesc; if( type.BaseType != null && !IsPrimitive( type.BaseType ) && !IgnoreType( type.BaseType ) ) { var baseDesc = new TypeDescriptor( type.BaseType ); var edge = myBuilder.TryAddEdge( typeDesc.Id, baseDesc.Id ); myIdToTypeMap[ baseDesc.Id ] = baseDesc; myEdgeTypes.Add( edge.Id, EdgeType.DerivesFrom ); } var interfaces = type.GetInterfaces(); if( type.BaseType != null ) { interfaces = interfaces.Except( type.BaseType.GetInterfaces() ).ToArray(); } foreach( var iface in interfaces ) { if( IgnoreType( iface ) ) { continue; } var ifaceDesc = new TypeDescriptor( iface ); var edge = myBuilder.TryAddEdge( typeDesc.Id, ifaceDesc.Id ); myIdToTypeMap[ ifaceDesc.Id ] = ifaceDesc; myEdgeTypes.Add( edge.Id, EdgeType.Implements ); } }