| 1208 | } |
| 1209 | |
| 1210 | RefPtr<ImportOperatorDefSyntaxNode> Parser::ParseImportOperator() |
| 1211 | { |
| 1212 | RefPtr<ImportOperatorDefSyntaxNode> op = new ImportOperatorDefSyntaxNode(); |
| 1213 | PushScope(op.Ptr()); |
| 1214 | FillPosition(op.Ptr()); |
| 1215 | ReadToken("import"); |
| 1216 | ReadToken(TokenType::LParent); |
| 1217 | op->SourceWorld = ReadToken(TokenType::Identifier); |
| 1218 | ReadToken(TokenType::RightArrow); |
| 1219 | op->DestWorld = ReadToken(TokenType::Identifier); |
| 1220 | ReadToken(TokenType::RParent); |
| 1221 | FillPosition(op.Ptr()); |
| 1222 | op->Name = ReadToken(TokenType::Identifier); |
| 1223 | if (LookAheadToken(TokenType::OpLess)) |
| 1224 | { |
| 1225 | ReadToken(TokenType::OpLess); |
| 1226 | op->TypeName = ReadToken(TokenType::Identifier); |
| 1227 | ReadToken(TokenType::OpGreater); |
| 1228 | } |
| 1229 | else |
| 1230 | { |
| 1231 | op->TypeName.Position = op->Name.Position; |
| 1232 | op->TypeName.Content = "TComponentType"; |
| 1233 | } |
| 1234 | ReadToken(TokenType::LParent); |
| 1235 | while (!AdvanceIf(this, TokenType::RParent)) |
| 1236 | { |
| 1237 | op->Members.Add(ParseParameter()); |
| 1238 | if (AdvanceIf(this, TokenType::RParent)) |
| 1239 | break; |
| 1240 | ReadToken(TokenType::Comma); |
| 1241 | } |
| 1242 | while (LookAheadToken("require")) |
| 1243 | { |
| 1244 | ReadToken("require"); |
| 1245 | op->Requirements.Add(ParseFunction(false)); |
| 1246 | } |
| 1247 | isInImportOperator = true; |
| 1248 | op->Body = ParseBlockStatement(); |
| 1249 | isInImportOperator = false; |
| 1250 | PopScope(); |
| 1251 | return op; |
| 1252 | } |
| 1253 | |
| 1254 | // TODO(tfoley): this definition is now largely redundant (only |
| 1255 | // used to parse requirements for import operators) |
no test coverage detected