Parse an external name. For example, in a function reference decl, the parser would be in this state: fn0 = * name signature
(&mut self)
| 1317 | // fn0 = * name signature |
| 1318 | // |
| 1319 | fn parse_external_name(&mut self) -> ParseResult<ExternalName> { |
| 1320 | match self.token() { |
| 1321 | Some(Token::Name(s)) => { |
| 1322 | self.consume(); |
| 1323 | s.parse() |
| 1324 | .map_err(|_| self.error("invalid test case or libcall name")) |
| 1325 | } |
| 1326 | |
| 1327 | Some(Token::UserNameRef(name_ref)) => { |
| 1328 | self.consume(); |
| 1329 | Ok(ExternalName::user(UserExternalNameRef::new( |
| 1330 | name_ref as usize, |
| 1331 | ))) |
| 1332 | } |
| 1333 | |
| 1334 | Some(Token::UserRef(namespace)) => { |
| 1335 | self.consume(); |
| 1336 | if let Some(Token::Colon) = self.token() { |
| 1337 | self.consume(); |
| 1338 | match self.token() { |
| 1339 | Some(Token::Integer(index_str)) => { |
| 1340 | let index: u32 = u32::from_str_radix(index_str, 10).map_err(|_| { |
| 1341 | self.error("the integer given overflows the u32 type") |
| 1342 | })?; |
| 1343 | self.consume(); |
| 1344 | |
| 1345 | // Deduplicate the reference (O(n), but should be fine for tests), |
| 1346 | // to follow `FunctionParameters::declare_imported_user_function`, |
| 1347 | // otherwise this will cause ref mismatches when asserted below. |
| 1348 | let name_ref = self |
| 1349 | .predeclared_external_names |
| 1350 | .iter() |
| 1351 | .find_map(|(reff, name)| { |
| 1352 | if name.index == index && name.namespace == namespace { |
| 1353 | Some(reff) |
| 1354 | } else { |
| 1355 | None |
| 1356 | } |
| 1357 | }) |
| 1358 | .unwrap_or_else(|| { |
| 1359 | self.predeclared_external_names |
| 1360 | .push(ir::UserExternalName { namespace, index }) |
| 1361 | }); |
| 1362 | |
| 1363 | Ok(ExternalName::user(name_ref)) |
| 1364 | } |
| 1365 | _ => err!(self.loc, "expected integer"), |
| 1366 | } |
| 1367 | } else { |
| 1368 | err!(self.loc, "expected colon") |
| 1369 | } |
| 1370 | } |
| 1371 | |
| 1372 | _ => err!(self.loc, "expected external name"), |
| 1373 | } |
| 1374 | } |
| 1375 | |
| 1376 | // Parse a function signature. |