示例#1
0
        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;
        }