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}