Commit 3c9550d6 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* attempt at reference caching, commented out..

parent b7a92192
Loading
Loading
Loading
Loading
+64 −1
Original line number Diff line number Diff line
package de.ugoe.cs.swe.common;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
@@ -10,8 +12,11 @@ import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.EcoreUtil2.ElementReferenceAcceptor;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import de.ugoe.cs.swe.tTCN3.Assignment;
import de.ugoe.cs.swe.tTCN3.Enumeration;
@@ -20,6 +25,7 @@ import de.ugoe.cs.swe.tTCN3.FormalValuePar;
import de.ugoe.cs.swe.tTCN3.Head;

public class TTCN3ReferenceHelper {
	static Map<EObject, HashMap<EObject, Boolean>> isReferencedCache = Collections.synchronizedMap(Maps.<EObject, HashMap<EObject, Boolean>> newHashMap());

	/**
	 * Own implementation of org.eclipse.xtext.EcoreUtil2::findCrossReferences
@@ -107,6 +113,44 @@ public class TTCN3ReferenceHelper {
	@SuppressWarnings("unchecked")
	public static boolean isReferenced2(EObject rootElement, Set<? extends EObject> targets, boolean ignoreAssignment) {
		boolean found = false;
//		HashMap<EObject, Boolean> cached = isReferencedCache.get(rootElement);
//		if (cached != null) {
//			for (EObject t : targets) {
//				if (cached.containsKey(t)) {
//					return cached.get(t);
//				}
//			}
//		} else {
//			cached = new HashMap<>();
//			synchronized (isReferencedCache) {
//				isReferencedCache.put(rootElement, cached);
//			}
//		}
//		EcoreUtil2.findCrossReferences(rootElement, targets, new ElementReferenceAcceptor() {
//			
//			@Override
//			public void accept(EObject referrer, EObject referenced, EReference reference, int index) {
//				// TODO Auto-generated method stub
//				synchronized (isReferencedCache) {
//					boolean confirmed = true;
//					if (ignoreAssignment) {
//						confirmed = checkAssignment(referrer, referenced);
//					}
//					if (referenced instanceof Enumeration) {
//						confirmed = false;
//					}
//					isReferencedCache.get(rootElement).put(referenced, confirmed);
//				}
////				System.out.println(referrer +"->"+referenced+" via "+reference);
//				
//			}
//		});
//		for (EObject t : targets) {
//			if (cached.containsKey(t)) {
//				return cached.get(t);
//			}
//		}

		
		for(EReference ref: rootElement.eClass().getEAllReferences()) {
			
@@ -135,6 +179,9 @@ public class TTCN3ReferenceHelper {
						for(int i=0; i< values.size(); ++i) {
							EObject refElement = values.get(i);
							if(targets.contains(refElement)) {
//								synchronized (isReferencedCache) {
//									cached.put(refElement, true);
//								}
								return true;
							}
						}
@@ -142,17 +189,33 @@ public class TTCN3ReferenceHelper {
						EObject refElement = (EObject) value;
						if(targets.contains(refElement)) {
							if (refElement instanceof Enumeration) {
//								synchronized (isReferencedCache) {
//									cached.put(refElement, false);
//								}
								return false;
							}
							//TODO: simplify
							if (ignoreAssignment) {
								return checkAssignment(rootElement, refElement);
							}
								boolean confirmed = checkAssignment(rootElement, refElement);
//								synchronized (isReferencedCache) {
//									cached.put(refElement, confirmed);
//								}
								return confirmed;
							}
//							synchronized (isReferencedCache) {
//								cached.put(refElement, true);
//							}
							return true;
						}
					}
				}
			}
		}
//		if (!found) {
//			for (EObject t : targets) {
//				isReferencedCache.get(rootElement).put(t, found);
//			}
//		}
		return found;
	}