aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/Trees.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/ast/Trees.scala')
-rw-r--r--src/dotty/tools/dotc/ast/Trees.scala33
1 files changed, 12 insertions, 21 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala
index 7e0ac3bdc..69bc91f5a 100644
--- a/src/dotty/tools/dotc/ast/Trees.scala
+++ b/src/dotty/tools/dotc/ast/Trees.scala
@@ -568,13 +568,23 @@ object Trees {
def withName(name: Name) = this.derivedDefDef(mods, name.toTermName, tparams, vparamss, tpt, rhs)
}
- /** mods type name = rhs or
- * mods type name >: lo <: hi, if rhs = TypeBoundsTree(lo, hi)
+ /** mods class name template or
+ * mods trait name template or
+ * mods type name = rhs or
+ * mods type name >: lo <: hi, if rhs = TypeBoundsTree(lo, hi) & (lo ne hi)
*/
case class TypeDef[T >: Untyped](mods: Modifiers[T], name: TypeName, rhs: Tree[T])
extends MemberDef[T] {
type ThisTree[T >: Untyped] = TypeDef[T]
def withName(name: Name) = this.derivedTypeDef(mods, name.toTypeName, rhs, tparams)
+
+ /** Is this a definition of a class? */
+ def isClassDef = rhs.isInstanceOf[Template[_]]
+
+ /** If this a non-class type definition, its type parameters.
+ * Can be different from Nil only for PolyTypeDefs, which are always
+ * untyped and get eliminated during desugaring.
+ */
def tparams: List[untpd.TypeDef] = Nil
}
@@ -584,13 +594,6 @@ object Trees {
type ThisTree[T >: Untyped] = Template[T]
}
- /** mods class name[tparams] impl */
- case class ClassDef[T >: Untyped](mods: Modifiers[T], name: TypeName, impl: Template[T])
- extends MemberDef[T] {
- type ThisTree[T >: Untyped] = ClassDef[T]
- def withName(name: Name) = this.derivedClassDef(mods, name.toTypeName, impl)
- }
-
/** import expr.selectors
* where a selector is either an untyped `Ident`, `name` or
* an untyped `Pair` `name => rename`
@@ -727,7 +730,6 @@ object Trees {
type DefDef = Trees.DefDef[T]
type TypeDef = Trees.TypeDef[T]
type Template = Trees.Template[T]
- type ClassDef = Trees.ClassDef[T]
type Import = Trees.Import[T]
type PackageDef = Trees.PackageDef[T]
type Annotated = Trees.Annotated[T]
@@ -889,10 +891,6 @@ object Trees {
case tree: Template[_] if (constr eq tree.constr) && (parents eq tree.parents) && (self eq tree.self) && (body eq tree.body) => tree
case _ => Template(constr, parents, self, body).copyAttr(tree)
}
- def derivedClassDef(mods: Modifiers[T], name: TypeName, impl: Template[T]): ClassDef[T] = tree match {
- case tree: ClassDef[_] if (mods == tree.mods) && (name == tree.name) && (impl eq tree.impl) => tree
- case _ => ClassDef(mods, name, impl).copyAttr(tree)
- }
def derivedImport(expr: Tree[T], selectors: List[Tree[Untyped]]): Import[T] = tree match {
case tree: Import[_] if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
case _ => Import(expr, selectors).copyAttr(tree)
@@ -991,8 +989,6 @@ object Trees {
finishTypeDef(tree.derivedTypeDef(mods, name, transform(rhs, c), tree.tparams), tree, c, plugins)
case Template(constr, parents, self, body) =>
finishTemplate(tree.derivedTemplate(transformSub(constr, c), transform(parents, c), transformSub(self, c), transform(body, c)), tree, c, plugins)
- case ClassDef(mods, name, impl) =>
- finishClassDef(tree.derivedClassDef(mods, name, transformSub(impl, c)), tree, c, plugins)
case Import(expr, selectors) =>
finishImport(tree.derivedImport(transform(expr, c), selectors), tree, c, plugins)
case PackageDef(pid, stats) =>
@@ -1059,7 +1055,6 @@ object Trees {
def finishDefDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
def finishTypeDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
def finishTemplate(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
- def finishClassDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
def finishImport(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
def finishPackageDef(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
def finishAnnotated(tree: Tree[T], old: Tree[T], c: C, plugins: Plugins) = tree
@@ -1173,8 +1168,6 @@ object Trees {
tree.derivedTypeDef(mods, name, transform(rhs), tree.tparams)
case Template(constr, parents, self, body) =>
tree.derivedTemplate(transformSub(constr), transform(parents), transformSub(self), transformStats(body))
- case ClassDef(mods, name, impl) =>
- tree.derivedClassDef(mods, name, transformSub(impl))
case Import(expr, selectors) =>
tree.derivedImport(transform(expr), selectors)
case PackageDef(pid, stats) =>
@@ -1280,8 +1273,6 @@ object Trees {
this(x, rhs)
case Template(constr, parents, self, body) =>
this(this(this(this(x, constr), parents), self), body)
- case ClassDef(mods, name, impl) =>
- this(x, impl)
case Import(expr, selectors) =>
this(x, expr)
case PackageDef(pid, stats) =>