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}