docs: public void traverse(JavacASTVisitor visitor) {
  		switch (this.getKind()) {
  		case COMPILATION_UNIT:
  			visitor.visitCompilationUnit(this, (JCCompilationUnit) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitCompilationUnit(this, (JCCompilationUnit) get());
  			break;
  		case TYPE:
  			visitor.visitType(this, (JCClassDecl) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitType(this, (JCClassDecl) get());
  			break;
  		case FIELD:
  			visitor.visitField(this, (JCVariableDecl) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitField(this, (JCVariableDecl) get());
  			break;
  		case METHOD:
  			visitor.visitMethod(this, (JCMethodDecl) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitMethod(this, (JCMethodDecl) get());
  			break;
  		case INITIALIZER:
  			visitor.visitInitializer(this, (JCBlock) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitInitializer(this, (JCBlock) get());
  			break;
  		case ARGUMENT:
  			JCMethodDecl parentMethod = (JCMethodDecl) up().get();
  			visitor.visitMethodArgument(this, (JCVariableDecl) get(), parentMethod);
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitMethodArgument(this, (JCVariableDecl) get(), parentMethod);
  			break;
  		case LOCAL:
  			visitor.visitLocal(this, (JCVariableDecl) get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitLocal(this, (JCVariableDecl) get());
  			break;
  		case STATEMENT:
  			visitor.visitStatement(this, get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitStatement(this, get());
  			break;
  		case ANNOTATION:
  			switch (up().getKind()) {
  			case TYPE:
  				visitor.visitAnnotationOnType((JCClassDecl) up().get(), this, (JCAnnotation) get());
  				break;
  			case FIELD:
  				visitor.visitAnnotationOnField((JCVariableDecl) up().get(), this, (JCAnnotation) get());
  				break;
  			case METHOD:
  				visitor.visitAnnotationOnMethod((JCMethodDecl) up().get(), this, (JCAnnotation) get());
  				break;
  			case ARGUMENT:
  				JCVariableDecl argument = (JCVariableDecl) up().get();
  				JCMethodDecl method = (JCMethodDecl) up().up().get();
  				visitor.visitAnnotationOnMethodArgument(argument, method, this, (JCAnnotation) get());
  				break;
  			case LOCAL:
  				visitor.visitAnnotationOnLocal((JCVariableDecl) up().get(), this, (JCAnnotation) get());
  				break;
  			case TYPE_USE:
  				visitor.visitAnnotationOnTypeUse(up().get(), this, (JCAnnotation) get());
  				break;
  			default:
  				throw new AssertionError("Annotion not expected as child of a " + up().getKind());
  			}
  			break;
  		case TYPE_USE:
  			visitor.visitTypeUse(this, get());
  			ast.traverseChildren(visitor, this);
  			visitor.endVisitTypeUse(this, get());
  			break;
  		default:
  			throw new AssertionError("Unexpected kind during node traversal: " + getKind());
  		}
  	}