Commit 886cdb95 authored by Daniel Honsel's avatar Daniel Honsel
Browse files

collect data for unused import checks

parent 9c40ffc2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="de.ugoe.cs.swe.T3Q.T3Q"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--config config/t3q.cfg --profile defaultProfile resources/IMS_PART4_IWD_14wk37"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="--config config/t3q.cfg --profile defaultProfile resources/checkNoUnusedImports"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="de.ugoe.cs.swe.T3Q"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms256m -Xmx4g"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
+70 −0
Original line number Diff line number Diff line
package de.ugoe.cs.swe.scoping;

import java.util.List;

import org.eclipse.xtext.resource.IEObjectDescription;

import com.google.common.collect.Lists;

import de.ugoe.cs.swe.tTCN3.ImportDef;
import de.ugoe.cs.swe.tTCN3.TTCN3Module;

//TODO: consider restrictions of the imported scope
public class ImportData {
	private String name;
	private ImportDef importDef;
	private TTCN3Module module;
	private List<IEObjectDescription> exportedObjects;
	
	public ImportData(String name, ImportDef importDef) {
		super();
		this.name = name;
		this.importDef = importDef;
		exportedObjects = Lists.newArrayList();
	}

	public TTCN3Module getModule() {
		return module;
	}

	public void setModule(TTCN3Module module) {
		this.module = module;
	}

	public String getName() {
		return name;
	}

	public ImportDef getImportDef() {
		return importDef;
	}

	public List<IEObjectDescription> getExportedObjects() {
		return exportedObjects;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ImportData other = (ImportData) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
+42 −7
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.antlr.misc.MultiMap;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
@@ -21,8 +22,13 @@ import org.eclipse.xtext.scoping.impl.MultimapBasedSelectable;
import org.eclipse.xtext.util.IResourceScopeCache;

import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ListMultimap;
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.inject.Inject;
import com.google.inject.Provider;

@@ -36,6 +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 ListMultimap<Resource, ImportData> imports = ArrayListMultimap.create();

	@Inject
	private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;

@@ -53,10 +61,10 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
	}

	protected IScope getImportedScope(final Resource resource, final EReference reference) {
		ISelectable allDescriptions = getAllDescriptions(resource);
		List<String> imports = getImports(allDescriptions);
		List<String> importsString = getImports(resource);
		List<IEObjectDescription> objects = Lists.newArrayList();
		

		if (TTCN3StatisticsProvider.getInstance().isParsingCompleted() && staticScope.containsKey(resource)) {
			return staticScope.get(resource);
		} else {
@@ -65,7 +73,7 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
					ISelectable descriptions = getAllDescriptions(r);
					IEObjectDescription module = descriptions.getExportedObjectsByType(TTCN3Package.eINSTANCE.getTTCN3Module()).iterator()
							.next();
					if (imports.contains(((TTCN3Module) module.getEObjectOrProxy()).getName())) {
					if (importsString.contains(((TTCN3Module) module.getEObjectOrProxy()).getName())) {
						for (IEObjectDescription e : descriptions.getExportedObjects()) {
							IEObjectDescription d = null;

@@ -128,6 +136,14 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
								objects.add(d);
							}
						}
						// add exported objects to import list
						if (TTCN3StatisticsProvider.getInstance().isParsingCompleted() && module != null && objects.size() > 0) {
							ImportData m = new ImportData(((TTCN3Module) module.getEObjectOrProxy()).getName(), null);
							for (ImportData d : imports.get(resource)) {
								if (d.equals(m))
									d.getExportedObjects().addAll(objects);
							}
						}
					}
				}
			}
@@ -140,11 +156,22 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		}
	}

	protected List<String> getImports(final ISelectable allDescriptions) {
	protected List<String> getImports(final Resource resource) {
		ISelectable allDescriptions = getAllDescriptions(resource);
		List<String> list = Lists.newArrayList();
		
		boolean exists = imports.containsKey(resource);
		
		for (IEObjectDescription d : allDescriptions.getExportedObjectsByType(TTCN3Package.eINSTANCE.getImportDef())) {
			list.add(((ImportDef) d.getEObjectOrProxy()).getName());
			ImportDef def = (ImportDef) d.getEObjectOrProxy();
			list.add(def.getName());
			
			if (!exists && TTCN3StatisticsProvider.getInstance().isParsingCompleted() && imports.containsKey(resource)) {
				imports.get(resource).add(new ImportData(def.getName(), def));
			} else if (!exists && TTCN3StatisticsProvider.getInstance().isParsingCompleted() && !imports.containsKey(resource)) {
				imports.put(resource, new ImportData(def.getName(), def));
			}
			
		}
		return list;
	}
@@ -167,4 +194,12 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		return new MultimapBasedSelectable(allDescriptions);
	}
	
	public List<ImportData> importedObjects(final Resource resource) {
		if (imports.containsKey(resource)) {
			return imports.get(resource);
		} else {
			return Lists.newArrayList();
		}
	}
	
}
+19 −2
Original line number Diff line number Diff line
@@ -73,6 +73,10 @@ 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 org.eclipse.xtext.scoping.IGlobalScopeProvider
import com.google.inject.Inject
import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider
import de.ugoe.cs.swe.scoping.ImportData

class CheckDefinitionComeFirstParameter {
	public boolean hasOtherDefinitions
@@ -86,6 +90,9 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
	final Stopwatch stopwatch = Stopwatch.createUnstarted();
	final TTCN3StatisticsProvider statistics = TTCN3StatisticsProvider.getInstance
	
	@Inject
	private IGlobalScopeProvider globalScopeProvider;	
	
	@Check
	def checkNoGotoStatements(GotoStatement goto) {
		goto.checkNoLabelsOrGotoStatements
@@ -1031,6 +1038,16 @@ class CodeStyleValidator extends AbstractDeclarativeValidator {
		}
	}
	
	@Check
	def checkNoUnusedImports(TTCN3Module module) {
		val TTCN3GlobalScopeProvider scopeProvider = globalScopeProvider as TTCN3GlobalScopeProvider
		if (scopeProvider == null) { return }
		
		val List<ImportData> data = scopeProvider.importedObjects(module.eResource);
		
		//TODO: implement validations
	}	
	
	override register(EValidatorRegistrar registrar) {
		//not needed for classes used as ComposedCheck
	}