swiftlang / swift-syntax

A set of Swift libraries for parsing, inspecting, generating, and transforming Swift source code.
Apache License 2.0
3.24k stars 413 forks source link

`AttributeRemover` outputs a leading newline in some cases #2269

Open gohanlon opened 1 year ago

gohanlon commented 1 year ago

Description

2247 better isolates the AttributeRemoverTests to just AttributeRemover. Along the way, a new assert helper was created that, unlike assertMacroExpansion, doesn't trim newlines before comparing values.

Notably, this revealed a previously undetected behavior in AttributeRemover: it outputs an additional leading newline when the removed attribute isn't preceded by any tokens. For instance:

assertSyntaxRemovingTestAttributes {
  """
  @Test
  var x: Int
  """
} reduction: {
  "var x: Int"
}
//failed - Attribute removal did not produce the expected reduced source
//+
// var x: Int
//
//Actual reduced source:
//
//var x: Int

and:

assertSyntaxRemovingTestAttributes {
  """
  @Test
  /* comment */
  var value: Int
  """
} reduction: {
  """
  /* comment */
  var value: Int
  """
}
//failed - Attribute removal did not produce the expected reduced source
//+
// /* comment */
// var value: Int
//
//Actual reduced source:
//
///* comment */
//var value: Int

The following tests outputs have an extra leading newline:

Before #2247, this behavior is masked by assertMacroExpansion. In #2247, the above tests are "fixed" by including the unwanted leading newlines in the expected output and marking those tests with FIXMEs (to be properly fixed in a separate PR).

Steps to Reproduce

No response

ahoppen commented 1 year ago

Tracked in Apple’s issue tracker as rdar://116607739