Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / models / RDLSpecDependencyTerm.java
package org.ntlab.rdlcanvas.models;

import exceptions.SyntaxException;
import models.terms.DependencyTerm;
import models.terms.EvaluatableTerm;

import java.util.List;

public class RDLSpecDependencyTerm extends DependencyTerm implements Typable, RDLSpecEvaluatableTerm {
    private StructuralType structuralType;
    private ValueType valuableType;

    public RDLSpecDependencyTerm(RDLSpecEvaluatableTerm dependingTerm, List<RDLSpecEvaluatableTerm> dependedTerms, List<RDLSpecEvaluatableTerm> argumentTerms) {
        super((EvaluatableTerm) dependingTerm, dependedTerms.stream().map(item -> (EvaluatableTerm) item).toList(), argumentTerms.stream().map(item -> (EvaluatableTerm) item).toList());
        this.structuralType = ((Typable) dependingTerm).getStructuralType();
        this.valuableType = ((Typable) dependingTerm).getValueType();

        for (int i = 0; i < dependedTerms.size(); i ++) {
            if (!typeChecker(dependedTerms.get(i), argumentTerms.get(i))) {
                throw new SyntaxException("the type is different");
            }
        }
    }

    private boolean typeChecker(RDLSpecEvaluatableTerm left, RDLSpecEvaluatableTerm right) {
        StructuralType leftStructuralType = ((Typable) left).getStructuralType();
        StructuralType rightStructuralType = ((Typable) right).getStructuralType();

        if (leftStructuralType == StructuralType.structure || leftStructuralType == StructuralType.map) {
            if (leftStructuralType == rightStructuralType) {
                return true;
            } else {
                return false;
            }
        } else {
            ValueType leftValueType = ((Typable) left).getValueType();
            ValueType rightValueType = ((Typable) right).getValueType();

            if (leftValueType.equals(rightValueType)) {
                return true;
            } else {
                return false;
            }
        }
    }

    @Override
    public StructuralType getStructuralType() {
        return structuralType;
    }

    @Override
    public ValueType getValueType() {
        return valuableType;
    }

    @Override
    public boolean isDependencyTerm() {
        return true;
    }
}