AST* Parser::statement(Scope* ps) { AST* ret = NULL; if (expect(";")) { ret = emptyStatement(); } else if (expect("var")) { ret = varStatement(ps); opteol(); } else if (expect("{")) { ret = block(ps); opteol(); } else if (expect("if")) { ret = ifStatement(ps); } else if (expect("switch")) { ret = switchStatement(ps); } else if (expect("do")) { ret = doStatement(ps); opteol(); } else if (expect("while")) { ret = whileStatement(ps); } else if (expect("for")) { ret = forStatement(ps); } else if (expect("with")) { ret = withStatement(ps); } else if (expect("continue")) { ret = continueStatement(); opteol(); } else if (expect("break")) { ret = breakStatement(); opteol(); } else if (expect("return")) { ret = returnStatement(ps); opteol(); } else if (expect("try")) { ret = tryStatement(ps); } else if (expect("throw")) { ret = throwStatement(ps); opteol(); } else { ret = expression(0, ps); opteol(); } return ret; }
void GoCodeFormatter::recalculateStateAfter(const QTextBlock &block) { restoreCurrentState(block.previous()); const LexerState lexerState(tokenizeBlock(block)); m_newStates.clear(); int currentState; for (m_index = 0; m_index < m_tokens.count(); ++m_index) { currentState = m_currentState.top().state; m_tk = m_tokens.at(m_index); switch (currentState) { case TopMost: tryDeclaration(); break; case PackageClause: switch (m_tk.kind()) { case T_IDENTIFIER: leave(); break; default: break; } break; case ImportDecl: switch (m_tk.kind()) { case T_LPAREN: enter(ImportOpen); break; case T_STRING: leave(); break; default: break; } break; case ImportOpen: switch (m_tk.kind()) { case T_RPAREN: leave(); leave(); break; default: break; } break; case InterfaceDecl: switch (m_tk.kind()) { case T_LBRACE: enter(InterfaceOpen); break; default: break; } break; case InterfaceOpen: switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; default: break; } break; case StructDecl: switch (m_tk.kind()) { case T_LBRACE: enter(StructOpen); break; default: break; } break; case StructOpen: switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; default: break; } break; case TypeDecl: switch (m_tk.kind()) { case T_LPAREN: enter(TypeOpen); break; case T_INTERFACE: leave(); enter(InterfaceDecl); break; case T_STRUCT: leave(); enter(StructDecl); break; default: leave(); break; } break; case TypeOpen: switch (m_tk.kind()) { case T_INTERFACE: leave(); enter(InterfaceDecl); break; case T_STRUCT: enter(StructDecl); break; case T_RPAREN: leave(); leave(); break; default: break; } break; case IdentDecl: leave(); break; // TODO: implement /* switch (m_tk.kind()) { case T_LPAREN: enter(IdentArgs); break; case T_LBRACE: enter(IdentFields); break; default: leave(); break; } break; case IdentArgs: switch (m_tk.kind()) { case T_RPAREN: leave(); break; default: break; } break; case IdentFields: switch (m_tk.kind()) { case T_RBRACE: leave(); break; default: break; } break;*/ case ConstDecl: leave(); break; // TODO: implement case VarDecl: leave(); break; // TODO: implement /* switch (m_tk.kind()) { case T_LPAREN: enter(VarOpen); break; case T_EQUAL: enter(VarExpr); break; default: break; } break; case VarOpen: switch (m_tk.kind()) { case T_RPAREN: leave(); leave(); break; default: if (!tryDeclaration()) leave(); break; } break; case VarExpr: if (tryDeclaration()) break; else leave(); break;*/ case FuncDecl: switch (m_tk.kind()) { case T_LBRACE: enter(FuncOpen); break; case T_LPAREN: enter(FuncParams); break; default: break; } break; case FuncOpen: switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; default: tryStatement(); break; } break; case FuncParams: switch (m_tk.kind()) { case T_RPAREN: leave(); break; default: break; } break; case BlockOpen: switch (m_tk.kind()) { case T_RBRACE: leave(); break; default: tryStatement(); break; } break; case GroupOpen: switch (m_tk.kind()) { case T_RPAREN: leave(); break; default: tryStatement(); break; } break; case ForStmt: switch (m_tk.kind()) { case T_LBRACE: enter(ForOpen); break; default: break; } break; case ForOpen: // TODO: parse arguments switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; default: tryStatement(); break; } break; case IfStmt: switch (m_tk.kind()) { case T_LBRACE: enter(IfOpen); break; default: break; } break; case IfOpen: // TODO: parse arguments switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; default: tryStatement(); break; } break; case SwitchStmt: switch (m_tk.kind()) { case T_LBRACE: enter(SwitchOpen); break; default: break; } break; case SwitchOpen: switch (m_tk.kind()) { case T_RBRACE: leave(); leave(); break; case T_DEFAULT: case T_CASE: enter(CaseClause); break; default: break; } break; case CaseClause: switch (m_tk.kind()) { case T_COLON: leave(); enter(CaseOpen); break; default: break; } break; case CaseOpen: switch (m_tk.kind()) { case T_DEFAULT: case T_CASE: leave(); enter(CaseClause); break; case T_RBRACE: leave(); leave(); leave(); break; default: tryStatement(); break; } break; case Label: switch (m_tk.kind()) { case T_COLON: leave(); break; default: leave(); continue; // shouldn't happen } break; case MultilineCommentStart: case MultilineCommentCont: if (m_tk.kind() != T_COMMENT) { leave(); continue; } else if (m_index == m_tokens.size() - 1 && lexerState.multiLine() == LexerState::NoMultiLine) { leave(); } else if (m_index == 0 && m_tk.is(T_COMMENT)) { // to allow enter/leave to update the indentDepth leave(); enter(MultilineCommentCont); } break; default: break; } } currentState = m_currentState.top().state; if (currentState != MultilineCommentStart && currentState != MultilineCommentCont && (lexerState.multiLine() == LexerState::MultiLineComment)) { enter(MultilineCommentStart); } saveCurrentState(block); }