summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp b/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp
new file mode 100644
index 00000000..569f5271
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.78.1/src/semicolons.cpp
@@ -0,0 +1,151 @@
+/**
+ * @file semicolons.cpp
+ * Removes extra semicolons
+ *
+ * @author Ben Gardner
+ * @license GPL v2+
+ */
+
+#include "semicolons.h"
+
+#include "prototypes.h"
+
+
+static void remove_semicolon(Chunk *pc);
+
+
+/**
+ * We are on a semicolon that is after an unidentified brace close.
+ * Check for what is before the brace open.
+ * Do not remove if it is a square close, word, type, or paren close.
+ */
+static void check_unknown_brace_close(Chunk *semi, Chunk *brace_close);
+
+
+static void remove_semicolon(Chunk *pc)
+{
+ LOG_FUNC_ENTRY();
+ LOG_FMT(LDELSEMI, "%s(%d): Removed semicolon: orig line is %zu, orig col is %zu",
+ __func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol());
+ log_func_stack_inline(LDELSEMI);
+ // TODO: do we want to shift stuff back a column?
+ Chunk::Delete(pc);
+}
+
+
+void remove_extra_semicolons()
+{
+ LOG_FUNC_ENTRY();
+
+ Chunk *pc = Chunk::GetHead();
+
+ while (pc->IsNotNullChunk())
+ {
+ Chunk *next = pc->GetNextNcNnl();
+ Chunk *prev;
+
+ if ( pc->Is(CT_SEMICOLON)
+ && !pc->TestFlags(PCF_IN_PREPROC)
+ && (prev = pc->GetPrevNcNnl())->IsNotNullChunk())
+ {
+ LOG_FMT(LSCANSEMI, "%s(%d): Semi orig line is %zu, orig col is %zu, parent is %s, prev = '%s' [%s/%s]\n",
+ __func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), get_token_name(pc->GetParentType()),
+ prev->Text(),
+ get_token_name(prev->GetType()), get_token_name(prev->GetParentType()));
+
+ if (pc->GetParentType() == CT_TYPEDEF)
+ {
+ // keep it
+ }
+ else if ( prev->Is(CT_BRACE_CLOSE)
+ && ( prev->GetParentType() == CT_ELSE
+ || prev->GetParentType() == CT_ELSEIF
+ || prev->GetParentType() == CT_FOR
+ || prev->GetParentType() == CT_FUNC_CLASS_DEF
+ || prev->GetParentType() == CT_FUNC_DEF
+ || prev->GetParentType() == CT_IF
+ || prev->GetParentType() == CT_NAMESPACE
+ || prev->GetParentType() == CT_OC_MSG_DECL
+ || prev->GetParentType() == CT_SWITCH
+ || prev->GetParentType() == CT_USING_STMT
+ || prev->GetParentType() == CT_WHILE))
+ {
+ // looking for code block vs. initialisation
+ bool code_block_found = true;
+ Chunk *closing_brace = pc->GetPrevNcNnl(); // Issue #3506
+
+ if (closing_brace->IsNotNullChunk())
+ {
+ Chunk *opening_brace = closing_brace->GetOpeningParen();
+
+ if (opening_brace->IsNotNullChunk())
+ {
+ Chunk *equal_sign = opening_brace->GetPrevNcNnl();
+
+ if ( equal_sign->IsNotNullChunk()
+ && equal_sign->Is(CT_ASSIGN))
+ {
+ // initialisation found
+ code_block_found = false;
+ }
+ }
+ }
+
+ if (code_block_found)
+ {
+ // code block found
+ remove_semicolon(pc);
+ }
+ }
+ else if ( prev->Is(CT_BRACE_CLOSE)
+ && prev->GetParentType() == CT_NONE)
+ {
+ check_unknown_brace_close(pc, prev);
+ }
+ else if ( prev->Is(CT_SEMICOLON)
+ && prev->GetParentType() != CT_FOR)
+ {
+ remove_semicolon(pc);
+ }
+ else if ( language_is_set(LANG_D)
+ && ( prev->GetParentType() == CT_ENUM
+ || prev->GetParentType() == CT_STRUCT
+ || prev->GetParentType() == CT_UNION))
+ {
+ remove_semicolon(pc);
+ }
+ else if ( language_is_set(LANG_JAVA)
+ && prev->GetParentType() == CT_SYNCHRONIZED)
+ {
+ remove_semicolon(pc);
+ }
+ else if (prev->Is(CT_BRACE_OPEN))
+ {
+ remove_semicolon(pc);
+ }
+ }
+ pc = next;
+ }
+} // remove_extra_semicolons
+
+
+static void check_unknown_brace_close(Chunk *semi, Chunk *brace_close)
+{
+ LOG_FUNC_ENTRY();
+ Chunk *pc = brace_close->GetPrevType(CT_BRACE_OPEN, brace_close->GetLevel());
+
+ pc = pc->GetPrevNcNnl();
+
+ if ( pc->IsNotNullChunk()
+ && pc->IsNot(CT_ANGLE_CLOSE)
+ && pc->IsNot(CT_COND_COLON) // Issue #3920
+ && pc->IsNot(CT_RETURN)
+ && pc->IsNot(CT_SQUARE_CLOSE)
+ && pc->IsNot(CT_TSQUARE)
+ && pc->IsNot(CT_TYPE)
+ && pc->IsNot(CT_WORD)
+ && !pc->IsParenClose())
+ {
+ remove_semicolon(semi);
+ }
+}