boolean (SyntaxTreeBuilder.Marker exprStart, @Nullable SyntaxTreeBuilder.Marker sliceOrTupleStart) { boolean inSlice = sliceOrTupleStart == null; while (atToken(PyTokenTypes.COMMA)) { nextToken(); SyntaxTreeBuilder.Marker sliceItemStart = myBuilder.mark(); parseTestExpression(false, false); if (matchToken(PyTokenTypes.COLON)) { inSlice = true; parseTestExpression(false, false); if (matchToken(PyTokenTypes.COLON)) { parseTestExpression(false, false); } } sliceItemStart.done(PyElementTypes.SLICE_ITEM); if (!BRACKET_OR_COMMA.contains(myBuilder.getTokenType())) { myBuilder.error(message("rbracket.or.comma.expected")); break; } } checkMatches(PyTokenTypes.RBRACKET, message("PARSE.expected.rbracket")); if (inSlice) { if (sliceOrTupleStart != null) { sliceOrTupleStart.drop(); } exprStart.done(PyElementTypes.SLICE_EXPRESSION); } return inSlice; }