Skip to content

Commit 7cd869b

Browse files
committed
Remove placeholder nodes
1 parent 894fc62 commit 7cd869b

30 files changed

+54
-795
lines changed

CodeGeneration/Sources/SyntaxSupport/DeclNodes.swift

-33
Original file line numberDiff line numberDiff line change
@@ -548,39 +548,6 @@ public let DECL_NODES: [Node] = [
548548
elementChoices: [.designatedType]
549549
),
550550

551-
Node(
552-
kind: .editorPlaceholderDecl,
553-
base: .decl,
554-
nameForDiagnostics: "editor placeholder",
555-
documentation: """
556-
An editor placeholder, e.g. `<#declaration#>` that is used in a position that expects a declaration.
557-
""",
558-
traits: [
559-
"WithAttributes",
560-
"WithModifiers",
561-
],
562-
children: [
563-
Child(
564-
name: "attributes",
565-
kind: .collection(kind: .attributeList, collectionElementName: "Attribute", defaultsToEmpty: true),
566-
documentation: "If there were attributes before the editor placeholder, the ``EditorPlaceholderDeclSyntax`` will contain these."
567-
),
568-
Child(
569-
name: "modifiers",
570-
kind: .collection(kind: .declModifierList, collectionElementName: "Modifier", defaultsToEmpty: true),
571-
documentation: "If there were modifiers before the editor placeholder, the `EditorPlaceholderDecl` will contain these."
572-
),
573-
Child(
574-
name: "placeholder",
575-
deprecatedName: "identifier",
576-
kind: .token(choices: [.token(.identifier)]),
577-
documentation: """
578-
The actual editor placeholder that starts with `<#` and ends with `#>`.
579-
"""
580-
),
581-
]
582-
),
583-
584551
Node(
585552
kind: .enumCaseParameterClause,
586553
base: .syntax,

CodeGeneration/Sources/SyntaxSupport/ExprNodes.swift

-13
Original file line numberDiff line numberDiff line change
@@ -740,19 +740,6 @@ public let EXPR_NODES: [Node] = [
740740
]
741741
),
742742

