Skip to content

Commit c855e51

Browse files
authored
Merge pull request #391 from tayloraswift/fix-invalid-type-resugaring
don’t resugar types that are the base type of a `MemberTypeSyntax`
2 parents c4ea334 + 49b6f19 commit c855e51

File tree

2 files changed

+68
-25
lines changed

2 files changed

+68
-25
lines changed

Sources/MarkdownPluginSwift/Signatures/SignatureSyntax.Autographer.swift

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ extension SignatureSyntax.Autographer
3232
}
3333

3434
mutating
35-
func encode(type:TypeSyntax)
35+
func encode(type:TypeSyntax, stem:Bool = false)
3636
{
3737
if let type:AttributedTypeSyntax = type.as(AttributedTypeSyntax.self)
3838
{
@@ -56,14 +56,18 @@ extension SignatureSyntax.Autographer
5656
else if
5757
let type:IdentifierTypeSyntax = type.as(IdentifierTypeSyntax.self)
5858
{
59-
self.encode(type: type.name, generics: type.genericArgumentClause?.arguments)
59+
self.encode(type: type.name,
60+
arguments: type.genericArgumentClause?.arguments,
61+
resugar: !stem)
6062
}
6163
else if
6264
let type:MemberTypeSyntax = type.as(MemberTypeSyntax.self)
6365
{
64-
self.encode(type: type.baseType)
66+
self.encode(type: type.baseType, stem: true)
6567
self.autograph.append(".")
66-
self.encode(type: type.name, generics: type.genericArgumentClause?.arguments)
68+
self.encode(type: type.name,
69+
arguments: type.genericArgumentClause?.arguments,
70+
resugar: false)
6771
}
6872
else if
6973
let type:ArrayTypeSyntax = type.as(ArrayTypeSyntax.self)
@@ -183,32 +187,32 @@ extension SignatureSyntax.Autographer
183187
}
184188

185189
private mutating
186-
func encode(type name:TokenSyntax, generics:GenericArgumentListSyntax?)
190+
func encode(type name:TokenSyntax, arguments:GenericArgumentListSyntax?, resugar:Bool)
187191
{
188-
if let generics:GenericArgumentListSyntax
192+
if let arguments:GenericArgumentListSyntax, resugar
189193
{
190-
let generics:[TypeSyntax] = generics.map(\.argument)
194+
let arguments:[TypeSyntax] = arguments.map(\.argument)
191195
let position:Int = name.positionAfterSkippingLeadingTrivia.utf8Offset
192196

193-
if self.sugarMap.arrays.contains(position), generics.count == 1
197+
if self.sugarMap.arrays.contains(position), arguments.count == 1
194198
{
195199
self.autograph.append("[")
196-
self.encode(type: generics[0])
200+
self.encode(type: arguments[0])
197201
self.autograph.append("]")
198202
return
199203
}
200-
if self.sugarMap.dictionaries.contains(position), generics.count == 2
204+
if self.sugarMap.dictionaries.contains(position), arguments.count == 2
201205
{
202206
self.autograph.append("[")
203-
self.encode(type: generics[0])
207+
self.encode(type: arguments[0])
204208
self.autograph.append(":")
205-
self.encode(type: generics[1])
209+
self.encode(type: arguments[1])
206210
self.autograph.append("]")
207211
return
208212
}
209-
if self.sugarMap.optionals.contains(position), generics.count == 1
213+
if self.sugarMap.optionals.contains(position), arguments.count == 1
210214
{
211-
self.encode(type: generics[0])
215+
self.encode(type: arguments[0])
212216
self.autograph.append("?")
213217
return
214218
}
@@ -224,12 +228,12 @@ extension SignatureSyntax.Autographer
224228

225229
self.autograph.append(name.text)
226230

227-
if let generics:GenericArgumentListSyntax
231+
if let arguments:GenericArgumentListSyntax
228232
{
229233
self.autograph.append("<")
230234

231235
var first:Bool = true
232-
for generic:GenericArgumentSyntax in generics
236+
for type:GenericArgumentSyntax in arguments
233237
{
234238
if first
235239
{
@@ -240,7 +244,7 @@ extension SignatureSyntax.Autographer
240244
self.autograph.append(",")
241245
}
242246

243-
self.encode(type: generic.argument)
247+
self.encode(type: type.argument)
244248
}
245249

246250
self.autograph.append(">")

Sources/MarkdownPluginSwiftTests/Autographs.swift

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ struct Autographs
1111
private
1212
var landmarks:SignatureLandmarks
1313

14+
private
15+
var dictionary:Signature<Symbol.Decl>.Fragment { .init("Dictionary", referent: .sSD) }
16+
private
17+
var array:Signature<Symbol.Decl>.Fragment { .init("Array", referent: .sSa) }
18+
private
19+
var optional:Signature<Symbol.Decl>.Fragment { .init("Optional", referent: .sSq) }
20+
1421
init()
1522
{
1623
self.landmarks = .init()
@@ -199,19 +206,15 @@ struct Autographs
199206
}
200207

201208
@Test mutating
202-
func Resugaring()
209+
func Resugaring1()
203210
{
204-
let dictionary:Signature<Symbol.Decl>.Fragment = .init("Dictionary", referent: .sSD)
205-
let array:Signature<Symbol.Decl>.Fragment = .init("Array", referent: .sSa)
206-
let optional:Signature<Symbol.Decl>.Fragment = .init("Optional", referent: .sSq)
207-
208211
let _:Signature<Symbol.Decl>.Expanded = .init([
209212
"func f<T, U, V>(\n a: (",
210-
array,
213+
self.array,
211214
"<T>),\n b: ",
212-
dictionary,
215+
self.dictionary,
213216
"<U, V>.Type) -> ",
214-
optional,
217+
self.optional,
215218
"<V>",
216219
],
217220
sugarDictionary: .sSD,
@@ -223,6 +226,42 @@ struct Autographs
223226
#expect(self.landmarks.output == ["V?"])
224227
}
225228

229+
@Test mutating
230+
func Resugaring2()
231+
{
232+
let _:Signature<Symbol.Decl>.Expanded = .init([
233+
"func f(_: ", self.dictionary, "<Int, String>.Index)",
234+
],
235+
sugarDictionary: .sSD,
236+
sugarArray: .sSa,
237+
sugarOptional: .sSq,
238+
landmarks: &self.landmarks)
239+
240+
#expect(self.landmarks.inputs == ["Dictionary<Int,String>.Index"])
241+
#expect(self.landmarks.output == [])
242+
}
243+
244+
@Test mutating
245+
func Resugaring3()
246+
{
247+
let _:Signature<Symbol.Decl>.Expanded = .init([
248+
"func f(_: ",
249+
self.array,
250+
"<",
251+
self.dictionary,
252+
"<",
253+
self.optional,
254+
"<Int>, String>>?)",
255+
],
256+
sugarDictionary: .sSD,
257+
sugarArray: .sSa,
258+
sugarOptional: .sSq,
259+
landmarks: &self.landmarks)
260+
261+
#expect(self.landmarks.inputs == ["[[Int?:String]]?"])
262+
#expect(self.landmarks.output == [])
263+
}
264+
226265
@Test mutating
227266
func DesugaringStaticSelf()
228267
{

0 commit comments

Comments
 (0)