Skip to content

Commit

Permalink
remove force of annotation constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
bishabosha committed Oct 27, 2021
1 parent 92f1948 commit 7833232
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 18 deletions.
3 changes: 0 additions & 3 deletions src/compiler/scala/tools/nsc/tasty/ForceKinds.scala
Expand Up @@ -18,8 +18,6 @@ import ForceKinds._

object ForceKinds {

/** When forcing the constructor of an annotation */
final val AnnotCtor: ForceKinds.Single = of(1 << 0)
/** When forcing the companion of a module */
final val DeepForce: ForceKinds.Single = of(1 << 1)
/** When forcing the owner of a symbol */
Expand Down Expand Up @@ -51,7 +49,6 @@ class ForceKinds(val toInt: Int) extends AnyVal {

def describe: List[String] = {
var xs = List.empty[String]
if (is(AnnotCtor)) xs ::= "reading annotation constructor"
if (is(DeepForce)) xs ::= "deep"
if (is(CompleteOwner)) xs ::= "class owner is required"
if (is(OverloadedSym)) xs ::= "overload resolution"
Expand Down
5 changes: 5 additions & 0 deletions src/compiler/scala/tools/nsc/tasty/TastyModes.scala
Expand Up @@ -34,10 +34,14 @@ object TastyModes {
final val InnerScope: TastyMode = TastyMode(1 << 5)
/** When reading the tree of an Opaque type */
final val OpaqueTypeDef: TastyMode = TastyMode(1 << 6)
/** When reading trees of an annotation */
final val ReadAnnotationCtor: TastyMode = TastyMode(1 << 7)

/** The union of `IndexStats` and `InnerScope` */
final val IndexScopedStats: TastyMode = IndexStats | InnerScope

final val ReadAnnotTopLevel: TastyMode = ReadAnnotation | ReadAnnotationCtor

case class TastyMode(val toInt: Int) extends AnyVal { mode =>

def |(other: TastyMode): TastyMode = TastyMode(toInt | other.toInt)
Expand All @@ -58,6 +62,7 @@ object TastyModes {
if (mode.is(ReadMacro)) sb += "ReadMacro"
if (mode.is(InnerScope)) sb += "InnerScope"
if (mode.is(OpaqueTypeDef)) sb += "OpaqueTypeDef"
if (mode.is(ReadAnnotationCtor)) sb += "ReadAnnotationCtor"
sb.mkString(" | ")
}
}
Expand Down
9 changes: 5 additions & 4 deletions src/compiler/scala/tools/nsc/tasty/TreeUnpickler.scala
Expand Up @@ -396,7 +396,7 @@ class TreeUnpickler[Tasty <: TastyUniverse](
val lo = readType()
if (nothingButMods(end)) readVariances(lo)
else defn.TypeBounds(lo, readVariances(readType()))
case ANNOTATEDtype => defn.AnnotatedType(readType(), readTerm()(ctx.addMode(ReadAnnotation)))
case ANNOTATEDtype => defn.AnnotatedType(readType(), readTerm()(ctx.addMode(ReadAnnotTopLevel)))
case ANDtype => defn.IntersectionType(readType(), readType())
case ORtype => unionIsUnsupported
case SUPERtype => defn.SuperType(readType(), readType())
Expand Down Expand Up @@ -694,7 +694,7 @@ class TreeUnpickler[Tasty <: TastyUniverse](
private val readTypedWithin: Context => Symbol = implicit ctx => readType().typeSymbolDirect

private val readTypedAnnot: Context => DeferredAnnotation = { implicit ctx =>
val annotCtx = ctx.addMode(ReadAnnotation)
val annotCtx = ctx.addMode(ReadAnnotTopLevel)
val start = currentAddr
readByte() // tag
val end = readEnd()
Expand Down Expand Up @@ -1134,7 +1134,8 @@ class TreeUnpickler[Tasty <: TastyUniverse](
until(end)(skipTree())
tpd.TypeTree(fnResult(fn.tpe))
} else {
tpd.Apply(fn, until(end)(readTerm()))
val argsCtx = ctx.argumentCtx(fn)
tpd.Apply(fn, until(end)(readTerm()(argsCtx)))
}
case TYPEAPPLY => tpd.TypeApply(readTerm(), until(end)(readTpt()))
case TYPED => tpd.Typed(readTerm(), readTpt())
Expand All @@ -1158,7 +1159,7 @@ class TreeUnpickler[Tasty <: TastyUniverse](
// wrong number of arguments in some scenarios reading F-bounded
// types. This came up in #137 of collection strawman.
tpd.AppliedTypeTree(readTpt(), until(end)(readTpt()))
case ANNOTATEDtpt => tpd.Annotated(readTpt(), readTerm()(ctx.addMode(ReadAnnotation)))
case ANNOTATEDtpt => tpd.Annotated(readTpt(), readTerm()(ctx.addMode(ReadAnnotTopLevel)))
case LAMBDAtpt => tpd.LambdaTypeTree(readParams[NoCycle](TYPEPARAM).map(symFromNoCycle), readTpt())
case MATCHtpt => matchTypeIsUnsupported
case TYPEBOUNDStpt =>
Expand Down
3 changes: 3 additions & 0 deletions src/compiler/scala/tools/nsc/tasty/bridge/ContextOps.scala
Expand Up @@ -557,6 +557,9 @@ trait ContextOps { self: TastyUniverse =>

final def newRefinementClassSymbol: Symbol = owner.newRefinementClass(u.NoPosition)

final def argumentCtx(fn: Tree): Context =
if (fn.symbol.isPrimaryConstructor) retractMode(ReadAnnotationCtor) else thisCtx

final def setInfo(sym: Symbol, info: Type): Unit = sym.info = info

final def markAsEnumSingleton(sym: Symbol): Unit =
Expand Down
15 changes: 4 additions & 11 deletions src/compiler/scala/tools/nsc/tasty/bridge/TreeOps.scala
Expand Up @@ -12,7 +12,7 @@

package scala.tools.nsc.tasty.bridge

import scala.tools.nsc.tasty.{TastyUniverse, TastyModes, ForceKinds}, TastyModes._, ForceKinds._
import scala.tools.nsc.tasty.{TastyUniverse, TastyModes}, TastyModes._

import scala.tools.tasty.TastyName
import scala.reflect.internal.Flags
Expand Down Expand Up @@ -70,17 +70,10 @@ trait TreeOps { self: TastyUniverse =>
def selectCtor(qual: Tree) =
u.Select(qual, u.nme.CONSTRUCTOR).setType(qual.tpe.typeSymbol.primaryConstructor.tpe)

if (ctx.mode.is(ReadAnnotation) && name.isSignedConstructor) {
val cls = qual.tpe.typeSymbol
cls.ensureCompleted(AnnotCtor)
if (cls.isJavaAnnotation)
selectCtor(qual)
else
selectName(qual, name)(lookup)
}
else {
if (ctx.mode.is(ReadAnnotationCtor) && name.isSignedConstructor)
selectCtor(qual)
else
selectName(qual, name)(lookup)
}

}

Expand Down
6 changes: 6 additions & 0 deletions test/tasty/pos/src-3/tastytest/Annotated.scala
Expand Up @@ -6,6 +6,12 @@ trait Annotated
@rootAnnot(1)
trait RootAnnotated

@overloadedAnnot(123)
trait OverloadedAnnotated1

@overloadedAnnot(false, "hello")
trait OverloadedAnnotated2

trait OuterClassAnnotated extends OuterClass {
@basicAnnot(xyz)
def foo = 1
Expand Down
6 changes: 6 additions & 0 deletions test/tasty/pos/src-3/tastytest/overloadedAnnot.scala
@@ -0,0 +1,6 @@
package tastytest

final class overloadedAnnot(str: String, int: Int, boolean: Boolean) extends scala.annotation.StaticAnnotation {
def this(int: Int) = this("abc", int, false)
def this(boolean: Boolean, str: String) = this(str, 123, boolean)
}

0 comments on commit 7833232

Please sign in to comment.