Bug 551570 - Compose IContextInformationValidator

Change-Id: If0d01ead002636c95cbb4fa9754b37c3da9a799c
Signed-off-by: Mickael Istria <mistria@redhat.com>
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompositeContextInformationValidator.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompositeContextInformationValidator.java
new file mode 100644
index 0000000..1f2bd35
--- /dev/null
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompositeContextInformationValidator.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.jface.text.contentassist;
+
+import java.util.Arrays;
+
+import org.eclipse.jface.text.ITextViewer;
+
+class CompositeContextInformationValidator implements IContextInformationValidator {
+
+	private final IContextInformationValidator[] children;
+
+	public CompositeContextInformationValidator(IContextInformationValidator[] validators) {
+		this.children= validators;
+	}
+
+	@Override
+	public void install(IContextInformation info, ITextViewer viewer, int offset) {
+		Arrays.stream(children).forEach(child -> child.install(info, viewer, offset));
+	}
+
+	@Override
+	public boolean isContextInformationValid(int offset) {
+		return Arrays.stream(children).anyMatch(child -> child.isContextInformationValid(offset));
+	}
+
+}
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
index 1d707db..04c7e63 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/ContentAssistant.java
@@ -2114,9 +2114,14 @@
 		if (processors == null || processors.isEmpty()) {
 			return null;
 		}
-		// pick first one, arbitrary
-		IContentAssistProcessor p = processors.iterator().next();
-		return p != null ? p.getContextInformationValidator() : null;
+		IContextInformationValidator[] validators= processors.stream()
+				.map(IContentAssistProcessor::getContextInformationValidator)
+				.filter(Objects::nonNull)
+				.toArray(IContextInformationValidator[]::new);
+		if (validators.length == 0) {
+			return null;
+		}
+		return new CompositeContextInformationValidator(validators);
 	}
 
 	/**
@@ -2135,9 +2140,14 @@
 		if (processors == null || processors.isEmpty()) {
 			return null;
 		}
-		// pick first one, arbitrary
-		IContentAssistProcessor p = processors.iterator().next();
-		return p != null ? p.getContextInformationValidator() : null;
+		IContextInformationValidator[] validators= processors.stream()
+				.map(IContentAssistProcessor::getContextInformationValidator)
+				.filter(Objects::nonNull)
+				.toArray(IContextInformationValidator[]::new);
+		if (validators.length == 0) {
+			return null;
+		}
+		return new CompositeContextInformationValidator(validators);
 	}
 
 	/**