Commit 1f8fbbfe authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ added initial support for imported scoping in editor (live mode)

  - needs some refinement due to duplication, efficiency
  - needs to be deactivated in commandline mode (already implemented)
parent 6da2488a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ public class T3Q {
		LoggingInterface logger = new LoggingInterface(activeProfile.getLoggingConfiguration());
		logger.setMaximumLogLevel(logLevel);
		TTCN3ResourceProvider resourceProvider = new TTCN3ResourceProvider(inputPaths, logger, activeProfile);
		TTCN3GlobalScopeProvider.LIVE = false;
		resourceProvider.loadResources();
		//TODO: check if it has to be exclusive
		if (!this.isGenerateLocalDependencies()) {
+155 −2
Original line number Diff line number Diff line
@@ -2,19 +2,29 @@ package de.ugoe.cs.swe.scoping;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptionsProvider;
import org.eclipse.xtext.resource.ISelectable;
import org.eclipse.xtext.resource.XtextResourceSet;
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.MultimapBasedScope;
import org.eclipse.xtext.scoping.impl.MultimapBasedSelectable;

import com.google.common.base.Predicate;
import com.google.common.collect.HashMultimap;
@@ -23,12 +33,16 @@ 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.inject.Inject;

import de.ugoe.cs.swe.common.CommonHelper;
import de.ugoe.cs.swe.common.MiscTools;
import de.ugoe.cs.swe.common.PreAnalyzer;
import de.ugoe.cs.swe.common.logging.LoggingInterface;
import de.ugoe.cs.swe.common.logging.LoggingInterface.MessageClass;
import de.ugoe.cs.swe.tTCN3.ImportDef;
import de.ugoe.cs.swe.tTCN3.TTCN3Module;
import de.ugoe.cs.swe.tTCN3.TTCN3Package;
import de.ugoe.cs.swe.validation.TTCN3StatisticsProvider;

public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
@@ -51,6 +65,13 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
	// array[0] = line, array[1] = column
	public static final Map<String, List<String[]>> FOUND_TABS = Collections.synchronizedMap(Maps.<String, List<String[]>> newHashMap());

	public static boolean LIVE = true;		

	@Inject
	IResourceDescriptionsProvider rdp;

	@Inject
    XtextResourceSet resourceSet;
	
	@Override
	public IScope getScope(Resource resource, final EReference reference, Predicate<IEObjectDescription> filter) {
@@ -87,11 +108,20 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
					STATIC_SCOPE.put(resource, scope);
				}
			}
			if (LIVE) {
				TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(false);
			}

			return scope;
		} else {
			if (LIVE) {
				reset(resource);
				return getImportedScope(resource, reference);
			} else {
				return IScope.NULLSCOPE;
			}
			
		}
	}

	public static void printImportedModuleNames(boolean fileNames, final LoggingInterface logger) {
@@ -156,5 +186,128 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		logger.logInformation(uri, node.getStartLine(), node.getEndLine(), MessageClass.GENERAL,
				"Imported module \"" + name + "\" cannot be resolved!", "1.18, " + MiscTools.getMethodName());
	}
	//Adapted from TTCN3ResourceProvider
	public void reset(final Resource resource) {
		TTCN3GlobalScopeProvider.RESOURCES.clear();
		TTCN3GlobalScopeProvider.NAMED_MODULES.clear();
		TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.clear();
		TTCN3GlobalScopeProvider.IMPORTS.clear();
		TTCN3GlobalScopeProvider.IMPORTED_FROM.clear();
		TTCN3GlobalScopeProvider.IMPORTED_RESOURCES.clear();
		TTCN3GlobalScopeProvider.STATIC_SCOPE.clear();

		for (IResourceDescription d : rdp.getResourceDescriptions(resourceSet).getAllResourceDescriptions()) {
			Resource r = resource.getResourceSet().getResource(d.getURI(), true);
			TTCN3Module module = CommonHelper.getModule(r);
			if (!TTCN3GlobalScopeProvider.NAMED_MODULES.containsKey(module.getName())) {
				TTCN3GlobalScopeProvider.RESOURCES.add(r);
				TTCN3GlobalScopeProvider.NAMED_MODULES.put(module.getName(), module);
			}
		}

		for (IResourceDescription d : rdp.getResourceDescriptions(resourceSet).getAllResourceDescriptions()) {
			Resource r = resource.getResourceSet().getResource(d.getURI(), true);
			TTCN3GlobalScopeProvider.initExportedObjects(r);
		}
		
		for (int i = 0; i < TTCN3GlobalScopeProvider.RESOURCES.size(); i++) {
			PreAnalyzer p = new PreAnalyzer(TTCN3GlobalScopeProvider.RESOURCES.get(i));
			try {
				p.call();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
			
		TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true);
	}

	//Adapted from FileParser
	public static void initExportedObjects(Resource resource) {
		List<IEObjectDescription> objects = Lists.newArrayList();
		
		List<IEObjectDescription> exports = Lists.newArrayList(internalGetAllDescriptions(resource).getExportedObjects());
		int size = exports.size();
		
		for (int i = 0; i < size; i++) {
			IEObjectDescription e = exports.get(i);
			IEObjectDescription d = null;
			
			if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getTTCN3Module(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getGroupDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getEnumDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getEnumeration(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getComponentDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getPortDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getRecordDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getSetDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getSubTypeDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getUnionDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getRecordOfDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getSetOfDefNamed(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getSignatureDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getBaseTemplate(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getFunctionRef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getAltstepDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getTestcaseDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getSingleConstDef(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			} else if (EcoreUtil2.isAssignableFrom(TTCN3Package.eINSTANCE.getModuleParameter(), e.getEClass())) {
				d = EObjectDescription.create(e.getQualifiedName().getLastSegment(), e.getEObjectOrProxy());
				objects.add(d);
			}
		}	
		
		synchronized (TTCN3GlobalScopeProvider.EXPORTED_OBJECTS) {
			TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.putAll(resource, objects);
		}
		
	}
	
	//Adapted from FileParser
	private static ISelectable internalGetAllDescriptions(final Resource resource) {
		Iterable<EObject> allContents = new Iterable<EObject>() {
			public Iterator<EObject> iterator() {
				return EcoreUtil.getAllContents(resource, false);
			}
		};
		Iterable<IEObjectDescription> allDescriptions = Scopes.scopedElementsFor(allContents);
		return new MultimapBasedSelectable(allDescriptions);
	}		
	
}