Skip to content

Commit e3ce708

Browse files
committed
The context and return types of a contributed operation can be a union
1 parent 31141a5 commit e3ce708

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/contributors/NumberOperationContributor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
******************************************************************************/
1010
package org.eclipse.epsilon.eol.execute.operations.contributors;
1111

12+
import java.util.Arrays;
13+
import java.util.List;
1214
import java.util.stream.LongStream;
15+
16+
import org.eclipse.epsilon.eol.types.EolPrimitiveType;
17+
import org.eclipse.epsilon.eol.types.EolType;
1318
import org.eclipse.epsilon.eol.types.NumberUtil;
1419

1520
public class NumberOperationContributor extends OperationContributor {
@@ -19,6 +24,11 @@ public boolean contributesTo(Object target) {
1924
return target instanceof Number;
2025
}
2126

27+
@Override
28+
public List<EolType> contributesToType() {
29+
return Arrays.asList(EolPrimitiveType.Real, EolPrimitiveType.Integer);
30+
}
31+
2232
@Override
2333
protected Number getTarget() {
2434
return (Number) super.getTarget();

plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/contributors/OperationContributor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
package org.eclipse.epsilon.eol.execute.operations.contributors;
1212

1313
import java.lang.reflect.Method;
14+
import java.util.Arrays;
1415
import java.util.List;
1516
import java.util.Set;
1617
import org.eclipse.epsilon.common.parse.AST;
1718
import org.eclipse.epsilon.eol.dom.Expression;
1819
import org.eclipse.epsilon.eol.execute.context.IEolContext;
1920
import org.eclipse.epsilon.eol.execute.introspection.java.ObjectMethod;
21+
import org.eclipse.epsilon.eol.types.EolAnyType;
22+
import org.eclipse.epsilon.eol.types.EolType;
2023
import org.eclipse.epsilon.eol.util.ReflectionUtil;
2124

2225
/**
@@ -33,6 +36,10 @@ public abstract class OperationContributor implements AutoCloseable {
3336

3437
public abstract boolean contributesTo(Object target);
3538

39+
public List<EolType> contributesToType() {
40+
return Arrays.asList(EolAnyType.Instance);
41+
}
42+
3643
public ObjectMethod findContributedMethodForUnevaluatedParameters(Object target, String name, List<Expression> parameterExpressions, IEolContext context) {
3744
// Note that the last parameter is false: we only want to retrieve methods that take an AST as an argument
3845
// and not methods that take a supertype of AST (such as Object)

plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/operations/contributors/StringOperationContributor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.FileOutputStream;
1313
import java.io.StringWriter;
14+
import java.util.Arrays;
1415
import java.util.List;
1516

1617
import javax.xml.parsers.DocumentBuilderFactory;
@@ -35,8 +36,8 @@ public boolean contributesTo(Object target) {
3536
}
3637

3738
@Override
38-
public EolType contributesToType() {
39-
return EolPrimitiveType.String;
39+
public List<EolType> contributesToType() {
40+
return Arrays.asList(EolPrimitiveType.String);
4041
}
4142

4243
public Object toEnum() throws Exception {

plugins/org.eclipse.epsilon.eol.staticanalyser/src/org/eclipse/epsilon/eol/staticanalyser/EolStaticAnalyser.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,14 @@ public void preValidate(IEolModule imodule) {
11991199
//Parse builtin operations
12001200
List<OperationContributor> operationContributors = context.operationContributorRegistry.stream().collect(Collectors.toList());
12011201
for(OperationContributor oc: operationContributors) {
1202-
EolType contextType = toStaticAnalyserType(oc.contributesToType());
1202+
List<EolType> contextTypes = oc.contributesToType().stream().map(t -> toStaticAnalyserType(t)).collect(Collectors.toList());
1203+
EolType contextType;
1204+
if (contextTypes.size() == 1) {
1205+
contextType = contextTypes.get(0);
1206+
}
1207+
else {
1208+
contextType = new EolUnionType(contextTypes);
1209+
}
12031210

12041211
for(Method m: oc.getClass().getDeclaredMethods()) {
12051212
List<EolType> operationParameterTypes = new ArrayList<EolType>();
@@ -1251,6 +1258,8 @@ public EolType javaClassToEolType(Class<?> javaClass) {
12511258
} else if (javaClass == Double.class || javaClass == double.class || javaClass == Float.class
12521259
|| javaClass == float.class) {
12531260
return EolPrimitiveType.Real;
1261+
} else if (javaClass == Number.class) {
1262+
return new EolUnionType(EolPrimitiveType.Real, EolPrimitiveType.Integer);
12541263
} else if (javaClass == boolean.class || javaClass == Boolean.class) {
12551264
return EolPrimitiveType.Boolean;
12561265
} else if (javaClass == java.util.Collection.class) {
@@ -1508,6 +1517,15 @@ public boolean canBeCompatible(EolType targetType, EolType valueType) {
15081517
return false;
15091518
}
15101519

1520+
if (targetType instanceof EolUnionType) {
1521+
for (EolType t : ((EolUnionType)targetType).containedTypes) {
1522+
if (canBeCompatible(t, valueType)) {
1523+
return true;
1524+
}
1525+
}
1526+
return false;
1527+
}
1528+
15111529
while (true) {
15121530

15131531
if (!(targetType.equals(valueType)) && !(valueType instanceof EolAnyType)) {

0 commit comments

Comments
 (0)