Commit fcfce8fd authored by Daniel Honsel's avatar Daniel Honsel
Browse files

improved init process

parent 53d4afc4
Loading
Loading
Loading
Loading
+107 −2
Original line number Diff line number Diff line
@@ -2,21 +2,38 @@ package de.ugoe.cs.swe.T3Q;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.ISelectable;
import org.eclipse.xtext.resource.SynchronizedXtextResourceSet;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.scoping.Scopes;
import org.eclipse.xtext.scoping.impl.MultimapBasedSelectable;

import com.google.common.collect.Lists;

import de.ugoe.cs.swe.common.MiscTools;
import de.ugoe.cs.swe.scoping.TTCN3GlobalScopeProvider;
import de.ugoe.cs.swe.tTCN3.TTCN3Package;
import de.ugoe.cs.swe.validation.TTCN3StatisticsProvider;

public class FileParser implements Callable<Resource> {
	private final File file;
	private  final IQualifiedNameProvider qualifiedNameProvider;

	public FileParser(final File file) {
	public FileParser(final File file, final IQualifiedNameProvider qualifiedNameProvider) {
		this.file = file;
		this.qualifiedNameProvider = qualifiedNameProvider;
	}

	private Resource parseFile() {
@@ -37,6 +54,8 @@ public class FileParser implements Callable<Resource> {
		String path = file.getAbsolutePath();
		res = resourceSet.getResource(URI.createURI("file:///" + path), true);
		
		initExportedObjects(res);
		
		final long millisEnd = System.currentTimeMillis();
		
		final long millis = millisEnd -  millisStart;
@@ -47,6 +66,92 @@ public class FileParser implements Callable<Resource> {
		return res;
	}
	
	public 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, qualifiedNameProvider);
		return new MultimapBasedSelectable(allDescriptions);
	}		
	
	private 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);
		}
		
	}
	
	@Override
	public Resource call() throws Exception {
		return parseFile();
+11 −2
Original line number Diff line number Diff line
@@ -29,10 +29,10 @@ public class PreAnalyzer implements Callable<Boolean> {
				synchronized (TTCN3GlobalScopeProvider.IMPORTS) {
					if (TTCN3GlobalScopeProvider.IMPORTS.containsKey(this.resource)) {
						TTCN3GlobalScopeProvider.IMPORTS.get(this.resource)
								.add(new ImportData(i.getName(), i, importedModule));
								.add(initializeImportedObjects(i, importedModule));
					} else {
						TTCN3GlobalScopeProvider.IMPORTS.put(this.resource,
								new ImportData(i.getName(), i, importedModule));
								initializeImportedObjects(i, importedModule));
					}
				}

@@ -57,6 +57,15 @@ public class PreAnalyzer implements Callable<Boolean> {
		return true;
	}
	
	private ImportData initializeImportedObjects(final ImportDef def, final TTCN3Module module) {
		ImportData data = new ImportData(def.getName(), def, module);
		
		data.getExportedObjects().addAll(TTCN3GlobalScopeProvider.EXPORTED_OBJECTS.get(module.eResource()));
		
		return data;
	}

	
	@Override
	public Boolean call() throws Exception {
		return findImports();
+9 −2
Original line number Diff line number Diff line
@@ -26,9 +26,11 @@ import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.validation.FeatureBasedDiagnostic;

import com.google.common.base.Stopwatch;
import com.google.inject.Inject;
import com.google.inject.Injector;

import de.ugoe.cs.swe.TTCN3StandaloneSetup;
@@ -47,6 +49,9 @@ public class TTCN3ResourceProvider {
	private LoggingInterface logger;
	private QualityCheckProfile activeProfile;
	
	@Inject
	private IQualifiedNameProvider qualifiedNameProvider;
	
	private final Stopwatch stopwatch = Stopwatch.createUnstarted();

	public TTCN3ResourceProvider(final ArrayList<String> paths,
@@ -78,7 +83,7 @@ public class TTCN3ResourceProvider {
			if (file.isFile()) {
				matcher = pattern.matcher(file.getName());	
				if(!matcher.matches()) {
					parser.add(new FileParser(file));
					parser.add(new FileParser(file, qualifiedNameProvider));
				}
			} else if (file.isDirectory()) {
				Collection<File> files = FileUtils.listFiles(file,
@@ -87,7 +92,7 @@ public class TTCN3ResourceProvider {
				for (File f : files) {
					matcher = pattern.matcher(f.getName());	
					if(!matcher.matches()) {
						parser.add(new FileParser(f));
						parser.add(new FileParser(f, qualifiedNameProvider));
					}
				}
			}
@@ -119,6 +124,8 @@ public class TTCN3ResourceProvider {
			e.printStackTrace();
		}		
		
		TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true);
		
		stopwatch.stop();
		
		TTCN3StatisticsProvider.getInstance().setParsingCompleted(true);
+11 −124
Original line number Diff line number Diff line
@@ -2,28 +2,19 @@ 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.naming.IQualifiedNameProvider;
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.ISelectable;
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 org.eclipse.xtext.util.IResourceScopeCache;

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

import de.ugoe.cs.swe.common.MiscTools;
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 {
@@ -54,15 +42,12 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
			.synchronizedSetMultimap(HashMultimap.<Resource, ImportData> create());
	public static final Multimap<TTCN3Module, TTCN3Module> IMPORTED_FROM = Multimaps
			.synchronizedSetMultimap(HashMultimap.<TTCN3Module, TTCN3Module> create());
	public static final SetMultimap<Resource, IEObjectDescription> EXPORTED_OBJECTS = Multimaps
			.synchronizedSetMultimap(HashMultimap.<Resource, IEObjectDescription> create());
	
	public static final List<Resource> RESOURCES = Collections.synchronizedList(Lists.<Resource> newArrayList());
	public static final Map<String, TTCN3Module> NAMED_MODULES = Collections.synchronizedMap(Maps.<String, TTCN3Module> newHashMap());

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

	@Inject
	private IQualifiedNameProvider qualifiedNameProvider;

	@Override
	public IScope getScope(Resource resource, final EReference reference, Predicate<IEObjectDescription> filter) {
@@ -78,97 +63,17 @@ 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<IEObjectDescription> objects = Lists.newArrayList();

		if (TTCN3StatisticsProvider.getInstance().isParsingCompleted() && STATIC_SCOPE.containsKey(resource)) {
		if (TTCN3StatisticsProvider.getInstance().isPreAnalyzingCompleted() && STATIC_SCOPE.containsKey(resource)) {
			return STATIC_SCOPE.get(resource);
		} else if (TTCN3StatisticsProvider.getInstance().isParsingCompleted()) {
			for (Resource r : IMPORTED_RESOURCES.get(resource)) {
				ISelectable descriptions = getAllDescriptions(r);
				IEObjectDescription module = descriptions.getExportedObjectsByType(TTCN3Package.eINSTANCE.getTTCN3Module()).iterator()
						.next();
				for (IEObjectDescription e : descriptions.getExportedObjects()) {
					IEObjectDescription d = null;
		} else if (TTCN3StatisticsProvider.getInstance().isPreAnalyzingCompleted()) {
			IScope scope = IScope.NULLSCOPE;
			List<IEObjectDescription> objects = Lists.newArrayList();
			
					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);
					}
			for (ImportData importData : IMPORTS.get(resource)) {
				objects.addAll(importData.getExportedObjects());
			}
				// 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, null);
					synchronized (IMPORTS) {
						for (ImportData d : IMPORTS.get(resource)) {
							if (d.equals(m)) {
								d.getExportedObjects().addAll(objects);
							}
						}
					}
				}
			}

			IScope scope = IScope.NULLSCOPE;
			
			if (reference == null)
				return scope;
@@ -186,24 +91,6 @@ public class TTCN3GlobalScopeProvider extends AbstractGlobalScopeProvider {
		}
	}

	protected ISelectable getAllDescriptions(final Resource resource) {
		return cache.get("internalGetAllDescriptionsGlobal", resource, new Provider<ISelectable>() {
			public ISelectable get() {
				return internalGetAllDescriptions(resource);
			}
		});
	}

	protected 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, qualifiedNameProvider);
		return new MultimapBasedSelectable(allDescriptions);
	}

	public static void printImportedModuleNames(boolean fileNames, final LoggingInterface logger) {
		for (String moduleName : NAMED_MODULES.keySet()) {
			TTCN3Module module = NAMED_MODULES.get(moduleName);
+28 −31
Original line number Diff line number Diff line
@@ -232,15 +232,15 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {

		list.addAll(module.eAllOfType(FieldReference))

		// TODO: improve performance of this call
		// use import data exported objects after init!!!
		synchronized (IMPORTS) {
			if (IMPORTS.containsKey(module.eResource)) {
				val imported = IMPORTS.get(module.eResource)
				for (i : 0 .. imported.size - 1) {
					val d = imported.get(i)
					for (o : d.module.getAllContentsOfType(FieldReference)) {
						list.add(o)
					for (o : d.exportedObjects) {
						if (TTCN3Package.eINSTANCE.fieldReference.isAssignableFrom(o.EClass)) {
							list.add(o.EObjectOrProxy)
						}
					}
				}
			}
@@ -530,8 +530,6 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
		return res
	}

	
	
	private def Iterable<EObject> directFieldTypeElements(FieldReference field) {
		if (field instanceof StructFieldDef) {
			if (field.type != null) {
@@ -561,7 +559,6 @@ class TTCN3ScopeProvider extends AbstractDeclarativeScopeProvider {
//	def IScope scope_TypeReference_head(TypeReference tr, EReference ref) {
//		// TODO: fix me!
//	}

	def IScope scope_Head_target(Head value, EReference ref) {
		value.scope_ReferencedValueHead(ref)
	}
Loading