Browse Source

Remove region context action is now more efficient in choosing the

subtrees to analyze.
newNRvisualizers
Mike Krüger 14 years ago
parent
commit
d284cbb726
  1. 47
      ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveRegion.cs

47
ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveRegion.cs

@ -24,6 +24,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
using System; using System;
using System.Linq;
namespace ICSharpCode.NRefactory.CSharp.Refactoring namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
@ -37,48 +38,58 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
public void Run (RefactoringContext context) public void Run (RefactoringContext context)
{ {
var directive = GetDirective (context); var directive = GetDirective (context);
var visitor = new DirectiveVisitor (directive); var endDirective = DirectiveSearcher.GetEndRegion (context.Unit, directive);
context.Unit.AcceptVisitor (visitor); if (endDirective == null)
Console.WriteLine ("directive:" + directive + "/" + visitor.Endregion);
if (visitor.Endregion == null)
return; return;
using (var script = context.StartScript ()) { using (var script = context.StartScript ()) {
script.Remove (directive); script.Remove (directive);
script.Remove (visitor.Endregion); script.Remove (endDirective);
} }
} }
class DirectiveVisitor : DepthFirstAstVisitor class DirectiveSearcher : DepthFirstAstVisitor
{ {
readonly PreProcessorDirective startDirective; readonly PreProcessorDirective regionDirective;
bool searchDirectives = false; bool searchDirectives = false;
int depth; int depth;
PreProcessorDirective endregion;
public PreProcessorDirective Endregion { DirectiveSearcher (PreProcessorDirective regionDirective)
get; {
set; if (regionDirective == null)
throw new ArgumentNullException ("regionDirective");
this.regionDirective = regionDirective;
}
public static PreProcessorDirective GetEndRegion (CompilationUnit unit, PreProcessorDirective regionDirective)
{
var visitor = new DirectiveSearcher (regionDirective);
unit.AcceptVisitor (visitor);
return visitor.endregion;
} }
public DirectiveVisitor (PreProcessorDirective startDirective) protected override void VisitChildren (AstNode node)
{ {
this.startDirective = startDirective; if (endregion != null)
return;
if (!searchDirectives && !regionDirective.Ancestors.Any (a => a == node))
return;
base.VisitChildren (node);
} }
public override void VisitPreProcessorDirective (PreProcessorDirective preProcessorDirective) public override void VisitPreProcessorDirective (PreProcessorDirective preProcessorDirective)
{ {
if (searchDirectives) { if (searchDirectives) {
if (preProcessorDirective.Type == PreProcessorDirectiveType.Region) if (preProcessorDirective.Type == PreProcessorDirectiveType.Region) {
depth++; depth++;
if (preProcessorDirective.Type == PreProcessorDirectiveType.Endregion) { } else if (preProcessorDirective.Type == PreProcessorDirectiveType.Endregion) {
depth--; depth--;
if (depth == 0) { if (depth == 0) {
Endregion = preProcessorDirective; endregion = preProcessorDirective;
searchDirectives = false; searchDirectives = false;
} }
} }
} } else if (preProcessorDirective == regionDirective) {
if (preProcessorDirective == startDirective) {
searchDirectives = true; searchDirectives = true;
depth = 1; depth = 1;
} }

Loading…
Cancel
Save