summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/AnnotationInfos.scala3
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala5
-rw-r--r--src/reflect/scala/reflect/internal/Mode.scala110
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala6
-rw-r--r--src/reflect/scala/reflect/internal/TreeInfo.scala6
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala10
-rw-r--r--src/reflect/scala/reflect/internal/util/Collections.scala2
7 files changed, 75 insertions, 67 deletions
diff --git a/src/reflect/scala/reflect/internal/AnnotationInfos.scala b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
index 90534a9865..73ca74f08e 100644
--- a/src/reflect/scala/reflect/internal/AnnotationInfos.scala
+++ b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
@@ -40,8 +40,7 @@ trait AnnotationInfos extends api.Annotations { self: SymbolTable =>
// monomorphic one by introducing existentials, see SI-7009 for details
existentialAbstraction(throwableSym.typeParams, throwableSym.tpe)
}
- val throwsAnn = AnnotationInfo(appliedType(definitions.ThrowsClass, throwableTpe), List(Literal(Constant(throwableTpe))), Nil)
- withAnnotations(List(throwsAnn))
+ this withAnnotation AnnotationInfo(appliedType(ThrowsClass, throwableTpe), List(Literal(Constant(throwableTpe))), Nil)
}
/** Tests for, get, or remove an annotation */
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index a0ddc1e1b2..b32d439426 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -431,6 +431,11 @@ trait Definitions extends api.StandardDefinitions {
case _ => false
}
+ def repeatedToSingle(tp: Type): Type = tp match {
+ case TypeRef(_, RepeatedParamClass, arg :: Nil) => arg
+ case _ => tp
+ }
+
def repeatedToSeq(tp: Type): Type = (tp baseType RepeatedParamClass) match {
case TypeRef(_, RepeatedParamClass, arg :: Nil) => seqType(arg)
case _ => tp
diff --git a/src/reflect/scala/reflect/internal/Mode.scala b/src/reflect/scala/reflect/internal/Mode.scala
index 516e96cbb3..027e3a340a 100644
--- a/src/reflect/scala/reflect/internal/Mode.scala
+++ b/src/reflect/scala/reflect/internal/Mode.scala
@@ -48,35 +48,10 @@ object Mode {
*/
final val TAPPmode: Mode = 0x080
- /** SUPERCONSTRmode is set for the super
- * in a superclass constructor call super.<init>.
- */
- final val SUPERCONSTRmode: Mode = 0x100
-
- /** SNDTRYmode indicates that an application is typed for the 2nd time.
- * In that case functions may no longer be coerced with implicit views.
- */
- final val SNDTRYmode: Mode = 0x200
-
/** LHSmode is set for the left-hand side of an assignment.
*/
final val LHSmode: Mode = 0x400
- /** STARmode is set when star patterns are allowed.
- * (This was formerly called REGPATmode.)
- */
- final val STARmode: Mode = 0x1000
-
- /** ALTmode is set when we are under a pattern alternative.
- */
- final val ALTmode: Mode = 0x2000
-
- /** HKmode is set when we are typing a higher-kinded type.
- * adapt should then check kind-arity based on the prototypical type's
- * kind arity. Type arguments should not be inferred.
- */
- final val HKmode: Mode = 0x4000 // @M: could also use POLYmode | TAPPmode
-
/** BYVALmode is set when we are typing an expression
* that occurs in a by-value position. An expression e1 is in by-value
* position within expression e2 iff it will be reduced to a value at that
@@ -90,11 +65,11 @@ object Mode {
*/
final val TYPEPATmode: Mode = 0x10000
- /** RETmode is set when we are typing a return expression.
- */
- final val RETmode: Mode = 0x20000
-
- final private val StickyModes: Mode = EXPRmode | PATTERNmode | TYPEmode | ALTmode
+ private val StickyModes: Mode = EXPRmode | PATTERNmode | TYPEmode
+ private val StickyModesForFun: Mode = StickyModes | SCCmode
+ final val MonoQualifierModes: Mode = EXPRmode | QUALmode
+ final val PolyQualifierModes: Mode = EXPRmode | QUALmode | POLYmode
+ final val OperatorModes: Mode = EXPRmode | POLYmode | TAPPmode | FUNmode
/** Translates a mask of mode flags into something readable.
*/
@@ -107,13 +82,13 @@ object Mode {
(1 << 5) -> "POLYmode",
(1 << 6) -> "QUALmode",
(1 << 7) -> "TAPPmode",
- (1 << 8) -> "SUPERCONSTRmode",
- (1 << 9) -> "SNDTRYmode",
+ (1 << 8) -> "<>", // formerly SUPERCONSTRmode
+ (1 << 9) -> "<>", // formerly SNDTRYmode
(1 << 10) -> "LHSmode",
- (1 << 11) -> "<DOES NOT EXIST mode>",
- (1 << 12) -> "STARmode",
- (1 << 13) -> "ALTmode",
- (1 << 14) -> "HKmode",
+ (1 << 11) -> "<>",
+ (1 << 12) -> "<>", // formerly STARmode
+ (1 << 13) -> "<>", // formerly ALTmode
+ (1 << 14) -> "<>", // formerly HKmode
(1 << 15) -> "BYVALmode",
(1 << 16) -> "TYPEPATmode"
).map({ case (k, v) => Mode(k) -> v })
@@ -121,32 +96,47 @@ object Mode {
import Mode._
final class Mode private (val bits: Int) extends AnyVal {
- def &(other: Mode): Mode = new Mode(bits & other.bits)
- def |(other: Mode): Mode = new Mode(bits | other.bits)
+ def &(other: Mode): Mode = new Mode(bits & other.bits)
+ def |(other: Mode): Mode = new Mode(bits | other.bits)
def &~(other: Mode): Mode = new Mode(bits & ~(other.bits))
- def onlySticky = this & Mode.StickyModes
- def forFunMode = this & (Mode.StickyModes | SCCmode) | FUNmode | POLYmode | BYVALmode
- def forTypeMode =
- if (inAny(PATTERNmode | TYPEPATmode)) TYPEmode | TYPEPATmode
- else TYPEmode
-
- def inAll(required: Mode) = (this & required) == required
- def inAny(required: Mode) = (this & required) !=NOmode
- def inNone(prohibited: Mode) = (this & prohibited) == NOmode
- def inHKMode = inAll(HKmode)
- def inFunMode = inAll(FUNmode)
- def inPolyMode = inAll(POLYmode)
- def inPatternMode = inAll(PATTERNmode)
- def inExprMode = inAll(EXPRmode)
- def inByValMode = inAll(BYVALmode)
- def inRetMode = inAll(RETmode)
-
- def inPatternNotFunMode = inPatternMode && !inFunMode
- def inExprModeOr(others: Mode) = inAny(EXPRmode | others)
- def inExprModeButNot(prohibited: Mode) = inAll(EXPRmode) && inNone(prohibited)
+ def onlyTypePat = this & TYPEPATmode
+ def onlySticky = this & Mode.StickyModes
+ def forFunMode = this & Mode.StickyModesForFun | FUNmode | POLYmode | BYVALmode
+ def forTypeMode = if (typingPatternOrTypePat) TYPEmode | TYPEPATmode else TYPEmode
+
+ def inAll(required: Mode) = (this & required) == required
+ def inAny(required: Mode) = (this & required) != NOmode
+ def inNone(prohibited: Mode) = (this & prohibited) == NOmode
+
+ /** True if this mode matches every mode in the 'all' Mode,
+ * and no modes in the 'none' Mode.
+ */
+ def in(all: Mode = NOmode, none: Mode = NOmode) = inAll(all) && inNone(none)
+
+ def inByValMode = inAll(BYVALmode)
+ def inExprMode = inAll(EXPRmode)
+ def inFunMode = inAll(FUNmode)
+ def inPatternMode = inAll(PATTERNmode)
+ def inPolyMode = inAll(POLYmode)
+ def inQualMode = inAll(QUALmode)
+ def inSccMode = inAll(SCCmode)
+ def inTappMode = inAll(TAPPmode)
+ def inTypeMode = inAll(TYPEmode)
+
+ def typingExprByValue = inAll(EXPRmode | BYVALmode)
+ def typingExprFun = inAll(EXPRmode | FUNmode)
+ def typingExprNotFun = in(all = EXPRmode, none = FUNmode)
+ def typingExprNotFunNotLhs = in(all = EXPRmode, none = FUNmode | LHSmode)
+ def typingExprNotLhs = in(all = EXPRmode, none = LHSmode)
+ def typingExprNotValue = in(all = EXPRmode, none = BYVALmode)
+ def typingMonoExprByValue = in(all = EXPRmode | BYVALmode, none = POLYmode)
+ def typingConstructorPattern = inAll(PATTERNmode | FUNmode)
+ def typingPatternNotConstructor = in(all = PATTERNmode, none = FUNmode)
+ def typingPatternOrTypePat = inAny(PATTERNmode | TYPEPATmode)
+ def typingTypeByValue = inAll(TYPEmode | BYVALmode)
override def toString =
- if (bits == 0) "NOmode"
- else (modeNameMap filterKeys inAll).values.toList.sorted mkString " "
+ if (this == NOmode) "NOmode"
+ else (modeNameMap filterKeys inAll).values.toList.sorted mkString "-"
}
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 24bcfbb8d2..af20b8b756 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -1504,10 +1504,10 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
* This is done in checkAccessible and overriding checks in refchecks
* We can't do this on class loading because it would result in infinite cycles.
*/
- def cookJavaRawInfo(): Unit = {
+ def cookJavaRawInfo(): this.type = {
// only try once...
if (phase.erasedTypes || (this hasFlag TRIEDCOOKING))
- return
+ return this
this setFlag TRIEDCOOKING
info // force the current info
@@ -1515,6 +1515,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
this modifyInfo rawToExistential
else if (isOverloaded)
alternatives withFilter (_.isJavaDefined) foreach (_ modifyInfo rawToExistential)
+
+ this
}
/** The logic approximately boils down to finding the most recent phase
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala
index 4c0f0695b3..e9ef9c7945 100644
--- a/src/reflect/scala/reflect/internal/TreeInfo.scala
+++ b/src/reflect/scala/reflect/internal/TreeInfo.scala
@@ -277,16 +277,16 @@ abstract class TreeInfo {
* same object?
*/
def isSelfConstrCall(tree: Tree): Boolean = tree match {
- case Applied(Ident(nme.CONSTRUCTOR), _, _) => true
+ case Applied(Ident(nme.CONSTRUCTOR), _, _) => true
case Applied(Select(This(_), nme.CONSTRUCTOR), _, _) => true
- case _ => false
+ case _ => false
}
/** Is tree a super constructor call?
*/
def isSuperConstrCall(tree: Tree): Boolean = tree match {
case Applied(Select(Super(_, _), nme.CONSTRUCTOR), _, _) => true
- case _ => false
+ case _ => false
}
/**
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index 3956bbcdec..6582459afe 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -3973,6 +3973,16 @@ trait Types
case _ => false
}
+ def isExistentialType(tp: Type): Boolean = tp.dealias match {
+ case ExistentialType(_, _) => true
+ case _ => false
+ }
+
+ def isImplicitMethodType(tp: Type) = tp match {
+ case mt: MethodType => mt.isImplicit
+ case _ => false
+ }
+
/** This is defined and named as it is because the goal is to exclude source
* level types which are not value types (e.g. MethodType) without excluding
* necessary internal types such as WildcardType. There are also non-value
diff --git a/src/reflect/scala/reflect/internal/util/Collections.scala b/src/reflect/scala/reflect/internal/util/Collections.scala
index 51b2f9f4e4..e127d577e1 100644
--- a/src/reflect/scala/reflect/internal/util/Collections.scala
+++ b/src/reflect/scala/reflect/internal/util/Collections.scala
@@ -209,3 +209,5 @@ trait Collections {
case _: IllegalArgumentException => None
}
}
+
+object Collections extends Collections