package glslplugin.annotation.impl;

import com.intellij.lang.annotation.AnnotationHolder;
import glslplugin.annotation.Annotator;
import glslplugin.lang.elements.expressions.GLSLExpression;
import glslplugin.lang.elements.expressions.GLSLUnaryOperatorExpression;
import glslplugin.lang.elements.expressions.operator.GLSLOperator;
import glslplugin.lang.elements.types.GLSLType;
import org.jetbrains.annotations.NotNull;

/**
 * @author Darkyen
 */
public class UnaryOperatorTypeAnnotation extends Annotator<GLSLUnaryOperatorExpression> {

    @Override
    public void annotate(GLSLUnaryOperatorExpression expr, AnnotationHolder holder) {
        final GLSLExpression operand = expr.getOperand();
        final GLSLOperator operator = expr.getOperator();
        if(operand == null || operator == null)return;

        if(!(operator instanceof GLSLOperator.GLSLUnaryOperator)){
            holder.createErrorAnnotation(expr, '\''+operator.getTextRepresentation()+"' is not an unary operator");
            return;
        }

        GLSLOperator.GLSLUnaryOperator unaryOperator = (GLSLOperator.GLSLUnaryOperator) operator;
        final GLSLType operandType = operand.getType();
        if(operandType.isValidType()){
            if(!unaryOperator.isValidInput(operandType)){
                holder.createErrorAnnotation(expr,
                        "'" + operator.getTextRepresentation() + "' does not operate on '" + operandType.getTypename() + "'");
            }
        }
    }

    @NotNull
    @Override
    public Class<GLSLUnaryOperatorExpression> getElementType() {
        return GLSLUnaryOperatorExpression.class;
    }
}