Skip to content

Commit 136120e

Browse files
Merge branch 'master' into unblock-olaf
2 parents 96c7d28 + 7381e9d commit 136120e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+556
-215
lines changed

.drone.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# After updating this file, you need to re-sign it:
22
#
33
# - Install [drone-cli](http://readme.drone.io/usage/getting-started-cli/)
4-
# - Copy your token from http://dotty-ci.epfl.ch/account (Click SHOW TOKEN)
5-
# - (export DRONE_TOKEN=your-token; export DRONE_SERVER=http://dotty-ci.epfl.ch; drone sign lampepfl/dotty)
4+
# - Copy your token from http://dotty-ci.epfl.ch/account (Click SHOW TOKEN)
5+
# - DRONE_TOKEN=your-token DRONE_SERVER=http://dotty-ci.epfl.ch drone sign lampepfl/dotty
66
#
77
# Please note that the signing can only be done by collaborators.
88

@@ -76,3 +76,5 @@ matrix:
7676
CI_PUBLISH: false
7777
- CI_TEST: dotty-bootstrapped/test
7878
CI_PUBLISH: false
79+
- CI_TEST: ;set bootstrapOptimised in ThisBuild := true ;dotty-bootstrapped/test
80+
CI_PUBLISH: false

.drone.yml.sig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
eyJhbGciOiJIUzI1NiJ9.IyBBZnRlciB1cGRhdGluZyB0aGlzIGZpbGUsIHlvdSBuZWVkIHRvIHJlLXNpZ24gaXQ6CiMKIyAtIEluc3RhbGwgW2Ryb25lLWNsaV0oaHR0cDovL3JlYWRtZS5kcm9uZS5pby91c2FnZS9nZXR0aW5nLXN0YXJ0ZWQtY2xpLykKIyAtIENvcHkgeW91ciB0b2tlbiBmcm9tICBodHRwOi8vZG90dHktY2kuZXBmbC5jaC9hY2NvdW50IChDbGljayBTSE9XIFRPS0VOKQojIC0gKGV4cG9ydCBEUk9ORV9UT0tFTj15b3VyLXRva2VuOyBleHBvcnQgRFJPTkVfU0VSVkVSPWh0dHA6Ly9kb3R0eS1jaS5lcGZsLmNoOyBkcm9uZSBzaWduIGxhbXBlcGZsL2RvdHR5KQojCiMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgc2lnbmluZyBjYW4gb25seSBiZSBkb25lIGJ5IGNvbGxhYm9yYXRvcnMuCgpwaXBlbGluZToKICB0ZXN0OgogICAgaW1hZ2U6IGxhbXBlcGZsL2RvdHR5OjA3LTA2LTIwMTcKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIC4vcHJvamVjdC9zY3JpcHRzL3NidCAiJHtDSV9URVNUfSIKICAgIHdoZW46CiAgICAgIGJyYW5jaDoKICAgICAgICBleGNsdWRlOiBnaC1wYWdlcwoKICBwdWJsaXNoX25pZ2h0bHk6CiAgICBpbWFnZTogbGFtcGVwZmwvZG90dHk6MDctMDYtMjAxNwogICAgcHVsbDogdHJ1ZQogICAgY29tbWFuZHM6CiAgICAgIC0gLi9wcm9qZWN0L3NjcmlwdHMvc2J0ICI7Y2xlYW4gO3B1Ymxpc2hMb2NhbCIgIiR7Q0lfUFVCTElTSH0iCiAgICAgIC0gLi9wcm9qZWN0L3NjcmlwdHMvc2J0ICJzYnQtZG90dHkvc2NyaXB0ZWQgc291cmNlLWRlcGVuZGVuY2llcy8qIiAiJHtDSV9QVUJMSVNIfSIKICAgICAgLSBOSUdIVExZQlVJTEQ9InllcyIgLi9wcm9qZWN0L3NjcmlwdHMvc2J0UHVibGlzaCAke0NJX1BVQkxJU0h9ICRTT05BVFlQRV9VU0VSICRTT05BVFlQRV9QVyAkUEdQX1BXICI7ZG90dHktYm9vdHN0cmFwcGVkL3B1Ymxpc2hTaWduZWQgO3NvbmF0eXBlUmVsZWFzZSIKICAgIHZvbHVtZXM6CiAgICAgIC0gL2hvbWUvZHJvbmUva2V5czova2V5cwogICAgd2hlbjoKICAgICAgZXZlbnQ6IGRlcGxveW1lbnQKICAgICAgZW52aXJvbm1lbnQ6IG5pZ2h0bHkKCiAgcHVibGlzaF9yZWxlYXNlOgogICAgaW1hZ2U6IGxhbXBlcGZsL2RvdHR5OjA3LTA2LTIwMTcKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIFJFTEVBU0VCVUlMRD0ieWVzIiAuL3Byb2plY3Qvc2NyaXB0cy9zYnRQdWJsaXNoICR7Q0lfUFVCTElTSH0gJFNPTkFUWVBFX1VTRVIgJFNPTkFUWVBFX1BXICRQR1BfUFcgIjtkb3R0eS1ib290c3RyYXBwZWQvcHVibGlzaFNpZ25lZCA7c29uYXR5cGVSZWxlYXNlIgogICAgdm9sdW1lczoKICAgICAgLSAvaG9tZS9kcm9uZS9rZXlzOi9rZXlzCiAgICB3aGVuOgogICAgICBldmVudDogZGVwbG95bWVudAogICAgICBlbnZpcm9ubWVudDogcmVsZWFzZQoKICBwdWJsaXNoX3NidF9yZWxlYXNlOgogICAgaW1hZ2U6IGxhbXBlcGZsL2RvdHR5OjA3LTA2LTIwMTcKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIFJFTEVBU0VCVUlMRD0ieWVzIiAuL3Byb2plY3Qvc2NyaXB0cy9zYnRQdWJsaXNoICR7Q0lfUFVCTElTSH0gJFNPTkFUWVBFX1VTRVIgJFNPTkFUWVBFX1BXICRQR1BfUFcgIjtzYnQtZG90dHkvcHVibGlzaFNpZ25lZCA7c29uYXR5cGVSZWxlYXNlIgogICAgdm9sdW1lczoKICAgICAgLSAvaG9tZS9kcm9uZS9rZXlzOi9rZXlzCiAgICB3aGVuOgogICAgICBldmVudDogZGVwbG95bWVudAogICAgICBlbnZpcm9ubWVudDogc2J0X3JlbGVhc2UKCiAgZG9jdW1lbnRhdGlvbjoKICAgIGltYWdlOiBsYW1wZXBmbC9kb3R0eTowNy0wNi0yMDE3CiAgICBwdWxsOiB0cnVlCiAgICBjb21tYW5kczoKICAgICAgLSAuL3Byb2plY3Qvc2NyaXB0cy9nZW5Eb2NzICIke0NJX1BVQkxJU0h9IiAkQk9UX1BBU1MKICAgIHdoZW46CiAgICAgIGJyYW5jaDogbWFzdGVyCgogIHNsYWNrOgogICAgaW1hZ2U6IHBsdWdpbnMvc2xhY2sKICAgIGNoYW5uZWw6IGRvdHR5CiAgICB3aGVuOgogICAgICBicmFuY2g6IG1hc3RlcgogICAgICBzdGF0dXM6IGNoYW5nZWQKCm1hdHJpeDoKICBpbmNsdWRlOgogICAgLSBDSV9URVNUOiBkb3R0eS1iaW4tdGVzdHMvdGVzdAogICAgICBDSV9QVUJMSVNIOiB0cnVlCiAgICAtIENJX1RFU1Q6IGxlZ2FjeVRlc3RzCiAgICAgIENJX1BVQkxJU0g6IGZhbHNlCiAgICAtIENJX1RFU1Q6IDt0ZXN0O3NidC1kb3R0eS9zY3JpcHRlZCBjb21waWxlclJlcG9ydGVyLyo7c2J0LWRvdHR5L3NjcmlwdGVkIGRpc2NvdmVyeS8qO3NidC1kb3R0eS9zY3JpcHRlZCBzYnQtZG90dHkvKgogICAgICBDSV9QVUJMSVNIOiBmYWxzZQogICAgLSBDSV9URVNUOiBkb3R0eS1ib290c3RyYXBwZWQvdGVzdAogICAgICBDSV9QVUJMSVNIOiBmYWxzZQo.REtW8iikLellOXP5ex7tY4WJFc4aIFHXTFsbPi0qkiA
1+
eyJhbGciOiJIUzI1NiJ9.IyBBZnRlciB1cGRhdGluZyB0aGlzIGZpbGUsIHlvdSBuZWVkIHRvIHJlLXNpZ24gaXQ6CiMKIyAtIEluc3RhbGwgW2Ryb25lLWNsaV0oaHR0cDovL3JlYWRtZS5kcm9uZS5pby91c2FnZS9nZXR0aW5nLXN0YXJ0ZWQtY2xpLykKIyAtIENvcHkgeW91ciB0b2tlbiBmcm9tIGh0dHA6Ly9kb3R0eS1jaS5lcGZsLmNoL2FjY291bnQgKENsaWNrIFNIT1cgVE9LRU4pCiMgLSBEUk9ORV9UT0tFTj15b3VyLXRva2VuIERST05FX1NFUlZFUj1odHRwOi8vZG90dHktY2kuZXBmbC5jaCBkcm9uZSBzaWduIGxhbXBlcGZsL2RvdHR5CiMKIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBzaWduaW5nIGNhbiBvbmx5IGJlIGRvbmUgYnkgY29sbGFib3JhdG9ycy4KCnBpcGVsaW5lOgogIHRlc3Q6CiAgICBpbWFnZTogbGFtcGVwZmwvZG90dHk6MDctMDYtMjAxNwogICAgcHVsbDogdHJ1ZQogICAgY29tbWFuZHM6CiAgICAgIC0gLi9wcm9qZWN0L3NjcmlwdHMvc2J0ICIke0NJX1RFU1R9IgogICAgd2hlbjoKICAgICAgYnJhbmNoOgogICAgICAgIGV4Y2x1ZGU6IGdoLXBhZ2VzCgogIHB1Ymxpc2hfbmlnaHRseToKICAgIGltYWdlOiBsYW1wZXBmbC9kb3R0eTowNy0wNi0yMDE3CiAgICBwdWxsOiB0cnVlCiAgICBjb21tYW5kczoKICAgICAgLSAuL3Byb2plY3Qvc2NyaXB0cy9zYnQgIjtjbGVhbiA7cHVibGlzaExvY2FsIiAiJHtDSV9QVUJMSVNIfSIKICAgICAgLSAuL3Byb2plY3Qvc2NyaXB0cy9zYnQgInNidC1kb3R0eS9zY3JpcHRlZCBzb3VyY2UtZGVwZW5kZW5jaWVzLyoiICIke0NJX1BVQkxJU0h9IgogICAgICAtIE5JR0hUTFlCVUlMRD0ieWVzIiAuL3Byb2plY3Qvc2NyaXB0cy9zYnRQdWJsaXNoICR7Q0lfUFVCTElTSH0gJFNPTkFUWVBFX1VTRVIgJFNPTkFUWVBFX1BXICRQR1BfUFcgIjtkb3R0eS1ib290c3RyYXBwZWQvcHVibGlzaFNpZ25lZCA7c29uYXR5cGVSZWxlYXNlIgogICAgdm9sdW1lczoKICAgICAgLSAvaG9tZS9kcm9uZS9rZXlzOi9rZXlzCiAgICB3aGVuOgogICAgICBldmVudDogZGVwbG95bWVudAogICAgICBlbnZpcm9ubWVudDogbmlnaHRseQoKICBwdWJsaXNoX3JlbGVhc2U6CiAgICBpbWFnZTogbGFtcGVwZmwvZG90dHk6MDctMDYtMjAxNwogICAgcHVsbDogdHJ1ZQogICAgY29tbWFuZHM6CiAgICAgIC0gUkVMRUFTRUJVSUxEPSJ5ZXMiIC4vcHJvamVjdC9zY3JpcHRzL3NidFB1Ymxpc2ggJHtDSV9QVUJMSVNIfSAkU09OQVRZUEVfVVNFUiAkU09OQVRZUEVfUFcgJFBHUF9QVyAiO2RvdHR5LWJvb3RzdHJhcHBlZC9wdWJsaXNoU2lnbmVkIDtzb25hdHlwZVJlbGVhc2UiCiAgICB2b2x1bWVzOgogICAgICAtIC9ob21lL2Ryb25lL2tleXM6L2tleXMKICAgIHdoZW46CiAgICAgIGV2ZW50OiBkZXBsb3ltZW50CiAgICAgIGVudmlyb25tZW50OiByZWxlYXNlCgogIHB1Ymxpc2hfc2J0X3JlbGVhc2U6CiAgICBpbWFnZTogbGFtcGVwZmwvZG90dHk6MDctMDYtMjAxNwogICAgcHVsbDogdHJ1ZQogICAgY29tbWFuZHM6CiAgICAgIC0gUkVMRUFTRUJVSUxEPSJ5ZXMiIC4vcHJvamVjdC9zY3JpcHRzL3NidFB1Ymxpc2ggJHtDSV9QVUJMSVNIfSAkU09OQVRZUEVfVVNFUiAkU09OQVRZUEVfUFcgJFBHUF9QVyAiO3NidC1kb3R0eS9wdWJsaXNoU2lnbmVkIDtzb25hdHlwZVJlbGVhc2UiCiAgICB2b2x1bWVzOgogICAgICAtIC9ob21lL2Ryb25lL2tleXM6L2tleXMKICAgIHdoZW46CiAgICAgIGV2ZW50OiBkZXBsb3ltZW50CiAgICAgIGVudmlyb25tZW50OiBzYnRfcmVsZWFzZQoKICBkb2N1bWVudGF0aW9uOgogICAgaW1hZ2U6IGxhbXBlcGZsL2RvdHR5OjA3LTA2LTIwMTcKICAgIHB1bGw6IHRydWUKICAgIGNvbW1hbmRzOgogICAgICAtIC4vcHJvamVjdC9zY3JpcHRzL2dlbkRvY3MgIiR7Q0lfUFVCTElTSH0iICRCT1RfUEFTUwogICAgd2hlbjoKICAgICAgYnJhbmNoOiBtYXN0ZXIKCiAgc2xhY2s6CiAgICBpbWFnZTogcGx1Z2lucy9zbGFjawogICAgY2hhbm5lbDogZG90dHkKICAgIHdoZW46CiAgICAgIGJyYW5jaDogbWFzdGVyCiAgICAgIHN0YXR1czogY2hhbmdlZAoKbWF0cml4OgogIGluY2x1ZGU6CiAgICAtIENJX1RFU1Q6IGRvdHR5LWJpbi10ZXN0cy90ZXN0CiAgICAgIENJX1BVQkxJU0g6IHRydWUKICAgIC0gQ0lfVEVTVDogbGVnYWN5VGVzdHMKICAgICAgQ0lfUFVCTElTSDogZmFsc2UKICAgIC0gQ0lfVEVTVDogO3Rlc3Q7c2J0LWRvdHR5L3NjcmlwdGVkIGNvbXBpbGVyUmVwb3J0ZXIvKjtzYnQtZG90dHkvc2NyaXB0ZWQgZGlzY292ZXJ5Lyo7c2J0LWRvdHR5L3NjcmlwdGVkIHNidC1kb3R0eS8qCiAgICAgIENJX1BVQkxJU0g6IGZhbHNlCiAgICAtIENJX1RFU1Q6IGRvdHR5LWJvb3RzdHJhcHBlZC90ZXN0CiAgICAgIENJX1BVQkxJU0g6IGZhbHNlCiAgICAtIENJX1RFU1Q6IDtzZXQgYm9vdHN0cmFwT3B0aW1pc2VkIGluIFRoaXNCdWlsZCA6PSB0cnVlIDtkb3R0eS1ib290c3RyYXBwZWQvdGVzdAogICAgICBDSV9QVUJMSVNIOiBmYWxzZQo.0COKo7FjFKxUxTYAwxWvpOHgRClgdi9A4M4Kb91h6HQ

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ Try it out
1414
==========
1515
To try it in your project see also the [Getting Started User Guide](http://dotty.epfl.ch/#getting-started).
1616

17+
Code of Conduct
18+
===============
19+
Dotty uses the [Scala Code of Conduct](https://www.scala-lang.org/conduct.html)
20+
for all communication and discussion. This includes both GitHub, Gitter chat and
21+
other more direct lines of communication such as email.
22+
1723
How to Contribute
1824
=================
1925
* [Getting Started as Contributor](http://dotty.epfl.ch/docs/contributing/getting-started.html)

compiler/src/dotty/tools/dotc/ast/TreeInfo.scala

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
1414
// Note: the <: Type constraint looks necessary (and is needed to make the file compile in dotc).
1515
// But Scalac accepts the program happily without it. Need to find out why.
1616

17-
def unsplice[T >: Untyped](tree: Trees.Tree[T]): Trees.Tree[T] = tree.asInstanceOf[untpd.Tree] match {
18-
case untpd.TypedSplice(tree1) => tree1.asInstanceOf[Trees.Tree[T]]
19-
case _ => tree
20-
}
17+
def unsplice(tree: Trees.Tree[T]): Trees.Tree[T] = tree
2118

2219
def isDeclarationOrTypeDef(tree: Tree): Boolean = unsplice(tree) match {
2320
case DefDef(_, _, _, _, EmptyTree)
@@ -116,7 +113,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
116113
case _ => false
117114
}
118115

119-
def isSuperSelection(tree: untpd.Tree) = unsplice(tree) match {
116+
def isSuperSelection(tree: Tree) = unsplice(tree) match {
120117
case Select(Super(_, _), _) => true
121118
case _ => false
122119
}
@@ -129,7 +126,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
129126
}
130127

131128
/** Is tree a variable pattern? */
132-
def isVarPattern(pat: untpd.Tree): Boolean = unsplice(pat) match {
129+
def isVarPattern(pat: Tree): Boolean = unsplice(pat) match {
133130
case x: BackquotedIdent => false
134131
case x: Ident => x.name.isVariableName
135132
case _ => false
@@ -160,7 +157,7 @@ trait TreeInfo[T >: Untyped <: Type] { self: Trees.Instance[T] =>
160157
def isLeftAssoc(operator: Name) = !operator.isEmpty && (operator.toSimpleName.last != ':')
161158

162159
/** can this type be a type pattern? */
163-
def mayBeTypePat(tree: untpd.Tree): Boolean = unsplice(tree) match {
160+
def mayBeTypePat(tree: Tree): Boolean = unsplice(tree) match {
164161
case AndTypeTree(tpt1, tpt2) => mayBeTypePat(tpt1) || mayBeTypePat(tpt2)
165162
case OrTypeTree(tpt1, tpt2) => mayBeTypePat(tpt1) || mayBeTypePat(tpt2)
166163
case RefinedTypeTree(tpt, refinements) => mayBeTypePat(tpt) || refinements.exists(_.isInstanceOf[Bind])
@@ -253,6 +250,13 @@ trait UntypedTreeInfo extends TreeInfo[Untyped] { self: Trees.Instance[Untyped]
253250
import TreeInfo._
254251
import untpd._
255252

253+
/** The underlying tree when stripping any TypedSplice or Parens nodes */
254+
override def unsplice(tree: Tree): Tree = tree match {
255+
case TypedSplice(tree1) => tree1
256+
case Parens(tree1) => unsplice(tree1)
257+
case _ => tree
258+
}
259+
256260
/** True iff definition is a val or def with no right-hand-side, or it
257261
* is an abstract typoe declaration
258262
*/

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,8 +1305,10 @@ object Trees {
13051305
this(this(x, arg), annot)
13061306
case Thicket(ts) =>
13071307
this(x, ts)
1308-
case _ if ctx.reporter.errorsReported =>
1309-
// in case of errors it may be that typed trees point to untyped ones.
1308+
case _ if ctx.mode.is(Mode.Interactive) =>
1309+
// In case of errors it may be that typed trees point to untyped ones.
1310+
// The IDE can still traverse inside such trees, either in the run where errors
1311+
// are reported, or in subsequent ones.
13101312
x
13111313
}
13121314
}

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,32 +1407,13 @@ object SymDenotations {
14071407
baseData._2
14081408

14091409
def computeBaseData(implicit onBehalf: BaseData, ctx: Context): (List[ClassSymbol], BaseClassSet) = {
1410-
val seen = new BaseClassSetBuilder
1411-
def addBaseClasses(bcs: List[ClassSymbol], to: List[ClassSymbol])
1412-
: List[ClassSymbol] = bcs match {
1413-
case bc :: bcs1 =>
1414-
val bcs1added = addBaseClasses(bcs1, to)
1415-
if (seen contains bc) bcs1added
1416-
else {
1417-
seen.add(bc)
1418-
bc :: bcs1added
1419-
}
1420-
case nil =>
1421-
to
1422-
}
1423-
def addParentBaseClasses(ps: List[TypeRef], to: List[ClassSymbol]): List[ClassSymbol] = ps match {
1424-
case p :: ps1 =>
1425-
addParentBaseClasses(ps1,
1426-
addBaseClasses(p.symbol.asClass.baseClasses, to))
1427-
case nil =>
1428-
to
1429-
}
14301410
def emptyParentsExpected =
14311411
is(Package) || (symbol == defn.AnyClass) || ctx.erasedTypes && (symbol == defn.ObjectClass)
14321412
if (classParents.isEmpty && !emptyParentsExpected)
14331413
onBehalf.signalProvisional()
1434-
(classSymbol :: addParentBaseClasses(classParents, Nil),
1435-
seen.result)
1414+
val builder = new BaseDataBuilder
1415+
for (p <- classParents) builder.addAll(p.symbol.asClass.baseClasses)
1416+
(classSymbol :: builder.baseClasses, builder.baseClassSet)
14361417
}
14371418

14381419
final override def derivesFrom(base: Symbol)(implicit ctx: Context): Boolean =
@@ -2096,7 +2077,14 @@ object SymDenotations {
20962077
def contains(sym: Symbol): Boolean = contains(sym, classIds.length)
20972078
}
20982079

2099-
private class BaseClassSetBuilder {
2080+
object BaseClassSet {
2081+
def apply(bcs: List[ClassSymbol]): BaseClassSet =
2082+
new BaseClassSet(bcs.toArray.map(_.id))
2083+
}
2084+
2085+
/** A class to combine base data from parent types */
2086+
class BaseDataBuilder {
2087+
private var classes: List[ClassSymbol] = Nil
21002088
private var classIds = new Array[Int](32)
21012089
private var length = 0
21022090

@@ -2106,19 +2094,32 @@ object SymDenotations {
21062094
classIds = classIds1
21072095
}
21082096

2109-
def contains(sym: Symbol): Boolean =
2110-
new BaseClassSet(classIds).contains(sym, length)
2111-
2112-
def add(sym: Symbol): Unit = {
2097+
private def add(sym: Symbol): Unit = {
21132098
if (length == classIds.length) resize(length * 2)
21142099
classIds(length) = sym.id
21152100
length += 1
21162101
}
21172102

2118-
def result = {
2103+
def addAll(bcs: List[ClassSymbol]): this.type = {
2104+
val len = length
2105+
bcs match {
2106+
case bc :: bcs1 =>
2107+
addAll(bcs1)
2108+
if (!new BaseClassSet(classIds).contains(bc, len)) {
2109+
add(bc)
2110+
classes = bc :: classes
2111+
}
2112+
case nil =>
2113+
}
2114+
this
2115+
}
2116+
2117+
def baseClassSet = {
21192118
if (length != classIds.length) resize(length)
21202119
new BaseClassSet(classIds)
21212120
}
2121+
2122+
def baseClasses: List[ClassSymbol] = classes
21222123
}
21232124

21242125
@sharable private var indent = 0 // for completions printing

compiler/src/dotty/tools/dotc/core/Symbols.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,10 @@ object Symbols {
556556
type ThisName = TypeName
557557

558558
/** If this is a top-level class, and if `-Yretain-trees` is set, return the TypeDef tree
559-
* for this class, otherwise EmptyTree.
559+
* for this class, otherwise EmptyTree. This will force the info of the class.
560560
*/
561561
def tree(implicit ctx: Context): tpd.Tree /* tpd.TypeDef | tpd.EmptyTree */ = {
562+
denot.info
562563
// TODO: Consider storing this tree like we store lazy trees for inline functions
563564
if (unpickler != null && !denot.isAbsent) {
564565
assert(myTree.isEmpty)

compiler/src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,11 +1143,11 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
11431143
case OrType(tp11, tp12) =>
11441144
tp11 & tp2 | tp12 & tp2
11451145
case _ =>
1146-
val t1 = mergeIfSub(tp1, tp2)
1147-
if (t1.exists) t1
1146+
val tp1a = dropIfSuper(tp1, tp2)
1147+
if (tp1a ne tp1) glb(tp1a, tp2)
11481148
else {
1149-
val t2 = mergeIfSub(tp2, tp1)
1150-
if (t2.exists) t2
1149+
val tp2a = dropIfSuper(tp2, tp1)
1150+
if (tp2a ne tp2) glb(tp1, tp2a)
11511151
else tp1 match {
11521152
case tp1: ConstantType =>
11531153
tp2 match {
@@ -1204,6 +1204,22 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
12041204
final def lub(tps: List[Type]): Type =
12051205
((defn.NothingType: Type) /: tps)(lub(_,_, canConstrain = false))
12061206

1207+
private def recombineAndOr(tp: AndOrType, tp1: Type, tp2: Type) =
1208+
if (!tp1.exists) tp2
1209+
else if (!tp2.exists) tp1
1210+
else tp.derivedAndOrType(tp1, tp2)
1211+
1212+
/** If some (&-operand of) this type is a supertype of `sub` replace it with `NoType`.
1213+
*/
1214+
private def dropIfSuper(tp: Type, sub: Type): Type =
1215+
if (isSubTypeWhenFrozen(sub, tp)) NoType
1216+
else tp match {
1217+
case tp @ AndType(tp1, tp2) =>
1218+
recombineAndOr(tp, dropIfSuper(tp1, sub), dropIfSuper(tp2, sub))
1219+
case _ =>
1220+
tp
1221+
}
1222+
12071223
/** Merge `t1` into `tp2` if t1 is a subtype of some &-summand of tp2.
12081224
*/
12091225
private def mergeIfSub(tp1: Type, tp2: Type): Type =

0 commit comments

Comments
 (0)