Commit 20bcffb3 authored by Sergio Pérez's avatar Sergio Pérez
Browse files

* Fix List structures in generators/definitions

parent d12b670d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ package edg.constraint;

public class ListConstraint extends AccessConstraint
{
	public enum Position { H, T, S }
	public enum Position { H, T, S, HS }
	// H -> Head
	// T -> Tail
	// S -> Structure: Interested in the list structure but not in its elements (Only positive constraints)
+4 −0
Original line number Diff line number Diff line
@@ -14,6 +14,10 @@ public class StructuralConstraint extends EdgeConstraint {
        constraint = new DataConstructorConstraint(operation, index + "S");
    }

    public StructuralConstraint(Operation operation, ListConstraint.Position position) {
        constraint = new ListConstraint(operation, ListConstraint.Position.HS);
    }

    private StructuralConstraint(AccessConstraint constraint) {
        this.constraint = constraint;
    }
+35 −14
Original line number Diff line number Diff line
@@ -84,9 +84,9 @@ public class ValueEdgeGenerator {
					// In case the parent is a List this structure is also necessary
					final Node parent = this.last.getParent(dataConstructor);
					if (parent.getType() == Node.Type.List) {
						StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Remove,
							childIndex + "/" + (this.last.getChildren(parent).size()-1));
						this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sDc);
						StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove,
							ListConstraint.Position.HS);
						this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sLc);
					}
					switch(dataConstructorChild.getType()){
						case DataConstructor:
@@ -126,6 +126,11 @@ public class ValueEdgeGenerator {
			} else {
				this.last.addEdge(head, list, Edge.Type.Value, headConstraint);
				this.last.addEdge(tail, list, Edge.Type.Value, tailConstraint);
				if (this.last.getParent(list).getType() == Node.Type.List){
					StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove,
							ListConstraint.Position.HS);
					this.last.addEdge(list, this.last.getParent(list), Edge.Type.ValueStructure, sLc);
				}
			}
		}
	}
@@ -218,24 +223,40 @@ public class ValueEdgeGenerator {
	private void generateGeneratorPatternStructureEdges(Node parent, Node pattern){
		switch(pattern.getType()){
			case List:
				if (parent.getType() == Node.Type.Generator)
					this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint());
				else {
					ListConstraint lc = new ListConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.S);
					this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, lc);
				}
				generateGeneratorPatternStructureEdges(pattern);
				break;
			case DataConstructor:
				if (parent.getType() == Node.Type.Generator)
					this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint());
				else {
					switch(parent.getType()){
						case List:
							StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS);
							this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc);
						case DataConstructor:
							StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Add,
									this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1));
							this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc);
					}
//					StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS);
//					this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc);
				}
				generateGeneratorPatternStructureEdges(pattern);
				break;
//			case DataConstructor:
//				if (parent.getType() == Node.Type.Generator)
//					this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint());
//				else {
//					switch(parent.getType()){
//						case List:
//							StructuralConstraint sLc2 = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS);
//							this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc2);
//						case DataConstructor:
//							StructuralConstraint sDc2 = new StructuralConstraint(AccessConstraint.Operation.Add,
//									this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1));
//							this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc2);
//					}
//				}
//				generateGeneratorPatternStructureEdges(pattern);
//				break;
			case Literal:
					final Node genNode = this.last.getAncestor(parent, Node.Type.Generator);
					this.last.addEdge(pattern, genNode, Edge.Type.Value, EmptyConstraint.getConstraint());