QString toSQLParse::indentStatement(statement &stat, int level/*SQLITEMAN, toSyntaxAnalyzer &syntax*/) { QString ret; switch (stat.Type) { default: { QMessageBox::warning(QApplication::activeWindow(), "Sqliteman", "toSQLparse: Internal error in toSQLParse, should never get here"); } case statement::Block: { ret = IndentComment(level, 0, stat.Comment, false); int exc = 0; for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin(); i != stat.subTokens().end(); i++) { int add = 0; std::list<toSQLParse::statement>::iterator j = i; j++; if (i != stat.subTokens().begin() && j != stat.subTokens().end()) add = Settings.IndentLevel; else exc = 0; QString t; if ((*i).subTokens().begin() != (*i).subTokens(). end()) t = (*(*i).subTokens().begin()).String.toUpper(); if (t == ("BEGIN") || t == ("WHEN") || t == ("ELSE") || t == ("ELSIF")) add = 0; if ((*i).Type == statement::List) ret += indentString(level + add + exc); ret += indentStatement(*i, level + add + exc/*SQLITEMAN , syntax*/); if ((*i).Type == statement::List) { int i; for (i = ret.length() - 1;i >= 0 && ret[i].isSpace();i--) ; ret = ret.mid(0, std::max(i + 1, 0)); ret += ("\n"); ret += indentString(level + exc); } if (t == ("EXCEPTION")) exc = Settings.IndentLevel * 2; } if (Settings.EndBlockNewline && level != 0) ret += ("\n"); } break; case statement::List: case statement::Statement: int maxlev = 0; int maxlevorig = 0; bool useMaxLev = false; bool any = true; int current; bool first; bool noKeyBreak = false; bool lineList = false; QString comment; if (stat.Type == statement::Statement) { ret = IndentComment(level, 0, stat.Comment, false); useMaxLev = true; first = true; current = 0; } else { for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin(); i != stat.subTokens().end();) { if ((*i).Type != statement::Keyword) noKeyBreak = true; else useMaxLev = true; break; } current = level; first = true; } if (useMaxLev) { int count = 0; for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin(); i != stat.subTokens().end(); i++) { if (any) { QString upp = (*i).String.toUpper(); if ((*i).Type == statement::Keyword && upp != ("LOOP") && upp != ("DO") && upp != ("THEN") && upp != ("AS") && upp != ("IS")) { if (int((*i).String.length()) + 1 > maxlev) maxlev = (*i).String.length() + 1; count++; any = false; } else if (i == stat.subTokens().begin()) { noKeyBreak = true; break; } } else if ((*i).Type == statement::Token) any = true; if ((*i).Type == statement::List) count++; } if (count <= 1 && maxlev > 0) maxlev--; maxlevorig = maxlev; any = true; } for (std::list<toSQLParse::statement>::iterator i = stat.subTokens().begin(); i != stat.subTokens().end(); i++) { comment = AddComment(comment, (*i).Comment); QString upp = (*i).String.toUpper(); #ifdef TOPARSE_DEBUG printf("%s\n", (const char*)(*i).String.toUtf8()); #endif if ((*i).Type == statement::List) { if (Settings.OperatorSpace) { ret += (" "); current++; } QString t = indentStatement(*i, current/*SQLITEMAN, syntax*/); if (t.indexOf(("\n")) >= 0) current = CurrentColumn(t); else current += CurrentColumn(t); ret += t; any = true; } else if ((*i).String == (",")) { if (Settings.CommaBefore) { ret += IndentComment(Settings.CommentColumn, current, comment, true); comment = QString::null; ret += indentString(level + maxlev - (Settings.OperatorSpace ? 2 : 1)); ret += (","); } else { ret += (","); ret += IndentComment(Settings.CommentColumn, current + 1, comment, true); comment = QString::null; ret += indentString(level + maxlev); } current = level + maxlev; any = false; lineList = true; } else if ((*i).Type == statement::Keyword && (upp == ("LOOP") || upp == ("DO") || upp == ("THEN") || upp == ("AS") || upp == ("IS"))) { if (!Settings.BlockOpenLine) { if (ret.length() > 0) { if (toIsIdent(ret.at(ret.length() - 1)) || ret.at(ret.length() - 1) == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ || ret.at(ret.length() - 1) == '\'' || Settings.OperatorSpace) { ret += (" "); current++; } } ret += Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String; current += (*i).String.length(); } else { ret += IndentComment(Settings.CommentColumn, current, comment, true); comment = QString::null; ret += indentString(level); ret += Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String; current = level + (*i).String.length(); } any = false; } else if (any && (*i).Type == statement::Keyword && !noKeyBreak) { if (first) first = false; else { ret += IndentComment(Settings.CommentColumn, current, comment, true); current = 0; comment = QString::null; } if (current == 0) { ret += indentString(level); current = level; } else while (current < level) { ret += (" "); current++; } maxlev = maxlevorig; QString word = Settings.KeywordUpper ? (*i).String.toUpper() : (*i).String; if (ret.length()) { ret += QString("%1").arg(word, Settings.RightSeparator ? maxlev - 1 : 1 - maxlev); current = level + std::max(int(word.length()), maxlev - 1); } else { ret += word; current = level + word.length(); } any = false; lineList = false; } else { QString t = (*i).String; bool add = false; if ((*i).Type == statement::Keyword) { if (!lineList && !any && (*i).Type == statement::Keyword && !noKeyBreak && upp == ("BY")) add = true; } else { any = true; } if (isKeyword(upp) /*SQLITEMAN syntax.reservedWord(upp)*/ && Settings.KeywordUpper) t = upp; int extra; if (first) { first = false; any = false; extra = 0; } else { if (ret.length() > 0 && !ret.at(ret.length() - 1).isSpace() && (Settings.OperatorSpace || ((toIsIdent(t[0]) || t[0] == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ || t[0] == '\'') && (toIsIdent(ret.at(ret.length() - 1)) || ret.at(ret.length() - 1) == QUOTE_CHARACTER /*SQLITEMAN syntax.quoteCharacter()*/ || ret.at(ret.length() - 1) == '\'') ) ) ) { if (t != (";") && t != (".") && ret.at(ret.length() - 1) != '.' && current != 0) { current++; ret += (" "); } } else if (ret.length() > 2 && ret.at(ret.length() - 2) == '*' && ret.at(ret.length() - 1) == '/') { current++; ret += (" "); } extra = maxlev; } if (current < level + maxlev) { if (current == 0) ret += indentString(level + maxlev); else while (current < level + maxlev) { ret += (" "); current++; } current = level + maxlev; } ret += t; current += t.length(); if (t.startsWith(("<<"))) { ret += ("\n"); current = 0; } if (add ) maxlev += t.length() + 1; } } if (stat.Type == statement::Statement) { ret += IndentComment(Settings.CommentColumn, current, comment, true); comment = QString::null; if (Settings.EndBlockNewline && level == 0 && stat.subTokens().begin() != stat.subTokens().end() && (*stat.subTokens().rbegin()).String == (";")) ret += ("\n"); } else if (!comment.isEmpty()) { ret += IndentComment(Settings.CommentColumn, current, comment, true); comment = QString::null; ret += indentString(level - (Settings.OperatorSpace ? 2 : 1)); } break; } return ret; }
int Indent_C(EBuffer *B, int Line, int PosCursor) { int I; hsState *StateMap = NULL; int StateLen = 0; int OI; OI = I = B->LineIndented(Line); if (Line == 0) { I = 0; } else { if (I != 0) B->IndentLine(Line, 0); if (B->GetMap(Line, &StateLen, &StateMap) == 0) return 0; switch (B->RLine(Line - 1)->StateE) { case hsC_Comment: case hsC_CPP_Comm: I = IndentComment(B, Line, StateLen, StateMap); break; case hsC_CPP: /*case hsC_CPP_Comm:*/ case hsC_CPP_String1: case hsC_CPP_String2: case hsC_CPP_ABrace: I = C_INDENT; break; default: if (StateLen > 0) { // line is not empty if (StateMap[0] == hsC_CPP || StateMap[0] == hsC_CPP_Comm || StateMap[0] == hsC_CPP_String1 || StateMap[0] == hsC_CPP_String2 || StateMap[0] == hsC_CPP_ABrace) { I = IndentCPP(B, Line, StateLen, 0); } else { I = IndentNormal(B, Line, StateLen, StateMap); if ((StateMap[0] == hsC_Comment || StateMap[0] == hsC_CommentL || StateMap[0] == hsC_CPP_Comm) && ((LookAt(B, Line, 0, "/*", hsC_Comment, 0) || LookAt(B, Line, 0, "/*", hsC_CPP_Comm, 0) || LookAt(B, Line, 0, "//", hsC_CommentL, 0)))) { I += C_COMMENT_OFS; } else if (CheckLabel(B, Line)) { if (LookAt(B, Line, 0, "case", hsC_Keyword) || LookAt(B, Line, 0, "default", hsC_Keyword) || LookAt(B, Line, 0, "public:", hsC_Keyword, 0) || LookAt(B, Line, 0, "private:", hsC_Keyword, 0) || LookAt(B, Line, 0, "protected:", hsC_Keyword, 0)) ; else I += C_COLON_OFS; } //else if (LookAt(B, Line, 0, "{", hsC_Normal, 0)) { // I -= C_INDENT - C_BRACE_OFS; //} } } else { I = IndentNormal(B, Line, 0, NULL); } break; } } if (StateMap) free(StateMap); if (I >= 0) B->IndentLine(Line, I); else I = 0; if (PosCursor == 1) { int X = B->CP.Col; X = X - OI + I; if (X < I) X = I; if (X < 0) X = 0; if (X > B->LineLen(Line)) { X = B->LineLen(Line); if (X < I) X = I; } if (B->SetPosR(X, Line) == 0) return 0; } else if (PosCursor == 2) { if (B->SetPosR(I, Line) == 0) return 0; } return 1; }
//------------------------------------------------------------------------------ const wxString& BeginScript::GetGeneratingString(Gmat::WriteMode mode, const wxString &prefix, const wxString &useName) { //Note: This method is called only once from the ScriptInterpreter::WriteScript() // So all nested ScriptEvent generating string should be handled here wxString gen; wxString indent; wxString commentLine = GetCommentLine(); wxString inlineComment = GetInlineComment(); wxString beginPrefix = prefix; if (mode != Gmat::GUI_EDITOR) { if (mode == Gmat::NO_COMMENTS) { gen << prefix << wxT("BeginScript") << wxT("\n"); } else { IndentComment(gen, commentLine, prefix); gen << prefix << wxT("BeginScript"); if (inlineComment != wxT("")) gen << inlineComment << wxT("\n"); else gen << wxT("\n"); } } #if DBGLVL_GEN_STRING MessageInterface::ShowMessage (wxT("BeginScript::GetGeneratingString() this=(%p)%s, mode=%d, prefix='%s', ") wxT("useName='%s'\n"), this, this->GetTypeName().c_str(), mode, prefix.c_str(), useName.c_str()); #endif if (mode == Gmat::GUI_EDITOR) indent = wxT(""); else indent = wxT(" "); GmatCommand *current = next; while (current != NULL) { #if DBGLVL_GEN_STRING > 1 MessageInterface::ShowMessage (wxT("BeginScript::GetGeneratingString() current=(%p)%s\n"), current, current->GetTypeName().c_str()); #endif if (current->GetTypeName() != wxT("EndScript")) { // Indent whole block within Begin/EndScript IndentChildString(gen, current, indent, mode, prefix, useName, false); // Get command after EndScript current = GmatCommandUtil::GetNextCommand(current); if (current == NULL) IndentChildString(gen, current, indent, mode, beginPrefix, useName, true); } else { if (mode != Gmat::GUI_EDITOR) { // Indent whole block within Begin/EndScript IndentChildString(gen, current, indent, mode, beginPrefix, useName, true); } current = NULL; } } generatingString = gen; #if DBGLVL_GEN_STRING MessageInterface::ShowMessage (wxT("BeginScript::GetGeneratingString() returnning generatingString\n")); MessageInterface::ShowMessage(wxT("<<<\n%s>>>\n\n"), generatingString.c_str()); #endif return generatingString; }
//------------------------------------------------------------------------------ const std::string& BeginScript::GetGeneratingString(Gmat::WriteMode mode, const std::string &prefix, const std::string &useName) { //Note: This method is called only once from the ScriptInterpreter::WriteScript(), // so all nested ScriptEvent generating strings should be handled here. std::stringstream gen; std::string indent; std::string commentLine = GetCommentLine(); std::string inlineComment = GetInlineComment(); std::string beginPrefix = prefix; if (mode != Gmat::GUI_EDITOR) { if (mode == Gmat::NO_COMMENTS) { gen << prefix << "BeginScript" << "\n"; } else { IndentComment(gen, commentLine, prefix); // Insert command name (Fix for GMT-2612, LOJ: 2012.10.22) //gen << prefix << "BeginScript"; std::string tempString = prefix + "BeginScript"; InsertCommandName(tempString); gen << tempString; if (inlineComment != "") gen << inlineComment << "\n"; else gen << "\n"; } } #if DBGLVL_GEN_STRING MessageInterface::ShowMessage ("BeginScript::GetGeneratingString() this=(%p)%s, mode=%d, prefix='%s', " "useName='%s'\n", this, this->GetTypeName().c_str(), mode, prefix.c_str(), useName.c_str()); #endif if (mode == Gmat::GUI_EDITOR) indent = ""; else indent = " "; GmatCommand *current = next; while (current != NULL) { #if DBGLVL_GEN_STRING > 1 MessageInterface::ShowMessage ("BeginScript::GetGeneratingString() current=(%p)%s\n", current, current->GetTypeName().c_str()); #endif if (current->GetTypeName() != "EndScript") { // Indent whole block within Begin/EndScript IndentChildString(gen, current, indent, mode, prefix, useName, false); // Get command after EndScript current = GmatCommandUtil::GetNextCommand(current); if (current == NULL) IndentChildString(gen, current, indent, mode, beginPrefix, useName, true); } else { if (mode != Gmat::GUI_EDITOR) { // Indent whole block within Begin/EndScript IndentChildString(gen, current, indent, mode, beginPrefix, useName, true); } else { std::string comment = current->GetCommentLine(); #if DBGLVL_GEN_STRING MessageInterface::ShowMessage(" EndScript comment = '%s'\n", comment.c_str()); #endif // Only indent inline comment of EndScript (LOJ: 2013.03.27) gen << indent << comment; } current = NULL; } } generatingString = gen.str(); #if DBGLVL_GEN_STRING MessageInterface::ShowMessage ("BeginScript::GetGeneratingString() returnning generatingString\n"); MessageInterface::ShowMessage("<<<\n%s>>>\n\n", generatingString.c_str()); #endif return generatingString; }