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