public boolean parseScript()

in CFML/src/com/intellij/coldFusion/model/parsers/CfscriptParser.java [702:852]


  public boolean parseScript(PsiBuilder myBuilder, boolean betweenScriptTags, boolean createBlockOfStatments, boolean waitForRightBracket) {
    PsiBuilder.Marker blockOfStatements = null;
    if (myBuilder.getTokenType() == L_CURLYBRACKET) {
      waitForRightBracket = true;
      blockOfStatements = myBuilder.mark();
      myBuilder.advanceLexer();
    }
    while (!isEndOfScript(myBuilder)) {
      int lexerPosition = myBuilder.getCurrentOffset();
      if (myBuilder.getTokenType() == INCLUDE_KEYWORD) {
        parseInclude(myBuilder);
      }
      else if (myBuilder.getTokenType() == IMPORT_KEYWORD) {
        parseImport(myBuilder);
      }
      else if (myBuilder.getTokenType() == COMPONENT_KEYWORD ||
               myBuilder.getTokenType() == INTERFACE_KEYWORD) {
        parseComponentOrInterface(myBuilder);
      }
      else if (ACCESS_KEYWORDS.contains(myBuilder.getTokenType()) ||
               myBuilder.getTokenType() == FUNCTION_KEYWORD
        ) {
        parseFunctionExpression(myBuilder, false);
      }
      else if (TYPE_KEYWORDS.contains(myBuilder.getTokenType())) {
        if (!tryParseStatement(myBuilder)) {
          parseFunctionExpression(myBuilder, false);
        }
      }
      else if (myBuilder.getTokenType() == VAR_KEYWORD) {
        parseStatement(myBuilder);
      }
      else if (myBuilder.getTokenType() == IF_KEYWORD) {
        parseIfExpression(myBuilder);
      }
      else if (myBuilder.getTokenType() == WHILE_KEYWORD) {
        parseWhileExpression(myBuilder);
      }
      else if (myBuilder.getTokenType() == DO_KEYWORD) {
        parseDoWhileExpression(myBuilder);
      }
      else if (myBuilder.getTokenType() == FOR_KEYWORD) {
        parseForExpression(myBuilder);
      }
      else if (myBuilder.getTokenType() == SWITCH_KEYWORD) {
        parseSwitchExpression(myBuilder);
      } else if (myBuilder.getTokenType() == RETHROW_KEYWORD) {
        myBuilder.advanceLexer();
        eatSemicolon(myBuilder);
      }
      else if (myBuilder.getTokenType() == RETURN_KEYWORD) {
        parseReturnStatement(myBuilder);
      }
      else if (myBuilder.getTokenType() == BREAK_KEYWORD ||
               myBuilder.getTokenType() == ABORT_KEYWORD) {
        myBuilder.advanceLexer();
        eatSemicolon(myBuilder);
      }
      else if (CfmlUtil.isActionName(myBuilder)) {
        parseAction(myBuilder);
      }
      else if (myBuilder.getTokenType() == L_CURLYBRACKET) {
        parseScript(myBuilder, false);
      }
      else if (myBuilder.getTokenType() == R_CURLYBRACKET) {
        if (waitForRightBracket) {
          myBuilder.advanceLexer();
          if (blockOfStatements != null) {
            if (createBlockOfStatments) {
              blockOfStatements.done(CfmlElementTypes.BLOCK_OF_STATEMENTS);
            }
            else {
              blockOfStatements.drop();
            }
          }
          return true;
        }
        else {
          myBuilder.error(CfmlBundle.message("cfml.parsing.unexpected.token"));
          myBuilder.advanceLexer();
          return false;
        }
      }
      else if (myBuilder.getTokenType() == TRY_KEYWORD) {
        parseTryCatchExpression(myBuilder);
      }
      else if (KEYWORDS.contains(myBuilder.getTokenType())) {
        if (myBuilder.getTokenType() == VAR_KEYWORD || myBuilder.getTokenType() == SCOPE_KEYWORD) {
          parseStatement(myBuilder);
        }
        else if (myBuilder.getTokenType() != CONTINUE_KEYWORD &&
                 myBuilder.getTokenType() != RETURN_KEYWORD &&
                 myBuilder.getTokenType() != BREAK_KEYWORD) {
          PsiBuilder.Marker errorMarker = myBuilder.mark();
          myBuilder.advanceLexer();
          errorMarker.error(CfmlBundle.message("cfml.parsing.unexpected.token"));
        }
        else {
          myBuilder.advanceLexer();
          eatSemicolon(myBuilder);
        }
      }
      else {
        PsiBuilder.Marker marker = myBuilder.mark();
        if (parseType(myBuilder) && myBuilder.getTokenType() == FUNCTION_KEYWORD) {
          marker.rollbackTo();
          parseFunctionExpression(myBuilder, false);
        }
        else {
          marker.rollbackTo();
          if (myBuilder.getTokenType() == IDENTIFIER) {
            PsiBuilder.Marker assignMarker = myBuilder.mark();
            myBuilder.advanceLexer();
            if (myBuilder.getTokenType() == CfmlTokenTypes.ASSIGN) {
              assignMarker.rollbackTo();
              new CfmlExpressionParser(myBuilder).parseExpression();
              eatSemicolon(myBuilder);
            }
            else {
              assignMarker.rollbackTo();
              parseStatement(myBuilder);
            }
          }
          else {
            parseStatement(myBuilder);
          }
        }
      }

      if (!betweenScriptTags && !waitForRightBracket) {
        break;
      }
      if (lexerPosition == myBuilder.getCurrentOffset()) {
        myBuilder.error(CfmlBundle.message("cfml.parsing.unexpected.token"));
        myBuilder.advanceLexer();
        if (blockOfStatements != null) {
          blockOfStatements.drop();
        }
        return false;
      }

      /*
      IN_KEYWORD,
      VAR_KEYWORD,
      */
    }
    if (blockOfStatements != null) {
      blockOfStatements.drop();
    }
    return true;
  }