public override AstNode Visit(UnaryOperation node) { // Get the expression. Expression expr = node.GetExpression(); // Visit the expression. expr.Accept(this); // Get the expression type. IChelaType type = expr.GetNodeType(); // Dereference the type. type = DeReferenceType(type); node.SetCoercionType(type); // De-const the type. type = DeConstType(type); // Validate the expression type. switch(node.GetOperation()) { case UnaryOperation.OpNop: break; case UnaryOperation.OpNeg: if(!type.IsNumber()) Error(node, "expected numeric expression."); // Use signed integer when negating. if(type.IsInteger() && !type.IsPlaceHolderType()) { IntegerType intType = (IntegerType)type; intType = intType.GetSignedVersion(); if(node.GetCoercionType().IsConstant()) node.SetCoercionType(ConstantType.Create(intType)); else node.SetCoercionType(intType); } break; case UnaryOperation.OpNot: if(type != ChelaType.GetBoolType()) Error(node, "expected boolean expression."); break; case UnaryOperation.OpBitNot: if(!type.IsInteger()) Error(node, "expected integer expression."); break; default: Error(node, "Compiler bug, unknown unary operation."); break; } // Set the node type. node.SetNodeType(node.GetCoercionType()); return node; }