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;
}
}