public override TypeNode VisitTypeReference(TypeNode type)
{
if (type == null) return null;
switch (type.NodeType)
{
case NodeType.ArrayType:
case NodeType.ArrayTypeExpression:
ArrayType arrType = (ArrayType)type;
TypeNode elemType = this.VisitTypeReference(arrType.ElementType);
if (elemType == arrType.ElementType) return arrType;
return elemType.GetArrayType(arrType.Rank, arrType.Sizes, arrType.LowerBounds);
case NodeType.Pointer:
System.Compiler.Pointer pType = (System.Compiler.Pointer)type;
elemType = this.VisitTypeReference(pType.ElementType);
if (elemType == pType.ElementType) return pType;
return elemType.GetPointerType();
case NodeType.Reference:
Reference rType = (Reference)type;
elemType = this.VisitTypeReference(rType.ElementType);
if (elemType == rType.ElementType) return rType;
return elemType.GetReferenceType();
//TODO: other parameterized types, such as constrained types
case NodeType.ClassExpression:
ClassExpression cExpr = (ClassExpression)type;
cExpr.Expression = this.VisitExpression(cExpr.Expression);
cExpr.TemplateArguments = this.VisitTypeReferenceList(cExpr.TemplateArguments);
return cExpr;
case NodeType.InterfaceExpression:
InterfaceExpression iExpr = (InterfaceExpression)type;
iExpr.Expression = this.VisitExpression(iExpr.Expression);
iExpr.TemplateArguments = this.VisitTypeReferenceList(iExpr.TemplateArguments);
return iExpr;
case NodeType.TypeExpression:
TypeExpression tExpr = (TypeExpression)type;
tExpr.Expression = this.VisitExpression(tExpr.Expression);
tExpr.TemplateArguments = this.VisitTypeReferenceList(tExpr.TemplateArguments);
return tExpr;
//TODO: handle array expresssions, etc.
}
return type;
}