Bladeren bron

Merge pull request #2104 from Yakindu/issue_2103

Missing content at transitions for entry and exit states
Rene Beckmann 7 jaren geleden
bovenliggende
commit
4a796550e8

+ 71 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/contentassist/STextProposalProvider.java

@@ -45,16 +45,27 @@ import org.yakindu.base.expressions.expressions.ElementReferenceExpression;
 import org.yakindu.base.expressions.expressions.FeatureCall;
 import org.yakindu.base.types.Operation;
 import org.yakindu.base.types.Type;
+import org.yakindu.sct.model.sgraph.Entry;
+import org.yakindu.sct.model.sgraph.Exit;
+import org.yakindu.sct.model.sgraph.Region;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
 import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.sgraph.Vertex;
+import org.yakindu.sct.model.stext.extensions.STextExtensions;
 import org.yakindu.sct.model.stext.scoping.IPackageImport2URIMapper;
 import org.yakindu.sct.model.stext.scoping.IPackageImport2URIMapper.PackageImport;
 import org.yakindu.sct.model.stext.services.STextGrammarAccess;
+import org.yakindu.sct.model.stext.stext.EntryPointSpec;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
 import org.yakindu.sct.model.stext.stext.SimpleScope;
 import org.yakindu.sct.model.stext.stext.StatechartSpecification;
+import org.yakindu.sct.model.stext.stext.StextPackage;
+import org.yakindu.sct.model.stext.stext.TransitionReaction;
 import org.yakindu.sct.model.stext.stext.TransitionSpecification;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
+import org.yakindu.sct.model.stext.stext.impl.EntryPointSpecImpl;
 import org.yakindu.sct.model.stext.ui.internal.STextActivator;
 
 import com.google.common.base.Function;
@@ -79,6 +90,9 @@ public class STextProposalProvider extends AbstractSTextProposalProvider {
 	@Inject
 	private IPackageImport2URIMapper mapper;
 
+	@Inject
+	private STextExtensions utils; 
+	
 	public static class StrikeThroughStyler extends Styler {
 
 		@Override
@@ -140,6 +154,9 @@ public class STextProposalProvider extends AbstractSTextProposalProvider {
 	protected void suppressKeywords(List<Keyword> suppressKeywords, TransitionSpecification model) {
 		suppressKeywords.addAll(getKeywords(grammarAccess.getEntryEventAccess().getGroup().eContents()));
 		suppressKeywords.addAll(getKeywords(grammarAccess.getExitEventAccess().getGroup().eContents()));
+		suppressKeywords.addAll(getKeywords(grammarAccess.getExitPointSpecAccess().getGroup().eContents()));
+		suppressKeywords.addAll(getKeywords(grammarAccess.getExitEventAccess().getExitEventAction_0().eContents()));
+		suppressKeywords.addAll(getKeywords(grammarAccess.getExitEventAccess().getExitKeyword_1().eContents()));
 	}
 
 	// context States
@@ -372,7 +389,61 @@ public class STextProposalProvider extends AbstractSTextProposalProvider {
 				proposalText + " - " + ruleCall.getRule().getName(), null, context);
 		priorityOptimizer.accept(proposal);
 	}
+	
+	@Override
+	public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context,
+			ICompletionProposalAcceptor acceptor) {
+		if (model instanceof TransitionReaction) {
+			SpecificationElement contextElement = utils.getContextElement(model);
+			if (contextElement instanceof Transition) {
+				Transition transition = (Transition) contextElement;
+				// check if outgoing or incoming transition
+				EObject eContainer = ruleCall.eContainer();
+				Vertex state = null;
+				boolean entry = false;
+				if (eContainer instanceof Assignment) {
+					String feature = ((Assignment) eContainer).getFeature();
+					if (StextPackage.Literals.ENTRY_POINT_SPEC__ENTRYPOINT.getName().equals(feature)) {
+						state = transition.getTarget();
+						entry = true;
+					} else if (StextPackage.Literals.EXIT_POINT_SPEC__EXITPOINT.getName().equals(feature)) {
+						entry = false;
+						state = transition.getSource();
+					} else {
+						super.complete_ID(model, ruleCall, context, acceptor);
+					}
+				}
+				if (state instanceof State) {
+					createContentAssistForEntryAndExit((State) state, entry, context, acceptor);
+				}
+			}
+		}
+		super.complete_ID(model, ruleCall, context, acceptor);
+	}
 
+	private void createContentAssistForEntryAndExit(State state, boolean entry, ContentAssistContext context,
+			ICompletionProposalAcceptor acceptor) {
+		for (Region region : state.getRegions()) {
+			for (Vertex vertex : region.getVertices()) {
+				if (entry) {
+					if (vertex instanceof Entry) {
+						String assist = vertex.getName();
+						if (assist.length() > 0) {
+							acceptor.accept(createCompletionProposal(assist, context));
+						}
+					}
+				} else {
+					if (vertex instanceof Exit) {
+						String assist = vertex.getName();
+						if (assist.length() > 0) {
+							acceptor.accept(createCompletionProposal(assist, context));
+						}
+					}
+				}
+			}
+		}
+	}
+	
 	public void completeActiveStateReferenceExpression_Value(EObject model, Assignment assignment,
 			ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference) assignment.getTerminal()), context, acceptor);

