浏览代码

Fixed SText Global Scoping

Andreas Mülder 13 年之前
父节点
当前提交
0ecb394c63

+ 9 - 8
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/STextRuntimeModule.java

@@ -6,6 +6,7 @@ import org.eclipse.xtext.scoping.IScopeProvider;
 import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.scoping.NamespaceLocalScopeResolver;
+import org.yakindu.sct.model.stext.scoping.STextGlobalScopeProvider;
 
 import com.google.inject.Binder;
 import com.google.inject.name.Names;
@@ -13,15 +14,16 @@ import com.google.inject.name.Names;
 import de.itemis.xtext.utils.gmf.resource.InjectMembersLazyLinker;
 
 /**
- * Use this class to register components to be used at runtime / without the Equinox extension registry.
+ * Use this class to register components to be used at runtime / without the
+ * Equinox extension registry.
  */
-public class STextRuntimeModule extends org.yakindu.sct.model.stext.AbstractSTextRuntimeModule {
+public class STextRuntimeModule extends
+		org.yakindu.sct.model.stext.AbstractSTextRuntimeModule {
 
-	// public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider>
-	// bindIGlobalScopeProvider() {
-	// super.bindIGlobalScopeProvider();
-	// return ResourceSetGlobalScopeProvider.class;
-	// }
+	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		super.bindIGlobalScopeProvider();
+		return STextGlobalScopeProvider.class;
+	}
 
 	@Override
 	public Class<? extends ILinker> bindILinker() {
@@ -43,4 +45,3 @@ public class STextRuntimeModule extends org.yakindu.sct.model.stext.AbstractSTex
 	}
 
 }
-

+ 43 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/scoping/STextGlobalScopeProvider.java

@@ -0,0 +1,43 @@
+package org.yakindu.sct.model.stext.scoping;
+
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.FilteringScope;
+import org.eclipse.xtext.scoping.impl.ResourceSetGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.SimpleScope;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+
+/**
+ * This Global Scope provider exposes only Statecharts as global objects to
+ * prevent crossreferencing of Events and Variables between Statecharts.
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class STextGlobalScopeProvider extends ResourceSetGlobalScopeProvider {
+
+	@Inject
+	private DefaultGlobalScopeProvider delegate;
+
+	public IScope getScope(Resource context, EReference reference,
+			Predicate<IEObjectDescription> filter) {
+		IScope scope = super.getScope(context, reference, filter);
+		IScope globalScope = delegate.getScope(context, reference, filter);
+		FilteringScope filteringScope = new FilteringScope(globalScope,
+				new Predicate<IEObjectDescription>() {
+					@Override
+					public boolean apply(IEObjectDescription input) {
+						return input.getEClass() == SGraphPackage.Literals.STATECHART;
+					}
+				});
+		return new SimpleScope(Iterables.concat(scope.getAllElements(),
+				filteringScope.getAllElements()));
+	}
+}