Skip to content

Commit

Permalink
Merge pull request scalastyle#176 from er1c/ignorewhitespacelines
Browse files Browse the repository at this point in the history
Add an option to ignore reporting on entire lines that are whitespace…
  • Loading branch information
matthewfarwell committed Jun 15, 2016
2 parents 917a06e + 5d2585d commit ebf397d
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 27 deletions.
6 changes: 5 additions & 1 deletion lib/scalastyle_config.xml
Expand Up @@ -26,7 +26,11 @@
</parameters>
</check>
<check class="org.scalastyle.scalariform.SpacesAfterPlusChecker" level="warning" enabled="true"></check>
<check class="org.scalastyle.file.WhitespaceEndOfLineChecker" level="warning" enabled="true"></check>
<check class="org.scalastyle.file.WhitespaceEndOfLineChecker" level="warning" enabled="true">
<parameters>
<parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter>
</parameters>
</check>
<check class="org.scalastyle.scalariform.SpacesBeforePlusChecker" level="warning" enabled="true"></check>
<check class="org.scalastyle.file.FileLineLengthChecker" level="warning" enabled="true">
<parameters>
Expand Down
4 changes: 3 additions & 1 deletion lib/scalastyle_scala_config.xml
Expand Up @@ -26,7 +26,9 @@
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="false">
<parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
Expand Down
6 changes: 5 additions & 1 deletion src/main/resources/default_config.xml
Expand Up @@ -26,7 +26,11 @@
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true">
<parameters>
<parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/reference.conf
Expand Up @@ -41,6 +41,9 @@ spaces.after.plus.description = "Check that the plus sign is followed by a space
whitespace.end.of.line.message = "Whitespace at end of line"
whitespace.end.of.line.label = "Whitespace at end of line"
whitespace.end.of.line.description = "Check that there is no trailing whitespace at the end of lines"
whitespace.end.of.line.ignoreWhitespaceLines.label = "Ignore lines with just whitespace"
whitespace.end.of.line.ignoreWhitespaceLines.description = "Skip a line if the entire contents are whitespace characters"


spaces.before.plus.message = "There should be a space before the plus (+) sign"
spaces.before.plus.label = "Space before plus"
Expand Down
16 changes: 10 additions & 6 deletions src/main/resources/scalastyle_definition.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- scalastyle definition file. This contains the list of checkers and the parameters & types available -->
<scalastyle-definition>
<checker class="org.scalastyle.file.FileTabChecker" id="line.contains.tab" defaultLevel="warning"/>
<checker class="org.scalastyle.file.FileTabChecker" id="line.contains.tab" defaultLevel="warning"/>
<checker class="org.scalastyle.file.FileLengthChecker" id="file.size.limit" defaultLevel="warning">
<parameters>
<parameter name="maxFileLength" type="integer" default="1500"/>
Expand All @@ -13,15 +13,19 @@
</parameters>
</checker>
<checker class="org.scalastyle.scalariform.SpacesAfterPlusChecker" id="spaces.after.plus" defaultLevel="warning" />
<checker class="org.scalastyle.file.WhitespaceEndOfLineChecker" id="whitespace.end.of.line" defaultLevel="warning" />
<checker class="org.scalastyle.file.WhitespaceEndOfLineChecker" id="whitespace.end.of.line" defaultLevel="warning">
<parameters>
<parameter name="ignoreWhitespaceLines" type="boolean" default="false" />
</parameters>
</checker>
<checker class="org.scalastyle.scalariform.SpacesBeforePlusChecker" id="spaces.before.plus" defaultLevel="warning" />
<checker class="org.scalastyle.file.FileLineLengthChecker" id="line.size.limit" defaultLevel="warning" >
<parameters>
<checker class="org.scalastyle.file.FileLineLengthChecker" id="line.size.limit" defaultLevel="warning" >
<parameters>
<parameter name="maxLineLength" type="integer" default="160" />
<parameter name="tabSize" type="integer" default="4" />
<parameter name="ignoreImports" type="boolean" default="false" />
</parameters>
</checker>
</parameters>
</checker>
<checker class="org.scalastyle.scalariform.ClassNamesChecker" id="class.name" defaultLevel="warning">
<parameters>
<parameter name="regex" type="string" default="^[A-Z][A-Za-z]*$" />
Expand Down
6 changes: 5 additions & 1 deletion src/main/resources/scalastyle_documentation.xml
Expand Up @@ -733,7 +733,11 @@ To bring consistency with how comments should be formatted, leave a space right
</justification>
<example-configuration>
<![CDATA[
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true" />
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true">
<parameters>
<parameter name="ignoreWhitespaceLines" type="boolean" default="false" />
</parameters>
</check>
]]>
</example-configuration>
</check>
Expand Down
37 changes: 21 additions & 16 deletions src/main/scala/org/scalastyle/file/WhitespaceEndOfLineChecker.scala
Expand Up @@ -25,33 +25,38 @@ import org.scalastyle.ScalastyleError

