Loading de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/FileParser.java +107 −2 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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; Loading @@ -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(); Loading de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/PreAnalyzer.java +11 −2 Original line number Diff line number Diff line Loading @@ -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)); } } Loading @@ -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(); Loading de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/TTCN3ResourceProvider.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading Loading @@ -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, Loading @@ -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)); } } } Loading Loading @@ -119,6 +124,8 @@ public class TTCN3ResourceProvider { e.printStackTrace(); } TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true); stopwatch.stop(); TTCN3StatisticsProvider.getInstance().setParsingCompleted(true); Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3GlobalScopeProvider.java +11 −124 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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) { Loading @@ -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; Loading @@ -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); Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +28 −31 Original line number Diff line number Diff line Loading @@ -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) } } } } Loading Loading @@ -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) { Loading Loading @@ -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 Loading
de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/FileParser.java +107 −2 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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; Loading @@ -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(); Loading
de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/PreAnalyzer.java +11 −2 Original line number Diff line number Diff line Loading @@ -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)); } } Loading @@ -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(); Loading
de.ugoe.cs.swe.T3Q/src/de/ugoe/cs/swe/T3Q/TTCN3ResourceProvider.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading Loading @@ -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, Loading @@ -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)); } } } Loading Loading @@ -119,6 +124,8 @@ public class TTCN3ResourceProvider { e.printStackTrace(); } TTCN3StatisticsProvider.getInstance().setPreAnalyzingCompleted(true); stopwatch.stop(); TTCN3StatisticsProvider.getInstance().setParsingCompleted(true); Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3GlobalScopeProvider.java +11 −124 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 { Loading @@ -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) { Loading @@ -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; Loading @@ -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); Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/scoping/TTCN3ScopeProvider.xtend +28 −31 Original line number Diff line number Diff line Loading @@ -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) } } } } Loading Loading @@ -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) { Loading Loading @@ -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