mirror of https://github.com/sbt/sbt.git
Handle xml content in session save
This commit is contained in:
parent
c720a973a6
commit
232c28ecd1
|
|
@ -1,2 +1,4 @@
|
|||
target/
|
||||
__pycache__
|
||||
.idea
|
||||
.idea_modules
|
||||
|
|
|
|||
|
|
@ -18,16 +18,16 @@ object SessionSettingsNoBlankies {
|
|||
oldLinesToNew(newContent, lineMap.tail)
|
||||
}
|
||||
|
||||
private def toNewContent(content: List[String], tuple: (Int, List[(Int, List[String])])): List[String] = {
|
||||
val (from, newSettingSeq) = tuple
|
||||
private def toNewContent(content: List[String], setCommands: (Int, List[(Int, List[String])])): List[String] = {
|
||||
val (from, newSettings) = setCommands
|
||||
|
||||
val newTreeStringSeqMap = newSettingSeq.seq.map {
|
||||
val newTreeStringsMap = newSettings.map {
|
||||
case (_, lines) => toTreeStringMap(lines)
|
||||
}
|
||||
val to = newSettingSeq.map(_._1).max
|
||||
val to = newSettings.map(_._1).max
|
||||
val originalLine = content.slice(from - 1, to - 1)
|
||||
|
||||
val operations = newTreeStringSeqMap.flatMap {
|
||||
val operations = newTreeStringsMap.flatMap {
|
||||
map =>
|
||||
map.flatMap {
|
||||
case (name, (startIndex, statement)) =>
|
||||
|
|
@ -39,7 +39,7 @@ object SessionSettingsNoBlankies {
|
|||
}
|
||||
}
|
||||
}
|
||||
val statements = originalLine.mkString("\n")
|
||||
val statements = XmlContent.handleXmlContent(originalLine.mkString("\n"))
|
||||
val sortedOperations = operations.sortBy(_._1)(REVERSE_ORDERING_INT)
|
||||
val newContent = sortedOperations.foldLeft(statements) {
|
||||
case (acc, (startIndex, old, newStatement)) =>
|
||||
|
|
@ -58,8 +58,8 @@ object SessionSettingsNoBlankies {
|
|||
}
|
||||
|
||||
private def toTreeStringMap(lines: List[String]) = {
|
||||
|
||||
val trees = SplitExpressionsNoBlankies(new File("fake"), lines).settingsTrees
|
||||
val split = SplitExpressionsNoBlankies(new File("fake"), lines)
|
||||
val trees = split.settingsTrees
|
||||
val seq = trees.map {
|
||||
case (statement, tree) =>
|
||||
(extractSettingName(tree), (tree.pos.start, statement))
|
||||
|
|
|
|||
|
|
@ -28,12 +28,12 @@ case class SplitExpressionsNoBlankies(file: File, lines: Seq[String]) {
|
|||
val toolbox = mirror.mkToolBox(options = "-Yrangepos")
|
||||
val indexedLines = lines.toIndexedSeq
|
||||
val original = indexedLines.mkString(END_OF_LINE)
|
||||
val merged = handleXmlContent(original)
|
||||
val modifiedContent = handleXmlContent(original)
|
||||
val fileName = file.getAbsolutePath
|
||||
|
||||
val parsed =
|
||||
try {
|
||||
toolbox.parse(merged)
|
||||
toolbox.parse(modifiedContent)
|
||||
} catch {
|
||||
case e: ToolBoxError =>
|
||||
val seq = toolbox.frontEnd.infos.map { i =>
|
||||
|
|
@ -41,7 +41,7 @@ case class SplitExpressionsNoBlankies(file: File, lines: Seq[String]) {
|
|||
}
|
||||
throw new MessageOnlyException(
|
||||
s"""======
|
||||
|$merged
|
||||
|$modifiedContent
|
||||
|======
|
||||
|${seq.mkString(EOL)}""".stripMargin)
|
||||
}
|
||||
|
|
@ -58,7 +58,7 @@ case class SplitExpressionsNoBlankies(file: File, lines: Seq[String]) {
|
|||
}
|
||||
|
||||
def convertImport(t: Tree): (String, Int) =
|
||||
(merged.substring(t.pos.start, t.pos.end), t.pos.line - 1)
|
||||
(modifiedContent.substring(t.pos.start, t.pos.end), t.pos.line - 1)
|
||||
|
||||
/**
|
||||
* See BugInParser
|
||||
|
|
@ -69,7 +69,7 @@ case class SplitExpressionsNoBlankies(file: File, lines: Seq[String]) {
|
|||
def parseStatementAgain(t: Tree, originalStatement: String): String = {
|
||||
val statement = util.Try(toolbox.parse(originalStatement)) match {
|
||||
case util.Failure(th) =>
|
||||
val missingText = tryWithNextStatement(merged, t.pos.end, t.pos.line, fileName, th)
|
||||
val missingText = tryWithNextStatement(modifiedContent, t.pos.end, t.pos.line, fileName, th)
|
||||
originalStatement + missingText
|
||||
case _ =>
|
||||
originalStatement
|
||||
|
|
@ -79,7 +79,7 @@ case class SplitExpressionsNoBlankies(file: File, lines: Seq[String]) {
|
|||
|
||||
def convertStatement(t: Tree): Option[(String, Tree, LineRange)] =
|
||||
if (t.pos.isDefined) {
|
||||
val originalStatement = merged.substring(t.pos.start, t.pos.end)
|
||||
val originalStatement = modifiedContent.substring(t.pos.start, t.pos.end)
|
||||
val statement = parseStatementAgain(t, originalStatement)
|
||||
val numberLines = statement.count(c => c == END_OF_LINE_CHAR)
|
||||
Some((statement, t, LineRange(t.pos.line - 1, t.pos.line + numberLines)))
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
<setting>
|
||||
<start>1</start>
|
||||
<end>2</end>
|
||||
<set>name := "alaMaKota"</set>
|
||||
<set><![CDATA[name := "alaMaKota"]]></set>
|
||||
</setting>
|
||||
</settings>
|
||||
|
|
@ -2,11 +2,11 @@
|
|||
<setting>
|
||||
<start>1</start>
|
||||
<end>2</end>
|
||||
<set>name := "alaMaKota"</set>
|
||||
<set><![CDATA[name := "alaMaKota"]]></set>
|
||||
</setting>
|
||||
<setting>
|
||||
<start>25</start>
|
||||
<end>26</end>
|
||||
<set>organization := "scalania"</set>
|
||||
<set><![CDATA[organization := "scalania"]]></set>
|
||||
</setting>
|
||||
</settings>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<settings>
|
||||
<setting>
|
||||
<start>4</start>
|
||||
<end>11</end>
|
||||
<set><![CDATA[checkPom := "OK"]]></set>
|
||||
</setting>
|
||||
</settings>
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
name := "newName"
|
||||
libraryDependencies := Seq("org.scala-sbt" %% "sbinary" % "0.4.1")
|
||||
|
||||
lazy val checkPom = taskKey[Unit]("check pom to ensure no <type> sections are generated"); checkPom := "OK";scalacOptions := Seq("-deprecation")
|
||||
|
||||
val b = ( <b/>)
|
||||
val a = <aaa>
|
||||
|
||||
</aaa>
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
|
||||
organization := "jozwikr" // OK
|
||||
|
||||
scalaVersion := "2.9.2"
|
||||
|
||||
organization := "ololol"
|
||||
|
||||
|
||||
|
|
@ -2,6 +2,6 @@
|
|||
<setting>
|
||||
<start>1</start>
|
||||
<end>2</end>
|
||||
<set>name := "alaMaKota"</set>
|
||||
<set><![CDATA[name := "alaMaKota"]]></set>
|
||||
</setting>
|
||||
</settings>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
import sbt._
|
||||
|
||||
val scmpom = taskKey[xml.NodeBuffer]("Node buffer")
|
||||
|
||||
scmpom := <scm>
|
||||
<url>git@github.com:mohiva/play-html-compressor.git</url>
|
||||
<connection>scm:git:git@github.com:mohiva/play-html-compressor.git</connection>
|
||||
</scm>
|
||||
<developers>
|
||||
<developer>
|
||||
<id>akkie</id>
|
||||
<name>Christian Kaps</name>
|
||||
<url>http://mohiva.com</url>
|
||||
</developer>
|
||||
</developers>
|
||||
<a></a>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<settings>
|
||||
<setting>
|
||||
<start>5</start>
|
||||
<end>18</end>
|
||||
<set><![CDATA[scmpom := <a/><b a="rt">OK</b>]]></set>
|
||||
</setting>
|
||||
</settings>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
import sbt._
|
||||
|
||||
val scmpom = taskKey[xml.NodeBuffer]("Node buffer")
|
||||
|
||||
scmpom := ( <a/><b a="rt">OK</b> )
|
||||
|
|
@ -9,14 +9,14 @@ import scala.collection.immutable.{ SortedMap, TreeMap }
|
|||
import scala.io.Source
|
||||
import scala.xml.XML
|
||||
|
||||
abstract class AbstractSessionSettingsSpec(folder: String) extends AbstractSpec {
|
||||
abstract class AbstractSessionSettingsSpec(folder: String, printDetails: Boolean = false) extends AbstractSpec {
|
||||
protected val rootPath = getClass.getResource("").getPath + folder
|
||||
println(s"Reading files from: $rootPath")
|
||||
protected val rootDir = new File(rootPath)
|
||||
|
||||
"SessionSettings " should {
|
||||
"Be identical for empty map " in {
|
||||
def unit(f: File) = Seq((Source.fromFile(f).getLines().toSeq, SortedMap.empty[Int, List[(Int, List[String])]]))
|
||||
def unit(f: File) = Seq((Source.fromFile(f).getLines().toList, SortedMap.empty[Int, List[(Int, List[String])]]))
|
||||
runTestOnFiles(unit)
|
||||
}
|
||||
|
||||
|
|
@ -25,7 +25,7 @@ abstract class AbstractSessionSettingsSpec(folder: String) extends AbstractSpec
|
|||
}
|
||||
}
|
||||
|
||||
private def runTestOnFiles(expectedResultAndMap: File => Seq[(Seq[String], SortedMap[Int, List[(Int, List[String])]])]): MatchResult[GenTraversableOnce[File]] = {
|
||||
private def runTestOnFiles(expectedResultAndMap: File => Seq[(List[String], SortedMap[Int, List[(Int, List[String])]])]): MatchResult[GenTraversableOnce[File]] = {
|
||||
|
||||
val allFiles = rootDir.listFiles(new FilenameFilter() {
|
||||
def accept(dir: File, name: String) = name.endsWith(".sbt.txt")
|
||||
|
|
@ -34,9 +34,11 @@ abstract class AbstractSessionSettingsSpec(folder: String) extends AbstractSpec
|
|||
file =>
|
||||
val originalLines = Source.fromFile(file).getLines().toList
|
||||
foreach(expectedResultAndMap(file)) {
|
||||
case (expectedResult, map) =>
|
||||
val result = SessionSettingsNoBlankies.oldLinesToNew(originalLines, map)
|
||||
expectedResult === result
|
||||
case (expectedResultList, map) =>
|
||||
val resultList = SessionSettingsNoBlankies.oldLinesToNew(originalLines, map)
|
||||
val expected = SplitExpressionsNoBlankies(file, expectedResultList)
|
||||
val result = SplitExpressionsNoBlankies(file, resultList)
|
||||
result.settings must_== expected.settings
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -55,7 +57,7 @@ abstract class AbstractSessionSettingsSpec(folder: String) extends AbstractSpec
|
|||
})
|
||||
files.map { xmlFile =>
|
||||
val xml = XML.loadFile(xmlFile)
|
||||
val result = Source.fromFile(xmlFile.getAbsolutePath + ".result").getLines().toSeq
|
||||
val result = Source.fromFile(xmlFile.getAbsolutePath + ".result").getLines().toList
|
||||
val tupleCollection = (xml \\ "settings" \\ "setting").map {
|
||||
node =>
|
||||
val set = (node \\ "set").text
|
||||
|
|
@ -73,4 +75,4 @@ abstract class AbstractSessionSettingsSpec(folder: String) extends AbstractSpec
|
|||
|
||||
}
|
||||
|
||||
class SessionSettingsSpec extends AbstractSessionSettingsSpec("../session-settings")
|
||||
class SessionSettingsSpec extends AbstractSessionSettingsSpec("../session-settings")
|
||||
Loading…
Reference in New Issue