Browse Source

Fix naming conflict in AssignVariableNames

pull/877/head
Siegfried Pammer 8 years ago
parent
commit
2b1976c6b5
  1. 1
      ICSharpCode.Decompiler/CSharp/StatementBuilder.cs
  2. 6
      ICSharpCode.Decompiler/IL/ILVariable.cs
  3. 11
      ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

1
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -268,7 +268,6 @@ namespace ICSharpCode.Decompiler.CSharp @@ -268,7 +268,6 @@ namespace ICSharpCode.Decompiler.CSharp
AstNode usingInit = resource;
var var = inst.Variable;
if (var.LoadCount > 0 || var.AddressCount > 0) {
var.Kind = VariableKind.UsingLocal;
var type = settings.AnonymousTypes && var.Type.ContainsAnonymousType() ? new SimpleType("var") : exprBuilder.ConvertType(var.Type);
var vds = new VariableDeclarationStatement(type, var.Name, resource);
vds.Variables.Single().AddAnnotation(new ILVariableResolveResult(var, var.Type));

6
ICSharpCode.Decompiler/IL/ILVariable.cs

@ -303,6 +303,12 @@ namespace ICSharpCode.Decompiler.IL @@ -303,6 +303,12 @@ namespace ICSharpCode.Decompiler.IL
case VariableKind.InitializerTarget:
output.Write("initializer ");
break;
case VariableKind.ForeachLocal:
output.Write("foreach ");
break;
case VariableKind.UsingLocal:
output.Write("using ");
break;
default:
throw new ArgumentOutOfRangeException();
}

11
ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

@ -79,7 +79,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -79,7 +79,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
AddExistingName(reservedVariableNames, v.Name);
break;
default:
if (v.HasGeneratedName || !IsValidName(v.Name)) {
if (v.HasGeneratedName || !IsValidName(v.Name) || ConflictWithLocal(v)) {
// don't use the name from the debug symbols if it looks like a generated name
v.Name = null;
} else {
@ -104,6 +104,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -104,6 +104,15 @@ namespace ICSharpCode.Decompiler.IL.Transforms
}
}
bool ConflictWithLocal(ILVariable v)
{
if (v.Kind == VariableKind.UsingLocal || v.Kind == VariableKind.ForeachLocal) {
if (reservedVariableNames.ContainsKey(v.Name))
return true;
}
return false;
}
static bool IsValidName(string varName)
{
if (string.IsNullOrEmpty(varName))

Loading…
Cancel
Save