Skip to content

Commit 7e8b8a5

Browse files
committed
Add ability to parse default types for generic parameters
1 parent 6673b05 commit 7e8b8a5

File tree

8 files changed

+168
-23
lines changed

8 files changed

+168
-23
lines changed

CodeGeneration/Sources/SyntaxSupport/GenericNodes.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ public let GENERIC_NODES: [Node] = [
125125
nameForDiagnostics: "inherited type",
126126
isOptional: true
127127
),
128+
Child(
129+
name: "equal",
130+
kind: .token(choices: [.token(.equal)]),
131+
isOptional: true
132+
),
133+
Child(
134+
name: "defaultType",
135+
kind: .node(kind: .type),
136+
nameForDiagnostics: "default type",
137+
isOptional: true
138+
),
128139
Child(
129140
name: "trailingComma",
130141
kind: .token(choices: [.token(.comma)]),

Sources/SwiftParser/Declarations.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,34 @@ extension Parser {
675675
unexpectedBeforeInherited = nil
676676
inherited = nil
677677
}
678+
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+
}
701+
} else {
702+
unexpectedBeforeDefault = nil
703+
defaultType = nil
704+
}
705+
678706
keepGoing = self.consume(if: .comma)
679707
elements.append(
680708
RawGenericParameterSyntax(
@@ -686,6 +714,9 @@ extension Parser {
686714
colon: colon,
687715
unexpectedBeforeInherited,
688716
inheritedType: inherited,
717+
equal: equal,
718+
unexpectedBeforeDefault,
719+
defaultType: defaultType,
689720
trailingComma: keepGoing,
690721
arena: self.arena
691722
)

Sources/SwiftParserDiagnostics/generated/ChildNameForDiagnostics.swift

Lines changed: 2 additions & 0 deletions
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: 10 additions & 2 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: 11 additions & 3 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: 32 additions & 8 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: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesGHI.swift

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

0 commit comments

Comments
 (0)