|
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