diff options
author | Burak Emir <emir@epfl.ch> | 2006-09-08 09:47:16 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2006-09-08 09:47:16 +0000 |
commit | d81428a28723bade19dd6ebc977281dbb4be3f6d (patch) | |
tree | c7db2fe2c036c3163cab165aa6e0dc880bb95cec /src | |
parent | bd649c76b1dca274ad267aef186a3ad74e329f4e (diff) | |
download | scala-d81428a28723bade19dd6ebc977281dbb4be3f6d.tar.gz scala-d81428a28723bade19dd6ebc977281dbb4be3f6d.tar.bz2 scala-d81428a28723bade19dd6ebc977281dbb4be3f6d.zip |
throw exception in caseelements
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Definitions.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala | 22 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 246ea1152a..db040d975a 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -90,6 +90,7 @@ trait Definitions requires SymbolTable { var MatchErrorModule: Symbol = _ def MatchError_fail = getMember(MatchErrorModule, nme.fail) def MatchError_report = getMember(MatchErrorModule, nme.report) + var IndexOutOfBoundsExceptionClass: Symbol = _ //var RemoteExecutionModule: Symbol = _ // def RemoteExecution_detach = getMember(RemoteExecutionModule, "detach") var ScalaRunTimeModule: Symbol = _ @@ -523,6 +524,7 @@ trait Definitions requires SymbolTable { ConsoleModule = getModule("scala.Console") MatchErrorClass = getClass("scala.MatchError") MatchErrorModule = getModule("scala.MatchError") + IndexOutOfBoundsExceptionClass = getClass("java.lang.IndexOutOfBoundsException") //RemoteExecutionModule = getModule("scala.distributed.RemoteExecution") ScalaRunTimeModule = getModule("scala.runtime.ScalaRunTime") RepeatedParamClass = newCovariantPolyClass( diff --git a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala index 7c71ddbc84..1787be64ac 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala @@ -47,18 +47,20 @@ trait SyntheticMethods requires Analyzer { nme.caseElement, FINAL, MethodType(List(IntClass.tpe), AnyClass.tpe)) val caseFields = clazz.caseFieldAccessors map gen.mkAttributedRef typed( - DefDef(method, vparamss => - if (caseFields.isEmpty) Literal(Constant(null)) - else { - var i = caseFields.length - var cases = List(CaseDef(Ident(nme.WILDCARD), EmptyTree, Literal(Constant(null)))) - for (val field <- caseFields.reverse) { - i = i - 1; cases = CaseDef(Literal(Constant(i)), EmptyTree, field) :: cases + DefDef(method, {vparamss => + val doThrow:Tree = Throw(New(TypeTree(definitions.IndexOutOfBoundsExceptionClass.tpe), + List(List(Select(Ident(vparamss.head.head), nme.toString_))))) + if (caseFields.isEmpty) doThrow + else { + var i = caseFields.length + var cases = List(CaseDef(Ident(nme.WILDCARD), EmptyTree, doThrow)) + for (val field <- caseFields.reverse) { + i = i - 1; cases = CaseDef(Literal(Constant(i)), EmptyTree, field) :: cases + } + Match(Ident(vparamss.head.head), cases) } - Match(Ident(vparamss.head.head), cases) - })) + })) } - def caseArityMethod: Tree = { val method = syntheticMethod(nme.caseArity, FINAL, PolyType(List(), IntClass.tpe)) typed(DefDef(method, vparamss => Literal(Constant(clazz.caseFieldAccessors.length)))) |