743-
Node(
744-
kind: .editorPlaceholderExpr,
745-
base: .expr,
746-
nameForDiagnostics: "editor placeholder",
747-
children: [
748-
Child(
749-
name: "placeholder",
750-
deprecatedName: "identifier",
751-
kind: .token(choices: [.token(.identifier)])
752-
)
753-
]
754-
),
755-
756743
Node(
757744
kind: .exprList,
758745
base: .syntaxCollection,

CodeGeneration/Sources/SyntaxSupport/SyntaxNodeKind.swift

-2
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ public enum SyntaxNodeKind: String, CaseIterable {
109109
case documentationAttributeArgumentList
110110
case doStmt
111111
case dynamicReplacementAttributeArguments
112-
case editorPlaceholderDecl
113-
case editorPlaceholderExpr
114112
case effectsAttributeArgumentList
115113
case enumCaseDecl
116114
case enumCaseElement

Sources/SwiftParser/Declarations.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,9 @@ extension Parser {
275275
}
276276

277277
if self.currentToken.isEditorPlaceholder {
278-
let placeholder = self.consumeAnyToken()
278+
let placeholder = self.parseAnyIdentifier()
279279
return RawDeclSyntax(
280-
RawEditorPlaceholderDeclSyntax(
280+
RawMissingDeclSyntax(
281281
attributes: attrs.attributes,
282282
modifiers: attrs.modifiers,
283283
placeholder: placeholder,

Sources/SwiftParser/Expressions.swift

-8
Original file line numberDiff line numberDiff line change
@@ -1242,14 +1242,6 @@ extension Parser {
12421242
mutating func parseIdentifierExpression() -> RawExprSyntax {
12431243
let declName = self.parseDeclReferenceExpr(.compoundNames)
12441244
guard self.withLookahead({ $0.canParseAsGenericArgumentList() }) else {
1245-
if declName.baseName.tokenText.isEditorPlaceholder && declName.argumentNames == nil {
1246-
return RawExprSyntax(
1247-
RawEditorPlaceholderExprSyntax(
1248-
placeholder: declName.baseName,
1249-
arena: self.arena
1250-
)
1251-
)
1252-
}
12531245
return RawExprSyntax(declName)
12541246
}
12551247

Sources/SwiftParserDiagnostics/MissingNodesError.swift

+15-1
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,17 @@ extension ParseDiagnosticsGenerator {
381381

382382
// Walk all upcoming sibling to see if they are also missing to handle them in this diagnostic.
383383
// If this is the case, handle all of them in this diagnostic.
384-
var missingNodes = [Syntax(node)]
384+
var missingNodes: [Syntax] = [Syntax(node)]
385+
386+
// If the node is an `MissingDeclSyntax` and the placeholder is an editor placeholder
387+
// we should not add a diagnostic that it's missing.
388+
if let missing = missingNodes.first?.as(MissingDeclSyntax.self),
389+
missing.placeholder.isEditorPlaceholder,
390+
!missing.placeholder.isMissing
391+
{
392+
missingNodes = []
393+
}
394+
385395
if let parentWithTokens = ancestorWithMoreTokens, let index {
386396
let siblings = parentWithTokens.children(viewMode: .all)
387397
let siblingsAfter = siblings[siblings.index(after: index)...]
@@ -403,6 +413,10 @@ extension ParseDiagnosticsGenerator {
403413
}
404414
}
405415

416+
if missingNodes.isEmpty {
417+
return .visitChildren
418+
}
419+
406420
let changes = missingNodes.map { node in
407421
if let missing = node.asProtocol(MissingNodeSyntax.self) {
408422
// For missing nodes, only make the placeholder present. Don’t make any

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
675675
if shouldSkip(node) {
676676
return .skipChildren
677677
}
678-
if node.statements.only?.item.is(EditorPlaceholderExprSyntax.self) == true {
678+
if let item = node.statements.only?.item.as(DeclReferenceExprSyntax.self), item.baseName.isEditorPlaceholder {
679679
// Only emit a single diagnostic about the editor placeholder and none for the missing '{' and '}'.
680680
addDiagnostic(node, .editorPlaceholderInSourceFile, handledNodes: [node.id])
681681
return .skipChildren

Sources/SwiftParserDiagnostics/generated/SyntaxKindNameForDiagnostics.swift

-4
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,6 @@ extension SyntaxKind {
139139
return "@_documentation argument"
140140
case .dynamicReplacementAttributeArguments:
141141
return "@_dynamicReplacement argument"
142-
case .editorPlaceholderDecl:
143-
return "editor placeholder"
144-
case .editorPlaceholderExpr:
145-
return "editor placeholder"
146142
case .effectsAttributeArgumentList:
147143
return "@_effects arguments"
148144
case .enumCaseDecl:

Sources/SwiftRefactor/ExpandEditorPlaceholder.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,7 @@ public struct ExpandEditorPlaceholder: EditRefactoringProvider {
135135
/// Expansion on `closure1` and `normalArg` is the same as `ExpandEditorPlaceholder`.
136136
public struct ExpandEditorPlaceholders: EditRefactoringProvider {
137137
public static func textRefactor(syntax token: TokenSyntax, in context: Void) -> [SourceEdit] {
138-
guard let placeholder = token.parent?.as(EditorPlaceholderExprSyntax.self),
139-
let arg = placeholder.parent?.as(LabeledExprSyntax.self),
138+
guard let arg = token.parent?.as(LabeledExprSyntax.self),
140139
let argList = arg.parent?.as(LabeledExprListSyntax.self),
141140
let call = argList.parent?.as(FunctionCallExprSyntax.self)
142141
else {
@@ -190,8 +189,8 @@ extension FunctionTypeSyntax {
190189
placeholder = ExpandEditorPlaceholder.wrapInTypePlaceholder(ret, type: ret)
191190
}
192191

193-
let statementPlaceholder = EditorPlaceholderExprSyntax(
194-
placeholder: .identifier(placeholder)
192+
let statementPlaceholder = DeclReferenceExprSyntax(
193+
baseName: .identifier(placeholder)
195194
)
196195
let closureStatement = CodeBlockItemSyntax(
197196
item: .expr(ExprSyntax(statementPlaceholder))
@@ -234,8 +233,9 @@ extension FunctionCallExprSyntax {
234233
var includedArg = false
235234
var argsToExpand = 0
236235
for arg in arguments.reversed() {
237-
guard let expr = arg.expression.as(EditorPlaceholderExprSyntax.self),
238-
let data = EditorPlaceholderData(token: expr.placeholder),
236+
guard let expr = arg.expression.as(DeclReferenceExprSyntax.self),
237+
expr.baseName.isEditorPlaceholder,
238+
let data = EditorPlaceholderData(token: expr.baseName),
239239
case let .typed(_, type) = data,
240240
type.is(FunctionTypeSyntax.self)
241241
else {
@@ -253,7 +253,7 @@ extension FunctionCallExprSyntax {
253253

254254
var expandedArgs = [LabeledExprSyntax]()
255255
for arg in arguments.suffix(argsToExpand) {
256-
let edits = ExpandEditorPlaceholder.textRefactor(syntax: arg.expression.cast(EditorPlaceholderExprSyntax.self).placeholder)
256+
let edits = ExpandEditorPlaceholder.textRefactor(syntax: arg.expression.cast(DeclReferenceExprSyntax.self).baseName)
257257
guard edits.count == 1, let edit = edits.first, !edit.replacement.isEmpty else {
258258
return nil
259259
}

Sources/SwiftSyntax/Documentation.docc/generated/SwiftSyntax.md

-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ These articles are intended for developers wishing to contribute to SwiftSyntax
7070
- <doc:SwiftSyntax/AssociatedTypeDeclSyntax>
7171
- <doc:SwiftSyntax/ClassDeclSyntax>
7272
- <doc:SwiftSyntax/DeinitializerDeclSyntax>
73-
- <doc:SwiftSyntax/EditorPlaceholderDeclSyntax>
7473
- <doc:SwiftSyntax/EnumCaseDeclSyntax>
7574
- <doc:SwiftSyntax/EnumDeclSyntax>
7675
- <doc:SwiftSyntax/ExtensionDeclSyntax>
@@ -110,7 +109,6 @@ These articles are intended for developers wishing to contribute to SwiftSyntax
110109
- <doc:SwiftSyntax/DeclReferenceExprSyntax>
111110
- <doc:SwiftSyntax/DictionaryExprSyntax>
112111
- <doc:SwiftSyntax/DiscardAssignmentExprSyntax>
113-
- <doc:SwiftSyntax/EditorPlaceholderExprSyntax>
114112
- <doc:SwiftSyntax/FloatLiteralExprSyntax>
115113
- <doc:SwiftSyntax/ForceUnwrapExprSyntax>
116114
- <doc:SwiftSyntax/FunctionCallExprSyntax>

Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

-20
Original file line numberDiff line numberDiff line change
@@ -1057,26 +1057,6 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
10571057
return "declName"
10581058
case \DynamicReplacementAttributeArgumentsSyntax.unexpectedAfterDeclName:
10591059
return "unexpectedAfterDeclName"
1060-
case \EditorPlaceholderDeclSyntax.unexpectedBeforeAttributes:
1061-
return "unexpectedBeforeAttributes"
1062-
case \EditorPlaceholderDeclSyntax.attributes:
1063-
return "attributes"
1064-
case \EditorPlaceholderDeclSyntax.unexpectedBetweenAttributesAndModifiers:
1065-
return "unexpectedBetweenAttributesAndModifiers"
1066-
case \EditorPlaceholderDeclSyntax.modifiers:
1067-
return "modifiers"
1068-
case \EditorPlaceholderDeclSyntax.unexpectedBetweenModifiersAndPlaceholder:
1069-
return "unexpectedBetweenModifiersAndPlaceholder"
1070-
case \EditorPlaceholderDeclSyntax.placeholder:
1071-
return "placeholder"
1072-
case \EditorPlaceholderDeclSyntax.unexpectedAfterPlaceholder:
1073-
return "unexpectedAfterPlaceholder"
1074-
case \EditorPlaceholderExprSyntax.unexpectedBeforePlaceholder:
1075-
return "unexpectedBeforePlaceholder"
1076-
case \EditorPlaceholderExprSyntax.placeholder:
1077-
return "placeholder"
1078-
case \EditorPlaceholderExprSyntax.unexpectedAfterPlaceholder:
1079-
return "unexpectedAfterPlaceholder"
10801060
case \EnumCaseDeclSyntax.unexpectedBeforeAttributes:
10811061
return "unexpectedBeforeAttributes"
10821062
case \EnumCaseDeclSyntax.attributes:

Sources/SwiftSyntax/generated/RenamedChildrenCompatibility.swift

-110
Original file line numberDiff line numberDiff line change
@@ -2347,116 +2347,6 @@ extension DynamicReplacementAttributeArgumentsSyntax {
23472347
}
23482348
}
23492349

2350-
extension EditorPlaceholderDeclSyntax {
2351-
@available(*, deprecated, renamed: "unexpectedBetweenModifiersAndPlaceholder")
2352-
public var unexpectedBetweenModifiersAndIdentifier: UnexpectedNodesSyntax? {
2353-
get {
2354-
return unexpectedBetweenModifiersAndPlaceholder
2355-
}
2356-
set {
2357-
unexpectedBetweenModifiersAndPlaceholder = newValue
2358-
}
2359-
}
2360-
2361-
@available(*, deprecated, renamed: "placeholder")
2362-
public var identifier: TokenSyntax {
2363-
get {
2364-
return placeholder
2365-
}
2366-
set {
2367-
placeholder = newValue
2368-
}
2369-
}
2370-
2371-
@available(*, deprecated, renamed: "unexpectedAfterPlaceholder")
2372-
public var unexpectedAfterIdentifier: UnexpectedNodesSyntax? {
2373-
get {
2374-
return unexpectedAfterPlaceholder
2375-
}
2376-
set {
2377-
unexpectedAfterPlaceholder = newValue
2378-
}
2379-
}
2380-
2381-
@available(*, deprecated, renamed: "EditorPlaceholderDeclSyntax(leadingTrivia:_:attributes:_:modifiers:_:placeholder:_:trailingTrivia:)")
2382-
@_disfavoredOverload
2383-
public init(
2384-
leadingTrivia: Trivia? = nil,
2385-
_ unexpectedBeforeAttributes: UnexpectedNodesSyntax? = nil,
2386-
attributes: AttributeListSyntax = [],
2387-
_ unexpectedBetweenAttributesAndModifiers: UnexpectedNodesSyntax? = nil,
2388-
modifiers: DeclModifierListSyntax = [],
2389-
_ unexpectedBetweenModifiersAndIdentifier: UnexpectedNodesSyntax? = nil,
2390-
identifier: TokenSyntax,
2391-
_ unexpectedAfterIdentifier: UnexpectedNodesSyntax? = nil,
2392-
trailingTrivia: Trivia? = nil
2393-
2394-
) {
2395-
self.init(
2396-
leadingTrivia: leadingTrivia,
2397-
unexpectedBeforeAttributes,
2398-
attributes: attributes,
2399-
unexpectedBetweenAttributesAndModifiers,
2400-
modifiers: modifiers,
2401-
unexpectedBetweenModifiersAndIdentifier,
2402-
placeholder: identifier,
2403-
unexpectedAfterIdentifier,
2404-
trailingTrivia: trailingTrivia
2405-
)
2406-
}
2407-
}
2408-
2409-
extension EditorPlaceholderExprSyntax {
2410-
@available(*, deprecated, renamed: "unexpectedBeforePlaceholder")
2411-
public var unexpectedBeforeIdentifier: UnexpectedNodesSyntax? {
2412-
get {
2413-
return unexpectedBeforePlaceholder
2414-
}
2415-
set {
2416-
unexpectedBeforePlaceholder = newValue
2417-
}
2418-
}
2419-
2420-
@available(*, deprecated, renamed: "placeholder")
2421-
public var identifier: TokenSyntax {
2422-
get {
2423-
return placeholder
2424-
}
2425-
set {
2426-
placeholder = newValue
2427-
}
2428-
}
2429-
2430-
@available(*, deprecated, renamed: "unexpectedAfterPlaceholder")
2431-
public var unexpectedAfterIdentifier: UnexpectedNodesSyntax? {
2432-
get {
2433-
return unexpectedAfterPlaceholder
2434-
}
2435-
set {
2436-
unexpectedAfterPlaceholder = newValue
2437-
}
2438-
}
2439-
2440-
@available(*, deprecated, renamed: "EditorPlaceholderExprSyntax(leadingTrivia:_:placeholder:_:trailingTrivia:)")
2441-
@_disfavoredOverload
2442-
public init(
2443-
leadingTrivia: Trivia? = nil,
2444-
_ unexpectedBeforeIdentifier: UnexpectedNodesSyntax? = nil,
2445-
identifier: TokenSyntax,
2446-
_ unexpectedAfterIdentifier: UnexpectedNodesSyntax? = nil,
2447-
trailingTrivia: Trivia? = nil
2448-
2449-
) {
2450-
self.init(
2451-
leadingTrivia: leadingTrivia,
2452-
unexpectedBeforeIdentifier,
2453-
placeholder: identifier,
2454-
unexpectedAfterIdentifier,
2455-
trailingTrivia: trailingTrivia
2456-
)
2457-
}
2458-
}
2459-
24602350
extension EnumCaseElementSyntax {
24612351
@available(*, deprecated, renamed: "unexpectedBeforeName")
24622352
public var unexpectedBeforeIdentifier: UnexpectedNodesSyntax? {

Sources/SwiftSyntax/generated/SyntaxAnyVisitor.swift

-16
Original file line numberDiff line numberDiff line change
@@ -760,22 +760,6 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
760760
visitAnyPost(node._syntaxNode)
761761
}
762762

763-
override open func visit(_ node: EditorPlaceholderDeclSyntax) -> SyntaxVisitorContinueKind {
764-
return visitAny(node._syntaxNode)
765-
}
766-
767-
override open func visitPost(_ node: EditorPlaceholderDeclSyntax) {
768-
visitAnyPost(node._syntaxNode)
769-
}
770-
771-
override open func visit(_ node: EditorPlaceholderExprSyntax) -> SyntaxVisitorContinueKind {
772-
return visitAny(node._syntaxNode)
773-
}
774-
775-
override open func visitPost(_ node: EditorPlaceholderExprSyntax) {
776-
visitAnyPost(node._syntaxNode)
777-
}
778-
779763
override open func visit(_ node: EffectsAttributeArgumentListSyntax) -> SyntaxVisitorContinueKind {
780764
return visitAny(node._syntaxNode)
781765
}

0 commit comments

Comments
 (0)