Esempio n. 1
0
        // 'from' relative_module 'import' identifier ['as' name] (',' identifier ['as' name]) *
        // 'from' relative_module 'import' '(' identifier ['as' name] (',' identifier ['as' name])* [','] ')'
        // 'from' module 'import' "*"
        private FromImportStatement ParseFromImportStmt()
        {
            Eat(TokenKind.KeywordFrom);
            string fromWhiteSpace = _tokenWhiteSpace;
            var start = GetStart();
            ModuleName dname = ParseRelativeModuleName();

            bool ateImport = Eat(TokenKind.KeywordImport);
            string importWhiteSpace = _tokenWhiteSpace;

            bool ateParen = ateImport && MaybeEat(TokenKind.LeftParenthesis);
            string parenWhiteSpace = ateParen ? _tokenWhiteSpace : null;

            NameExpression/*!*/[] names;
            NameExpression[] asNames;
            bool fromFuture = false;

            List<string> namesWhiteSpace = null;
            if (ateImport) {
                if (MaybeEat(TokenKind.Multiply)) {
                    if (_langVersion.Is7x() && ((_functions != null && _functions.Count > 0) || _classDepth > 0)) {
                        ReportSyntaxError(start, GetEnd(), "import * only allowed at module level");
                    }

                    if (_verbatim) {
                        namesWhiteSpace = new List<string>() { _tokenWhiteSpace };
                    }
                    names = new[] { new NameExpression("*") };
                    asNames = null;
                } else {
                    List<NameExpression/*!*/> l = new List<NameExpression>();
                    List<NameExpression> las = new List<NameExpression>();
                    ParseAsNameList(l, las, out namesWhiteSpace);

                    names = l.ToArray();
                    asNames = las.ToArray();
                }
            } else {
                names = EmptyNames;
                asNames = EmptyNames;
            }

            // Process from __future__ statement
            if (dname.Names.Count == 1 && dname.Names[0].Name == "__future__") {
                fromFuture = ProcessFutureStatements(start, names, fromFuture);
            }

            bool ateRightParen = false;
            if (ateParen) {
                ateRightParen = Eat(TokenKind.RightParenthesis);
            }

            FromImportStatement ret = new FromImportStatement(dname, names, asNames, fromFuture, AbsoluteImports);
            if (_verbatim) {
                AddPreceedingWhiteSpace(ret, fromWhiteSpace);
                AddSecondPreceedingWhiteSpace(ret, importWhiteSpace);
                if (namesWhiteSpace != null) {
                    AddNamesWhiteSpace(ret, namesWhiteSpace.ToArray());
                }
                if (ateParen) {
                    AddThirdPreceedingWhiteSpace(ret, parenWhiteSpace);
                    AddFourthPreceedingWhiteSpace(ret, _tokenWhiteSpace);
                    if (!ateRightParen) {
                        AddErrorMissingCloseGrouping(ret);
                    }
                } else {
                    AddIsAltForm(ret);
                }
                if (!ateImport) {
                    AddErrorIsIncompleteNode(ret);
                }

            }
            ret.SetLoc(start, GetEnd());
            return ret;
        }