public override AstNode Visit(TypeNode node) { // Evaluate the type. IChelaType nodeType = null; switch(node.GetKind()) { case TypeKind.Void: nodeType = ChelaType.GetVoidType(); break; case TypeKind.Bool: nodeType = ChelaType.GetBoolType(); break; case TypeKind.Byte: nodeType = ChelaType.GetByteType(); break; case TypeKind.SByte: nodeType = ChelaType.GetSByteType(); break; case TypeKind.Char: nodeType = ChelaType.GetCharType(); break; case TypeKind.Double: nodeType = ChelaType.GetDoubleType(); break; case TypeKind.Float: nodeType = ChelaType.GetFloatType(); break; case TypeKind.Int: nodeType = ChelaType.GetIntType(); break; case TypeKind.UInt: nodeType = ChelaType.GetUIntType(); break; case TypeKind.Long: nodeType = ChelaType.GetLongType(); break; case TypeKind.ULong: nodeType = ChelaType.GetULongType(); break; case TypeKind.Short: nodeType = ChelaType.GetShortType(); break; case TypeKind.UShort: nodeType = ChelaType.GetUShortType(); break; case TypeKind.String: nodeType = ChelaType.GetStringType(); break; case TypeKind.Object: nodeType = ChelaType.GetObjectType(); break; case TypeKind.Size: nodeType = ChelaType.GetSizeType(); break; case TypeKind.PtrDiff: nodeType = ChelaType.GetPtrDiffType(); break; case TypeKind.Other: nodeType = node.GetOtherType(); break; case TypeKind.Reference: nodeType = ReferenceType.Create(currentModule.TypeMap(node.GetOtherType())); break; default: throw new System.NotSupportedException(); } // Vectorial type check. if(node.GetNumComponents() > 1) { if(!nodeType.IsPrimitive()) Error(node, "invalid vectorial type."); nodeType = VectorType.Create(nodeType, node.GetNumComponents()); } else if(node.GetNumRows() > 1 || node.GetNumColumns() > 1) { if(!nodeType.IsPrimitive()) Error(node, "invalid matrix type."); nodeType = MatrixType.Create(nodeType, node.GetNumRows(), node.GetNumColumns()); } // Set the node type. node.SetNodeType(MetaType.Create(currentModule.TypeMap(nodeType))); return node; }