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