001package org.anarres.graphviz.parser.analysis;
002
003import java.util.*;
004import org.anarres.graphviz.parser.node.*;
005
006public class CloneVisitor extends AnalysisAdapter {
007
008    private Object clone;
009
010    private <T extends Node> List<T> clone(List<T> in) {
011        if (in == null)
012            return null;
013        List<T> out = new ArrayList<T>(in.size());
014        for (T node : in)
015            out.add(clone(node));
016        return out;
017    }
018
019    @SuppressWarnings({"unchecked"})
020    public <T extends Node> T clone(T node) {
021        if (node == null)
022            return null;
023        node.apply(this);
024        return (T) clone;
025    }
026
027    private <T extends Node> void setClone(T prev, T repl) {
028        this.clone = repl;
029        fireClone(prev, repl);
030    }
031
032    protected <T extends Node> void fireClone(T prev, T repl) {
033    }
034
035    @Override
036    public void defaultCase(Node node) {
037        throw new IllegalStateException();
038    }
039
040    @Override
041    public void caseTStringLiteral(TStringLiteral node) {
042        setClone(node, (TStringLiteral) node.clone());
043    }
044
045    @Override
046    public void caseAGraphGraphType(AGraphGraphType node) {
047        TKwGraph _KwGraph_ = clone(node.getKwGraph());
048        setClone(node, new AGraphGraphType(_KwGraph_));
049    }
050
051    @Override
052    public void caseTTokSemi(TTokSemi node) {
053        setClone(node, (TTokSemi) node.clone());
054    }
055
056    @Override
057    public void caseADataStatement(ADataStatement node) {
058        setClone(node, new ADataStatement());
059    }
060
061    @Override
062    public void caseAGlobalDefaultsStatement(AGlobalDefaultsStatement node) {
063        setClone(node, new AGlobalDefaultsStatement());
064    }
065
066    @Override
067    public void caseASubgraphNode(ASubgraphNode node) {
068        PAtom _Name_ = clone(node.getName());
069        List<PStatement> _Statement_ = clone(node.getStatement());
070        setClone(node, new ASubgraphNode(_Name_, _Statement_));
071    }
072
073    @Override
074    public void caseANodeDefaultsStatement(ANodeDefaultsStatement node) {
075        setClone(node, new ANodeDefaultsStatement());
076    }
077
078    @Override
079    public void caseTKwEdge(TKwEdge node) {
080        setClone(node, (TKwEdge) node.clone());
081    }
082
083    @Override
084    public void caseEOF(EOF node) {
085        setClone(node, new EOF());
086    }
087
088    @Override
089    public void caseTTokLsquare(TTokLsquare node) {
090        setClone(node, (TTokLsquare) node.clone());
091    }
092
093    @Override
094    public void caseAGraphDefaultsStatement(AGraphDefaultsStatement node) {
095        setClone(node, new AGraphDefaultsStatement());
096    }
097
098    @Override
099    public void caseALinkEdge(ALinkEdge node) {
100        TTokLink _TokLink_ = clone(node.getTokLink());
101        setClone(node, new ALinkEdge(_TokLink_));
102    }
103
104    @Override
105    public void caseAPortNode(APortNode node) {
106        PAtom _Name_ = clone(node.getName());
107        PAtom _Port_ = clone(node.getPort());
108        setClone(node, new APortNode(_Name_, _Port_));
109    }
110
111    @Override
112    public void caseTTokLink(TTokLink node) {
113        setClone(node, (TTokLink) node.clone());
114    }
115
116    @Override
117    public void caseTLiteral(TLiteral node) {
118        setClone(node, (TLiteral) node.clone());
119    }
120
121    @Override
122    public void caseTKwNode(TKwNode node) {
123        setClone(node, (TKwNode) node.clone());
124    }
125
126    @Override
127    public void caseAAttribute(AAttribute node) {
128        PAtom _Key_ = clone(node.getKey());
129        PAtom _Value_ = clone(node.getValue());
130        setClone(node, new AAttribute(_Key_, _Value_));
131    }
132
133    @Override
134    public void caseTKwGraph(TKwGraph node) {
135        setClone(node, (TKwGraph) node.clone());
136    }
137
138    @Override
139    public void caseTKwDigraph(TKwDigraph node) {
140        setClone(node, (TKwDigraph) node.clone());
141    }
142
143    @Override
144    public void caseTTokLbrace(TTokLbrace node) {
145        setClone(node, (TTokLbrace) node.clone());
146    }
147
148    @Override
149    public void caseStart(Start node) {
150        PGraph _PGraph_ = clone(node.getPGraph());
151        EOF _EOF_ = clone(node.getEOF());
152        setClone(node, new Start(_PGraph_, _EOF_));
153    }
154
155    @Override
156    public void caseTBlank(TBlank node) {
157        setClone(node, (TBlank) node.clone());
158    }
159
160    @Override
161    public void caseAComposite(AComposite node) {
162        List<PNode> _Node_ = clone(node.getNode());
163        List<PAttribute> _Attribute_ = clone(node.getAttribute());
164        setClone(node, new AComposite(_Node_, _Attribute_));
165    }
166
167    @Override
168    public void caseTTokArrow(TTokArrow node) {
169        setClone(node, (TTokArrow) node.clone());
170    }
171
172    @Override
173    public void caseAArrowEdge(AArrowEdge node) {
174        TTokArrow _TokArrow_ = clone(node.getTokArrow());
175        setClone(node, new AArrowEdge(_TokArrow_));
176    }
177
178    @Override
179    public void caseTKwStrict(TKwStrict node) {
180        setClone(node, (TKwStrict) node.clone());
181    }
182
183    @Override
184    public void caseTKwSubgraph(TKwSubgraph node) {
185        setClone(node, (TKwSubgraph) node.clone());
186    }
187
188    @Override
189    public void caseTTokEq(TTokEq node) {
190        setClone(node, (TTokEq) node.clone());
191    }
192
193    @Override
194    public void caseTComment(TComment node) {
195        setClone(node, (TComment) node.clone());
196    }
197
198    @Override
199    public void caseAGraph(AGraph node) {
200        PGraphType _GraphType_ = clone(node.getGraphType());
201        PAtom _Name_ = clone(node.getName());
202        List<PStatement> _Statement_ = clone(node.getStatement());
203        setClone(node, new AGraph(_GraphType_, _Name_, _Statement_));
204    }
205
206    @Override
207    public void caseTTokRsquare(TTokRsquare node) {
208        setClone(node, (TTokRsquare) node.clone());
209    }
210
211    @Override
212    public void caseAEdgeDefaultsStatement(AEdgeDefaultsStatement node) {
213        setClone(node, new AEdgeDefaultsStatement());
214    }
215
216    @Override
217    public void caseTTokComma(TTokComma node) {
218        setClone(node, (TTokComma) node.clone());
219    }
220
221    @Override
222    public void caseALiteralAtom(ALiteralAtom node) {
223        TLiteral _Literal_ = clone(node.getLiteral());
224        setClone(node, new ALiteralAtom(_Literal_));
225    }
226
227    @Override
228    public void caseADigraphGraphType(ADigraphGraphType node) {
229        TKwDigraph _KwDigraph_ = clone(node.getKwDigraph());
230        setClone(node, new ADigraphGraphType(_KwDigraph_));
231    }
232
233    @Override
234    public void caseASimpleNode(ASimpleNode node) {
235        PAtom _Name_ = clone(node.getName());
236        setClone(node, new ASimpleNode(_Name_));
237    }
238
239    @Override
240    public void caseTTokRbrace(TTokRbrace node) {
241        setClone(node, (TTokRbrace) node.clone());
242    }
243
244    @Override
245    public void caseTTokColon(TTokColon node) {
246        setClone(node, (TTokColon) node.clone());
247    }
248
249    @Override
250    public void caseAQuotedAtom(AQuotedAtom node) {
251        TStringLiteral _StringLiteral_ = clone(node.getStringLiteral());
252        setClone(node, new AQuotedAtom(_StringLiteral_));
253    }
254}