diff --git a/main/src/main/scala/sbt/internals/parser/SbtParser.scala b/main/src/main/scala/sbt/internals/parser/SbtParser.scala
index 59f0d9ac4..30a754eb2 100644
--- a/main/src/main/scala/sbt/internals/parser/SbtParser.scala
+++ b/main/src/main/scala/sbt/internals/parser/SbtParser.scala
@@ -23,10 +23,13 @@ private[sbt] object SbtParser {
sealed trait ParsedSbtFileExpressions {
/** The set of parsed import expressions. */
def imports: Seq[(String, Int)]
+
/** The set of parsed defintions and/or sbt build settings. */
def settings: Seq[(String, LineRange)]
+
/** The set of scala tree's for parsed definitions/settings and the underlying string representation.. */
def settingsTrees: Seq[(String, Tree)]
+
/** Represents the changes we had to perform to the sbt file so that XML will parse correctly. */
def modifiedContent: String
}
@@ -229,13 +232,17 @@ private[sbt] object XmlContent {
(accSeqIndex, el) =>
val (statement, startIndex, endIndex) = el
val (accSeq, index) = accSeqIndex
- val textStatementOption = if (index >= startIndex) {
- None
+ val (st, textStatementOption) = if (index >= startIndex) {
+ (statement, None)
} else {
val s = content.substring(index, startIndex)
- Some((s, false))
+ if (s.trim.isEmpty) {
+ (statement + s, None)
+ } else {
+ (statement, Some((s, false)))
+ }
}
- val newAccSeq = (statement, true) +: addOptionToCollection(accSeq, textStatementOption)
+ val newAccSeq = (st, true) +: addOptionToCollection(accSeq, textStatementOption)
(newAccSeq, endIndex)
}
val endOfFile = content.substring(index, content.length)
@@ -352,18 +359,22 @@ private[sbt] object XmlContent {
* @return content with xml with brackets
*/
private def addExplicitXmlContent(content: String, xmlParts: Seq[(String, Int, Int)]): String = {
- val statements: Seq[(String, Boolean)] = splitFile(content, xmlParts)
- val (correctedStmt, shouldAddCloseBrackets, wasXml, _) = addBracketsIfNecessary(statements)
+ val statementsXml = splitFile(content, xmlParts)
+ val (correctedStmt, shouldAddCloseBrackets, wasXml, _) = addBracketsIfNecessary(statementsXml)
val closeIfNecessaryCorrectedStmt =
if (shouldAddCloseBrackets && wasXml) {
- correctedStmt.head +: CLOSE_BRACKET +: correctedStmt.tail
+ if (correctedStmt.head.trim.isEmpty) {
+ CLOSE_BRACKET +: correctedStmt
+ } else {
+ correctedStmt.head +: CLOSE_BRACKET +: correctedStmt.tail
+ }
} else {
correctedStmt
}
closeIfNecessaryCorrectedStmt.reverse.mkString
}
- def addBracketsIfNecessary(statements: Seq[(String, Boolean)]): (Seq[String], Boolean, Boolean, String) = {
+ private def addBracketsIfNecessary(statements: Seq[(String, Boolean)]): (Seq[String], Boolean, Boolean, String) = {
statements.foldLeft((Seq.empty[String], false, false, "")) {
case ((accStmt, shouldAddCloseBracket, prvWasXml, prvStmt), (stmt, isXml)) =>
if (stmt.trim.isEmpty) {
diff --git a/main/src/test/resources/fail-format/.gitignore b/main/src/test/resources/fail-format/.gitignore
new file mode 100644
index 000000000..f59ec20aa
--- /dev/null
+++ b/main/src/test/resources/fail-format/.gitignore
@@ -0,0 +1 @@
+*
\ No newline at end of file
diff --git a/main/src/test/resources/old-format/21.sbt.txt b/main/src/test/resources/old-format/21.sbt.txt
new file mode 100644
index 000000000..c4cfc8585
--- /dev/null
+++ b/main/src/test/resources/old-format/21.sbt.txt
@@ -0,0 +1,72 @@
+
+name := "scala-stm"
+
+organization := "org.scala-stm"
+
+version := "0.8-SNAPSHOT"
+
+scalaVersion := "2.11.2"
+
+crossScalaVersions := Seq("2.11.2", "2.10.4", "2.9.3")
+
+libraryDependencies += ("org.scalatest" %% "scalatest" % "[1.5,)" % "test")
+
+libraryDependencies += ("junit" % "junit" % "4.5" % "test")
+
+// skip exhaustive tests
+testOptions += Tests.Argument("-l", "slow")
+
+// test of TxnExecutor.transformDefault must be run by itself
+parallelExecution in Test := false
+
+////////////////////
+// publishing
+
+pomExtra :=
+ http://nbronson.github.com/scala-stm/
+
+
+ BSD
+ https://github.com/nbronson/scala-stm/blob/master/LICENSE.txt
+ repo
+
+
+
+ scm:git:git@github.com:nbronson/scala-stm.git
+ git@github.com:nbronson/scala-stm.git
+
+
+
+ nbronson
+ Nathan Bronson
+ ngbronson@gmail.com
+
+
+
+publishMavenStyle := true
+
+publishTo <<= (version) { v: String =>
+ val base = "https://oss.sonatype.org/"
+ if (v.trim.endsWith("SNAPSHOT"))
+ Some("snapshots" at base + "content/repositories/snapshots/")
+ else
+ Some("releases" at base + "service/local/staging/deploy/maven2/")
+ }
+
+// exclude scalatest from the Maven POM
+pomPostProcess := { xi: scala.xml.Node =>
+ import scala.xml._
+ val badDeps = (xi \\ "dependency") filter {
+ x => (x \ "artifactId").text != "scala-library"
+ } toSet
+ def filt(root: Node): Node = root match {
+ case x: Elem => {
+ val ch = x.child filter { !badDeps(_) } map { filt(_) }
+ Elem(x.prefix, x.label, x.attributes, x.scope, ch: _*)
+ }
+ case x => x
+ }
+ filt(xi)
+ }
+
+credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")