void () { SyntaxTreeBuilder builder = myContext.getBuilder(); assertCurrentToken(PyTokenTypes.FROM_KEYWORD); myFutureImportPhase = Phase.FROM; final SyntaxTreeBuilder.Marker fromImportStatement = builder.mark(); builder.advanceLexer(); boolean from_future = false; boolean had_dots = parseRelativeImportDots(); IElementType statementType = PyElementTypes.FROM_IMPORT_STATEMENT; if (had_dots && parseOptionalDottedName() || parseDottedName()) { final ImportTypes types = checkFromImportKeyword(); statementType = types.statement; final IElementType elementType = types.element; if (myFutureImportPhase == Phase.FUTURE) { myFutureImportPhase = Phase.IMPORT; from_future = true; } if (builder.getTokenType() == PyTokenTypes.MULT) { final SyntaxTreeBuilder.Marker star_import_mark = builder.mark(); builder.advanceLexer(); star_import_mark.done(types.starElement); } else if (builder.getTokenType() == PyTokenTypes.LPAR) { builder.advanceLexer(); parseImportElements(elementType, false, true, from_future); checkMatches(PyTokenTypes.RPAR, PyParsingBundle.message("PARSE.expected.rpar")); } else { parseImportElements(elementType, false, false, from_future); } } else if (had_dots) { // from . import ... final ImportTypes types = checkFromImportKeyword(); statementType = types.statement; parseImportElements(types.element, false, false, from_future); } checkEndOfStatement(); fromImportStatement.done(statementType); myFutureImportPhase = Phase.NONE; }