|
18 | 18 |
|
19 | 19 | extension TokenConsumer { |
20 | 20 | mutating func atStartOfExpression() -> Bool { |
| 21 | + if self.isAtModuleSelector() { |
| 22 | + var lookahead = self.lookahead() |
| 23 | + _ = lookahead.consumeModuleSelectorTokens() |
| 24 | + return lookahead.atStartOfExpression() |
| 25 | + } |
| 26 | + |
21 | 27 | switch self.at(anyIn: ExpressionStart.self) { |
22 | 28 | case (.awaitTryMove, let handle)?: |
23 | 29 | var lookahead = self.lookahead() |
@@ -572,6 +578,11 @@ extension Parser { |
572 | 578 | flavor: ExprFlavor, |
573 | 579 | pattern: PatternContext = .none |
574 | 580 | ) -> RawExprSyntax { |
| 581 | + if let moduleSelector = self.parseModuleSelector() { |
| 582 | + let qualifiedExpr = self.parseUnaryExpression(flavor: flavor, pattern: pattern) |
| 583 | + return attach(moduleSelector, to: qualifiedExpr) |
| 584 | + } |
| 585 | + |
575 | 586 | // Try parse a single value statement as an expression (e.g do/if/switch). |
576 | 587 | // Note we do this here in parseUnaryExpression as we don't allow postfix |
577 | 588 | // syntax to be attached to such expressions to avoid ambiguities such as postfix |
@@ -660,19 +671,22 @@ extension Parser { |
660 | 671 | return (unexpectedPeriod, period, declName, nil) |
661 | 672 | } |
662 | 673 |
|
| 674 | + let moduleSelector = parseModuleSelector() |
| 675 | + |
663 | 676 | // Parse the name portion. |
664 | 677 | let declName: RawDeclReferenceExprSyntax |
665 | 678 | if let indexOrSelf = self.consume(if: .integerLiteral, .keyword(.self)) { |
666 | 679 | // Handle "x.42" - a tuple index. |
667 | 680 | declName = RawDeclReferenceExprSyntax( |
| 681 | + unexpected(moduleSelector), |
668 | 682 | moduleSelector: nil, |
669 | 683 | baseName: indexOrSelf, |
670 | 684 | argumentNames: nil, |
671 | 685 | arena: self.arena |
672 | 686 | ) |
673 | 687 | } else { |
674 | 688 | // Handle an arbitrary declaration name. |
675 | | - declName = self.parseDeclReferenceExpr([.keywords, .compoundNames]) |
| 689 | + declName = self.parseDeclReferenceExpr(moduleSelector: moduleSelector, [.keywords, .compoundNames]) |
676 | 690 | } |
677 | 691 |
|
678 | 692 | // Parse the generic arguments, if any. |
@@ -1248,11 +1262,11 @@ extension Parser { |
1248 | 1262 | // is the start of an enum or expr pattern. |
1249 | 1263 | if pattern.admitsBinding && self.lookahead().isInBindingPatternPosition() { |
1250 | 1264 | let identifier = self.eat(handle) |
1251 | | - let pattern = RawIdentifierPatternSyntax( |
| 1265 | + let patternNode = RawIdentifierPatternSyntax( |
1252 | 1266 | identifier: identifier, |
1253 | 1267 | arena: self.arena |
1254 | 1268 | ) |
1255 | | - return RawExprSyntax(RawPatternExprSyntax(pattern: pattern, arena: self.arena)) |
| 1269 | + return RawExprSyntax(RawPatternExprSyntax(pattern: patternNode, arena: self.arena)) |
1256 | 1270 | } |
1257 | 1271 |
|
1258 | 1272 | return self.parseIdentifierExpression(flavor: flavor) |
@@ -1316,7 +1330,10 @@ extension Parser { |
1316 | 1330 | ) |
1317 | 1331 | } |
1318 | 1332 |
|
1319 | | - let declName = self.parseDeclReferenceExpr([.keywords, .compoundNames]) |
| 1333 | + // If there's a module selector after the period, parse and use it. |
| 1334 | + let moduleSelector = self.parseModuleSelector() |
| 1335 | + let declName = self.parseDeclReferenceExpr(moduleSelector: moduleSelector, [.keywords, .compoundNames]) |
| 1336 | + |
1320 | 1337 | return RawExprSyntax( |
1321 | 1338 | RawMemberAccessExprSyntax( |
1322 | 1339 | base: nil, |
@@ -1354,7 +1371,8 @@ extension Parser { |
1354 | 1371 | case .attributeArguments: options.insert(.keywordsUsingSpecialNames) |
1355 | 1372 | } |
1356 | 1373 |
|
1357 | | - let declName = self.parseDeclReferenceExpr(options) |
| 1374 | + // If something up the call stack has parsed a module selector, it will be attached using `attach(_:to:)`. |
| 1375 | + let declName = self.parseDeclReferenceExpr(moduleSelector: nil, options) |
1358 | 1376 | guard self.withLookahead({ $0.canParseAsGenericArgumentList() }) else { |
1359 | 1377 | return RawExprSyntax(declName) |
1360 | 1378 | } |
@@ -1385,6 +1403,7 @@ extension Parser { |
1385 | 1403 | ) |
1386 | 1404 | pound = pound.tokenView.withTokenDiagnostic(tokenDiagnostic: diagnostic, arena: self.arena) |
1387 | 1405 | } |
| 1406 | + let moduleSelector = parseModuleSelector() |
1388 | 1407 | let unexpectedBeforeMacroName: RawUnexpectedNodesSyntax? |
1389 | 1408 | let macroName: RawTokenSyntax |
1390 | 1409 | if !self.atStartOfLine { |
@@ -1432,7 +1451,7 @@ extension Parser { |
1432 | 1451 | return RawMacroExpansionExprSyntax( |
1433 | 1452 | unexpectedBeforePound, |
1434 | 1453 | pound: pound, |
1435 | | - moduleSelector: nil, |
| 1454 | + moduleSelector: moduleSelector, |
1436 | 1455 | unexpectedBeforeMacroName, |
1437 | 1456 | macroName: macroName, |
1438 | 1457 | genericArgumentClause: generics, |
@@ -1746,6 +1765,7 @@ extension Parser { |
1746 | 1765 | extension Parser { |
1747 | 1766 | mutating func parseAnonymousClosureArgument() -> RawDeclReferenceExprSyntax { |
1748 | 1767 | let (unexpectedBeforeBaseName, baseName) = self.expect(.dollarIdentifier) |
| 1768 | + // If something up the call stack has parsed a module selector, it will be attached using `attach(_:to:)`. |
1749 | 1769 | return RawDeclReferenceExprSyntax( |
1750 | 1770 | moduleSelector: nil, |
1751 | 1771 | unexpectedBeforeBaseName, |
@@ -1969,6 +1989,14 @@ extension Parser { |
1969 | 1989 | } |
1970 | 1990 | } |
1971 | 1991 |
|
| 1992 | +extension TokenConsumer { |
| 1993 | + mutating func atBinaryOperatorArgument() -> Bool { |
| 1994 | + var lookahead = self.lookahead() |
| 1995 | + _ = lookahead.consumeModuleSelectorTokens() |
| 1996 | + return lookahead.at(.binaryOperator) && lookahead.peek(isAt: .comma, .rightParen, .rightSquare) |
| 1997 | + } |
| 1998 | +} |
| 1999 | + |
1972 | 2000 | extension Parser { |
1973 | 2001 | /// Parse the elements of an argument list. |
1974 | 2002 | /// |
@@ -2020,8 +2048,9 @@ extension Parser { |
2020 | 2048 | // this case lexes as a binary operator because it neither leads nor |
2021 | 2049 | // follows a proper subexpression. |
2022 | 2050 | let expr: RawExprSyntax |
2023 | | - if self.at(.binaryOperator) && self.peek(isAt: .comma, .rightParen, .rightSquare) { |
2024 | | - expr = RawExprSyntax(self.parseDeclReferenceExpr(.operators)) |
| 2051 | + if self.atBinaryOperatorArgument() { |
| 2052 | + let moduleSelector = self.parseModuleSelector() |
| 2053 | + expr = RawExprSyntax(self.parseDeclReferenceExpr(moduleSelector: moduleSelector, .operators)) |
2025 | 2054 | } else { |
2026 | 2055 | expr = self.parseExpression(flavor: flavor, pattern: pattern) |
2027 | 2056 | } |
@@ -2400,9 +2429,9 @@ extension Parser { |
2400 | 2429 |
|
2401 | 2430 | unknownAttr = RawAttributeSyntax( |
2402 | 2431 | atSign: at, |
2403 | | - unexpectedBeforeIdent, |
2404 | 2432 | attributeName: RawIdentifierTypeSyntax( |
2405 | 2433 | moduleSelector: nil, |
| 2434 | + unexpectedBeforeIdent, |
2406 | 2435 | name: ident, |
2407 | 2436 | genericArgumentClause: nil, |
2408 | 2437 | arena: self.arena |
|
0 commit comments