Skip to content

Commit

Permalink
Partial Functions resisting
Browse files Browse the repository at this point in the history
  • Loading branch information
som-snytt committed Jan 9, 2024
1 parent 3e03b9d commit 03576bc
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/compiler/scala/reflect/reify/phases/Reshape.scala
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ trait Reshape {
def toScalaAnnotation(jann: ClassfileAnnotArg): Tree = (jann: @unchecked) match {
case LiteralAnnotArg(const) => Literal(const)
case ArrayAnnotArg(arr) => Apply(Ident(definitions.ArrayModule), arr.toList map toScalaAnnotation)
case NestedAnnotArg(ann) => toPreTyperAnnotation(ann)
case NestedAnnotArg(naa) => toPreTyperAnnotation(naa)
}

ann.assocs map { case (nme, arg) => NamedArg(Ident(nme), toScalaAnnotation(arg)) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ trait MacroAnnotationNamers { self: Analyzer =>
sym
}
deriveSymbolFromSource(tree) {
case tree @ ClassDef(mods, name, _, _) =>
case cdef @ ClassDef(mods, name, _, _) =>
val existing = context.scope.lookup(name)
val isRedefinition = (
existing.isType
Expand All @@ -90,10 +90,10 @@ trait MacroAnnotationNamers { self: Analyzer =>
)
val clazz: Symbol = {
if (isRedefinition) {
updatePosFlags(existing, tree.pos, mods.flags)
setPrivateWithin(tree, existing)
updatePosFlags(existing, cdef.pos, mods.flags)
setPrivateWithin(cdef, existing)
clearRenamedCaseAccessors(existing)
tree.symbol = existing
cdef.symbol = existing
existing
}
else coreCreateAssignAndEnterSymbol setFlag inConstructorFlag
Expand All @@ -111,7 +111,7 @@ trait MacroAnnotationNamers { self: Analyzer =>
assert(clazz.name.toString.indexOf('(') < 0, clazz.name) // )
}
clazz
case tree @ ModuleDef(mods, name, _) =>
case mdef @ ModuleDef(mods, name, _) =>
var m: Symbol = context.scope lookupModule name
val moduleFlags = mods.flags | MODULE
// TODO: inCurrentScope(m) check that's present in vanilla Namer is omitted here
Expand All @@ -128,16 +128,16 @@ trait MacroAnnotationNamers { self: Analyzer =>
val packageScope = m.enclosingPackageClass.rawInfo.decls
packageScope.filter(_.owner != m.enclosingPackageClass).toList.foreach(packageScope unlink _)
}
updatePosFlags(m, tree.pos, moduleFlags)
setPrivateWithin(tree, m)
m.moduleClass andAlso (setPrivateWithin(tree, _))
updatePosFlags(m, mdef.pos, moduleFlags)
setPrivateWithin(mdef, m)
m.moduleClass andAlso (setPrivateWithin(mdef, _))
context.unit.synthetics -= m
tree.symbol = m
mdef.symbol = m
}
else {
m = coreCreateAssignAndEnterSymbol
m.moduleClass setFlag moduleClassFlags(moduleFlags)
setPrivateWithin(tree, m.moduleClass)
setPrivateWithin(mdef, m.moduleClass)
}
m.moduleClass setInfo namerOf(m).moduleClassTypeCompleter(tree)
if (m.isTopLevel && !m.hasPackageFlag) {
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/typechecker/Macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ trait Macros extends MacroRuntimes with Traces with Helpers {
else {
// approximation is necessary for whitebox macros to guide type inference
// read more in the comments for onDelayed below
val undetparams = tp collect { case tp if tp.typeSymbol.isTypeParameter => tp.typeSymbol }
val undetparams = tp collect { case tp1 if tp1.typeSymbol.isTypeParameter => tp1.typeSymbol }
deriveTypeWithWildcards(undetparams)(tp)
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/library/scala/collection/mutable/ArraySeq.scala
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ object ArraySeq extends StrictOptimizedClassTagSeqFactory[ArraySeq] { self =>
* `ArraySeq.make(a.asInstanceOf[Array[Int]])` does not work, it throws a `ClassCastException`
* at runtime.
*/
def make[T](x: Array[T]): ArraySeq[T] = ((x.asInstanceOf[Array[_]]: @unchecked) match {
def make[T](x: Array[T]): ArraySeq[T] = ((x: @unchecked) match {
case null => null
case x: Array[AnyRef] => new ofRef[AnyRef](x)
case x: Array[Int] => new ofInt(x)
Expand Down
3 changes: 1 addition & 2 deletions src/reflect/scala/reflect/internal/TreeGen.scala
Original file line number Diff line number Diff line change
Expand Up @@ -723,8 +723,7 @@ abstract class TreeGen {
val valeqs = rest.take(definitions.MaxTupleArity - 1).takeWhile { ValEq.unapply(_).nonEmpty }
assert(!valeqs.isEmpty, "Missing ValEq")
val rest1 = rest.drop(valeqs.length)
val pats = valeqs.collect { case ValEq(pat, _) => pat }
val rhss = valeqs.collect { case ValEq(_, rhs) => rhs }
val (pats, rhss) = valeqs.map(ValEq.unapply(_).get).unzip
val defpat1 = makeBind(pat)
val defpats = pats map makeBind
val pdefs = defpats.lazyZip(rhss).flatMap(mkPatDef)
Expand Down
5 changes: 4 additions & 1 deletion test/files/neg/t11850.check
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ t11850.scala:170: warning: Name _1 is already introduced in an enclosing scope a
t11850.scala:187: warning: Name x is already introduced in an enclosing scope as value x. Did you intend to match it using backquoted `x`?
case x => x.toString
^
t11850.scala:203: warning: Name c is already introduced in an enclosing scope as value c in class pattern matches occasionally appear in pattern-matching anonymous functions. Did you intend to match it using backquoted `c`?
def f = c.collect { case c if c.flag => c.toString }
^
error: No warnings can be incurred under -Werror.
7 warnings
8 warnings
1 error
8 changes: 8 additions & 0 deletions test/files/neg/t11850.scala
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,11 @@ class `lukas asked whats that null check for` {
case c => false
}
}
case class Collector() {
def collect[T](pf: PartialFunction[Collector, T]): List[T] = ???
def flag = true
}
class `pattern matches occasionally appear in pattern-matching anonymous functions` {
val c = Collector()
def f = c.collect { case c if c.flag => c.toString }
}

0 comments on commit 03576bc

Please sign in to comment.