From 2f0d3dc47fe1e563314289a0f80c7dccb32a1e9a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 12 Mar 2014 16:27:03 +0100 Subject: [PATCH 1/3] Fix of #56 - newModuleSymbol Needs new TypeRef creation method that works for NoPrefix and at the same time does not need a denotation. This is provided by method TermRef.withNakedSymbol. --- src/dotty/tools/dotc/core/Symbols.scala | 2 +- src/dotty/tools/dotc/core/Types.scala | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/dotty/tools/dotc/core/Symbols.scala b/src/dotty/tools/dotc/core/Symbols.scala index ea96b3023118..6996e95a5a32 100644 --- a/src/dotty/tools/dotc/core/Symbols.scala +++ b/src/dotty/tools/dotc/core/Symbols.scala @@ -132,7 +132,7 @@ trait Symbols { this: Context => infoFn(module, modcls), privateWithin) val mdenot = SymDenotation( module, owner, name, modFlags | ModuleCreationFlags, - if (cdenot.isCompleted) TypeRef(owner.thisType, modclsName) withSym modcls + if (cdenot.isCompleted) TypeRef.withSymAndName(owner.thisType, modcls, modclsName) else new ModuleCompleter(modcls)) module.denot = mdenot modcls.denot = cdenot diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index bb30d9a9c7a6..090f7d83bacd 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -1210,8 +1210,10 @@ object Types { def apply(prefix: Type, name: TermName)(implicit ctx: Context): TermRef = ctx.uniqueNamedTypes.enterIfNew(prefix, name).asInstanceOf[TermRef] def apply(prefix: Type, sym: TermSymbol)(implicit ctx: Context): TermRef = - if (prefix eq NoPrefix) unique(new NoPrefixTermRef(sym.name, sym)) - else apply(prefix, sym.name) withSym sym + withSymAndName(prefix, sym, sym.name) + def withSymAndName(prefix: Type, sym: TermSymbol, name: TermName)(implicit ctx: Context): TermRef = + if (prefix eq NoPrefix) unique(new NoPrefixTermRef(name, sym)) + else apply(prefix, name) withSym sym def apply(prefix: Type, name: TermName, denot: Denotation)(implicit ctx: Context): TermRef = (if (prefix eq NoPrefix) apply(prefix, denot.symbol.asTerm) else apply(prefix, name)) withDenot denot def withSig(prefix: Type, name: TermName, sig: Signature)(implicit ctx: Context): TermRef = @@ -1225,8 +1227,10 @@ object Types { def apply(prefix: Type, name: TypeName)(implicit ctx: Context): TypeRef = ctx.uniqueNamedTypes.enterIfNew(prefix, name).asInstanceOf[TypeRef] def apply(prefix: Type, sym: TypeSymbol)(implicit ctx: Context): TypeRef = - if (prefix eq NoPrefix) unique(new NoPrefixTypeRef(sym.name, sym)) - else apply(prefix, sym.name) withSym sym + withSymAndName(prefix, sym, sym.name) + def withSymAndName(prefix: Type, sym: TypeSymbol, name: TypeName)(implicit ctx: Context): TypeRef = + if (prefix eq NoPrefix) unique(new NoPrefixTypeRef(name, sym)) + else apply(prefix, name) withSym sym def apply(prefix: Type, name: TypeName, denot: Denotation)(implicit ctx: Context): TypeRef = (if (prefix eq NoPrefix) apply(prefix, denot.symbol.asType) else apply(prefix, name)) withDenot denot } From 3908cf0cbf523ebc649798c83916e6035f3221de Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 12 Mar 2014 15:43:35 +0100 Subject: [PATCH 2/3] Fix for #55 Distringuish between ModifierFlags -- which can appear in trees -- and SourceModifierFlags -- which are modifiers according to the language spec. --- src/dotty/tools/dotc/core/Flags.scala | 6 +++++- src/dotty/tools/dotc/printing/RefinedPrinter.scala | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dotty/tools/dotc/core/Flags.scala b/src/dotty/tools/dotc/core/Flags.scala index 0678b79beb06..2c70fd5bf15f 100644 --- a/src/dotty/tools/dotc/core/Flags.scala +++ b/src/dotty/tools/dotc/core/Flags.scala @@ -395,10 +395,14 @@ object Flags { // --------- Combined Flag Sets and Conjunctions ---------------------- /** Flags representing source modifiers */ - final val ModifierFlags = + final val SourceModifierFlags = commonFlags(Private, Protected, Abstract, Final, Sealed, Case, Implicit, Override, AbsOverride, Lazy) + /** Flags representing modifiers that can appear in trees */ + final val ModifierFlags = + SourceModifierFlags | Trait | Module | Param | Synthetic | Package + /** Flags representing access rights */ final val AccessFlags = Private | Protected | Local diff --git a/src/dotty/tools/dotc/printing/RefinedPrinter.scala b/src/dotty/tools/dotc/printing/RefinedPrinter.scala index 5231ccd930b6..0d84a9e61628 100644 --- a/src/dotty/tools/dotc/printing/RefinedPrinter.scala +++ b/src/dotty/tools/dotc/printing/RefinedPrinter.scala @@ -15,7 +15,7 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) { override protected def recursionLimitExceeded() = {} - protected val PrintableFlags = (ModifierFlags | Label | Module).toCommonFlags + protected val PrintableFlags = (SourceModifierFlags | Label | Module).toCommonFlags /** The closest enclosing DefDef, TypeDef, or ClassDef node */ private var currentOwner: untpd.Tree = untpd.EmptyTree From e48ff7e408ebf3be64088f246e93a2ce3624e130 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 12 Mar 2014 18:17:13 +0100 Subject: [PATCH 3/3] Fix for #56 - newCompleteModuleSymbol Need a fix analogous to what was done in newModuleSymbol to determine the source module of a module class. --- src/dotty/tools/dotc/core/Symbols.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dotty/tools/dotc/core/Symbols.scala b/src/dotty/tools/dotc/core/Symbols.scala index 6996e95a5a32..aa0cbb5a937c 100644 --- a/src/dotty/tools/dotc/core/Symbols.scala +++ b/src/dotty/tools/dotc/core/Symbols.scala @@ -157,7 +157,7 @@ trait Symbols { this: Context => newModuleSymbol( owner, name, modFlags, clsFlags, (module, modcls) => ClassInfo( - owner.thisType, modcls, parents, decls, TermRef(owner.thisType, name) withSym module), + owner.thisType, modcls, parents, decls, TermRef.withSymAndName(owner.thisType, module, name)), privateWithin, coord, assocFile) /** Create a package symbol with associated package class