private IEnumerable<IComponentRegistration> GetRegistrationsFromExpression(ITreeNode registrationRootElement, ICSharpExpression expression)
{
var castExpression = expression as ICastExpression;
if (castExpression != null)
{
var predefinedTypeUsage = castExpression.TargetType as IUserTypeUsage;
if (predefinedTypeUsage != null && predefinedTypeUsage.ScalarTypeName != null)
{
IResolveResult resolveResult = predefinedTypeUsage.ScalarTypeName.Reference.Resolve().Result;
var typeElement = resolveResult.DeclaredElement as ITypeElement;
if (typeElement != null)
{
yield return new ServiceRegistration(registrationRootElement, typeElement);
}
}
}
var asExpression = expression as IAsExpression;
if (asExpression != null)
{
var typeUsage = asExpression.TypeOperand as IUserTypeUsage;
if (typeUsage != null && typeUsage.ScalarTypeName != null)
{
IResolveResult resolveResult = typeUsage.ScalarTypeName.Reference.Resolve().Result;
var typeElement = resolveResult.DeclaredElement as ITypeElement;
if (typeElement != null)
{
yield return new ServiceRegistration(registrationRootElement, typeElement);
}
}
}
var objectCreationExpression = expression as IObjectCreationExpression;
if (objectCreationExpression != null && objectCreationExpression.TypeReference != null)
{
IResolveResult resolveResult = objectCreationExpression.TypeReference.Resolve().Result;
var @class = resolveResult.DeclaredElement as IClass;
if (@class != null)
{
yield return new ComponentRegistration(registrationRootElement, @class, @class);
}
}
var invocationExpression = expression as IInvocationExpression;
if (invocationExpression != null)
{
if (invocationExpression.Reference != null)
{
var result = invocationExpression.Reference.Resolve().Result.DeclaredElement as IParametersOwner;
if (result != null)
{
var type = result.ReturnType as IDeclaredType;
if (type != null)
{
var @class = type.GetTypeElement();
if (@class != null)
{
yield return new ComponentRegistration(registrationRootElement, @class, @class);
}
}
}
}
}
}