protected override void EnsureRelatedNodeWasVisited(Node sourceNode, IEntity entity)
{
IInternalEntity internalInfo = GetConstructedInternalEntity(entity);
if (null == internalInfo)
{
ITypedEntity typedEntity = entity as ITypedEntity;
if (null == typedEntity) return;
internalInfo = typedEntity.Type as IInternalEntity;
if (null == internalInfo) return;
}
Node node = internalInfo.Node;
switch (node.NodeType)
{
case NodeType.Property:
case NodeType.Field:
{
IMember memberEntity = (IMember)entity;
if (EntityType.Property == entity.EntityType
|| TypeSystemServices.IsUnknown(memberEntity.Type))
{
EnsureMemberWasVisited((TypeMember)node);
AssertTypeIsKnown(sourceNode, memberEntity, memberEntity.Type);
}
break;
}
case NodeType.Method:
{
IMethod methodEntity = (IMethod)entity;
if (TypeSystemServices.IsUnknown(methodEntity.ReturnType))
{
// try to preprocess the method to resolve its return type
Method method = (Method)node;
PreProcessMethod(method);
if (TypeSystemServices.IsUnknown(methodEntity.ReturnType))
{
// still unknown?
EnsureMemberWasVisited(method);
AssertTypeIsKnown(sourceNode, methodEntity, methodEntity.ReturnType);
}
}
break;
}
case NodeType.ClassDefinition:
case NodeType.StructDefinition:
case NodeType.InterfaceDefinition:
{
EnsureMemberWasVisited((TypeDefinition)node);
break;
}
}
}