Exemplo n.º 1
0
        /// <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);
                }
            }
        }