package sizzle.compiler;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import sizzle.parser.syntaxtree.ArrayType;
import sizzle.parser.syntaxtree.Assignment;
import sizzle.parser.syntaxtree.Block;
import sizzle.parser.syntaxtree.BreakStatement;
import sizzle.parser.syntaxtree.BytesLiteral;
import sizzle.parser.syntaxtree.Call;
import sizzle.parser.syntaxtree.CharLiteral;
import sizzle.parser.syntaxtree.Comparison;
import sizzle.parser.syntaxtree.Component;
import sizzle.parser.syntaxtree.Composite;
import sizzle.parser.syntaxtree.Conjunction;
import sizzle.parser.syntaxtree.ContinueStatement;
import sizzle.parser.syntaxtree.Declaration;
import sizzle.parser.syntaxtree.DoStatement;
import sizzle.parser.syntaxtree.EmitStatement;
import sizzle.parser.syntaxtree.ExprList;
import sizzle.parser.syntaxtree.ExprStatement;
import sizzle.parser.syntaxtree.Expression;
import sizzle.parser.syntaxtree.Factor;
import sizzle.parser.syntaxtree.FingerprintLiteral;
import sizzle.parser.syntaxtree.FloatingPointLiteral;
import sizzle.parser.syntaxtree.ForStatement;
import sizzle.parser.syntaxtree.Function;
import sizzle.parser.syntaxtree.FunctionType;
import sizzle.parser.syntaxtree.Identifier;
import sizzle.parser.syntaxtree.IdentifierList;
import sizzle.parser.syntaxtree.IfStatement;
import sizzle.parser.syntaxtree.Index;
import sizzle.parser.syntaxtree.IntegerLiteral;
import sizzle.parser.syntaxtree.MapType;
import sizzle.parser.syntaxtree.Node;
import sizzle.parser.syntaxtree.NodeSequence;
import sizzle.parser.syntaxtree.Operand;
import sizzle.parser.syntaxtree.OutputType;
import sizzle.parser.syntaxtree.Pair;
import sizzle.parser.syntaxtree.PairList;
import sizzle.parser.syntaxtree.Program;
import sizzle.parser.syntaxtree.ProtoFieldDecl;
import sizzle.parser.syntaxtree.ProtoMember;
import sizzle.parser.syntaxtree.ProtoMemberList;
import sizzle.parser.syntaxtree.ProtoTupleType;
import sizzle.parser.syntaxtree.Regexp;
import sizzle.parser.syntaxtree.RegexpList;
import sizzle.parser.syntaxtree.ResultStatement;
import sizzle.parser.syntaxtree.ReturnStatement;
import sizzle.parser.syntaxtree.Selector;
import sizzle.parser.syntaxtree.SimpleExpr;
import sizzle.parser.syntaxtree.SimpleMember;
import sizzle.parser.syntaxtree.SimpleMemberList;
import sizzle.parser.syntaxtree.SimpleTupleType;
import sizzle.parser.syntaxtree.Start;
import sizzle.parser.syntaxtree.Statement;
import sizzle.parser.syntaxtree.StatementExpr;
import sizzle.parser.syntaxtree.StaticVarDecl;
import sizzle.parser.syntaxtree.StringLiteral;
import sizzle.parser.syntaxtree.SwitchStatement;
import sizzle.parser.syntaxtree.Term;
import sizzle.parser.syntaxtree.TimeLiteral;
import sizzle.parser.syntaxtree.TupleType;
import sizzle.parser.syntaxtree.Type;
import sizzle.parser.syntaxtree.TypeDecl;
import sizzle.parser.syntaxtree.VarDecl;
import sizzle.parser.syntaxtree.WhenStatement;
import sizzle.parser.syntaxtree.WhileStatement;
import sizzle.parser.visitor.GJNoArguDepthFirst;
public class NameFindingVisitor extends GJNoArguDepthFirst<Set<String>> {
@Override
public Set<String> visit(final Start n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Program n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Declaration n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final TypeDecl n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final StaticVarDecl n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final VarDecl n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Type n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Component n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ArrayType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final TupleType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final SimpleTupleType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final SimpleMemberList n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final SimpleMember n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ProtoTupleType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ProtoMemberList n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ProtoMember n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ProtoFieldDecl n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final MapType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final OutputType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ExprList n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final FunctionType n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Statement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Assignment n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Block n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final BreakStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ContinueStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final DoStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final EmitStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ExprStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ForStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final IfStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ResultStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final ReturnStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final SwitchStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final WhenStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final IdentifierList n) {
final HashSet<String> set = new HashSet<String>();
set.add(n.f0.f0.tokenImage);
if (n.f1.present())
for (final Node node : n.f1.nodes)
set.addAll(((NodeSequence) node).elementAt(1).accept(this));
return set;
}
@Override
public Set<String> visit(final WhileStatement n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Expression n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Conjunction n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Comparison n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final SimpleExpr n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Term n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Factor n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Selector n) {
return new HashSet<String>(Arrays.asList(n.f1.f0.tokenImage));
}
@Override
public Set<String> visit(final Index n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Call n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final RegexpList n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Regexp n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Operand n) {
switch (n.f0.which) {
case 0: // identifier
return n.f0.accept(this);
default:
throw new RuntimeException("unexpected choice " + n.f0.which + " is " + n.f0.choice.getClass());
}
}
@Override
public Set<String> visit(final Composite n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final PairList n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Pair n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Function n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final StatementExpr n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final Identifier n) {
return new HashSet<String>(Arrays.asList(n.f0.tokenImage));
}
@Override
public Set<String> visit(final IntegerLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final FingerprintLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final FloatingPointLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final CharLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final StringLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final BytesLiteral n) {
throw new RuntimeException("unimplemented");
}
@Override
public Set<String> visit(final TimeLiteral n) {
throw new RuntimeException("unimplemented");
}
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Assignment n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final AssignmentList n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final AssignmentRest n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final AssignmentStatement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Atom n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Block n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final CallExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ComparisonExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final EmitStatement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Expression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ExpressionList n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ExpressionRest n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final FloatingPointLiteral n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ForStatement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Identifier n) {
// return new HashSet<String>(Arrays.asList(n.f0.tokenImage));
// }
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final IndexExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Initializer n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final IntegerLiteral n) {
// return new HashSet<String>();
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Pair n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final PairList n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final MemberExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ParentheticalExpression n) {
// return n.f1.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final PlusExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Program n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final ProtoStatement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final SliceExpression n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Start n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Statement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final StringLiteral n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Term n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final TimesExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final Typle n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final TypleList n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final TypleRest n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final UnaryExpression n) {
// return n.f0.accept(this);
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final VariableDeclaration n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final WhenStatement n) {
// throw new RuntimeException("unimplemented");
// }
//
// /** {@inheritDoc} */
// @Override
// public Set<String> visit(final WhileStatement n) {
// throw new RuntimeException("unimplemented");
// }
}