Fixed AstValidator.getDeclarationTypes() for SequenceType(EClassifierLiteralType) and SetType(EClassifierLiteralType).
Change-Id: Iedf6ddadee47a54401677d5c11d55ec6d387f994
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
index fb5c48c..33acf41 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
@@ -1276,6 +1276,18 @@
}
} else if (iType instanceof ClassLiteralType) {
res.add(new ClassType(queryEnvironment, ((ClassLiteralType)iType).getType()));
+ } else if (iType instanceof SequenceType) {
+ final Set<IType> collectionTypes = Collections.singleton(((SequenceType)iType)
+ .getCollectionType());
+ for (IType collectionType : getDeclarationTypes(queryEnvironment, collectionTypes)) {
+ res.add(new SequenceType(queryEnvironment, collectionType));
+ }
+ } else if (iType instanceof SetType) {
+ final Set<IType> collectionTypes = Collections.singleton(((SetType)iType)
+ .getCollectionType());
+ for (IType collectionType : getDeclarationTypes(queryEnvironment, collectionTypes)) {
+ res.add(new SetType(queryEnvironment, collectionType));
+ }
} else {
res.add(iType);
}
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
index dd94859..2ddb953 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
@@ -23,6 +23,8 @@
import org.eclipse.acceleo.query.ast.Conditional;
import org.eclipse.acceleo.query.ast.Expression;
import org.eclipse.acceleo.query.ast.Lambda;
+import org.eclipse.acceleo.query.ast.Let;
+import org.eclipse.acceleo.query.parser.AstValidator;
import org.eclipse.acceleo.query.runtime.IQueryEnvironment;
import org.eclipse.acceleo.query.runtime.IService;
import org.eclipse.acceleo.query.runtime.IValidationMessage;
@@ -31,6 +33,7 @@
import org.eclipse.acceleo.query.runtime.ServiceUtils;
import org.eclipse.acceleo.query.runtime.ValidationMessageLevel;
import org.eclipse.acceleo.query.runtime.impl.QueryValidationEngine;
+import org.eclipse.acceleo.query.runtime.impl.ValidationServices;
import org.eclipse.acceleo.query.tests.anydsl.AnydslPackage;
import org.eclipse.acceleo.query.tests.services.EObjectServices;
import org.eclipse.acceleo.query.tests.services.ReceiverServices;
@@ -48,6 +51,7 @@
import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -992,6 +996,65 @@
}
@Test
+ public void testLetBindingCompatibleTypeSequenceType() {
+ final IValidationResult validationResult = engine.validate(
+ "let newVar : Sequence(ecore::EClass) = Sequence{self} in newVar", variableTypes);
+
+ final Expression ast = validationResult.getAstResult().getAst();
+ final Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
+
+ assertEquals(1, possibleTypes.size());
+ Iterator<IType> it = possibleTypes.iterator();
+ IType possibleType = it.next();
+ assertTrue(possibleType instanceof SequenceType);
+ IType collectionType = ((SequenceType)possibleType).getCollectionType();
+ assertTrue(collectionType instanceof EClassifierType);
+ assertEquals(EcorePackage.eINSTANCE.getEClass(), ((EClassifierType)collectionType).getType());
+ assertEquals(0, validationResult.getMessages().size());
+
+ final AstValidator validator = new AstValidator(new ValidationServices(queryEnvironment));
+ final Set<IType> bindingPossibleTypes = validator.getDeclarationTypes(queryEnvironment,
+ validationResult.getPossibleTypes(((Let)ast).getBindings().get(0).getType()));
+ it = bindingPossibleTypes.iterator();
+ possibleType = it.next();
+ assertTrue(possibleType instanceof SequenceType);
+ collectionType = ((SequenceType)possibleType).getCollectionType();
+ assertTrue(collectionType instanceof EClassifierType);
+ assertFalse(collectionType instanceof EClassifierLiteralType);
+ assertFalse(collectionType instanceof EClassifierLiteralType);
+ assertEquals(EcorePackage.eINSTANCE.getEClass(), ((EClassifierType)collectionType).getType());
+ }
+
+ @Test
+ public void testLetBindingCompatibleTypeSetType() {
+ final IValidationResult validationResult = engine.validate(
+ "let newVar : OrderedSet(ecore::EClass) = OrderedSet{self} in newVar", variableTypes);
+
+ final Expression ast = validationResult.getAstResult().getAst();
+ final Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
+
+ assertEquals(1, possibleTypes.size());
+ Iterator<IType> it = possibleTypes.iterator();
+ IType possibleType = it.next();
+ assertTrue(possibleType instanceof SetType);
+ IType collectionType = ((SetType)possibleType).getCollectionType();
+ assertTrue(collectionType instanceof EClassifierType);
+ assertEquals(EcorePackage.eINSTANCE.getEClass(), ((EClassifierType)collectionType).getType());
+ assertEquals(0, validationResult.getMessages().size());
+
+ final AstValidator validator = new AstValidator(new ValidationServices(queryEnvironment));
+ final Set<IType> bindingPossibleTypes = validator.getDeclarationTypes(queryEnvironment,
+ validationResult.getPossibleTypes(((Let)ast).getBindings().get(0).getType()));
+ it = bindingPossibleTypes.iterator();
+ possibleType = it.next();
+ assertTrue(possibleType instanceof SetType);
+ collectionType = ((SetType)possibleType).getCollectionType();
+ assertTrue(collectionType instanceof EClassifierType);
+ assertFalse(collectionType instanceof EClassifierLiteralType);
+ assertEquals(EcorePackage.eINSTANCE.getEClass(), ((EClassifierType)collectionType).getType());
+ }
+
+ @Test
public void testLetBindingIncompatibleType() {
final IValidationResult validationResult = engine.validate(
"let newVar : ecore::EPackage = self in newVar", variableTypes);
diff --git a/tests/org.eclipse.acceleo.aql.migration.tests/resources/evaluation/queryInvocation/queryInvocation-expected-validation.txt b/tests/org.eclipse.acceleo.aql.migration.tests/resources/evaluation/queryInvocation/queryInvocation-expected-validation.txt
index 0bb9b97..0490a76 100644
--- a/tests/org.eclipse.acceleo.aql.migration.tests/resources/evaluation/queryInvocation/queryInvocation-expected-validation.txt
+++ b/tests/org.eclipse.acceleo.aql.migration.tests/resources/evaluation/queryInvocation/queryInvocation-expected-validation.txt
@@ -1 +1 @@
-WARNING Set(EClassifierLiteral=EAttribute) is incompatible with Sequence(EClassifier=EAttribute) - 458 576
\ No newline at end of file
+WARNING Set(EClassifier=EAttribute) is incompatible with Sequence(EClassifier=EAttribute) - 458 576
\ No newline at end of file