class WhitespaceEndOfLineChecker extends FileChecker {
val errorKey = "whitespace.end.of.line"
lazy val ignoreWhitespaceLines = getBoolean("ignoreWhitespaceLines", false)

private val whitespaces = Set(' ', '\t')
private val endOfLines = Set('\n', '\r')

private def endsWithWhitespace(s: String) = {
private def endsWithWhitespace(s: String): (Boolean, Int) = {
val sb = s.reverse

var endOfLinesIndex = 0;
while (endOfLinesIndex < sb.length() && endOfLines(sb(endOfLinesIndex))) {
endOfLinesIndex += 1
}

var whitespaceIndex = endOfLinesIndex;
while (whitespaceIndex < sb.length() && whitespaces(sb(whitespaceIndex))) {
whitespaceIndex += 1
}

(whitespaceIndex != endOfLinesIndex, s.length() - whitespaceIndex)
(for {
withoutEndOfLines <- Some(sb.zipWithIndex.dropWhile{ case (c: Char, idx: Int) => endOfLines.contains(c) })
(nextChar, eolIndex) <- withoutEndOfLines.headOption
if (whitespaces.contains(nextChar))
} yield {
withoutEndOfLines.dropWhile{ case (c: Char, idx: Int) =>
whitespaces.contains(c)
}.headOption.map{ case (c: Char, idx: Int) =>
(true, s.length() - idx)
}.getOrElse {
if (ignoreWhitespaceLines) (false, 0)
else (true, 0)
}
} ).getOrElse( (false, 0) )
}

def verify(lines: Lines): List[ScalastyleError] = {
val errors = for {
line <- lines.lines.zipWithIndex;
whitespace = endsWithWhitespace(line._1.text)
if (whitespace._1)
(line, lineIndex) <- lines.lines.zipWithIndex
(hasWhitespace, whitespaceIndex) = endsWithWhitespace(line.text)
if (hasWhitespace)
if (!ignoreWhitespaceLines || line.text.trim.size > 0)
} yield {
ColumnError(line._2 + 1, whitespace._2)
ColumnError(lineIndex + 1, whitespaceIndex)
}

errors.toList
Expand Down
6 changes: 5 additions & 1 deletion src/test/resources/config/scalastyle_config.xml
Expand Up @@ -26,7 +26,11 @@
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true">
<parameters>
<parameter name="ignoreWhitespaceLines"><![CDATA[false]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
Expand Down
Expand Up @@ -65,4 +65,35 @@ object Foobar {

assertErrors(List(columnError(2, 14), columnError(3, 13)), source)
}

@Test def testThree(): Unit = {
val source = s"""
package foobar

object Foobar {
val foo = "foo"
~~
val bar = "bar"
##
}
""".replaceAll("~", " ").replaceAll("#", "\t");

assertErrors(List(), source, Map("ignoreWhitespaceLines" -> "true"))
}

@Test def testFour(): Unit = {
val source =
s"""
package foobar

object Foobar {
val foo = "foo"
~~
val bar = "bar"
##
}
""".replaceAll("~", " ").replaceAll("#", "\t");

assertErrors(List(columnError(6, 0), columnError(8, 0)), source, Map("ignoreWhitespaceLines" -> "false"))
}
}

0 comments on commit ebf397d

Please sign in to comment.