private Object visitIsa(RelationalExpression node) {
            Token token = node.getOperator();

            Expression left = node.getLeftExpression();
            TypeName typeName = node.getIsaTypeName();

            check(left);
            check(typeName);

            if (!(left instanceof VariableRef)) {
                error("relationalexpression.isa.left", token.getImage(), left);
            }

            Type leftType = left.getType();
            Type rightType = typeName.getType();

            if (leftType != null && rightType != null) {
                // Ensure the left type is an object.
                leftType = leftType.toNonPrimitive();
                left.convertTo(leftType);

                Class<?> leftClass = leftType.getObjectClass();
                Class<?> rightClass = rightType.getObjectClass();

                if (rightClass.isAssignableFrom(leftClass)) {
                    // Widening case. i.e. (5 isa Number) is always true.
                }
                else if (leftClass.isAssignableFrom(rightClass)) {
                    // Narrowing case. i.e. (n isa Integer) might be true.

                    // For this case, a cast operation needs to be inserted
                    // in an if statement.
                }
                else {
                    SourceInfo info = new SourceDetailedInfo
                        (node.getSourceInfo(),
                         typeName.getSourceInfo().getDetailPosition());

                    error("relationalexpression.isa.impossible",
                          leftType.getSimpleName(), rightType.getSimpleName(),
                          info);
                }
            }

            return null;
        }