Skip to content

Commit 244fcd7

Browse files
committed
Add behind experimental feature flag
1 parent 7e8b8a5 commit 244fcd7

File tree

12 files changed

+239
-140
lines changed

12 files changed

+239
-140
lines changed

CodeGeneration/Sources/SyntaxSupport/ExperimentalFeatures.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public enum ExperimentalFeature: String, CaseIterable {
2323
case oldOwnershipOperatorSpellings
2424
case defaultIsolationPerFile
2525
case moduleSelector
26+
case defaultGenerics
2627

2728
/// The name of the feature as it is written in the compiler's `Features.def` file.
2829
public var featureName: String {
@@ -47,6 +48,8 @@ public enum ExperimentalFeature: String, CaseIterable {
4748
return "DefaultIsolationPerFile"
4849
case .moduleSelector:
4950
return "ModuleSelector"
51+
case .defaultGenerics:
52+
return "DefaultGenerics"
5053
}
5154
}
5255

@@ -73,6 +76,8 @@ public enum ExperimentalFeature: String, CaseIterable {
7376
return "set default actor isolation for a file"
7477
case .moduleSelector:
7578
return "Module selector syntax (`ModName::identifier`)"
79+
case .defaultGenerics:
80+
return "default generics"
7681
}
7782
}
7883

CodeGeneration/Sources/SyntaxSupport/GenericNodes.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,11 @@ public let GENERIC_NODES: [Node] = [
126126
isOptional: true
127127
),
128128
Child(
129-
name: "equal",
130-
kind: .token(choices: [.token(.equal)]),
131-
isOptional: true
132-
),
133-
Child(
134-
name: "defaultType",
135-
kind: .node(kind: .type),
129+
name: "initializer",
130+
kind: .node(kind: .typeInitializerClause),
131+
experimentalFeature: .defaultGenerics,
136132
nameForDiagnostics: "default type",
137-
isOptional: true
133+
isOptional: true,
138134
),
139135
Child(
140136
name: "trailingComma",

Sources/SwiftParser/Declarations.swift

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -676,30 +676,19 @@ extension Parser {
676676
inherited = nil
677677
}
678678

679-
// Parse the '=' followed by a type.
680-
let equal = self.consume(if: .equal)
681-
let unexpectedBeforeDefault: RawUnexpectedNodesSyntax?
682-
let defaultType: RawTypeSyntax?
683-
if equal != nil {
684-
if self.at(.identifier, .keyword(.protocol), .keyword(.Any)) || self.atContextualPunctuator("~") {
685-
unexpectedBeforeDefault = nil
686-
defaultType = self.parseType()
687-
} else if let classKeyword = self.consume(if: .keyword(.class)) {
688-
unexpectedBeforeDefault = RawUnexpectedNodesSyntax([classKeyword], arena: self.arena)
689-
defaultType = RawTypeSyntax(
690-
RawIdentifierTypeSyntax(
691-
moduleSelector: nil,
692-
name: missingToken(.identifier, text: "AnyObject"),
693-
genericArgumentClause: nil,
694-
arena: self.arena
695-
)
696-
)
697-
} else {
698-
unexpectedBeforeDefault = nil
699-
defaultType = RawTypeSyntax(RawMissingTypeSyntax(arena: self.arena))
700-
}
679+
// Parse the default type, if any. We only have defaults of regular
680+
// type parameters, not parameter packs or value generics yet.
681+
let defaultType: RawTypeInitializerClauseSyntax?
682+
if self.experimentalFeatures.contains(.defaultGenerics),
683+
specifier == nil,
684+
let equal = self.consume(if: .equal) {
685+
let type = self.parseType()
686+
defaultType = RawTypeInitializerClauseSyntax(
687+
equal: equal,
688+
value: type,
689+
arena: self.arena
690+
)
701691
} else {
702-
unexpectedBeforeDefault = nil
703692
defaultType = nil
704693
}
705694

@@ -714,9 +703,7 @@ extension Parser {
714703
colon: colon,
715704
unexpectedBeforeInherited,
716705
inheritedType: inherited,
717-
equal: equal,
718-
unexpectedBeforeDefault,
719-
defaultType: defaultType,
706+
initializer: defaultType,
720707
trailingComma: keepGoing,
721708
arena: self.arena
722709
)

Sources/SwiftParser/generated/ExperimentalFeatures.swift

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftParserDiagnostics/generated/ChildNameForDiagnostics.swift

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/RenamedChildrenCompatibility.swift

Lines changed: 52 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/raw/RawSyntaxNodesGHI.swift

Lines changed: 15 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 3 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)