/** * Removes superfluous semicolons: * - after brace close whose parent is IF, ELSE, SWITCH, WHILE, FOR, NAMESPACE * - after another semicolon where parent is not FOR * - (D) after brace close whose parent is ENUM/STRUCT/UNION * - after an open brace * - when not in a #DEFINE */ void remove_extra_semicolons(void) { chunk_t *pc; chunk_t *next; chunk_t *prev; pc = chunk_get_head(); while (pc != NULL) { next = chunk_get_next_ncnl(pc); if ((pc->type == CT_SEMICOLON) && !(pc->flags & PCF_IN_PREPROC) && ((prev = chunk_get_prev_ncnl(pc)) != NULL)) { LOG_FMT(LSCANSEMI, "Semi on %d:%d, prev = '%s' [%s/%s]\n", pc->orig_line, pc->orig_col, prev->str.c_str(), get_token_name(prev->type), get_token_name(prev->parent_type)); if ((prev->type == CT_BRACE_CLOSE) && ((prev->parent_type == CT_IF) || (prev->parent_type == CT_ELSEIF) || (prev->parent_type == CT_ELSE) || (prev->parent_type == CT_SWITCH) || (prev->parent_type == CT_WHILE) || (prev->parent_type == CT_USING_STMT) || (prev->parent_type == CT_FOR) || (prev->parent_type == CT_FUNC_DEF) || (prev->parent_type == CT_OC_MSG_DECL) || (prev->parent_type == CT_FUNC_CLASS) || (prev->parent_type == CT_NAMESPACE))) { remove_semicolon(pc); } else if ((prev->type == CT_BRACE_CLOSE) && (prev->parent_type == CT_NONE)) { check_unknown_brace_close(pc, prev); } else if ((prev->type == CT_SEMICOLON) && (prev->parent_type != CT_FOR)) { remove_semicolon(pc); } else if ((cpd.lang_flags & LANG_D) && ((prev->parent_type == CT_ENUM) || (prev->parent_type == CT_UNION) || (prev->parent_type == CT_STRUCT))) { remove_semicolon(pc); } else if (prev->type == CT_BRACE_OPEN) { remove_semicolon(pc); } } pc = next; } }
void remove_extra_semicolons(void) { LOG_FUNC_ENTRY(); chunk_t *pc = chunk_get_head(); while (pc != nullptr) { chunk_t *next = chunk_get_next_ncnl(pc); chunk_t *prev; if ( pc->type == CT_SEMICOLON && !(pc->flags & PCF_IN_PREPROC) && (prev = chunk_get_prev_ncnl(pc)) != nullptr) { LOG_FMT(LSCANSEMI, "Semi on %zu:%zu parent=%s, prev = '%s' [%s/%s]\n", pc->orig_line, pc->orig_col, get_token_name(pc->parent_type), prev->text(), get_token_name(prev->type), get_token_name(prev->parent_type)); if (pc->parent_type == CT_TYPEDEF) { // keep it } else if ( prev->type == CT_BRACE_CLOSE && ( prev->parent_type == CT_IF || prev->parent_type == CT_ELSEIF || prev->parent_type == CT_ELSE || prev->parent_type == CT_SWITCH || prev->parent_type == CT_WHILE || prev->parent_type == CT_USING_STMT || prev->parent_type == CT_FOR || prev->parent_type == CT_FUNC_DEF || prev->parent_type == CT_OC_MSG_DECL || prev->parent_type == CT_FUNC_CLASS_DEF || prev->parent_type == CT_NAMESPACE)) { LOG_FUNC_CALL(); remove_semicolon(pc); } else if ( prev->type == CT_BRACE_CLOSE && prev->parent_type == CT_NONE) { check_unknown_brace_close(pc, prev); } else if (prev->type == CT_SEMICOLON && prev->parent_type != CT_FOR) { LOG_FUNC_CALL(); remove_semicolon(pc); } else if ( (cpd.lang_flags & LANG_D) && ( prev->parent_type == CT_ENUM || prev->parent_type == CT_UNION || prev->parent_type == CT_STRUCT)) { LOG_FUNC_CALL(); remove_semicolon(pc); } else if ( (cpd.lang_flags & LANG_JAVA) && prev->parent_type == CT_SYNCHRONIZED) { LOG_FUNC_CALL(); remove_semicolon(pc); } else if (prev->type == CT_BRACE_OPEN) { LOG_FUNC_CALL(); remove_semicolon(pc); } } pc = next; } } // remove_extra_semicolons