diff --git a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/validation/ValidationTestHelper.java b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/validation/ValidationTestHelper.java index afc1c1296..c111b8e76 100644 --- a/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/validation/ValidationTestHelper.java +++ b/plugins/org.eclipse.xtext.junit4/src/org/eclipse/xtext/junit4/validation/ValidationTestHelper.java @@ -22,6 +22,7 @@ import org.eclipse.xtext.validation.CheckMode; import org.eclipse.xtext.validation.IResourceValidator; import org.eclipse.xtext.validation.Issue; +import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; @@ -146,6 +147,7 @@ public class ValidationTestHelper { .append(eObject.eClass().getName()) .append("\n"); } + assertEquals(Joiner.on('\n').join(messageParts), message.toString()); fail(message.toString()); } } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/validation/EObjectDiagnosticImpl.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/validation/EObjectDiagnosticImpl.java index 7bdee71a9..9a152f18c 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/validation/EObjectDiagnosticImpl.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/validation/EObjectDiagnosticImpl.java @@ -50,19 +50,28 @@ public class EObjectDiagnosticImpl extends AbstractDiagnostic { @Override protected INode getNode() { - if (problematicObject == null) + return doGetNode(problematicObject, problematicFeature, indexOfProblemanticValueInFeature); + } + + protected INode doGetNode(EObject object, EStructuralFeature feature, int idx) { + if (object == null) return null; - if (problematicFeature == null) - return NodeModelUtils.findActualNodeFor(problematicObject); - - List nodesForFeature = NodeModelUtils.findNodesForFeature(problematicObject, problematicFeature); - if (nodesForFeature.isEmpty()) { - return NodeModelUtils.findActualNodeFor(problematicObject); + if (feature == null) { + INode result = NodeModelUtils.findActualNodeFor(object); + if (result != null) { + return result; + } + return doGetNode(object.eContainer(), object.eContainmentFeature(), -1); } - if (nodesForFeature.size() == 1 && indexOfProblemanticValueInFeature == -1) + + List nodesForFeature = NodeModelUtils.findNodesForFeature(object, feature); + if (nodesForFeature.isEmpty()) { + return doGetNode(object, null, -1); + } + if (nodesForFeature.size() == 1 && idx == -1) return nodesForFeature.get(0); - if (nodesForFeature.size() > indexOfProblemanticValueInFeature ) { - return nodesForFeature.get(indexOfProblemanticValueInFeature); + if (nodesForFeature.size() > idx ) { + return nodesForFeature.get(idx); } return null; }