Commit 50c110a4 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

hopefully fixed concurrent exception

parent 71a56c25
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import com.google.common.base.Predicate;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
@@ -40,8 +42,8 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
	// TODO: do not use this map when using the xtext eclipse editor
	private static final Map<Resource, IScope> staticScope = Maps.newHashMap();
	
	private static final SetMultimap<Resource, ImportData> imports = HashMultimap.create();
	private static final SetMultimap<TTCN3Module, TTCN3Module> importedFrom = HashMultimap.create();
	private static final SetMultimap<Resource, ImportData> imports = Multimaps.synchronizedSetMultimap(HashMultimap.<Resource, ImportData>create());
	public static final Multimap<TTCN3Module, TTCN3Module> IMPORTED_FROM = Multimaps.synchronizedSetMultimap(HashMultimap.<TTCN3Module, TTCN3Module>create());
	
	public static final Set<Resource> RESOURCES = Sets.newHashSet();
	
@@ -87,10 +89,12 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
								d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
								objects.add(d);
								TTCN3Module importedModule = (TTCN3Module) module.getEObjectOrProxy();
								if (importedFrom.containsKey(importedModule)) {
									importedFrom.get(importedModule).add(TTCN3StatisticsProvider.getInstance().getModule(resource));
								synchronized (IMPORTED_FROM) {
									if (IMPORTED_FROM.containsKey(importedModule)) {
										IMPORTED_FROM.get(importedModule).add(TTCN3StatisticsProvider.getInstance().getModule(resource));
									} else {
									importedFrom.put(importedModule, TTCN3StatisticsProvider.getInstance().getModule(resource));
										IMPORTED_FROM.put(importedModule, TTCN3StatisticsProvider.getInstance().getModule(resource));
									}
								}
							} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getGroupDef(), e.getEClass())) {
								d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
@@ -227,12 +231,6 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		}
	}
	
	public Set<TTCN3Module> getImportingModules(TTCN3Module module) {
		if (importedFrom.containsKey(module)) {
			return importedFrom.get(module);
		} else {
			return Sets.newHashSet();
		}
	}

	
}
+11 −28
Original line number Diff line number Diff line
@@ -79,6 +79,8 @@ import org.eclipse.xtext.validation.EValidatorRegistrar
import static extension de.ugoe.cs.swe.common.TTCN3ReferenceHelper.*
import static extension de.ugoe.cs.swe.common.TTCN3ScopeHelper.*
import static extension org.eclipse.xtext.EcoreUtil2.*
import static extension de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider.*
import java.util.Iterator

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -761,39 +763,20 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
	
	// TODO: figure out another way to find referenced objects
	private def boolean isUnreferenced(EObject type, TTCN3Module parent) {
		stopwatch.start

		val target = newHashSet(type);
		var boolean found = parent.isReferenced2(target)

		stopwatch.stop

		// TODO: improve performance (hit list for resources which are often called successfully?)
		if (!found) {

			val TTCN3GlobalScopeProvider scopeProvider = globalScopeProvider as TTCN3GlobalScopeProvider
			if (scopeProvider == null) {
				return true
			}

			val modulesImportingThis = scopeProvider.getImportingModules(parent);

			for (m : modulesImportingThis) {
				if (m.isReferenced2(target)) {
			synchronized (IMPORTED_FROM) {
				if (IMPORTED_FROM.containsKey(parent)) {
					val list = IMPORTED_FROM.get(parent)
					for (i : 0 .. list.size -1) {
						if (list.get(i).isReferenced2(target)) {
							return false
						}
					}					

//			for (r : parent.resourceSet.resources) {
//				val TTCN3Module currentBase = statistics.getModule(r)
//
//				// only consider modules that are importing the current module
//				if (statistics.isBaseModuleImported(parent, currentBase.name)) {
//					if (currentBase.isReferenced2(target)) {
//						return false
//					}
//				}
//			}
				} 
			}
		}

		return !found