Commit 230f3463 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

improved performance and added todo about strange behavior

parent d5a2a5c6
Loading
Loading
Loading
Loading
+28 −6
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package de.ugoe.cs.swe.scoping;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.antlr.misc.MultiMap;
import org.eclipse.emf.ecore.EObject;
@@ -29,6 +30,8 @@ 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;
import com.google.inject.Provider;

@@ -42,7 +45,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 ListMultimap<Resource, ImportData> imports = ArrayListMultimap.create();
	private static final SetMultimap<Resource, ImportData> imports = HashMultimap.create();
	private static final SetMultimap<TTCN3Module, TTCN3Module> importedFrom = HashMultimap.create();

	@Inject
	private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
@@ -64,14 +68,15 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		return getImportedScope(resource, null);
	}
	
	// TODO: figure out why the code commented out resolves more references 
	// but breaks checking if a variable is referenced elsewhere (checkZeroReferencedModuleDefinitions)
	protected IScope getImportedScope(final Resource resource, final EReference reference) {
		List<String> importsString = getImports(resource);
		List<IEObjectDescription> objects = Lists.newArrayList();
		

		if (TTCN3StatisticsProvider.getInstance().isParsingCompleted() && staticScope.containsKey(resource)) {
			return staticScope.get(resource);
		} else {
		} else /*if (TTCN3StatisticsProvider.getInstance().isParsingCompleted()) */ {
			if (!importsString.isEmpty()) {
				for (Resource r : resource.getResourceSet().getResources()) {
					ISelectable descriptions = getAllDescriptions(r);
@@ -84,6 +89,12 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
							if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getTTCN3Module(), e.getEClass())) {
								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));
								} else {
									importedFrom.put(importedModule, TTCN3StatisticsProvider.getInstance().getModule(resource));
								}
							} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getGroupDef(), e.getEClass())) {
								d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
								objects.add(d);
@@ -143,6 +154,7 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
						// add exported objects to import list
						if (TTCN3StatisticsProvider.getInstance().isParsingCompleted() && module != null && objects.size() > 0) {
							TTCN3Module importedModule = (TTCN3Module) module.getEObjectOrProxy();
							
							ImportData m = new ImportData(importedModule.getName(), null);
							for (ImportData d : imports.get(resource)) {
								if (d.equals(m)) {
@@ -163,6 +175,8 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
				staticScope.put(resource, scope);
			}
			return scope;
//		} else {
//			return IScope.NULLSCOPE;
		}
	}

@@ -204,7 +218,7 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		return new MultimapBasedSelectable(allDescriptions);
	}
	
	public List<ImportData> importedObjects(final Resource resource) {
	public Set<ImportData> importedObjects(final Resource resource) {
		if (imports.containsKey(resource)) {
			return imports.get(resource);
		} else {
@@ -212,7 +226,15 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
			if (imports.containsKey(resource)) {
				return imports.get(resource);
			}
			return Lists.newArrayList();
			return Sets.newHashSet();
		}
	}
	
	public Set<TTCN3Module> getImportingModules(TTCN3Module module) {
		if (importedFrom.containsKey(module)) {
			return importedFrom.get(module);
		} else {
			return Sets.newHashSet();
		}
	}
	
+23 −10
Original line number Diff line number Diff line
@@ -624,16 +624,29 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		
		// TODO: improve performance (hit list for resources which are often called successfully?)
		if (!found) {
			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)) {
			val TTCN3GlobalScopeProvider scopeProvider = globalScopeProvider as TTCN3GlobalScopeProvider
			if (scopeProvider == null) { return true }			
			
			val modulesImportingThis = scopeProvider.getImportingModules(parent);
			
			for (m : modulesImportingThis) {
				if (m.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
@@ -1048,7 +1061,7 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		val TTCN3GlobalScopeProvider scopeProvider = globalScopeProvider as TTCN3GlobalScopeProvider
		if (scopeProvider == null) { return }
		
		val List<ImportData> data = scopeProvider.importedObjects(module.eResource);
		val Set<ImportData> data = scopeProvider.importedObjects(module.eResource);
		
		for (d : data) {
			if (d.module == null) {