From 957259566245714ed22e6f4fd08b678d6be5a5f1 Mon Sep 17 00:00:00 2001 From: Sebastian Zarnekow Date: Thu, 13 Aug 2015 10:05:00 +0200 Subject: [PATCH] [263773] Adjusted Xtext grammar content assist to support fragments and params Also fixed validation for wildcard fragment overrides --- .../TransformationDiagnosticsProducer.java | 19 ++++++++++++++++--- .../Xtext2EcoreTransformer.java | 9 +++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/TransformationDiagnosticsProducer.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/TransformationDiagnosticsProducer.java index 46eb14c91..a5b878d31 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/TransformationDiagnosticsProducer.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/TransformationDiagnosticsProducer.java @@ -7,14 +7,16 @@ *******************************************************************************/ package org.eclipse.xtext.xtext.ecoreInference; +import java.util.List; + import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.xtext.diagnostics.AbstractDiagnosticProducer; import org.eclipse.xtext.diagnostics.Diagnostic; import org.eclipse.xtext.diagnostics.DiagnosticMessage; -import org.eclipse.xtext.diagnostics.Severity; import org.eclipse.xtext.diagnostics.IDiagnosticConsumer; -import org.eclipse.xtext.nodemodel.ICompositeNode; +import org.eclipse.xtext.diagnostics.Severity; +import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; /** @@ -44,13 +46,24 @@ public class TransformationDiagnosticsProducer extends AbstractDiagnosticProduce @Override public void setTarget(EObject object, EStructuralFeature feature) { EObject myObject = object; - ICompositeNode result = NodeModelUtils.getNode(myObject); + INode result = NodeModelUtils.getNode(myObject); while(result == null && myObject.eContainer() != null) { myObject = myObject.eContainer(); result = NodeModelUtils.getNode(myObject); } if (result == null) throw new IllegalStateException("Cannot find NodeAdapter for object: " + object); + else { + if (feature == null) { + feature = myObject.eClass().getEStructuralFeature("name"); + } + if (feature != null) { + List nodes = NodeModelUtils.findNodesForFeature(myObject, feature); + if (nodes.size() == 1) { + result = nodes.get(0); + } + } + } setNode(result); } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java index fa23ba906..3c40372ea 100755 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/xtext/ecoreInference/Xtext2EcoreTransformer.java @@ -231,6 +231,11 @@ public class Xtext2EcoreTransformer { throw new IllegalStateException("Unknown rule type: " + rule.eClass().getName()); } } + if (isWildcardFragment(rule)) { + for (Grammar usedGrammar: grammar.getUsedGrammars()) { + deriveTypeHierarchyFromOverridden((ParserRule) rule, usedGrammar); + } + } } catch (TransformationException e) { reportError(e); @@ -964,7 +969,7 @@ public class Xtext2EcoreTransformer { private EClassifierInfo findOrCreateEClassifierInfo(TypeRef typeRef, String name, boolean createIfMissing) throws TransformationException { if (typeRef.getClassifier() != null && typeRef.getMetamodel() == null) throw new TransformationException(TransformationErrorCode.UnknownMetaModelAlias, - "Cannot find metamodel for type '" + typeRef.getClassifier().getName() + "'", typeRef); + "Cannot find EPackage for type '" + typeRef.getClassifier().getName() + "'", typeRef); EClassifierInfo info = eClassifierInfos.getInfo(typeRef); if (info == null) { // we assumend EString for terminal rules and datatype rules, so @@ -996,7 +1001,7 @@ public class Xtext2EcoreTransformer { AbstractMetamodelDeclaration metaModel = typeRef.getMetamodel(); if (metaModel == null) throw new TransformationException(TransformationErrorCode.UnknownMetaModelAlias, "Cannot create type for " + classifierName - + " because its MetaModel is unknown.", typeRef); + + " because its EPackage is unknown.", typeRef); EPackage generatedEPackage = getGeneratedEPackage(metaModel); if (generatedEPackage == null) { throw new TransformationException(TransformationErrorCode.CannotCreateTypeInSealedMetamodel,