From c1b0ab6f6ed36fed7cc4bfa710704ff197c12b31 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 15 Nov 2014 12:07:31 +0100 Subject: Fixes for type argument handling. (1) Type arguments now get a coordinate. (2) They are labeled Override (2) avoids having to special case TypeArgs in OverridingPairs. --- src/dotty/tools/dotc/core/SymDenotations.scala | 8 +++++++- src/dotty/tools/dotc/core/TypeOps.scala | 8 +++++--- src/dotty/tools/dotc/transform/OverridingPairs.scala | 5 +---- 3 files changed, 13 insertions(+), 8 deletions(-) (limited to 'src/dotty/tools') diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index dfb58f68b..9801cb629 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -805,7 +805,13 @@ object SymDenotations { * either as overrider or overridee. */ final def canMatchInheritedSymbols(implicit ctx: Context): Boolean = - maybeOwner.isClass && !isConstructor && !is(Private) + maybeOwner.isClass && memberCanMatchInheritedSymbols + + /** If false, this class member cannot possibly participate in an override, + * either as overrider or overridee. + */ + final def memberCanMatchInheritedSymbols(implicit ctx: Context): Boolean = + !isConstructor && !is(Private) /** The symbol, in class `inClass`, that is overridden by this denotation. */ final def overriddenSymbol(inClass: ClassSymbol)(implicit ctx: Context): Symbol = diff --git a/src/dotty/tools/dotc/core/TypeOps.scala b/src/dotty/tools/dotc/core/TypeOps.scala index efd7fcca3..7a853ae12 100644 --- a/src/dotty/tools/dotc/core/TypeOps.scala +++ b/src/dotty/tools/dotc/core/TypeOps.scala @@ -197,8 +197,6 @@ trait TypeOps { this: Context => } } - - private def enterArgBinding(formal: Symbol, info: Type, cls: ClassSymbol, decls: Scope) = { val lazyInfo = new LazyType { // needed so we do not force `formal`. def complete(denot: SymDenotation)(implicit ctx: Context): Unit = { @@ -207,7 +205,11 @@ trait TypeOps { this: Context => } } val typeArgFlag = if (formal is Local) TypeArgument else EmptyFlags - val sym = ctx.newSymbol(cls, formal.name, formal.flagsUNSAFE & RetainedTypeArgFlags | typeArgFlag, lazyInfo) + val sym = ctx.newSymbol( + cls, formal.name, + formal.flagsUNSAFE & RetainedTypeArgFlags | typeArgFlag | Override, + lazyInfo, + coord = cls.coord) cls.enter(sym, decls) } diff --git a/src/dotty/tools/dotc/transform/OverridingPairs.scala b/src/dotty/tools/dotc/transform/OverridingPairs.scala index f076fbc94..813082f2e 100644 --- a/src/dotty/tools/dotc/transform/OverridingPairs.scala +++ b/src/dotty/tools/dotc/transform/OverridingPairs.scala @@ -30,10 +30,7 @@ object OverridingPairs { /** Symbols to exclude: Here these are constructors and private locals. * But it may be refined in subclasses. */ - protected def exclude(sym: Symbol): Boolean = - sym.isConstructor || - sym.is(Private) || - sym.is(ExcludedType) + protected def exclude(sym: Symbol): Boolean = !sym.memberCanMatchInheritedSymbols /** The parents of base (may also be refined). */ -- cgit v1.2.3