ソースを参照

Merge pull request #2107 from Yakindu/improving_stext_extensions

Created Interface for Extensions
jthoene 7 年 前
コミット
b0c6caa904

+ 6 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/STextRuntimeModule.java

@@ -25,6 +25,8 @@ import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
 import org.yakindu.base.types.typesystem.GenericTypeSystem;
 import org.yakindu.base.types.typesystem.ITypeSystem;
 import org.yakindu.sct.model.sgraph.resource.SCTLinker;
+import org.yakindu.sct.model.stext.extensions.ISCTExtensions;
+import org.yakindu.sct.model.stext.extensions.STextExtensions;
 import org.yakindu.sct.model.stext.inferrer.STextTypeInferrer;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.resource.SCTResourceDescriptionStrategy;
@@ -105,6 +107,10 @@ public class STextRuntimeModule extends org.yakindu.sct.model.stext.AbstractSTex
 	public Class<? extends ITypeSystemInferrer> bindITypeSystemInferrer() {
 		return STextTypeInferrer.class;
 	}
+	
+	public Class<? extends ISCTExtensions> bindISCTExtensions() {
+		return STextExtensions.class;
+	}
 
 	@Override
 	public Class<? extends ITransientValueService> bindITransientValueService() {

+ 32 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/extensions/ISCTExtensions.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2018 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     committers of YAKINDU - initial API and implementation
+ */
+package org.yakindu.sct.model.stext.extensions;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.yakindu.sct.model.sgraph.ScopedElement;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.Statechart;
+
+/**
+ * @author jonathan thoene - Initial contribution and API
+ * 
+ */
+
+public interface ISCTExtensions {
+	public SpecificationElement getContextElement(EObject context);
+	
+	public ScopedElement getScopedElement(EObject context);
+	
+	public Statechart getStatechart(EObject context);
+	
+	public Statechart getStatechart(final Resource context);
+}

+ 36 - 5
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/extensions/STextExtensions.java

@@ -1,6 +1,17 @@
+/**
+ * Copyright (c) 2018 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     committers of YAKINDU - initial API and implementation
+ */
 package org.yakindu.sct.model.stext.extensions;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.xtext.EcoreUtil2;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
@@ -10,10 +21,14 @@ 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 {
+/**
+ * @author jonathan thoene - Initial contribution and API
+ * 
+ */
+
+public class STextExtensions implements ISCTExtensions{
 	public SpecificationElement getContextElement(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
+		final ContextElementAdapter provider = getContextElementAdapter(context.eResource());
 
 		if (provider == null) {
 			return EcoreUtil2.getContainerOfType(context, SpecificationElement.class);
@@ -30,8 +45,7 @@ public class STextExtensions {
 	}
 
 	public Statechart getStatechart(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
+		final ContextElementAdapter provider = getContextElementAdapter(context.eResource());
 
 		if (provider == null) {
 			return EcoreUtil2.getContainerOfType(context, Statechart.class);
@@ -40,4 +54,21 @@ public class STextExtensions {
 					SGraphPackage.Literals.STATECHART);
 		}
 	}
+
+	public Statechart getStatechart(Resource context) {
+		final ContextElementAdapter provider = getContextElementAdapter(context);
+		if (provider == null || provider.getElement() == null) {
+			return (Statechart) EcoreUtil2.getObjectByType(context.getContents(), SGraphPackage.Literals.STATECHART);
+		} else {
+			if (provider.getElement().eResource() == null)
+				return null;
+			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
+					SGraphPackage.Literals.STATECHART);
+		}
+	}
+
+	protected ContextElementAdapter getContextElementAdapter(Resource context) {
+		return (ContextElementAdapter) EcoreUtil.getExistingAdapter(context,
+				ContextElementAdapter.class);
+	}
 }

+ 5 - 15
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextGlobalScopeProvider.java

@@ -42,9 +42,8 @@ import org.yakindu.base.types.TypesPackage;
 import org.yakindu.base.types.resource.TypedResourceDescriptionStrategy;
 import org.yakindu.base.types.typesystem.ITypeSystem;
 import org.yakindu.sct.domain.extension.DomainRegistry;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
+import org.yakindu.sct.model.stext.extensions.ISCTExtensions;
 import org.yakindu.sct.model.stext.scoping.IPackageImport2URIMapper.PackageImport;
 import org.yakindu.sct.model.stext.stext.ImportScope;
 import org.yakindu.sct.model.stext.stext.StatechartSpecification;
@@ -77,6 +76,8 @@ public class STextGlobalScopeProvider extends ImportUriGlobalScopeProvider {
 	private IPackageImport2URIMapper mapper;
 	@Inject
 	private ImportedResourceCache resourceDescriptionCache;
+	@Inject
+	private ISCTExtensions utils;
 
 	public void setCache(IResourceScopeCache cache) {
 		this.cache = cache;
@@ -87,7 +88,7 @@ public class STextGlobalScopeProvider extends ImportUriGlobalScopeProvider {
 	public IScope getScope(Resource context, EReference reference, Predicate<IEObjectDescription> filter) {
 		IScope parentScope = super.getScope(context, reference, filter);
 		parentScope = new SimpleScope(parentScope, filterPropertiesOfLibrary(context, reference, filter).getAllElements());
-		Statechart statechart = getStatechart(context);
+		Statechart statechart = utils.getStatechart(context);
 		if(statechart == null)
 			return IScope.NULLSCOPE;
 		final String statechartDomain = statechart.getDomainID();
@@ -157,7 +158,7 @@ public class STextGlobalScopeProvider extends ImportUriGlobalScopeProvider {
 				if (specification != null) {
 					return EcoreUtil.getObjectsByType(specification.getScopes(), StextPackage.Literals.IMPORT_SCOPE);
 				} else {
-					Statechart statechart = getStatechart(resource);
+					Statechart statechart = utils.getStatechart(resource);
 					if (statechart == null) {
 						return new LinkedHashSet<>();
 					}
@@ -175,17 +176,6 @@ public class STextGlobalScopeProvider extends ImportUriGlobalScopeProvider {
 		}
 	}
 
-	protected Statechart getStatechart(Resource context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context,
-				ContextElementAdapter.class);
-		if (provider == null || provider.getElement() == null) {
-			return (Statechart) EcoreUtil2.getObjectByType(context.getContents(), SGraphPackage.Literals.STATECHART);
-		} else {
-			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
-					SGraphPackage.Literals.STATECHART);
-		}
-	}
-
 	/**
 	 * Overidden to avoid scope nesting which is not required and slows down because
 	 * of shadowing testing.

+ 2 - 6
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextScopeProvider.java

@@ -16,7 +16,6 @@ import java.util.List;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
 import org.eclipse.xtext.naming.QualifiedName;
@@ -39,18 +38,15 @@ import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer.InferenceResult;
 import org.yakindu.base.types.typesystem.ITypeSystem;
 import org.yakindu.sct.model.sgraph.Region;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Scope;
 import org.yakindu.sct.model.sgraph.ScopedElement;
 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.extensions.ISCTExtensions;
 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;
-import org.yakindu.sct.model.stext.stext.StatechartSpecification;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
@@ -75,7 +71,7 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 	private ContextPredicateProvider predicateProvider;
 	
 	@Inject
-	private STextExtensions utils;
+	protected ISCTExtensions utils;
 
 	public IScope scope_ActiveStateReferenceExpression_value(EObject context, EReference reference) {
 		Statechart statechart = utils.getStatechart(context);

+ 4 - 17
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/StextImportAwareScopeProvider.java

@@ -14,17 +14,14 @@ import java.util.Optional;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.ImportNormalizer;
 import org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
 import org.yakindu.base.types.Package;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Scope;
-import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
+import org.yakindu.sct.model.stext.extensions.ISCTExtensions;
 import org.yakindu.sct.model.stext.scoping.IPackageImport2URIMapper.PackageImport;
 import org.yakindu.sct.model.stext.stext.ImportScope;
 import org.yakindu.sct.model.stext.stext.StateSpecification;
@@ -43,6 +40,8 @@ public class StextImportAwareScopeProvider extends ImportedNamespaceAwareLocalSc
 	@Inject
 	private IPackageImport2URIMapper mapper;
 
+	@Inject ISCTExtensions utils;
+	
 	@Override
 	public IScope getScope(EObject context, EReference reference) {
 		if (context == null)
@@ -63,7 +62,7 @@ public class StextImportAwareScopeProvider extends ImportedNamespaceAwareLocalSc
 		List<ImportNormalizer> importedNamespaceResolvers = Lists.newArrayList();
 		List<ImportScope> importScopes = null;
 		if (context instanceof StateSpecification || context instanceof TransitionSpecification) {
-			importScopes = EcoreUtil2.getAllContentsOfType(getStatechart(context), ImportScope.class);
+			importScopes = EcoreUtil2.getAllContentsOfType(utils.getStatechart(context), ImportScope.class);
 		} else {
 			importScopes = EcoreUtil2.getAllContentsOfType(context, ImportScope.class);
 		}
@@ -100,16 +99,4 @@ public class StextImportAwareScopeProvider extends ImportedNamespaceAwareLocalSc
 			return ((Package) object).getName();
 		return super.getImportedNamespace(object);
 	}
-
-	protected Statechart getStatechart(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
-		if (provider == null || provider.getElement() == null) {
-			return EcoreUtil2.getContainerOfType(context, Statechart.class);
-		} else {
-			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
-					SGraphPackage.Literals.STATECHART);
-		}
-	}
-
 }

+ 4 - 13
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -79,6 +79,7 @@ import org.yakindu.sct.model.sgraph.Vertex;
 import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
 import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
 import org.yakindu.sct.model.sgraph.validation.SGraphJavaValidator;
+import org.yakindu.sct.model.stext.extensions.ISCTExtensions;
 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;
@@ -137,6 +138,8 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 	private String domainID = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 	@Inject(optional = true)
 	private IPackageImport2URIMapper mapper;
+	@Inject
+	protected ISCTExtensions utils;
 
 	@Check(CheckType.FAST)
 	public void checkExpression(VariableDefinition expression) {
@@ -987,23 +990,11 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 		boolean isResponsible = super.isResponsible(context, eObject);
 		if (!isResponsible)
 			return false;
-		Statechart statechart = getStatechart(eObject);
+		Statechart statechart = utils.getStatechart(eObject);
 		if ((statechart != null) && !domainID.equals(statechart.getDomainID())) {
 			return false;
 		}
 		return true;
 	}
 
-	protected Statechart getStatechart(EObject context) {
-		final ContextElementAdapter provider = (ContextElementAdapter) EcoreUtil.getExistingAdapter(context.eResource(),
-				ContextElementAdapter.class);
-		if (provider == null || provider.getElement() == null) {
-			return EcoreUtil2.getContainerOfType(context, Statechart.class);
-		} else {
-			if (provider.getElement().eResource() == null)
-				return null;
-			return (Statechart) EcoreUtil.getObjectByType(provider.getElement().eResource().getContents(),
-					SGraphPackage.Literals.STATECHART);
-		}
-	}
 }