/// <summary> /// Removes a <see cref="Declaration"/> and its <see cref="Declaration.References"/>. /// </summary> /// <param name="module">The <see cref="ICodeModule"/> to modify.</param> /// <param name="target"></param> public static void Remove(this ICodeModule module, Declaration target) { if (!module.Equals(target.QualifiedName.QualifiedModuleName.Component.CodeModule)) { throw new ArgumentException("Target is not declared in specified module."); } var sortedItems = target.References .Where(reference => module.Equals(reference.QualifiedModuleName.Component.CodeModule)) .Select(reference => Tuple.Create((object)reference, reference.Selection)) .Concat(new[] { Tuple.Create((object)target, target.Selection) }) .OrderByDescending(t => t.Item2); foreach (var tuple in sortedItems) { if (tuple.Item1 is Declaration) { RemoveDeclarationOnly(module, target); } else { var reference = (IdentifierReference)tuple.Item1; Remove(reference.QualifiedModuleName.Component.CodeModule, reference); } } }