()
| 897 | // import_as_names: import_as_name (',' import_as_name)* [','] |
| 898 | // import_as_name: NAME ['as' NAME] |
| 899 | private _parseFromStatement(): ImportFromNode { |
| 900 | let fromToken = this._getKeywordToken(KeywordType.From); |
| 901 | |
| 902 | let modName = this._parseDottedModuleName(true); |
| 903 | let importFromNode = new ImportFromNode(fromToken, modName); |
| 904 | |
| 905 | if (!this._consumeTokenIfKeyword(KeywordType.Import)) { |
| 906 | this._addError('Expected "import"', this._peekToken()); |
| 907 | } else { |
| 908 | // Look for "*" token. |
| 909 | if (!this._consumeTokenIfOperator(OperatorType.Multiply)) { |
| 910 | let inParen = this._consumeTokenIfType(TokenType.OpenParenthesis); |
| 911 | |
| 912 | while (true) { |
| 913 | let importName = this._getTokenIfIdentifier(); |
| 914 | if (!importName) { |
| 915 | break; |
| 916 | } |
| 917 | |
| 918 | let importFromAsNode = new ImportFromAsNode(new NameNode(importName)); |
| 919 | |
| 920 | if (this._consumeTokenIfKeyword(KeywordType.As)) { |
| 921 | let aliasName = this._getTokenIfIdentifier(); |
| 922 | if (!aliasName) { |
| 923 | this._addError('Expected alias symbol name', this._peekToken()); |
| 924 | } else { |
| 925 | importFromAsNode.alias = new NameNode(aliasName); |
| 926 | importFromAsNode.extend(aliasName); |
| 927 | } |
| 928 | } |
| 929 | |
| 930 | importFromNode.imports.push(importFromAsNode); |
| 931 | importFromNode.extend(importFromAsNode); |
| 932 | |
| 933 | if (!this._consumeTokenIfType(TokenType.Comma)) { |
| 934 | break; |
| 935 | } |
| 936 | } |
| 937 | |
| 938 | if (importFromNode.imports.length === 0) { |
| 939 | this._addError('Expected imported symbol name', this._peekToken()); |
| 940 | } |
| 941 | |
| 942 | if (inParen) { |
| 943 | let nextToken = this._peekToken(); |
| 944 | if (!this._consumeTokenIfType(TokenType.CloseParenthesis)) { |
| 945 | this._addError('Expected ")"', this._peekToken()); |
| 946 | } else { |
| 947 | importFromNode.extend(nextToken); |
| 948 | } |
| 949 | } |
| 950 | } |
| 951 | } |
| 952 | |
| 953 | // TODO - need to process __future__ imports |
| 954 | |
| 955 | return importFromNode; |
| 956 | } |
no test coverage detected