diff options
author | buraq <buraq@epfl.ch> | 2004-05-18 10:42:03 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2004-05-18 10:42:03 +0000 |
commit | 00048f2901012137789f0af5ff5d733a581fc90e (patch) | |
tree | 8750463a865285bd54d2a0842a0e7331f026176e /sources/scalac | |
parent | 7432218075b602548bb109fac463077ddc50befd (diff) | |
download | scala-00048f2901012137789f0af5ff5d733a581fc90e.tar.gz scala-00048f2901012137789f0af5ff5d733a581fc90e.tar.bz2 scala-00048f2901012137789f0af5ff5d733a581fc90e.zip |
case classes implement trait scala.CaseClass
Diffstat (limited to 'sources/scalac')
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 41 | ||||
-rw-r--r-- | sources/scalac/util/Names.java | 4 |
2 files changed, 43 insertions, 2 deletions
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index a96a21fd0a..455bcd3f15 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -29,8 +29,9 @@ import Tree.*; * It preforms the following transformations. * * - Local modules are replaced by variables and classes - * - toString, equals, and hashCode methods are added to case classes, unless - * they are defined in the class or a baseclass different from java.lang.Object + * - equals, and hashCode, selectElement and toString methods are added to + * case classes, unless they are defined in the class or a baseclass + * different from java.lang.Object * - Calls to case factory methods are replaced by new's. * - Type nodes are replaced by TypeTerm nodes. * - Eliminate constant definitions @@ -687,6 +688,39 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { return gen.DefDef(toStringSym, body); } + private Tree selectElementMethod( ClassSymbol clazz ) { + Symbol seSym = clazz.newMethod( clazz.pos, OVERRIDE, Names.selectElement ); + Symbol seParam = seSym.newVParam( + clazz.pos, 0, Names.n, defs.INT_TYPE()); + seSym.setInfo( + Type.MethodType( new Symbol[]{ seParam }, defs.ANY_TYPE() )); + clazz.info().members().enter( seSym ); + Tree[] fields = caseFields( clazz ); + Tree body; + if( fields.length > 0) { // switch< n > + int tags[] = new int[ fields.length ]; + int i = 0; while( i < fields.length ) { tags[i] = ++i; }; + body = gen.Switch( gen.mkLocalRef( clazz.pos, seParam ), + tags, + fields, + gen.mkNullLit( clazz.pos ), + defs.ANY_TYPE() ); + } + else + body = gen.mkNullLit( clazz.pos ); + return gen.DefDef(seSym, body); + } + + private Tree numberOfElementsMethod( ClassSymbol clazz ) { + Symbol seSym = clazz.newMethod( clazz.pos, OVERRIDE, Names.numberOfElements ); + seSym.setInfo( + Type.MethodType( Symbol.EMPTY_ARRAY, defs.INT_TYPE() )); + clazz.info().members().enter( seSym ); + Tree[] fields = caseFields( clazz ); + return gen.DefDef(seSym, gen.mkIntLit( clazz.pos, fields.length )); + } + + private Tree equalsMethod(ClassSymbol clazz) { Symbol equalsSym = clazz.newMethod(clazz.pos, OVERRIDE, Names.equals); Symbol equalsParam = equalsSym.newVParam( @@ -823,6 +857,9 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { ts.append(equalsMethod(clazz)); if (!hasImplementation(clazz, Names.hashCode)) ts.append(hashCodeMethod(clazz)); + + ts.append(selectElementMethod(clazz)); + ts.append(numberOfElementsMethod(clazz)); ts.append(tagMethod(clazz)); if (ts.length() > 0) { Tree[] stats1 = new Tree[stats.length + ts.length()]; diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java index 87858f395c..619ddf5b07 100644 --- a/sources/scalac/util/Names.java +++ b/sources/scalac/util/Names.java @@ -106,6 +106,7 @@ public class Names { public static final Name AnyRef = Name.fromString("AnyRef"); public static final Name Array = Name.fromString("Array"); public static final Name Byte = Name.fromString("Byte"); + public static final Name CaseClass = Name.fromString("CaseClass"); public static final Name Catch = Name.fromString("Catch"); public static final Name Char = Name.fromString("Char"); public static final Name Boolean = Name.fromString("Boolean"); @@ -164,9 +165,11 @@ public class Names { public static final Name length = Name.fromString("length"); public static final Name match = Name.fromString("match"); public static final Name map = Name.fromString("map"); + public static final Name n = Name.fromString("n"); public static final Name nobinding = Name.fromString("nobinding"); public static final Name next = Name.fromString("next"); public static final Name newArray = Name.fromString("newArray"); + public static final Name numberOfElements = Name.fromString("numberOfElements"); public static final Name null_ = Name.fromString("null"); public static final Name predef = Name.fromString("predef"); public static final Name print = Name.fromString("print"); @@ -176,6 +179,7 @@ public class Names { public static final Name synchronized_ = Name.fromString("synchronized"); public static final Name eq = Name.fromString("eq"); public static final Name equals = Name.fromString("equals"); + public static final Name selectElement = Name.fromString("selectElement"); public static final Name tail = Name.fromString("tail"); public static final Name toString = Name.fromString("toString"); public static final Name that = Name.fromString("that"); |