package dk.brics.jsrefactoring.renameprty; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import dk.brics.jspointers.lattice.values.ObjectValue; import dk.brics.jsrefactoring.Master; import dk.brics.jsrefactoring.family.FamilyDefinition; import dk.brics.jsrefactoring.hosts.Host; import dk.brics.jsrefactoring.hosts.ObjectHost; import dk.brics.jsrefactoring.hosts.ScopeHost; import dk.brics.jsrefactoring.nodes.DynamicPropertyExpAccess; import dk.brics.jsrefactoring.nodes.AccessWithName; import dk.brics.jsrefactoring.nodes.Access; import dk.brics.jsrefactoring.nodes.AccessVariable; import dk.brics.jsutil.CollectionUtil; public class RenamingFamily implements FamilyDefinition<Host, Access> { private Master input; private String name; private ForInDynamicAccesses forinAccess; public RenamingFamily(Master input, String name, ForInDynamicAccesses forinAccess) { this.input = input; this.name = name; this.forinAccess = forinAccess; } @Override public Collection<? extends Host> getFamily(Access family) { if (family instanceof AccessWithName) { AccessWithName node = (AccessWithName)family; Set<ObjectHost> objects = ObjectHost.wrap(node.getBase(input, name)); if (node instanceof AccessVariable) { AccessVariable vnode = (AccessVariable)node; List<ScopeHost> scopes = vnode.getSearchedScopes(input); return CollectionUtil.union(objects, Collections.singleton(scopes.get(scopes.size()-1))); } else { return objects; } } else { DynamicPropertyExpAccess node = (DynamicPropertyExpAccess)family; Set<ObjectValue> result = new HashSet<ObjectValue>(); result.addAll(node.getBase(input, name)); for (ObjectValue obj : forinAccess.getExp2forinObjs().getView(node.getExp())) { if (!input.isPropertyDefinitelyAbsent(obj, name)) { result.add(obj); } } return ObjectHost.wrap(result); } } }