/// <summary>
/// Refactors a single element
/// </summary>
/// <param name="element"></param>
/// <param name="originalName">The original element's name</param>
/// <param name="newName">The new element's name</param>
private void RefactorElement(ModelElement element, string originalName, string newName)
{
if (element != null)
{
NameSpace nameSpace = element as NameSpace;
if (nameSpace != null)
{
NameSpaceRefactorer refactorer = new NameSpaceRefactorer(nameSpace);
foreach (Dictionary dictionary in EfsSystem.Instance.Dictionaries)
{
refactorer.visit(dictionary);
}
}
else
{
// the system keeps track where the element is used
List <Usage> usageList = EfsSystem.Instance.FindReferences(element);
SortedSet <Usage> usages = new SortedSet <Usage>(usageList, new CompareUsages());
foreach (Usage usage in usages)
{
RefactorIExpressionable(element, usage.User as IExpressionable);
RefactorTypedElement(element, usage.User as ITypedElement);
}
if (element is StructureElement)
{
Structure structure = element.Enclosing as Structure;
if (structure != null && structure.IsAbstract)
{
usages = new SortedSet <Usage>(EfsSystem.Instance.FindReferences(structure));
foreach (Usage usage in usages)
{
if (usage.Mode == Usage.ModeEnum.Interface)
{
Structure redefiningStructure = usage.User as Structure;
if (redefiningStructure != null)
{
ModelElement el = redefiningStructure.FindStructureElement(originalName);
if (el != null)
{
el.Name = newName;
RefactorElement(el, originalName, newName);
}
}
}
}
}
}
}
}
}