From e79e22b3219f03893259bd16e0447c4cc227194c Mon Sep 17 00:00:00 2001 From: Meghana Gupta Date: Wed, 8 Nov 2023 01:40:09 -0800 Subject: [PATCH] Add initial support for _resultDependsOnSelf Add under NonEscapableTypes experimental feature --- .../Sources/SyntaxSupport/DeclNodes.swift | 1 + .../SyntaxSupport/ExperimentalFeatures.swift | 3 +++ .../Sources/SyntaxSupport/KeywordSpec.swift | 3 +++ Sources/SwiftParser/Declarations.swift | 2 +- Sources/SwiftParser/Modifiers.swift | 3 ++- Sources/SwiftParser/Patterns.swift | 2 +- Sources/SwiftParser/TokenPrecedence.swift | 2 +- Sources/SwiftParser/TokenSpecSet.swift | 3 +++ .../generated/ExperimentalFeatures.swift | 3 +++ .../generated/Parser+TokenSpecSet.swift | 8 +++++++ Sources/SwiftSyntax/generated/Keyword.swift | 5 ++++ .../generated/raw/RawSyntaxValidation.swift | 1 + .../generated/syntaxNodes/SyntaxNodesD.swift | 3 ++- Tests/SwiftParserTest/DeclarationTests.swift | 24 +++++++++++++++++++ 14 files changed, 58 insertions(+), 5 deletions(-) diff --git a/CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift b/CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift index 2f48e8f78fc..112eca5d8c2 100644 --- a/CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift +++ b/CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift @@ -461,6 +461,7 @@ public let DECL_NODES: [Node] = [ .keyword(.private), .keyword(.public), .keyword(.reasync), + .keyword(._resultDependsOnSelf), .keyword(.required), .keyword(.static), .keyword(.unowned), diff --git a/CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift b/CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift index fba01c14575..6be33347251 100644 --- a/CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift +++ b/CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift @@ -17,6 +17,7 @@ public enum ExperimentalFeature: String, CaseIterable { case thenStatements case typedThrows case doExpressions + case nonEscapableTypes /// The name of the feature, which is used in the doc comment. public var featureName: String { @@ -29,6 +30,8 @@ public enum ExperimentalFeature: String, CaseIterable { return "typed throws" case .doExpressions: return "'do' expressions" + case .nonEscapableTypes: + return "NonEscableTypes" } } diff --git a/CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift b/CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift index 8ced026799a..b38c2772086 100644 --- a/CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift +++ b/CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift @@ -239,6 +239,7 @@ public enum Keyword: CaseIterable { case renamed case `repeat` case required + case _resultDependsOnSelf case `rethrows` case retroactive case `return` @@ -610,6 +611,8 @@ public enum Keyword: CaseIterable { return KeywordSpec("repeat", isLexerClassified: true) case .required: return KeywordSpec("required") + case ._resultDependsOnSelf: + return KeywordSpec("_resultDependsOnSelf", experimentalFeature: .nonEscapableTypes) case .rethrows: return KeywordSpec("rethrows", isLexerClassified: true) case .retroactive: diff --git a/Sources/SwiftParser/Declarations.swift b/Sources/SwiftParser/Declarations.swift index 87f12d1907e..907bb26b06a 100644 --- a/Sources/SwiftParser/Declarations.swift +++ b/Sources/SwiftParser/Declarations.swift @@ -18,7 +18,7 @@ extension DeclarationModifier { case .__consuming, .__setter_access, ._const, ._local, .async, .borrowing, .class, .consuming, .convenience, .distributed, .dynamic, .final, .indirect, .infix, .isolated, .lazy, .mutating, .nonmutating, - .optional, .override, .postfix, .prefix, .reasync, .required, + .optional, .override, .postfix, .prefix, .reasync, ._resultDependsOnSelf, .required, .rethrows, .static, .weak: return false case .fileprivate, .internal, .nonisolated, .package, .open, .private, diff --git a/Sources/SwiftParser/Modifiers.swift b/Sources/SwiftParser/Modifiers.swift index ee773fc56b1..233790dd8dc 100644 --- a/Sources/SwiftParser/Modifiers.swift +++ b/Sources/SwiftParser/Modifiers.swift @@ -85,7 +85,8 @@ extension Parser { (.declarationModifier(._const), let handle)?, (.declarationModifier(._local), let handle)?, (.declarationModifier(.__setter_access), let handle)?, - (.declarationModifier(.reasync), let handle)?: + (.declarationModifier(.reasync), let handle)?, + (.declarationModifier(._resultDependsOnSelf), let handle)? where experimentalFeatures.contains(.nonEscapableTypes): let (unexpectedBeforeKeyword, keyword) = self.eat(handle) elements.append(RawDeclModifierSyntax(unexpectedBeforeKeyword, name: keyword, detail: nil, arena: self.arena)) case (.declarationModifier(.rethrows), _)?: diff --git a/Sources/SwiftParser/Patterns.swift b/Sources/SwiftParser/Patterns.swift index f82d0452873..a2b7653b1ef 100644 --- a/Sources/SwiftParser/Patterns.swift +++ b/Sources/SwiftParser/Patterns.swift @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -@_spi(RawSyntax) import SwiftSyntax +@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) import SwiftSyntax extension Parser { /// Parse a pattern. diff --git a/Sources/SwiftParser/TokenPrecedence.swift b/Sources/SwiftParser/TokenPrecedence.swift index e36d7469908..024d292a5a9 100644 --- a/Sources/SwiftParser/TokenPrecedence.swift +++ b/Sources/SwiftParser/TokenPrecedence.swift @@ -230,7 +230,7 @@ enum TokenPrecedence: Comparable { // Declaration Modifiers .__consuming, .final, .required, .optional, .lazy, .dynamic, .infix, .postfix, .prefix, .mutating, .nonmutating, .convenience, .override, .package, .open, .__setter_access, .indirect, .isolated, .nonisolated, .distributed, ._local, - .inout, ._mutating, ._borrow, ._borrowing, .borrowing, ._consuming, .consuming, .consume, + .inout, ._mutating, ._borrow, ._borrowing, .borrowing, ._consuming, .consuming, .consume, ._resultDependsOnSelf, // Accessors .get, .set, .didSet, .willSet, .unsafeAddress, .addressWithOwner, .addressWithNativeOwner, .unsafeMutableAddress, .mutableAddressWithOwner, .mutableAddressWithNativeOwner, ._read, ._modify, diff --git a/Sources/SwiftParser/TokenSpecSet.swift b/Sources/SwiftParser/TokenSpecSet.swift index b8754ba87ac..d8a310d6480 100644 --- a/Sources/SwiftParser/TokenSpecSet.swift +++ b/Sources/SwiftParser/TokenSpecSet.swift @@ -376,6 +376,7 @@ enum DeclarationModifier: TokenSpecSet { case `static` case unowned case weak + case _resultDependsOnSelf init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) { switch PrepareForKeywordMatch(lexeme) { @@ -414,6 +415,7 @@ enum DeclarationModifier: TokenSpecSet { case TokenSpec(.static): self = .static case TokenSpec(.unowned): self = .unowned case TokenSpec(.weak): self = .weak + case TokenSpec(._resultDependsOnSelf) where experimentalFeatures.contains(.nonEscapableTypes): self = ._resultDependsOnSelf default: return nil } } @@ -455,6 +457,7 @@ enum DeclarationModifier: TokenSpecSet { case .static: return .keyword(.static) case .unowned: return TokenSpec(.unowned, recoveryPrecedence: .declKeyword) case .weak: return TokenSpec(.weak, recoveryPrecedence: .declKeyword) + case ._resultDependsOnSelf: return TokenSpec(._resultDependsOnSelf, recoveryPrecedence: .declKeyword) } } } diff --git a/Sources/SwiftParser/generated/ExperimentalFeatures.swift b/Sources/SwiftParser/generated/ExperimentalFeatures.swift index fd4934860e7..e8b56cea8f1 100644 --- a/Sources/SwiftParser/generated/ExperimentalFeatures.swift +++ b/Sources/SwiftParser/generated/ExperimentalFeatures.swift @@ -35,4 +35,7 @@ extension Parser.ExperimentalFeatures { /// Whether to enable the parsing of 'do' expressions. public static let doExpressions = Self (rawValue: 1 << 3) + + /// Whether to enable the parsing of NonEscableTypes. + public static let nonEscapableTypes = Self (rawValue: 1 << 4) } diff --git a/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift b/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift index 88b69cbe667..6e17ced402c 100644 --- a/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift +++ b/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift @@ -714,6 +714,8 @@ extension DeclModifierSyntax { case `private` case `public` case reasync + @_spi(ExperimentalLanguageFeatures) + case _resultDependsOnSelf case required case `static` case unowned @@ -783,6 +785,8 @@ extension DeclModifierSyntax { self = .public case TokenSpec(.reasync): self = .reasync + case TokenSpec(._resultDependsOnSelf) where experimentalFeatures.contains(.nonEscapableTypes): + self = ._resultDependsOnSelf case TokenSpec(.required): self = .required case TokenSpec(.static): @@ -860,6 +864,8 @@ extension DeclModifierSyntax { return .keyword(.public) case .reasync: return .keyword(.reasync) + case ._resultDependsOnSelf: + return .keyword(._resultDependsOnSelf) case .required: return .keyword(.required) case .static: @@ -939,6 +945,8 @@ extension DeclModifierSyntax { return .keyword(.public) case .reasync: return .keyword(.reasync) + case ._resultDependsOnSelf: + return .keyword(._resultDependsOnSelf) case .required: return .keyword(.required) case .static: diff --git a/Sources/SwiftSyntax/generated/Keyword.swift b/Sources/SwiftSyntax/generated/Keyword.swift index 8e999a9c233..099a0ea4171 100644 --- a/Sources/SwiftSyntax/generated/Keyword.swift +++ b/Sources/SwiftSyntax/generated/Keyword.swift @@ -181,6 +181,8 @@ public enum Keyword: UInt8, Hashable { case renamed case `repeat` case required + @_spi(ExperimentalLanguageFeatures) + case _resultDependsOnSelf case `rethrows` case retroactive case `return` @@ -722,6 +724,8 @@ public enum Keyword: UInt8, Hashable { self = ._compilerInitialized case "_originallyDefinedIn": self = ._originallyDefinedIn + case "_resultDependsOnSelf": + self = ._resultDependsOnSelf case "unsafeMutableAddress": self = .unsafeMutableAddress default: @@ -942,6 +946,7 @@ public enum Keyword: UInt8, Hashable { "renamed", "repeat", "required", + "_resultDependsOnSelf", "rethrows", "retroactive", "return", diff --git a/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift b/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift index 68a9dadabaf..c06fe43a8fa 100644 --- a/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift +++ b/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift @@ -804,6 +804,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) { .keyword("private"), .keyword("public"), .keyword("reasync"), + .keyword("_resultDependsOnSelf"), .keyword("required"), .keyword("static"), .keyword("unowned"), diff --git a/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift b/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift index 126e77744a3..380e0d6b9c5 100644 --- a/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift +++ b/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift @@ -169,7 +169,7 @@ public struct DeclModifierDetailSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyn /// ### Children /// -/// - `name`: (`__consuming` | `__setter_access` | `_const` | `_local` | `actor` | `async` | `borrowing` | `class` | `consuming` | `convenience` | `distributed` | `dynamic` | `fileprivate` | `final` | `indirect` | `infix` | `internal` | `isolated` | `lazy` | `mutating` | `nonisolated` | `nonmutating` | `open` | `optional` | `override` | `package` | `postfix` | `prefix` | `private` | `public` | `reasync` | `required` | `static` | `unowned` | `weak`) +/// - `name`: (`__consuming` | `__setter_access` | `_const` | `_local` | `actor` | `async` | `borrowing` | `class` | `consuming` | `convenience` | `distributed` | `dynamic` | `fileprivate` | `final` | `indirect` | `infix` | `internal` | `isolated` | `lazy` | `mutating` | `nonisolated` | `nonmutating` | `open` | `optional` | `override` | `package` | `postfix` | `prefix` | `private` | `public` | `reasync` | `_resultDependsOnSelf` | `required` | `static` | `unowned` | `weak`) /// - `detail`: ``DeclModifierDetailSyntax``? /// /// ### Contained in @@ -270,6 +270,7 @@ public struct DeclModifierSyntax: SyntaxProtocol, SyntaxHashable, _LeafSyntaxNod /// - `private` /// - `public` /// - `reasync` + /// - `_resultDependsOnSelf` /// - `required` /// - `static` /// - `unowned` diff --git a/Tests/SwiftParserTest/DeclarationTests.swift b/Tests/SwiftParserTest/DeclarationTests.swift index 4f1b951b7ff..2ce74a29529 100644 --- a/Tests/SwiftParserTest/DeclarationTests.swift +++ b/Tests/SwiftParserTest/DeclarationTests.swift @@ -3095,4 +3095,28 @@ final class DeclarationTests: ParserTestCase { substructure: AccessorBlockSyntax(accessors: .getter([CodeBlockItemSyntax("return 1")])) ) } + + func testResultDependsOnSelf() { + assertParse( + """ + class MethodModifiers { + _resultDependsOnSelf func getDependentResult() -> Builtin.NativeObject { + return Builtin.unsafeCastToNativeObject(self) + } + } + """, + experimentalFeatures: .nonEscapableTypes + ) + + assertParse( + """ + class MethodModifiers { + _resultDependsOnSelf func _resultDependsOnSelf() -> Builtin.NativeObject { + return Builtin.unsafeCastToNativeObject(self) + } + } + """, + experimentalFeatures: .nonEscapableTypes + ) + } }