diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-12-03 13:31:13 -0800 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-12-04 12:25:16 -0800 |
commit | 1b454185c44a0817a1f30c3d93a91b16805ce84b (patch) | |
tree | 29dde89e788abfa1ebdb6d7949c7553045422daf /src/compiler | |
parent | 6c63ab153651f7946ece5740d52e0f2b701e349d (diff) | |
download | scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.tar.gz scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.tar.bz2 scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.zip |
SI-8013 Nowarn on macro str interpolation
When warning about stray "foo $bar" under `-Xlint`,
which may be missing an interpolator id, suppress
the warning if we're in the middle of a macro
expansion, since we have no useful heuristic to
apply to the expanded tree.
The test for whether the string is part of an
expanded tree is to check all open macros for
an expanded tree that contains the literal tree
under scrutiny. (This is deemed more paranoid
than looking for a macro application that is an
enclosing position.)
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 6d799b0098..a77c2ff830 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -5107,12 +5107,24 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper // Warn about likely interpolated strings which are missing their interpolators def warnMissingInterpolator(lit: Literal): Unit = if (!isPastTyper) { + // attempt to avoid warning about trees munged by macros + def isMacroExpansion = { + // context.tree is not the expandee; it is plain new SC(ps).m(args) + //context.tree exists (t => (t.pos includes lit.pos) && hasMacroExpansionAttachment(t)) + // testing pos works and may suffice + //openMacros exists (_.macroApplication.pos includes lit.pos) + // tests whether the lit belongs to the expandee of an open macro + openMacros exists (_.macroApplication.attachments.get[MacroExpansionAttachment] match { + case Some(MacroExpansionAttachment(_, t: Tree)) => t exists (_ == lit) + case _ => false + }) + } // attempt to avoid warning about the special interpolated message string // for implicitNotFound or any standard interpolation (with embedded $$). def isRecognizablyNotForInterpolation = context.enclosingApply.tree match { case Apply(Select(Apply(RefTree(_, nme.StringContext), _), _), _) => true case Apply(Select(New(RefTree(_, tpnme.implicitNotFound)), _), _) => true - case _ => false + case _ => isMacroExpansion } def requiresNoArgs(tp: Type): Boolean = tp match { case PolyType(_, restpe) => requiresNoArgs(restpe) @@ -5143,12 +5155,9 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper } def typedLiteral(tree: Literal) = { - if (settings.lint) - warnMissingInterpolator(tree) + if (settings.lint) warnMissingInterpolator(tree) - tree setType ( - if (tree.value.tag == UnitTag) UnitTpe - else ConstantType(tree.value)) + tree setType (if (tree.value.tag == UnitTag) UnitTpe else ConstantType(tree.value)) } def typedSingletonTypeTree(tree: SingletonTypeTree) = { |