Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NullPointerException with wartremover plugin #2766

Closed
avdv opened this issue Oct 1, 2016 · 1 comment
Closed

NullPointerException with wartremover plugin #2766

avdv opened this issue Oct 1, 2016 · 1 comment

Comments

@avdv
Copy link
Contributor

avdv commented Oct 1, 2016

(See the guidelines for contributing, linked above)

steps

We're using the wartremover 1.1.1 SBT plugin in a Play 2.5.8 application, with SBT 0.13.12 and ReactiveMongo.

Sorry, but giving a reproduction is a bit hard since it seems to depend on a lot of preliminaries and we just hit this after refactoring code into different packages.

Basically, we just ran sbt compile in our project.

problem

An NPE is thrown when the wartremover plugin is trying to report an issue:

java.lang.NullPointerException
        at play.routes.compiler.RoutesCompiler$GeneratedSource$.unapply(RoutesCompiler.scala:37)
        at play.sbt.routes.RoutesCompiler$$anonfun$11$$anonfun$apply$2.isDefinedAt(RoutesCompiler.scala:180)
        at play.sbt.routes.RoutesCompiler$$anonfun$11$$anonfun$apply$2.isDefinedAt(RoutesCompiler.scala:179)
        at scala.Option.collect(Option.scala:250)
        at play.sbt.routes.RoutesCompiler$$anonfun$11.apply(RoutesCompiler.scala:179)
        at play.sbt.routes.RoutesCompiler$$anonfun$11.apply(RoutesCompiler.scala:178)
        at sbt.Compiler$$anonfun$foldMappers$2$$anonfun$apply$1.apply(Compiler.scala:156)
        at sbt.Compiler$$anonfun$foldMappers$2$$anonfun$apply$1$$anonfun$apply$2.apply(Compiler.scala:156)
        at scala.Option.getOrElse(Option.scala:120)
        at sbt.Compiler$$anonfun$foldMappers$2$$anonfun$apply$1.apply(Compiler.scala:156)
[15]  at sbt.LoggerReporter.log(LoggerReporter.scala:109)
        at xsbt.DelegatingReporter.info0(DelegatingReporter.scala:38)
        at xsbt.DelegatingReporter.info0(DelegatingReporter.scala:17)
        at scala.reflect.internal.Reporter.warning(Reporting.scala:81)
        at org.wartremover.Plugin$Traverser$$anon$1$$anon$2.error(Plugin.scala:68)
        at org.wartremover.Plugin$Traverser$$anon$1$$anon$2.error(Plugin.scala:65)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:49)
        at scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2484)
        at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1234)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1215)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1203)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1328)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2498)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2497)
        at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1232)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1207)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1203)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1328)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2484)
        at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1234)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1209)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1203)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1328)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2498)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2497)
        at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1232)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.internal.Trees$$anonfun$traverseMemberDef$1$1.apply$mcV$sp(Trees.scala:1208)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.internal.Trees$class.traverseMemberDef$1(Trees.scala:1203)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1327)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at scala.reflect.api.Trees$Traverser$$anonfun$traverseStats$1$$anonfun$apply$1.apply$mcV$sp(Trees.scala:2498)
        at scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2507)
        at scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2497)
        at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1326)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16)
        at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475)
        at org.wartremover.warts.Var$$anon$1.traverse(Var.scala:52)
        at org.wartremover.Plugin$Traverser$$anon$1$$anonfun$go$1$1.apply(Plugin.scala:74)
        at org.wartremover.Plugin$Traverser$$anon$1$$anonfun$go$1$1.apply(Plugin.scala:74)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at org.wartremover.Plugin$Traverser$$anon$1.go$1(Plugin.scala:74)
        at org.wartremover.Plugin$Traverser$$anon$1.apply(Plugin.scala:77)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply$mcV$sp(Global.scala:440)
        at scala.tools.nsc.Global$GlobalPhase.withCurrentUnit(Global.scala:431)
        at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:440)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:398)
        at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:398)
        at scala.collection.Iterator$class.foreach(Iterator.scala:893)
        at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
        at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:398)
        at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1501)
        at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1486)
        at scala.tools.nsc.Global$Run.compileSources(Global.scala:1481)
        at scala.tools.nsc.Global$Run.compile(Global.scala:1582)
        at xsbt.CachedCompiler0.run(CompilerInterface.scala:116)
        at xsbt.CachedCompiler0.run(CompilerInterface.scala:95)
...

This seems be caused by the Position having no sourceFile attached, as JDB yields the following result at sbt.LoggerReporter.log (LoggerReporter.scala:109):

pool-4-thread-4[15] eval pos.toString()
 pos.toString() = "<macro>:1"
[15] eval pos.sourceFile.isEmpty()
 pos.sourceFile.isEmpty() = false
[15] eval pos.sourceFile.get()
 pos.sourceFile.get() = null

So, apparently the posIn parameter given to convert here is already missing that information.

expectation

no exception.

avdv added a commit to avdv/sbt that referenced this issue Oct 1, 2016
eed3si9n added a commit that referenced this issue Oct 25, 2016
avdv added a commit to avdv/zinc that referenced this issue Oct 25, 2016
This avoids an NPE when accessing position info in case `sourcePath` or `sourceFile` are `null`. See sbt/sbt#2766 for a stack trace.
@avdv
Copy link
Contributor Author

avdv commented Dec 16, 2017

closing since fixes are already merged

@avdv avdv closed this as completed Dec 16, 2017
eed3si9n pushed a commit to eed3si9n/scala that referenced this issue May 14, 2019
This avoids an NPE when accessing position info in case `sourcePath` or `sourceFile` are `null`. See sbt/sbt#2766 for a stack trace.
lrytz pushed a commit to lrytz/scala that referenced this issue Nov 5, 2019
This avoids an NPE when accessing position info in case `sourcePath` or `sourceFile` are `null`. See sbt/sbt#2766 for a stack trace.
Rewritten from sbt/zinc@e2a249a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant