object DiscardedFuture extends WartTraverser
Flags statements that return a scala.concurrent.Future. Typically, we should not
discard scala.concurrent.Future because exceptions inside the future may not get logged.
Use FutureUtil.doNotAwait
to log exceptions and discard the future where necessary.
Also detects discarded cats.data.EitherT[
scala.concurrent.Future, ..., ...]
and cats.data.OptionT[
scala.concurrent.Future, ...]
and arbitrary nestings of those.
Custom type constructors can be registered to take the same role as scala.concurrent.Future
by annotating the type definition with DoNotDiscardLikeFuture.
Also flags usages of scala.collection.IterableOnceOps.foreach and scala.collection.IterableOnceOps.tapEach where the function returns a future-like type.
This wart is a special case of the warts NonUnitStatements
and NonUnitForEach
and scalac's -Wnonunit-statement
flag,
in that it warns only if the return type is future-like.
Additionally, this wart uses a different set of exceptions when no warning is issued.
We keep this specialized wart for two reasons:
1. It is not practically feasible to use -Wnonunit-statement
and NonUnitForEach in scalatest
because it would flag many of the assertions of the form x should be >= y
in statement positions.
Yet, it is important to check for discarded futures in tests because a discarded future may hide an exception.
2. In some production code, it is convenient to suppress the warnings coming from -Wnonunit-statement
and NonUnitForEach,
just due to how the code is written. In such places, we still want to benefit from the explicit checks
against discarded futures.
This wart does not look at futures that are discarded at the end of a unit-type expression.
These cases are caught by -Ywarn-value-discard
. We do not implement a specialized version
for future-like values because we do not expect to suppress the warnings coming from -Ywarn-value-discard
.
- Alphabetic
- By Inheritance
- DiscardedFuture
- WartTraverser
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def apply(u: WartUniverse): Traverser
- Definition Classes
- DiscardedFuture → WartTraverser
- def asAnnotationMacro(c: Context)(annottees: scala.reflect.macros.blackbox.Context.Expr[Any]*): scala.reflect.macros.blackbox.Context.Expr[Any]
- Definition Classes
- WartTraverser
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def asMacro(c: Context)(expr: scala.reflect.macros.blackbox.Context.Expr[Any]): scala.reflect.macros.blackbox.Context.Expr[Any]
- Definition Classes
- WartTraverser
- lazy val className: String
- Definition Classes
- WartTraverser
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native() @IntrinsicCandidate()
- def compose(o: WartTraverser): WartTraverser
- Definition Classes
- WartTraverser
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def error(u: WartUniverse)(pos: scala.reflect.api.Universe.Position, message: String): Unit
- Definition Classes
- WartTraverser
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- def hasTypeAscription(u: WartUniverse)(tree: scala.reflect.api.Universe.ValOrDefDef): Boolean
- Definition Classes
- WartTraverser
- def hasWartAnnotation(u: WartUniverse)(tree: scala.reflect.api.Universe.Tree): Boolean
- Definition Classes
- WartTraverser
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @IntrinsicCandidate()
- def isAnonymousFunctionName(u: WartUniverse)(t: scala.reflect.api.Universe.TypeName): Boolean
- Definition Classes
- WartTraverser
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isPrimitive(u: WartUniverse)(t: scala.reflect.api.Universe.Type): Boolean
- Definition Classes
- WartTraverser
- def isPrivate(u: WartUniverse)(t: scala.reflect.api.Universe.ValOrDefDef): Boolean
- Definition Classes
- WartTraverser
- def isPublic(u: WartUniverse)(t: scala.reflect.api.Universe.ValOrDefDef): Boolean
- Definition Classes
- WartTraverser
- def isSynthetic(u: WartUniverse)(t: scala.reflect.api.Universe.Tree): Boolean
- Definition Classes
- WartTraverser
- def isSyntheticPartialFunction(u: WartUniverse)(tree: scala.reflect.api.Universe.Tree): Boolean
- Definition Classes
- WartTraverser
- def isWartAnnotation(u: WartUniverse)(a: scala.reflect.api.Universe.Annotation): Boolean
- Definition Classes
- WartTraverser
- val message: String
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @IntrinsicCandidate()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- def warning(u: WartUniverse)(pos: scala.reflect.api.Universe.Position, message: String): Unit
- Definition Classes
- WartTraverser
- lazy val wartName: String
- Definition Classes
- WartTraverser
- def wasInferred(u: WartUniverse)(t: scala.reflect.api.Universe.TypeTree): Boolean
- Definition Classes
- WartTraverser