diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/ITypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/ITypeCalculator.java index e1f0a79f7..4809da4be 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/ITypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/ITypeCalculator.java @@ -1,7 +1,9 @@ package org.eclipse.epsilon.eol.execute.operations; +import java.util.List; + import org.eclipse.epsilon.eol.staticanalyser.types.EolType; public interface ITypeCalculator { -public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType); +public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes); } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateOperation.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateOperation.java index 42e9ab95a..d9961eca1 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateOperation.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateOperation.java @@ -20,8 +20,10 @@ import org.eclipse.epsilon.eol.execute.context.FrameType; import org.eclipse.epsilon.eol.execute.context.IEolContext; import org.eclipse.epsilon.eol.execute.context.Variable; +import org.eclipse.epsilon.eol.execute.operations.TypeCalculator; import org.eclipse.epsilon.eol.types.EolMap; +@TypeCalculator(klass = AggregateTypeCalculator.class) public class AggregateOperation extends FirstOrderOperation { @Override diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateTypeCalculator.java new file mode 100644 index 000000000..8c732f109 --- /dev/null +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/AggregateTypeCalculator.java @@ -0,0 +1,16 @@ +package org.eclipse.epsilon.eol.execute.operations.declarative; + +import java.util.List; + +import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; +import org.eclipse.epsilon.eol.staticanalyser.types.EolMapType; +import org.eclipse.epsilon.eol.staticanalyser.types.EolType; + +public class AggregateTypeCalculator implements ITypeCalculator { + + @Override + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { + return new EolMapType(expressionTypes.get(0), expressionTypes.get(1)); + } + +} diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/BooleanTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/BooleanTypeCalculator.java index dab240edc..ee41c1ff7 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/BooleanTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/BooleanTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolPrimitiveType; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; @@ -7,7 +9,7 @@ public class BooleanTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { return EolPrimitiveType.Boolean; } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/CollectTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/CollectTypeCalculator.java index 4cce66d60..90a42b359 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/CollectTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/CollectTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolCollectionType; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; @@ -7,7 +9,7 @@ public class CollectTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { String collectionName = ((EolCollectionType)contextType).getName(); String newCollectionName = null; if (collectionName.equals("Bag") || collectionName.equals("Set")) { @@ -19,7 +21,7 @@ else if (collectionName.equals("Sequence") || collectionName.equals("OrderedSet" else { throw new RuntimeException("Unknown collection name"); } - return new EolCollectionType(newCollectionName, expressionType); + return new EolCollectionType(newCollectionName, expressionTypes.get(0)); } } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/IntegerTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/IntegerTypeCalculator.java index b71677a66..091dc62ac 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/IntegerTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/IntegerTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolPrimitiveType; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; @@ -7,7 +9,7 @@ public class IntegerTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { return EolPrimitiveType.Integer; } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/MapByTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/MapByTypeCalculator.java index 67148a715..4123da5c6 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/MapByTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/MapByTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolCollectionType; import org.eclipse.epsilon.eol.staticanalyser.types.EolMapType; @@ -8,8 +10,8 @@ public class MapByTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { - return new EolMapType(expressionType, new EolCollectionType("Sequence", iteratorType)); + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { + return new EolMapType(expressionTypes.get(0), new EolCollectionType("Sequence", iteratorType)); } } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectOneTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectOneTypeCalculator.java index abf92a5d5..532d5d560 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectOneTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectOneTypeCalculator.java @@ -1,12 +1,14 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; public class SelectOneTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionType) { return iteratorType; } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectTypeCalculator.java index 58b456e27..a238ef687 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SelectTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolCollectionType; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; @@ -7,7 +9,7 @@ public class SelectTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { String collectionName = ((EolCollectionType)contextType).getName(); return new EolCollectionType(collectionName, iteratorType); diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SortByTypeCalculator.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SortByTypeCalculator.java index e91a82794..670272f5e 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SortByTypeCalculator.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/declarative/SortByTypeCalculator.java @@ -1,5 +1,7 @@ package org.eclipse.epsilon.eol.execute.operations.declarative; +import java.util.List; + import org.eclipse.epsilon.eol.execute.operations.ITypeCalculator; import org.eclipse.epsilon.eol.staticanalyser.types.EolCollectionType; import org.eclipse.epsilon.eol.staticanalyser.types.EolType; @@ -7,8 +9,7 @@ public class SortByTypeCalculator implements ITypeCalculator { @Override - public EolType calculateType(EolType contextType, EolType iteratorType, EolType expressionType) { + public EolType calculateType(EolType contextType, EolType iteratorType, List expressionTypes) { return new EolCollectionType("Sequence", iteratorType); } - } diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/staticanalyser/EolStaticAnalyser.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/staticanalyser/EolStaticAnalyser.java index c1b1d4538..70f4b9d08 100644 --- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/staticanalyser/EolStaticAnalyser.java +++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/staticanalyser/EolStaticAnalyser.java @@ -291,13 +291,16 @@ public void visit(FirstOrderOperationCallExpression firstOrderOperationCallExpre context.getFrameStack().enterLocal(FrameType.UNPROTECTED, firstOrderOperationCallExpression, new Variable(iterator.getName(), iteratorType)); - Expression expression = firstOrderOperationCallExpression.getExpressions().get(0); - expression.accept(this); - EolType expressionType = getResolvedType(expression); + List expressions = firstOrderOperationCallExpression.getExpressions(); + for (Expression expression: expressions) { + expression.accept(this); + } + + List expressionTypes = expressions.stream().map(e -> getResolvedType(e)).collect(Collectors.toList()); context.getFrameStack().leaveLocal(firstOrderOperationCallExpression); try { - EolType returnType = tc.klass().newInstance().calculateType(contextType, iteratorType, expressionType); + EolType returnType = tc.klass().newInstance().calculateType(contextType, iteratorType, expressionTypes); setResolvedType(firstOrderOperationCallExpression, returnType); } catch (Exception e) { setResolvedType(firstOrderOperationCallExpression, EolAnyType.Instance); diff --git a/tests/org.eclipse.epsilon.eol.staticanalyser.tests/src/org/eclipse/epsilon/eol/staticanalyser/tests/scripts/aggregate.eol b/tests/org.eclipse.epsilon.eol.staticanalyser.tests/src/org/eclipse/epsilon/eol/staticanalyser/tests/scripts/aggregate.eol new file mode 100644 index 000000000..712858d87 --- /dev/null +++ b/tests/org.eclipse.epsilon.eol.staticanalyser.tests/src/org/eclipse/epsilon/eol/staticanalyser/tests/scripts/aggregate.eol @@ -0,0 +1,4 @@ +/*Map*/Bag{0..9}.aggregate(i:Integer|i,i); +/*Map*/Sequence{0..9}.aggregate(i:Integer|i,i); +/*Map*/Set{0..9}.aggregate(i:Integer|i,i); +/*Map*/OrderedSet{0..9}.aggregate(i:Integer|i,i); \ No newline at end of file