+ 1 - 0
plugins/org.yakindu.sct.model.stext/META-INF/MANIFEST.MF

@@ -28,6 +28,7 @@ Import-Package: org.apache.commons.logging,
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.yakindu.sct.model.stext,
  org.yakindu.sct.model.stext.expressions,
+ org.yakindu.sct.model.stext.extensions,
  org.yakindu.sct.model.stext.formatting,
  org.yakindu.sct.model.stext.inferrer,
  org.yakindu.sct.model.stext.naming,

+ 43 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/extensions/STextExtensions.java

@@ -0,0 +1,43 @@
+package org.yakindu.sct.model.stext.extensions;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.xtext.EcoreUtil2;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.ScopedElement;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
+import org.yakindu.sct.model.stext.stext.StatechartSpecification;
+
+public class STextExtensions {
+	public SpecificationElement getContextElement(EObject context) {
+		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
+				ContextElementAdapter.class);
+
+		if (provider == null) {
+			return EcoreUtil2.getContainerOfType(context, SpecificationElement.class);
+		} else {
+			return (SpecificationElement) provider.getElement();
+		}
+	}
+	
+	public ScopedElement getScopedElement(EObject context) {
+		ScopedElement scopedElement = EcoreUtil2.getContainerOfType(context, ScopedElement.class);
+		if (EcoreUtil.getRootContainer(context) instanceof StatechartSpecification && scopedElement != null)
+			return scopedElement;
+		return getStatechart(context);
+	}
+
+	public Statechart getStatechart(EObject context) {
+		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
+				ContextElementAdapter.class);
+
+		if (provider == null) {
+			return EcoreUtil2.getContainerOfType(context, Statechart.class);
+		} else {
+			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
+					SGraphPackage.Literals.STATECHART);
+		}
+	}
+}

+ 8 - 32
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextScopeProvider.java

@@ -46,6 +46,7 @@ import org.yakindu.sct.model.sgraph.SpecificationElement;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
+import org.yakindu.sct.model.stext.extensions.STextExtensions;
 import org.yakindu.sct.model.stext.scoping.ContextPredicateProvider.EmptyPredicate;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
@@ -72,9 +73,12 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 	private IQualifiedNameProvider nameProvider;
 	@Inject
 	private ContextPredicateProvider predicateProvider;
+	
+	@Inject
+	private STextExtensions utils;
 
 	public IScope scope_ActiveStateReferenceExpression_value(EObject context, EReference reference) {
-		Statechart statechart = getStatechart(context);
+		Statechart statechart = utils.getStatechart(context);
 		if (statechart == null)
 			return IScope.NULLSCOPE;
 		List<State> allStates = EcoreUtil2.getAllContentsOfType(statechart, State.class);
@@ -86,7 +90,7 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 
 	protected List<ImportNormalizer> getActiveStateNormalizer(EObject context) {
 		List<ImportNormalizer> normalizer = Lists.newArrayList();
-		SpecificationElement contextElement = getContextElement(context);
+		SpecificationElement contextElement = utils.getContextElement(context);
 		if (contextElement == null)
 			return normalizer;
 		Region containingRegion = EcoreUtil2.getContainerOfType(contextElement, Region.class);
@@ -187,7 +191,7 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 	 */
 	protected IScope getNamedTopLevelScope(final EObject context, EReference reference) {
 		List<EObject> scopeCandidates = Lists.newArrayList();
-		ScopedElement scopedElement = getScopedElement(context);
+		ScopedElement scopedElement = utils.getScopedElement(context);
 		if (scopedElement == null)
 			return IScope.NULLSCOPE;
 		EList<Scope> scopes = scopedElement.getScopes();
@@ -207,7 +211,7 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 	 */
 	protected IScope getUnnamedTopLevelScope(final EObject context, EReference reference) {
 		List<EObject> scopeCandidates = Lists.newArrayList();
-		ScopedElement scopedElement = getScopedElement(context);
+		ScopedElement scopedElement = utils.getScopedElement(context);
 		if (scopedElement == null)
 			return IScope.NULLSCOPE;
 		EList<Scope> scopes = scopedElement.getScopes();
@@ -227,33 +231,5 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 		return Scopes.scopeFor(scopeCandidates, scope);
 	}
 
-	protected SpecificationElement getContextElement(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
-
-		if (provider == null) {
-			return EcoreUtil2.getContainerOfType(context, SpecificationElement.class);
-		} else {
-			return (SpecificationElement) provider.getElement();
-		}
-	}
 
-	protected ScopedElement getScopedElement(EObject context) {
-		ScopedElement scopedElement = EcoreUtil2.getContainerOfType(context, ScopedElement.class);
-		if (EcoreUtil.getRootContainer(context) instanceof StatechartSpecification && scopedElement != null)
-			return scopedElement;
-		return getStatechart(context);
-	}
-
-	protected Statechart getStatechart(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
-
-		if (provider == null) {
-			return EcoreUtil2.getContainerOfType(context, Statechart.class);
-		} else {
-			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
-					SGraphPackage.Literals.STATECHART);
-		}
-	}
 }