Sfoglia il codice sorgente

Avoid shadowing in global scope provider (#2154)

Thomas Kutz 7 anni fa
parent
commit
0a1932a6b1

+ 7 - 0
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/SGenRuntimeModule.java

@@ -11,11 +11,13 @@
 package org.yakindu.sct.generator.genmodel;
 
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
 import org.eclipse.xtext.serializer.tokens.ICrossReferenceSerializer;
 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.generator.genmodel.naming.GenModelQualifiedNameProvider;
+import org.yakindu.sct.generator.genmodel.scoping.SGenGlobalScopeProvider;
 import org.yakindu.sct.generator.genmodel.serializer.SGenCrossReferenceSerializer;
 import org.yakindu.sct.generator.genmodel.typesystem.SGenTypeInferrer;
 
@@ -46,4 +48,9 @@ public class SGenRuntimeModule extends org.yakindu.sct.generator.genmodel.Abstra
 	public Class<? extends ICrossReferenceSerializer> bindICrossReferenceSerializer() {
 		return SGenCrossReferenceSerializer.class;
 	}
+	
+	@Override
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return SGenGlobalScopeProvider.class;
+	};
 }

+ 57 - 0
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenGlobalScopeProvider.java

@@ -0,0 +1,57 @@
+/**
+ * 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.generator.genmodel.scoping;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.resource.IContainer;
+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.SimpleScope;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+/**
+ * 
+ * @author kutz - Initial contribution and API
+ *
+ */
+public class SGenGlobalScopeProvider extends DefaultGlobalScopeProvider {
+	
+	/**
+	 * Overidden to avoid scope nesting which comes with shadowing problems when
+	 * potential elements in scope have the same name
+	 */
+	@Override
+	protected IScope getScope(IScope parent, final Resource context, boolean ignoreCase, EClass type, Predicate<IEObjectDescription> filter) {
+		IScope result = parent;
+		if (context == null || context.getResourceSet() == null)
+			return result;
+		List<IContainer> containers = Lists.newArrayList(getVisibleContainers(context));
+		Collections.reverse(containers);
+		List<IEObjectDescription> objectDescriptions = new ArrayList<IEObjectDescription>();
+		Iterator<IContainer> iter = containers.iterator();
+		while (iter.hasNext()) {
+			IContainer container = iter.next();
+			result = createContainerScopeWithContext(context, IScope.NULLSCOPE, container, filter, type, ignoreCase);
+			Iterables.addAll(objectDescriptions, result.getAllElements());
+		}
+		return new SimpleScope(objectDescriptions);
+	}
+}