mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.5 KiB
56 lines
1.5 KiB
using System; |
|
using System.Collections.Generic; |
|
using ICSharpCode.NRefactory.CSharp; |
|
|
|
namespace Decompiler.Transforms.Ast |
|
{ |
|
public class RemoveDeadLabels : DepthFirstAstVisitor<object, object> |
|
{ |
|
List<string> usedLabels = new List<string>(); |
|
bool collectingUsedLabels; |
|
|
|
public override object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data) |
|
{ |
|
collectingUsedLabels = true; |
|
base.VisitConstructorDeclaration(constructorDeclaration, data); |
|
collectingUsedLabels = false; |
|
base.VisitConstructorDeclaration(constructorDeclaration, data); |
|
return null; |
|
} |
|
|
|
public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data) |
|
{ |
|
collectingUsedLabels = true; |
|
base.VisitMethodDeclaration(methodDeclaration, data); |
|
collectingUsedLabels = false; |
|
base.VisitMethodDeclaration(methodDeclaration, data); |
|
return null; |
|
} |
|
|
|
public override object VisitAccessor(Accessor accessor, object data) |
|
{ |
|
collectingUsedLabels = true; |
|
base.VisitAccessor(accessor, data); |
|
collectingUsedLabels = false; |
|
return base.VisitAccessor(accessor, data); |
|
} |
|
|
|
public override object VisitGotoStatement(GotoStatement gotoStatement, object data) |
|
{ |
|
if (collectingUsedLabels) { |
|
usedLabels.Add(gotoStatement.Label); |
|
} |
|
return null; |
|
} |
|
|
|
public override object VisitLabelStatement(LabelStatement labelStatement, object data) |
|
{ |
|
if (!collectingUsedLabels) { |
|
if (!usedLabels.Contains(labelStatement.Label)) { |
|
labelStatement.Remove(); |
|
} |
|
} |
|
return null; |
|
} |
|
} |
|
}
|
|
|