~ubuntu-branches/ubuntu/saucy/monodevelop/saucy-proposed

« back to all changes in this revision

Viewing changes to contrib/Mono.Cecil/Cecil.Decompiler/Cecil.Decompiler.Steps/DeclareVariablesOnFirstAssignment.cs

  • Committer: Bazaar Package Importer
  • Author(s): Jo Shields
  • Date: 2010-09-10 16:54:48 UTC
  • mfrom: (19.1.1 experimental)
  • Revision ID: james.westby@ubuntu.com-20100910165448-0rybfk25zd4o9431
Tags: 2.4+dfsg-2
* debian/patches/inject_Mono.Debugger.Soft_source.patch,
  debian/patches/use_system_Mono.Debugger.Soft.patch,
  debian/control:
  + Build against system Soft Debugger, since we now have a new
    enough Mono to match MonoDevelop's required API

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#region license
 
2
//
 
3
//      (C) 2007 - 2008 Novell, Inc. http://www.novell.com
 
4
//      (C) 2007 - 2008 Jb Evain http://evain.net
 
5
//
 
6
// Permission is hereby granted, free of charge, to any person obtaining
 
7
// a copy of this software and associated documentation files (the
 
8
// "Software"), to deal in the Software without restriction, including
 
9
// without limitation the rights to use, copy, modify, merge, publish,
 
10
// distribute, sublicense, and/or sell copies of the Software, and to
 
11
// permit persons to whom the Software is furnished to do so, subject to
 
12
// the following conditions:
 
13
//
 
14
// The above copyright notice and this permission notice shall be
 
15
// included in all copies or substantial portions of the Software.
 
16
//
 
17
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
18
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
19
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
20
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 
21
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 
22
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 
23
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
24
//
 
25
#endregion
 
26
 
 
27
using System;
 
28
using System.Collections.Generic;
 
29
 
 
30
using Mono.Cecil.Cil;
 
31
 
 
32
using Cecil.Decompiler.Ast;
 
33
 
 
34
namespace Cecil.Decompiler.Steps {
 
35
 
 
36
        public class DeclareVariablesOnFirstAssignment : BaseCodeTransformer, IDecompilationStep {
 
37
 
 
38
                public static readonly IDecompilationStep Instance = new DeclareVariablesOnFirstAssignment ();
 
39
 
 
40
                DecompilationContext context;
 
41
                HashSet<VariableDefinition> not_assigned = new HashSet<VariableDefinition> ();
 
42
 
 
43
                public override ICodeNode VisitVariableReferenceExpression (VariableReferenceExpression node)
 
44
                {
 
45
                        var variable = (VariableDefinition) node.Variable;
 
46
 
 
47
                        if (!TryDiscardVariable (variable))
 
48
                                return node;
 
49
 
 
50
                        return new VariableDeclarationExpression (variable);
 
51
                }
 
52
 
 
53
                public override ICodeNode VisitVariableDeclarationExpression (VariableDeclarationExpression node)
 
54
                {
 
55
                        TryDiscardVariable (node.Variable);
 
56
                        
 
57
                        return node;
 
58
                }
 
59
 
 
60
                private bool TryDiscardVariable (VariableDefinition variable)
 
61
                {
 
62
                        if (!not_assigned.Contains (variable))
 
63
                                return false;
 
64
 
 
65
                        RemoveVariable (variable);
 
66
                        return true;
 
67
                }
 
68
 
 
69
                void RemoveVariable (VariableDefinition variable)
 
70
                {
 
71
                        context.RemoveVariable (variable);
 
72
                        not_assigned.Remove (variable);
 
73
                }
 
74
 
 
75
                public BlockStatement Process (DecompilationContext context, BlockStatement block)
 
76
                {
 
77
                        this.context = context;
 
78
                        PopulateNotAssigned ();
 
79
                        return (BlockStatement) VisitBlockStatement (block);
 
80
                }
 
81
 
 
82
                void PopulateNotAssigned ()
 
83
                {
 
84
                        not_assigned.Clear ();
 
85
                        foreach (VariableDefinition variable in context.Variables)
 
86
                                not_assigned.Add (variable);
 
87
                }
 
88
        }
 
89
}