Loading de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/common/TTCN3ReferenceHelper.java +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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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()) { Loading Loading @@ -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; } } Loading @@ -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; } Loading Loading
de.ugoe.cs.swe.TTCN3/src/de/ugoe/cs/swe/common/TTCN3ReferenceHelper.java +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; Loading @@ -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; Loading @@ -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 Loading Loading @@ -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()) { Loading Loading @@ -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; } } Loading @@ -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; } Loading