diff options
author | Martin Odersky <odersky@gmail.com> | 2016-04-07 17:58:52 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-04-07 17:59:27 +0200 |
commit | 03e8c54c0165d129b12bdde29b2482dd1758e418 (patch) | |
tree | ddca733ac77e4c19a4465788c54302bdccb9e7e9 /src/dotty/tools/dotc/core/Contexts.scala | |
parent | 306d422f1e3017731d1f9266f9d445e77ea73105 (diff) | |
download | dotty-03e8c54c0165d129b12bdde29b2482dd1758e418.tar.gz dotty-03e8c54c0165d129b12bdde29b2482dd1758e418.tar.bz2 dotty-03e8c54c0165d129b12bdde29b2482dd1758e418.zip |
Treat type parameters of secondary constructors as aliases
... of class parameters using the gadt mechanism. Previously they were encoded as aliases
by hardcoding alias bounds in the type parameter declaration, but that then leads to
weird behavior and failures in unpickling.
To make this work, we also need to propagate gadt bounds into the this-call context.
Test case in pickling/i1202a.scala.
Diffstat (limited to 'src/dotty/tools/dotc/core/Contexts.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Contexts.scala | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/core/Contexts.scala b/src/dotty/tools/dotc/core/Contexts.scala index a0bb03e50..53a4bfe08 100644 --- a/src/dotty/tools/dotc/core/Contexts.scala +++ b/src/dotty/tools/dotc/core/Contexts.scala @@ -336,13 +336,17 @@ object Contexts { def thisCallArgContext: Context = { assert(owner.isClassConstructor) val constrCtx = outersIterator.dropWhile(_.outer.owner == owner).next - superOrThisCallContext(owner, constrCtx.scope).setTyperState(typerState) + superOrThisCallContext(owner, constrCtx.scope) + .setTyperState(typerState) + .setGadt(gadt) } - /** The super= or this-call context with given owner and locals. */ + /** The super- or this-call context with given owner and locals. */ private def superOrThisCallContext(owner: Symbol, locals: Scope): FreshContext = { var classCtx = outersIterator.dropWhile(!_.isClassDefContext).next - classCtx.outer.fresh.setOwner(owner).setScope(locals).setMode(classCtx.mode | Mode.InSuperCall) + classCtx.outer.fresh.setOwner(owner) + .setScope(locals) + .setMode(classCtx.mode | Mode.InSuperCall) } /** The context of expression `expr` seen as a member of a statement sequence */ @@ -438,6 +442,7 @@ object Contexts { def setImportInfo(importInfo: ImportInfo): this.type = { this.importInfo = importInfo; this } def setRunInfo(runInfo: RunInfo): this.type = { this.runInfo = runInfo; this } def setDiagnostics(diagnostics: Option[StringBuilder]): this.type = { this.diagnostics = diagnostics; this } + def setGadt(gadt: GADTMap): this.type = { this.gadt = gadt; this } def setTypeComparerFn(tcfn: Context => TypeComparer): this.type = { this.typeComparer = tcfn(this); this } def setSearchHistory(searchHistory: SearchHistory): this.type = { this.searchHistory = searchHistory; this } def setFreshNames(freshNames: FreshNameCreator): this.type = { this.freshNames = freshNames; this } |