2 // Copyright (c) 2003, 2004, 2005 Rodrigo B. de Oliveira (rbo@acm.org)
3 // All rights reserved.
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
8 // * Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 // * Neither the name of Rodrigo B. de Oliveira nor the names of its
14 // contributors may be used to endorse or promote products derived from this
15 // software without specific prior written permission.
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
21 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 using System
.Collections
.Generic
;
34 namespace Boo
.Lang
.Compiler
.Ast
36 public partial class DepthFirstTransformer
38 protected Node _resultingNode
= null;
40 protected virtual void RemoveCurrentNode()
42 _resultingNode
= null;
45 protected virtual void ReplaceCurrentNode(Node replacement
)
47 _resultingNode
= replacement
;
50 protected virtual void OnNode(Node node
)
55 public virtual Node
VisitNode(Node node
)
61 Node saved
= _resultingNode
;
62 _resultingNode
= node
;
64 Node result
= _resultingNode
;
65 _resultingNode
= saved
;
68 catch (Boo
.Lang
.Compiler
.CompilerError
)
72 catch (Exception error
)
80 protected virtual void OnError(Node node
, Exception error
)
82 throw Boo
.Lang
.Compiler
.CompilerErrorFactory
.InternalError(node
, error
);
85 public Node
Visit(Node node
)
87 return VisitNode(node
);
90 public Expression
Visit(Expression node
)
92 return (Expression
)VisitNode(node
);
95 public Statement
Visit(Statement node
)
97 return (Statement
)VisitNode(node
);
100 public bool Visit
<T
>(NodeCollection
<T
> collection
) where T
: Node
102 if (null == collection
) return false;
106 T
[] nodes
= collection
.ToArray();
107 for (int i
= 0; i
< nodes
.Length
; ++i
)
109 T currentNode
= nodes
[i
];
110 T resultingNode
= (T
)VisitNode(currentNode
);
111 if (currentNode
!= resultingNode
)
113 int actualIndex
= i
- removed
;
114 if (null == resultingNode
)
117 collection
.RemoveAt(actualIndex
);
121 collection
.ReplaceAt(actualIndex
, resultingNode
);