import java.util.ArrayList;
import java.util.Arrays;
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
import org.simantics.scl.compiler.elaboration.chr.CHRQuery;
import org.simantics.scl.compiler.elaboration.chr.CHRRule;
import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
import org.simantics.scl.compiler.elaboration.expressions.EApply;
import org.simantics.scl.compiler.elaboration.expressions.EBinary;
+import org.simantics.scl.compiler.elaboration.expressions.ERecord;
import org.simantics.scl.compiler.elaboration.expressions.EVar;
import org.simantics.scl.compiler.elaboration.expressions.Expression;
import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement;
import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator;
import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard;
import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifier;
+import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment;
import org.simantics.scl.compiler.environment.AmbiguousNameException;
import org.simantics.scl.compiler.environment.Environments;
import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst;
import org.simantics.scl.compiler.internal.parsing.types.TypeAst;
public class CHRTranslation {
}
private static CHRLiteral convertConstraint(boolean remove, boolean negated, Expression expression) {
- ArrayList<Expression> parameters = new ArrayList<Expression>(4);
- while(expression instanceof EApply) {
+ long location = expression.location;
+ Expression[] parameters;
+ FieldAssignment[] fields = null;
+ if(expression instanceof EApply) {
EApply apply = (EApply)expression;
- for(int i=apply.parameters.length-1;i>=0;--i)
- parameters.add(apply.parameters[i]);
+ parameters = apply.parameters;
expression = apply.function;
}
- EVar var = (EVar)expression;
- Expression[] parametersArray = new Expression[parameters.size()];
- for(int i=0,j=parametersArray.length-1;i<parametersArray.length;++i,--j)
- parametersArray[i] = parameters.get(j);
- return new CHRLiteral(expression.location, new UnresolvedCHRRelation(var.location, var.name), parametersArray, remove, negated);
+ else if(expression instanceof ERecord) {
+ ERecord record = (ERecord)expression;
+ parameters = null;
+ fields = record.fields;
+ expression = record.constructor;
+ }
+ else // if(expression instanceof EVar)
+ parameters = Expression.EMPTY_ARRAY;
+ EVar var = (EVar)expression; // this should succeed because of isConstraint test
+ CHRLiteral literal = new CHRLiteral(location, new UnresolvedCHRRelation(var.location, var.name),
+ parameters, remove, negated);
+ literal.fields = fields;
+ return literal;
}
private static CHRLiteral convertListQualifier(TranslationContext context, boolean isHead, ListQualifier qualifier) {
}
private static boolean isConstraint(TranslationContext context, Expression expression) {
- while(expression instanceof EApply)
+ if(expression instanceof EApply)
expression = ((EApply)expression).function;
+ else if(expression instanceof ERecord)
+ expression = ((ERecord)expression).constructor;
if(!(expression instanceof EVar))
return false;
String name = ((EVar)expression).name;
}
public static CHRConstraint convertConstraintStatement(TranslationContext context, ConstraintStatement statement) {
- return new CHRConstraint(statement.location, statement.name.text, TypeAst.toTypes(context, statement.parameterTypes));
+ CHRConstraint constraint = new CHRConstraint(statement.location, statement.name.text, TypeAst.toTypes(context, statement.parameterTypes));
+ for(DAnnotationAst annotation : statement.annotations)
+ applyConstraintAnnotation(context, constraint, annotation);
+ constraint.fieldNames = statement.fieldNames;
+ return constraint;
+ }
+
+ private static void applyConstraintAnnotation(TranslationContext context, CHRConstraint constraint, DAnnotationAst annotation) {
+ context.getErrorLog().log(annotation.location, "Invalid constraint annotation");
}
}