You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
5.0 KiB

/**
* @file newlines.h
* prototypes for newlines.cpp
*
* @author Ben Gardner
* @license GPL v2+
*/
#ifndef NEWLINES_H_INCLUDED
#define NEWLINES_H_INCLUDED
#include "chunk.h"
/**
* Double the newline, if allowed.
*/
void double_newline(Chunk *nl);
/**
* Remove all extra newlines.
* Modify line breaks as needed.
*/
void newlines_remove_newlines();
/**
* Remove all newlines that fail the checks performed by the can_increase_nl() function
*/
void newlines_remove_disallowed();
/** Step through all chunks, altering newlines inside parens of if/for/while/do as needed.
* Handles the style options: nl_multi_line_sparen_open, nl_multi_line_sparen_close, nl_before_if_closing_paren
*/
void newlines_sparens();
//! Step through all chunks.
void newlines_cleanup_braces(bool first);
void newlines_cleanup_angles();
//! Handle insertion/removal of blank lines before if/for/while/do and functions
void newlines_insert_blank_lines();
/**
* Handle removal of extra blank lines in functions
* x <= 0: do nothing, x > 0: allow max x-1 blank lines
*/
void newlines_functions_remove_extra_blank_lines();
void newlines_squeeze_ifdef();
/**
* In case of consecutive closing parens, which follow a newline,
* the closing paren are altered to different lines, as per the respective opening parens.
* In the given example, first 2 opening paren are in same line, hence the respective closing paren are put in the same line.
* input:
* func1(func2(
* func3(
* func4(
* )
* )
* )
* );
* output:
* func1(func2(
* func3(
* func4(
* )
* )
* ));
*/
void newlines_squeeze_paren_close();
//! removes unnecessary newlines at start and end of a file
void newlines_eat_start_end();
/**
* Searches for a chunk of type chunk_type and moves them, if needed.
* Will not move tokens that are on their own line or have other than
* exactly 1 newline before (options::pos_comma() == TRAIL) or after (options::pos_comma() == LEAD).
* We can't remove a newline if it is right before a preprocessor.
*/
void newlines_chunk_pos(E_Token chunk_type, uncrustify::token_pos_e mode);
/**
* Searches for CT_CLASS_COLON and moves them, if needed.
* Also breaks up the args
*/
void newlines_class_colon_pos(E_Token tok);
void newlines_cleanup_dup();
void annotations_newlines();
void newline_after_multiline_comment();
//! Handle insertion of blank lines after label colons
void newline_after_label_colon();
/**
* Scans for newline tokens and changes the nl_count.
* A newline token has a minimum nl_count of 1.
* Note that a blank line is actually 2 newlines, unless the newline is the
* first chunk.
* So, most comparisons have +1 below.
*/
void do_blank_lines();
/**
* Clears the PCF_ONE_LINER flag on the current line.
* Done right before inserting a newline.
*/
void undo_one_liner(Chunk *pc);
/**
* Does a simple Ignore, Add, Remove, or Force after the given chunk
*
* @param pc The chunk
* @param av The IARF value
*/
void newline_iarf(Chunk *pc, uncrustify::iarf_e av);
/**
* Add a newline before the chunk if there isn't already a newline present.
* Virtual braces are skipped, as they do not contribute to the output.
*/
Chunk *newline_add_before(Chunk *pc);
/**
* Add a newline after the chunk if there isn't already a newline present.
* Virtual braces are skipped, as they do not contribute to the output.
*/
Chunk *newline_force_before(Chunk *pc);
Chunk *newline_add_after(Chunk *pc);
Chunk *newline_force_after(Chunk *pc);
/**
* Removes any CT_NEWLINE or CT_NL_CONT between start and end.
* Start must be before end on the chunk list.
* If the 'PCF_IN_PREPROC' status differs between two tags, we can't remove
* the newline.
*
* @param start The starting chunk (if it is a newline, it will be removed!)
* @param end The ending chunk (will not be removed, even if it is a newline)
*
* @return true/false - removed something
*/
void newline_del_between(Chunk *start, Chunk *end);
/**
* Add a newline between two tokens.
* If there is already a newline between then, nothing is done.
* Otherwise a newline is inserted.
*
* If end is CT_BRACE_OPEN and a comment and newline follow, then
* the brace open is moved instead of inserting a newline.
*
* In this situation:
* if (...) { //comment
*
* you get:
* if (...) //comment
* {
*/
Chunk *newline_add_between(Chunk *start, Chunk *end);
/**
* Counts newlines between two chunk elements
*
* @param pc_start chunk from which the counting of newlines will start
* @param pc_end chunk at which the counting of newlines will end
* @param newlines reference in which the amount of newlines will be written to
* (will be initialized with 0)
* @param scope specifies region chunks should/should not be considered.
*
* @return false if pc_start or pc_end are null chunks or if pc_end is not reached
* @return true if above cases are not met
*/
bool newlines_between(Chunk *pc_start, Chunk *pc_end, size_t &newlines, E_Scope scope = E_Scope::ALL);
#endif /* NEWLINES_H_INCLUDED */