Skip to content

Self alias in object nested in class breaks pickler #11648

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
prolativ opened this issue Mar 8, 2021 · 3 comments
Closed

Self alias in object nested in class breaks pickler #11648

prolativ opened this issue Mar 8, 2021 · 3 comments

Comments

@prolativ
Copy link
Contributor

prolativ commented Mar 8, 2021

Compiler version

3.0.0-RC1

Minimized code

class A {
  object B { b =>

  }
}

compiled with -Xprint-types -Ytest-pickler

Output (click arrow to expand)

Exception in thread "main" scala.MatchError: ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <root>)),module class <empty>)),class A)),module class B$)) (of class dotty.tools.dotc.core.Types$CachedThisType)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.sourceOfSelf$1(SymDenotations.scala:1019)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.sourceModule(SymDenotations.scala:1021)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextRef$$anonfun$1(RefinedPrinter.scala:99)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextRef(RefinedPrinter.scala:104)
	at dotty.tools.dotc.printing.PlainPrinter.toTextSingleton(PlainPrinter.scala:251)
	at dotty.tools.dotc.printing.PlainPrinter.toText$$anonfun$1(PlainPrinter.scala:161)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.PlainPrinter.toText(PlainPrinter.scala:248)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$1(RefinedPrinter.scala:266)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:268)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$2(RefinedPrinter.scala:720)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:745)
	at dotty.tools.dotc.ast.Trees$Tree.toText(Trees.scala:197)
	at dotty.tools.dotc.printing.Printer.toTextLocal$$anonfun$1(Printer.scala:155)
	at dotty.tools.dotc.printing.Printer.atPrec(Printer.scala:42)
	at dotty.tools.dotc.printing.Printer.toTextLocal(Printer.scala:155)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextCore(RefinedPrinter.scala:494)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$2(RefinedPrinter.scala:674)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:745)
	at dotty.tools.dotc.printing.RefinedPrinter.optText(RefinedPrinter.scala:941)
	at dotty.tools.dotc.printing.RefinedPrinter.$anonfun$8(RefinedPrinter.scala:867)
	at dotty.tools.dotc.printing.Texts$Text$.provided(Texts.scala:172)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextTemplate(RefinedPrinter.scala:868)
	at dotty.tools.dotc.printing.RefinedPrinter.templateText$$anonfun$1(RefinedPrinter.scala:892)
	at dotty.tools.dotc.printing.RefinedPrinter.withEnclosingDef(RefinedPrinter.scala:47)
	at dotty.tools.dotc.printing.RefinedPrinter.templateText(RefinedPrinter.scala:892)
	at dotty.tools.dotc.printing.RefinedPrinter.recur$1(RefinedPrinter.scala:551)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextCore(RefinedPrinter.scala:561)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$2(RefinedPrinter.scala:674)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:745)
	at dotty.tools.dotc.ast.Trees$Tree.toText(Trees.scala:197)
	at dotty.tools.dotc.printing.Printer.toText$$anonfun$1(Printer.scala:163)
	at scala.collection.immutable.List.map(List.scala:250)
	at scala.collection.immutable.List.map(List.scala:79)
	at dotty.tools.dotc.printing.Printer.toText(Printer.scala:163)
	at dotty.tools.dotc.printing.Printer.toTextGlobal$$anonfun$2(Printer.scala:171)
	at dotty.tools.dotc.printing.Printer.atPrec(Printer.scala:42)
	at dotty.tools.dotc.printing.Printer.toTextGlobal(Printer.scala:171)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextTemplate(RefinedPrinter.scala:881)
	at dotty.tools.dotc.printing.RefinedPrinter.templateText$$anonfun$1(RefinedPrinter.scala:892)
	at dotty.tools.dotc.printing.RefinedPrinter.withEnclosingDef(RefinedPrinter.scala:47)
	at dotty.tools.dotc.printing.RefinedPrinter.templateText(RefinedPrinter.scala:892)
	at dotty.tools.dotc.printing.RefinedPrinter.recur$1(RefinedPrinter.scala:551)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextCore(RefinedPrinter.scala:561)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$2(RefinedPrinter.scala:674)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:745)
	at dotty.tools.dotc.ast.Trees$Tree.toText(Trees.scala:197)
	at dotty.tools.dotc.printing.Printer.toText$$anonfun$1(Printer.scala:163)
	at scala.collection.immutable.List.map(List.scala:246)
	at scala.collection.immutable.List.map(List.scala:79)
	at dotty.tools.dotc.printing.Printer.toText(Printer.scala:163)
	at dotty.tools.dotc.printing.Printer.toTextGlobal$$anonfun$2(Printer.scala:171)
	at dotty.tools.dotc.printing.Printer.atPrec(Printer.scala:42)
	at dotty.tools.dotc.printing.Printer.toTextGlobal(Printer.scala:171)
	at dotty.tools.dotc.printing.RefinedPrinter.packageDefText(RefinedPrinter.scala:904)
	at dotty.tools.dotc.printing.RefinedPrinter.toTextCore(RefinedPrinter.scala:570)
	at dotty.tools.dotc.printing.RefinedPrinter.toText$$anonfun$2(RefinedPrinter.scala:674)
	at dotty.tools.dotc.printing.MessageLimiter.controlled(MessageLimiter.scala:23)
	at dotty.tools.dotc.printing.PlainPrinter.controlled(PlainPrinter.scala:36)
	at dotty.tools.dotc.printing.RefinedPrinter.toText(RefinedPrinter.scala:745)
	at dotty.tools.dotc.ast.Trees$Tree.toText(Trees.scala:197)
	at dotty.tools.dotc.printing.Showable.show(Showable.scala:23)
	at dotty.tools.dotc.printing.Showable.show$(Showable.scala:9)
	at dotty.tools.dotc.ast.Trees$Tree.show(Trees.scala:56)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.showArg(Formatting.scala:28)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.treatArg$$anonfun$1(Formatting.scala:46)
	at scala.collection.immutable.List.map(List.scala:246)
	at scala.collection.immutable.List.map(List.scala:79)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.treatArg(Formatting.scala:46)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.$anonfun$2(Formatting.scala:62)
	at scala.collection.LazyZip2$$anon$1$$anon$2.next(LazyZipOps.scala:42)
	at scala.collection.mutable.Growable.addAll(Growable.scala:65)
	at scala.collection.mutable.Growable.addAll$(Growable.scala:60)
	at scala.collection.mutable.ArrayBuilder.addAll(ArrayBuilder.scala:66)
	at scala.collection.IterableOnceOps.toArray(IterableOnce.scala:1282)
	at scala.collection.IterableOnceOps.toArray$(IterableOnce.scala:1276)
	at scala.collection.AbstractIterable.toArray(Iterable.scala:919)
	at scala.Array$.from(Array.scala:72)
	at scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:274)
	at scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:265)
	at scala.collection.ClassTagIterableFactory$AnyIterableDelegate.from(Factory.scala:671)
	at scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:112)
	at scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:109)
	at scala.collection.LazyZip2.map(LazyZipOps.scala:37)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.assemble(Formatting.scala:62)
	at dotty.tools.dotc.core.Decorators$.i(Decorators.scala:263)
	at dotty.tools.dotc.transform.Pickler.testUnpickler$$anonfun$2(Pickler.scala:135)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
	at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:919)
	at scala.collection.IterableOps$WithFilter.foreach(Iterable.scala:889)
	at dotty.tools.dotc.transform.Pickler.testUnpickler(Pickler.scala:136)
	at dotty.tools.dotc.transform.Pickler.runOn(Pickler.scala:119)
	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:205)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at dotty.tools.dotc.Run.runPhases$5(Run.scala:215)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:223)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:230)
	at dotty.tools.dotc.Run.compileSources(Run.scala:166)
	at dotty.tools.dotc.Run.compile(Run.scala:150)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
	at dotty.tools.dotc.Driver.process(Driver.scala:186)
	at dotty.tools.dotc.Driver.process(Driver.scala:155)
	at dotty.tools.dotc.Driver.process(Driver.scala:167)
	at dotty.tools.dotc.Driver.main(Driver.scala:194)
	at dotty.tools.dotc.Main.main(Main.scala)

There are no errors when there's no self alias

class A {
  object B {

  }
}

or if the inner object is nested in another object instead of a class

object A {
  object B { b =>

  }
}
@odersky
Copy link
Contributor

odersky commented Mar 8, 2021

I think we should disallow self aliases for objects altogether.

  • We can't give them a type, this is already disallowed.
  • We don't need an alias, since we already have the object's name.

odersky added a commit to dotty-staging/dotty that referenced this issue Mar 8, 2021
odersky added a commit to dotty-staging/dotty that referenced this issue Mar 8, 2021
@odersky
Copy link
Contributor

odersky commented Mar 8, 2021

It seems this breaks too many tests.

@KacperFKorban
Copy link
Member

This seems to be fixed now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants