Browse Source

Issue pro 1157, headless scoping (#1851)

* remove error handler out of scope provider

* ensure context resource is properly used

* trivial format
Johannes Dicks 7 years ago
parent
commit
c1b0aa8980

+ 103 - 104
plugins/org.yakindu.base.expressions/src/org/yakindu/base/expressions/scoping/AbstractLibraryGlobalScopeProvider.java

@@ -1,105 +1,104 @@
-/** 
- * Copyright (c) 2017 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.base.expressions.scoping;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.resource.IResourceDescription;
-import org.eclipse.xtext.resource.IResourceServiceProvider;
-import org.eclipse.xtext.resource.impl.EObjectDescriptionLookUp;
-import org.eclipse.xtext.scoping.IGlobalScopeProvider;
-import org.eclipse.xtext.scoping.IScope;
-import org.eclipse.xtext.scoping.Scopes;
-import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider;
-import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
-
-import com.google.common.base.Predicate;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
-/**
- * 
- * @author andreas muelder - Initial contribution and API
- * 
- */
-public abstract class AbstractLibraryGlobalScopeProvider extends AbstractGlobalScopeProvider
-		implements IGlobalScopeProvider {
-
-	@Inject
-	private IResourceServiceProvider.Registry serviceProviderRegistry;
-
-	protected abstract Set<URI> getLibraries(Resource context);
-
-	protected Iterable<URI> getValidLibraries(Resource context) {
-		return Iterables.filter(getLibraries(context), new Predicate<URI>() {
-			@Override
-			public boolean apply(URI input) {
-				return URIConverter.INSTANCE.exists(input, Collections.EMPTY_MAP);
-			}
-		});
-	}
-
-	private LoadingCache<URI, Iterable<IEObjectDescription>> libraryCache;
-
-	public AbstractLibraryGlobalScopeProvider() {
-		libraryCache = CacheBuilder.newBuilder().build(new CacheLoader<URI, Iterable<IEObjectDescription>>() {
-			@Override
-			public Iterable<IEObjectDescription> load(URI key) throws Exception {
-				return getDescriptions(key);
-			}
-		});
-	}
-
-	@Override
-	public IScope getScope(Resource context, EReference reference, Predicate<IEObjectDescription> filter) {
-		List<IEObjectDescription> descriptions = Lists.newArrayList();
-		for (URI uri : getValidLibraries(context)) {
-			try {
-				Iterables.addAll(descriptions, libraryCache.get(uri));
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-		return SelectableBasedScope.createScope(IScope.NULLSCOPE, new EObjectDescriptionLookUp(descriptions),
-				reference.getEReferenceType(), isIgnoreCase(reference));
-	}
-
-	protected Iterable<IEObjectDescription> getDescriptions(URI uri) {
-		List<IEObjectDescription> result = Lists.newArrayList();
-		ResourceSet set = new ResourceSetImpl();
-		Resource resource = set.getResource(uri, true);
-		IResourceServiceProvider resourceServiceProvider = serviceProviderRegistry.getResourceServiceProvider(uri);
-		if (resourceServiceProvider == null) {
-			Iterables.addAll(result, Scopes.scopedElementsFor(Lists.newArrayList(resource.getAllContents())));
-		} else {
-			IResourceDescription resourceDescription = resourceServiceProvider.getResourceDescriptionManager()
-					.getResourceDescription(resource);
-			Iterables.addAll(result, resourceDescription.getExportedObjects());
-		}
-		resource.unload();
-		return result;
-	}
-
+/** 
+ * Copyright (c) 2017 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.base.expressions.scoping;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.IResourceServiceProvider;
+import org.eclipse.xtext.resource.impl.EObjectDescriptionLookUp;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
+import org.eclipse.xtext.scoping.IScope;
+import org.eclipse.xtext.scoping.Scopes;
+import org.eclipse.xtext.scoping.impl.AbstractGlobalScopeProvider;
+import org.eclipse.xtext.scoping.impl.SelectableBasedScope;
+
+import com.google.common.base.Predicate;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public abstract class AbstractLibraryGlobalScopeProvider extends AbstractGlobalScopeProvider
+		implements IGlobalScopeProvider {
+
+	@Inject
+	private IResourceServiceProvider.Registry serviceProviderRegistry;
+
+	protected abstract Set<URI> getLibraries(Resource context);
+
+	protected Iterable<URI> getValidLibraries(Resource context) {
+		return Iterables.filter(getLibraries(context), new Predicate<URI>() {
+			@Override
+			public boolean apply(URI input) {
+				return URIConverter.INSTANCE.exists(input, Collections.EMPTY_MAP);
+			}
+		});
+	}
+
+	private Cache<URI, Iterable<IEObjectDescription>> libraryCache;
+
+	public AbstractLibraryGlobalScopeProvider() {
+		libraryCache = CacheBuilder.newBuilder().<URI, Iterable<IEObjectDescription>> build();
+	}
+
+	@Override
+	public IScope getScope(Resource context, EReference reference, Predicate<IEObjectDescription> filter) {
+		List<IEObjectDescription> descriptions = Lists.newArrayList();
+		for (URI uri : getValidLibraries(context)) {
+			try {
+				Iterables.addAll(descriptions, libraryCache.get(uri, new Callable<Iterable<IEObjectDescription>>() {
+
+					@Override
+					public Iterable<IEObjectDescription> call() throws Exception {
+						return getDescriptions(context, uri);
+					}
+				}));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return SelectableBasedScope.createScope(IScope.NULLSCOPE, new EObjectDescriptionLookUp(descriptions),
+				reference.getEReferenceType(), isIgnoreCase(reference));
+	}
+
+	protected Iterable<IEObjectDescription> getDescriptions(Resource context, URI uri) {
+		List<IEObjectDescription> result = Lists.newArrayList();
+		ResourceSet set = context.getResourceSet();
+		Resource resource = set.getResource(uri, true);
+		IResourceServiceProvider resourceServiceProvider = serviceProviderRegistry.getResourceServiceProvider(uri);
+		if (resourceServiceProvider == null) {
+			Iterables.addAll(result, Scopes.scopedElementsFor(Lists.newArrayList(resource.getAllContents())));
+		} else {
+			IResourceDescription resourceDescription = resourceServiceProvider.getResourceDescriptionManager()
+					.getResourceDescription(resource);
+			Iterables.addAll(result, resourceDescription.getExportedObjects());
+		}
+		resource.unload();
+		return result;
+	}
+
 }

+ 0 - 40
plugins/org.yakindu.sct.domain.generic.resource/src/org/yakindu/sct/domain/generic/resource/HeadlessErrorHandler.java

@@ -1,40 +0,0 @@
-/** 
- * Copyright (c) 2017 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.domain.generic.resource;
-
-import org.yakindu.sct.model.stext.scoping.STextScopeProvider.ErrorHandlerDelegate;
-
-/**
- * 
- * @author johannes dicks - Initial contribution and API
- * 
- */
-public class HeadlessErrorHandler<T> extends ErrorHandlerDelegate<T> {
-	@Override
-	public T handle(Object[] params, Throwable throwable) {
-		/// XXX: has to be an instance of Error because of
-		/// org.eclipse.xtext.util.PolymorphicDispatcher.invoke(Object...)
-		throw new HeadlessError(throwable);
-		// return delegate.handle(params, throwable);
-
-	}
-
-	public static class HeadlessError extends Error {
-
-		private static final long serialVersionUID = -670534113540254487L;
-
-		public HeadlessError(Throwable throwable) {
-			super(throwable);
-		}
-
-	}
-
-}

+ 0 - 2
plugins/org.yakindu.sct.domain.generic.resource/src/org/yakindu/sct/domain/generic/resource/ResourceModuleProvider.java

@@ -16,7 +16,6 @@ import org.yakindu.sct.domain.extension.IDomain;
 import org.yakindu.sct.domain.extension.IModuleProvider;
 import org.yakindu.sct.model.stext.STextRuntimeModule;
 import org.yakindu.sct.model.stext.resource.StextResource;
-import org.yakindu.sct.model.stext.scoping.STextScopeProvider.ErrorHandlerDelegate;
 import org.yakindu.sct.model.stext.ui.STextUiModule;
 import org.yakindu.sct.model.stext.ui.internal.STextActivator;
 
@@ -38,7 +37,6 @@ public class ResourceModuleProvider implements IModuleProvider {
 
 				@Override
 				public void configure(Binder binder) {
-					binder.bind(ErrorHandlerDelegate.class).to(HeadlessErrorHandler.class);
 				}
 			});
 		}

+ 2 - 1
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/execution/GeneratorExecutorLookup.java

@@ -69,7 +69,8 @@ public class GeneratorExecutorLookup {
 			set.getResources().add(((AbstractTypeSystem) typeSystem).getResource());
 
 			// XXX: avoid resolving the whole resource set, because there might
-			// be models with different domains, we have to ensure that just the models related to the current entry are resolved.
+			// be models with different domains, we have to ensure that just the
+			// models related to the current entry are resolved
 			EcoreUtil.resolveAll(entry);
 			EcoreUtil.resolveAll(entry.getElementRef());
 			EcoreUtil.resolveAll(((AbstractTypeSystem) typeSystem).getResource());

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

@@ -13,8 +13,6 @@ package org.yakindu.sct.model.stext.scoping;
 
 import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EReference;
@@ -30,7 +28,6 @@ import org.eclipse.xtext.scoping.impl.FilteringScope;
 import org.eclipse.xtext.scoping.impl.ImportNormalizer;
 import org.eclipse.xtext.scoping.impl.ImportScope;
 import org.eclipse.xtext.scoping.impl.SimpleScope;
-import org.eclipse.xtext.util.PolymorphicDispatcher.ErrorHandler;
 import org.yakindu.base.expressions.expressions.ElementReferenceExpression;
 import org.yakindu.base.expressions.expressions.Expression;
 import org.yakindu.base.expressions.expressions.FeatureCall;
@@ -55,7 +52,6 @@ import org.yakindu.sct.model.stext.stext.InternalScope;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
-import com.google.inject.Injector;
 
 /**
  * 
@@ -74,45 +70,6 @@ public class STextScopeProvider extends ExpressionsScopeProvider {
 	private IQualifiedNameProvider nameProvider;
 	@Inject
 	private ContextPredicateProvider predicateProvider;
-	@Inject
-	private Injector injector;
-	
-	public static class ErrorHandlerDelegate<T> implements ErrorHandler<T> {
-
-		protected ErrorHandler<T> delegate;
-
-		public static final Log LOG = LogFactory.getLog(STextScopeProvider.class);
-
-		public T handle(Object[] params, Throwable throwable) {
-			if (throwable instanceof NoSuchMethodException) {
-				LOG.debug("Error in scope method, using fallback", throwable);
-			} else {
-				LOG.warn("Error in scope method, using fallback", throwable);
-			}
-			return delegate.handle(params, throwable);
-		}
-
-		public void setDelegate(ErrorHandler<T> delegate) {
-			this.delegate = delegate;
-		}
-
-	}
-	
-	@Override
-	public IScope getScope(EObject context, EReference reference) {
-		ErrorHandler<IScope> originalHandler = getErrorHandler();
-		try {
-			ErrorHandlerDelegate instance = injector.getInstance(ErrorHandlerDelegate.class);
-			instance.setDelegate(originalHandler);
-			setErrorHandler(instance);
-			IScope scope = super.getScope(context, reference);
-			return scope;
-		} catch (Throwable t) {
-				throw t;
-		} finally {
-			setErrorHandler(originalHandler);
-		}
-	}
 	
 	public IScope scope_ActiveStateReferenceExpression_value(EObject context, EReference reference) {
 		Statechart statechart = getStatechart(context);