void () { assertCurrentToken(PyTokenTypes.AT); // ??? need this? final SyntaxTreeBuilder.Marker decoratorStartMarker = myBuilder.mark(); final SyntaxTreeBuilder.Marker decoListMarker = myBuilder.mark(); boolean decorated = false; while (myBuilder.getTokenType() == PyTokenTypes.AT) { SyntaxTreeBuilder.Marker decoratorMarker = myBuilder.mark(); myBuilder.advanceLexer(); myContext.getFunctionParser().parseDecoratorExpression(); if (atToken(PyTokenTypes.STATEMENT_BREAK)) { decoratorMarker.done(PyElementTypes.DECORATOR_CALL); nextToken(); } else { myBuilder.error(message("PARSE.expected.statement.break")); decoratorMarker.done(PyElementTypes.DECORATOR_CALL); } decorated = true; } if (decorated) decoListMarker.done(PyElementTypes.DECORATOR_LIST); //else decoListMarker.rollbackTo(); parseDeclarationAfterDecorator(decoratorStartMarker); }