package org.checkerframework.dataflow.cfg.node;

/**
 * A visitor for a {@link Node} tree.
 *
 * @param <R> return type of the visitor. Use {@link Void} if the visitor does not have a return
 *     value.
 * @param <P> parameter type of the visitor. Use {@link Void} if the visitor does not have a
 *     parameter.
 */
public interface NodeVisitor<R, P> {
  // Literals
  R visitShortLiteral(ShortLiteralNode n, P p);

  R visitIntegerLiteral(IntegerLiteralNode n, P p);

  R visitLongLiteral(LongLiteralNode n, P p);

  R visitFloatLiteral(FloatLiteralNode n, P p);

  R visitDoubleLiteral(DoubleLiteralNode n, P p);

  R visitBooleanLiteral(BooleanLiteralNode n, P p);

  R visitCharacterLiteral(CharacterLiteralNode n, P p);

  R visitStringLiteral(StringLiteralNode n, P p);

  R visitNullLiteral(NullLiteralNode n, P p);

  // Unary operations
  R visitNumericalMinus(NumericalMinusNode n, P p);

  R visitNumericalPlus(NumericalPlusNode n, P p);

  R visitBitwiseComplement(BitwiseComplementNode n, P p);

  R visitNullChk(NullChkNode n, P p);

  // Binary operations
  R visitStringConcatenate(StringConcatenateNode n, P p);

  R visitNumericalAddition(NumericalAdditionNode n, P p);

  R visitNumericalSubtraction(NumericalSubtractionNode n, P p);

  R visitNumericalMultiplication(NumericalMultiplicationNode n, P p);

  R visitIntegerDivision(IntegerDivisionNode n, P p);

  R visitFloatingDivision(FloatingDivisionNode n, P p);

  R visitIntegerRemainder(IntegerRemainderNode n, P p);

  R visitFloatingRemainder(FloatingRemainderNode n, P p);

  R visitLeftShift(LeftShiftNode n, P p);

  R visitSignedRightShift(SignedRightShiftNode n, P p);

  R visitUnsignedRightShift(UnsignedRightShiftNode n, P p);

  R visitBitwiseAnd(BitwiseAndNode n, P p);

  R visitBitwiseOr(BitwiseOrNode n, P p);

  R visitBitwiseXor(BitwiseXorNode n, P p);

  // Compound assignments
  R visitStringConcatenateAssignment(StringConcatenateAssignmentNode n, P p);

  // Comparison operations
  R visitLessThan(LessThanNode n, P p);

  R visitLessThanOrEqual(LessThanOrEqualNode n, P p);

  R visitGreaterThan(GreaterThanNode n, P p);

  R visitGreaterThanOrEqual(GreaterThanOrEqualNode n, P p);

  R visitEqualTo(EqualToNode n, P p);

  R visitNotEqual(NotEqualNode n, P p);

  // Conditional operations
  R visitConditionalAnd(ConditionalAndNode n, P p);

  R visitConditionalOr(ConditionalOrNode n, P p);

  R visitConditionalNot(ConditionalNotNode n, P p);

  R visitTernaryExpression(TernaryExpressionNode n, P p);

  R visitAssignment(AssignmentNode n, P p);

  R visitLocalVariable(LocalVariableNode n, P p);

  R visitVariableDeclaration(VariableDeclarationNode n, P p);

  R visitFieldAccess(FieldAccessNode n, P p);

  R visitMethodAccess(MethodAccessNode n, P p);

  R visitArrayAccess(ArrayAccessNode n, P p);

  R visitImplicitThis(ImplicitThisNode n, P p);

  R visitExplicitThis(ExplicitThisNode n, P p);

  R visitSuper(SuperNode n, P p);

  R visitReturn(ReturnNode n, P p);

  R visitLambdaResultExpression(LambdaResultExpressionNode n, P p);

  R visitStringConversion(StringConversionNode n, P p);

  R visitWideningConversion(WideningConversionNode n, P p);

  R visitNarrowingConversion(NarrowingConversionNode n, P p);

  R visitInstanceOf(InstanceOfNode n, P p);

  R visitTypeCast(TypeCastNode n, P p);

  // Blocks

  R visitSynchronized(SynchronizedNode n, P p);

  // Statements
  R visitAssertionError(AssertionErrorNode n, P p);

  R visitThrow(ThrowNode n, P p);

  // Cases
  R visitCase(CaseNode n, P p);

  // Method and constructor invocations
  R visitMethodInvocation(MethodInvocationNode n, P p);

  R visitObjectCreation(ObjectCreationNode n, P p);

  R visitMemberReference(FunctionalInterfaceNode n, P p);

  R visitArrayCreation(ArrayCreationNode n, P p);

  // Type, package and class names
  R visitArrayType(ArrayTypeNode n, P p);

  R visitPrimitiveType(PrimitiveTypeNode n, P p);

  R visitClassName(ClassNameNode n, P p);

  R visitPackageName(PackageNameNode n, P p);

  // Parameterized types
  R visitParameterizedType(ParameterizedTypeNode n, P p);

  // Marker nodes
  R visitMarker(MarkerNode n, P p);

  // Anonymous/inner/nested class declaration within a method
  R visitClassDeclaration(ClassDeclarationNode classDeclarationNode, P p);
}
