()
| 959 | // dotted_as_names: dotted_as_name (',' dotted_as_name)* |
| 960 | // dotted_as_name: dotted_name ['as' NAME] |
| 961 | private _parseImportStatement(): ImportNode { |
| 962 | let importToken = this._getKeywordToken(KeywordType.Import); |
| 963 | |
| 964 | let importNode = new ImportNode(importToken); |
| 965 | |
| 966 | while (true) { |
| 967 | let modName = this._parseDottedModuleName(); |
| 968 | let importAsNode = new ImportAsNode(modName); |
| 969 | |
| 970 | if (this._consumeTokenIfKeyword(KeywordType.As)) { |
| 971 | let aliasToken = this._getTokenIfIdentifier(); |
| 972 | if (aliasToken) { |
| 973 | importAsNode.alias = new NameNode(aliasToken); |
| 974 | importAsNode.extend(importAsNode.alias); |
| 975 | } else { |
| 976 | this._addError('Expected identifier after "as"', this._peekToken()); |
| 977 | } |
| 978 | } |
| 979 | |
| 980 | importNode.list.push(importAsNode); |
| 981 | |
| 982 | if (!this._consumeTokenIfType(TokenType.Comma)) { |
| 983 | break; |
| 984 | } |
| 985 | } |
| 986 | |
| 987 | importNode.extend(importNode.list); |
| 988 | |
| 989 | return importNode; |
| 990 | } |
| 991 | |
| 992 | // ('.' | '...')* dotted_name | ('.' | '...')+ |
| 993 | // dotted_name: NAME ('.' NAME)* |
no test coverage detected