summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilles Dubochet <gilles.dubochet@epfl.ch>2005-12-18 18:33:03 +0000
committerGilles Dubochet <gilles.dubochet@epfl.ch>2005-12-18 18:33:03 +0000
commitd3819b93ab8b2de3d5cc35c33b8258ccdb5a931a (patch)
treedfc6f7f497e58ea3321e6f687b11313d2afa86b5
parent0e82079908655682e5140ad521cef0572cb6d2a4 (diff)
downloadscala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.tar.gz
scala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.tar.bz2
scala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.zip
Removed old Scalac code in sources and various ...
Removed old Scalac code in sources and various other obsolete elements.
-rw-r--r--config/ia/CustomCode/refreshenvironment.jar.desired.sha11
-rw-r--r--config/ia/images/Splash.pngbin153467 -> 0 bytes
-rw-r--r--config/ia/locales/de/LICENSE.html76
-rw-r--r--config/ia/locales/de/custom258
-rw-r--r--config/ia/locales/de/custom_unix228
-rw-r--r--config/ia/locales/de/custom_win32237
-rw-r--r--config/ia/locales/en/LICENSE.html68
-rw-r--r--config/ia/locales/en/custom258
-rw-r--r--config/ia/locales/en/custom_unix228
-rw-r--r--config/ia/locales/en/custom_win32237
-rw-r--r--config/ia/locales/fr/LICENSE.html82
-rw-r--r--config/ia/locales/fr/custom258
-rw-r--r--config/ia/locales/fr/custom_unix228
-rw-r--r--config/ia/locales/fr/custom_win32237
-rw-r--r--config/ia/scala.iap_xml2521
-rw-r--r--config/ia/scala_unix.iap_xml1645
-rw-r--r--config/ia/scala_win32.iap_xml2088
-rw-r--r--config/ia/setversion.xsl138
-rw-r--r--config/ia/tools.readme17
-rw-r--r--config/ia/tools.zipbin109543 -> 0 bytes
-rw-r--r--config/list/emacs.lst12
-rw-r--r--config/list/examples.lst45
-rw-r--r--config/list/lamplib.lst14
-rw-r--r--config/list/library-msil.lst304
-rw-r--r--config/list/library.lst400
-rw-r--r--config/list/meta.lst46
-rw-r--r--config/list/scala4ant.lst15
-rw-r--r--config/list/scalac.lst223
-rw-r--r--config/list/scaladoc.lst22
-rw-r--r--config/list/scalai.lst34
-rw-r--r--config/list/scalap.lst20
-rw-r--r--config/list/scalatest.lst14
-rw-r--r--config/list/test.lst264
-rw-r--r--config/list/util.lst38
-rw-r--r--config/list/website.lst95
-rw-r--r--docs/devel/nscNodes.dot104
-rw-r--r--docs/devel/nscTypes.dot73
-rw-r--r--docs/man/man1/scaladoc.1119
-rw-r--r--docs/man/man1/scalaint.1127
-rw-r--r--docs/man/man1/scalarun.1123
-rw-r--r--sources/MANIFEST1
-rw-r--r--sources/ch/epfl/lamp/util/CodePrinter.java277
-rw-r--r--sources/ch/epfl/lamp/util/ForwardingMap.java97
-rw-r--r--sources/ch/epfl/lamp/util/HTMLPrinter.java886
-rw-r--r--sources/ch/epfl/lamp/util/HTMLRepresentation.java99
-rw-r--r--sources/ch/epfl/lamp/util/Pair.java27
-rw-r--r--sources/ch/epfl/lamp/util/XHTMLPrinter.java189
-rw-r--r--sources/ch/epfl/lamp/util/XMLAttribute.java31
-rw-r--r--sources/meta/GenerateAll.java99
-rw-r--r--sources/meta/java/AbstractJavaExpander.java49
-rw-r--r--sources/meta/java/JavaWriter.java394
-rw-r--r--sources/meta/java/Type.java152
-rw-r--r--sources/meta/scala/AbstractScalaExpander.java45
-rw-r--r--sources/meta/scala/MetaFunction.java55
-rw-r--r--sources/meta/scala/MetaTuple.java58
-rw-r--r--sources/meta/scalac/Phase.java46
-rw-r--r--sources/meta/scalac/ast/AbstractTreeCaseExpander.java62
-rw-r--r--sources/meta/scalac/ast/AbstractTreeExpander.java41
-rw-r--r--sources/meta/scalac/ast/AbstractTreeMethodExpander.java31
-rw-r--r--sources/meta/scalac/ast/MetaDefaultTreeFactory.java25
-rw-r--r--sources/meta/scalac/ast/MetaLazyTreeCopier.java51
-rw-r--r--sources/meta/scalac/ast/MetaStrictTreeCopier.java44
-rw-r--r--sources/meta/scalac/ast/MetaTransformer.java77
-rw-r--r--sources/meta/scalac/ast/MetaTraverser.java44
-rw-r--r--sources/meta/scalac/ast/MetaTree.java218
-rw-r--r--sources/meta/scalac/ast/MetaTreeCopier.java26
-rw-r--r--sources/meta/scalac/ast/MetaTreeFactory.java21
-rw-r--r--sources/meta/scalac/ast/Tree.java441
-rw-r--r--sources/meta/scalac/ast/TreeField.java63
-rw-r--r--sources/meta/scalac/ast/TreeFieldLink.java60
-rw-r--r--sources/meta/scalac/ast/TreeKind.java63
-rw-r--r--sources/meta/scalac/ast/TreeNode.java231
-rw-r--r--sources/meta/scalac/ast/TreeSymbol.java24
-rw-r--r--sources/meta/scalac/ast/TreeType.java65
-rw-r--r--sources/meta/scalac/checkers/MetaCheckTreeNodes.java158
-rw-r--r--sources/meta/util/AbstractFileExpander.java126
-rw-r--r--sources/meta/util/AbstractMain.java38
-rw-r--r--sources/meta/util/TextExpander.java275
-rw-r--r--sources/meta/util/TextWriter.java248
-rw-r--r--sources/scala/tools/scala4ant/AntAdaptor.scala209
-rw-r--r--sources/scala/tools/scala4ant/AntTask.scala13
-rw-r--r--sources/scala/tools/scala4ant/NscAdaptor.scala134
-rw-r--r--sources/scala/tools/scala4ant/NscTask.scala118
-rw-r--r--sources/scala/tools/scala4ant/ScalaRuntime.scala133
-rw-r--r--sources/scala/tools/scala4ant/ScalaTask.scala51
-rw-r--r--sources/scala/tools/scala4ant/ScalacTask.scala109
-rw-r--r--sources/scala/tools/scala4ant/ScalapTask.scala81
-rw-r--r--sources/scala/tools/scalac/CompilerPhases.scala37
-rw-r--r--sources/scala/tools/scalac/Global.scala95
-rw-r--r--sources/scala/tools/scalac/Main.scala72
-rw-r--r--sources/scala/tools/scalac/ant/Scalac.java524
-rw-r--r--sources/scala/tools/scalac/ast/TreeList.scala86
-rw-r--r--sources/scala/tools/scalac/ast/parser/MarkupParser.scala608
-rw-r--r--sources/scala/tools/scalac/ast/parser/Parser.scala2314
-rw-r--r--sources/scala/tools/scalac/ast/parser/ParserPhase.scala24
-rw-r--r--sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala607
-rw-r--r--sources/scala/tools/scalac/ast/parser/Scanner.scala998
-rw-r--r--sources/scala/tools/scalac/ast/parser/SymbolicXMLBuilder.scala673
-rw-r--r--sources/scala/tools/scalac/ast/parser/TokenData.scala45
-rw-r--r--sources/scala/tools/scalac/ast/parser/Tokens.scala240
-rw-r--r--sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala171
-rw-r--r--sources/scala/tools/scalac/ast/printer/SwingPrinter.scala264
-rw-r--r--sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala1055
-rw-r--r--sources/scala/tools/scalac/ast/printer/TreeInfo.scala419
-rw-r--r--sources/scala/tools/scalac/backend/GenJVMFromICode.scala758
-rw-r--r--sources/scala/tools/scalac/icode/IBasicBlock.scala143
-rw-r--r--sources/scala/tools/scalac/icode/ICInstruction.scala358
-rw-r--r--sources/scala/tools/scalac/icode/ICTypeStack.scala147
-rw-r--r--sources/scala/tools/scalac/icode/ICode.scala492
-rw-r--r--sources/scala/tools/scalac/icode/ICodePhase.scala67
-rw-r--r--sources/scala/tools/scalac/icode/ICodePrinter.scala71
-rw-r--r--sources/scala/tools/scalac/transformer/TransMatch.scala401
-rw-r--r--sources/scala/tools/scalac/transformer/TransMatchPhase.scala26
-rw-r--r--sources/scala/tools/scalac/transformer/UnCurry.scala406
-rw-r--r--sources/scala/tools/scalac/transformer/UnCurryPhase.scala95
-rw-r--r--sources/scala/tools/scalac/transformer/matching/AlgebraicMatcher.scala189
-rw-r--r--sources/scala/tools/scalac/transformer/matching/Autom2Scala.scala207
-rw-r--r--sources/scala/tools/scalac/transformer/matching/BerrySethi.scala669
-rw-r--r--sources/scala/tools/scalac/transformer/matching/BindingBerrySethi.scala177
-rw-r--r--sources/scala/tools/scalac/transformer/matching/CaseEnv.scala73
-rw-r--r--sources/scala/tools/scalac/transformer/matching/CodeFactory.scala287
-rw-r--r--sources/scala/tools/scalac/transformer/matching/DetWordAutom.scala890
-rw-r--r--sources/scala/tools/scalac/transformer/matching/Label.scala136
-rw-r--r--sources/scala/tools/scalac/transformer/matching/LeftTracerInScala.scala246
-rw-r--r--sources/scala/tools/scalac/transformer/matching/NondetWordAutom.scala527
-rw-r--r--sources/scala/tools/scalac/transformer/matching/Npair.scala67
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PartialMatcher.scala46
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala940
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternNode.scala249
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternNodeCreator.scala109
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternNodeDebugPrinter.scala118
-rw-r--r--sources/scala/tools/scalac/transformer/matching/PatternTool.scala88
-rw-r--r--sources/scala/tools/scalac/transformer/matching/RightTracerInScala.scala551
-rw-r--r--sources/scala/tools/scalac/transformer/matching/SequenceMatcher.scala165
-rw-r--r--sources/scala/tools/scalac/transformer/matching/StateSetComparator.scala34
-rw-r--r--sources/scala/tools/scalac/transformer/matching/TracerInScala.scala14
-rw-r--r--sources/scala/tools/scalac/transformer/matching/VariableTraverser.scala56
-rw-r--r--sources/scala/tools/scalac/transformer/matching/WordAutomInScala.scala153
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala3153
-rw-r--r--sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala83
-rw-r--r--sources/scala/tools/scalac/typechecker/ConstantFolder.scala329
-rw-r--r--sources/scala/tools/scalac/typechecker/Context.scala146
-rw-r--r--sources/scala/tools/scalac/typechecker/DeSugarize.scala641
-rw-r--r--sources/scala/tools/scalac/typechecker/ImportList.scala47
-rw-r--r--sources/scala/tools/scalac/typechecker/Infer.scala1428
-rw-r--r--sources/scala/tools/scalac/typechecker/RefCheck.scala1224
-rw-r--r--sources/scala/tools/scalac/typechecker/RefCheckPhase.scala30
-rw-r--r--sources/scala/tools/scalac/typechecker/Substituter.scala95
-rw-r--r--sources/scala/tools/scalac/typechecker/View.scala19
-rw-r--r--sources/scala/tools/scalac/util/NewArray.scala72
-rw-r--r--sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala525
-rw-r--r--sources/scala/tools/scalac/wholeprog/Inline.scala235
-rw-r--r--sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala443
-rw-r--r--sources/scala/tools/scalac/wholeprog/PrintDotFile.scala431
-rw-r--r--sources/scala/tools/scalac/wholeprog/WholeProgPhase.scala58
-rw-r--r--sources/scala/tools/scalac/wholeprog/graph/Graph.scala189
-rw-r--r--sources/scala/tools/scaladoc/Comment.java259
-rw-r--r--sources/scala/tools/scaladoc/DocModule.java129
-rw-r--r--sources/scala/tools/scaladoc/HTMLGenerator.java2145
-rw-r--r--sources/scala/tools/scaladoc/HTMLGeneratorCommand.java191
-rw-r--r--sources/scala/tools/scaladoc/HTTPServer.java453
-rw-r--r--sources/scala/tools/scaladoc/Location.java228
-rw-r--r--sources/scala/tools/scaladoc/MLType.scala690
-rw-r--r--sources/scala/tools/scaladoc/Main.scala61
-rw-r--r--sources/scala/tools/scaladoc/Page.java63
-rw-r--r--sources/scala/tools/scaladoc/ScalaSearch.java603
-rw-r--r--sources/scala/tools/scaladoc/StandardDocModule.java54
-rw-r--r--sources/scala/tools/scaladoc/SymbolTablePrinter.java203
-rw-r--r--sources/scala/tools/scaladoc/SymbolTablePrinterFactory.java138
-rw-r--r--sources/scala/tools/scaladoc/Tag.java151
-rw-r--r--sources/scala/tools/scaladoc/TypeIsomorphism.java19
-rw-r--r--sources/scala/tools/scaladoc/resources/script.js5
-rw-r--r--sources/scala/tools/scaladoc/resources/style.css124
-rw-r--r--sources/scala/tools/scaladoc/resources/xhtml-lat1.ent196
-rw-r--r--sources/scala/tools/scaladoc/resources/xhtml-special.ent80
-rw-r--r--sources/scala/tools/scaladoc/resources/xhtml-symbol.ent237
-rw-r--r--sources/scala/tools/scaladoc/resources/xhtml1-transitional.dtd1201
-rw-r--r--sources/scala/tools/scalai/Code.java129
-rw-r--r--sources/scala/tools/scalai/CodeBuffer.java73
-rw-r--r--sources/scala/tools/scalai/CodeContainer.java39
-rw-r--r--sources/scala/tools/scalai/CodeGenerator.java20
-rw-r--r--sources/scala/tools/scalai/CodePromise.java45
-rw-r--r--sources/scala/tools/scalai/Compiler.java414
-rw-r--r--sources/scala/tools/scalai/Constants.java97
-rw-r--r--sources/scala/tools/scalai/Environment.java251
-rw-r--r--sources/scala/tools/scalai/Evaluator.java602
-rw-r--r--sources/scala/tools/scalai/EvaluatorException.java126
-rw-r--r--sources/scala/tools/scalai/EvaluatorResult.java21
-rw-r--r--sources/scala/tools/scalai/ExpressionCompiler.java308
-rw-r--r--sources/scala/tools/scalai/ExpressionContext.java136
-rw-r--r--sources/scala/tools/scalai/Function.java98
-rw-r--r--sources/scala/tools/scalai/Interpreter.java193
-rw-r--r--sources/scala/tools/scalai/InterpreterCommand.java74
-rw-r--r--sources/scala/tools/scalai/InterpreterPrinter.java81
-rw-r--r--sources/scala/tools/scalai/InterpreterShell.java466
-rw-r--r--sources/scala/tools/scalai/JavaMirror.java274
-rw-r--r--sources/scala/tools/scalai/Main.java42
-rw-r--r--sources/scala/tools/scalai/Override.java65
-rw-r--r--sources/scala/tools/scalai/PathClassLoader.java47
-rw-r--r--sources/scala/tools/scalai/ScalaFunction.java57
-rw-r--r--sources/scala/tools/scalai/ScalaObject.java67
-rw-r--r--sources/scala/tools/scalai/ScalaTemplate.java109
-rw-r--r--sources/scala/tools/scalai/Template.java40
-rw-r--r--sources/scala/tools/scalai/Variable.java58
-rw-r--r--sources/scalac/ApplicationError.java59
-rw-r--r--sources/scalac/CompilationLoop.java143
-rw-r--r--sources/scalac/CompilationUnit.java89
-rw-r--r--sources/scalac/CompilerCommand.java369
-rw-r--r--sources/scalac/CompilerPhases.java231
-rw-r--r--sources/scalac/Global.java706
-rw-r--r--sources/scalac/Phase.java73
-rw-r--r--sources/scalac/PhaseDescriptor.java233
-rw-r--r--sources/scalac/Unit.java89
-rw-r--r--sources/scalac/ast/DefaultTreeFactory.java.tmpl22
-rw-r--r--sources/scalac/ast/LazyTreeCopier.java.tmpl42
-rw-r--r--sources/scalac/ast/StrictTreeCopier.java.tmpl35
-rw-r--r--sources/scalac/ast/Transformer.java.tmpl319
-rw-r--r--sources/scalac/ast/Traverser.java.tmpl35
-rw-r--r--sources/scalac/ast/Tree.java.tmpl202
-rw-r--r--sources/scalac/ast/TreeCloner.java137
-rw-r--r--sources/scalac/ast/TreeCopier.java.tmpl26
-rw-r--r--sources/scalac/ast/TreeFactory.java.tmpl22
-rw-r--r--sources/scalac/ast/TreeGen.java1361
-rw-r--r--sources/scalac/ast/TreeInfo.java307
-rw-r--r--sources/scalac/ast/TreeList.java82
-rw-r--r--sources/scalac/ast/printer/TreePrinter.java28
-rw-r--r--sources/scalac/atree/AArithmeticOp.java50
-rw-r--r--sources/scalac/atree/AClass.java139
-rw-r--r--sources/scalac/atree/ACode.java98
-rw-r--r--sources/scalac/atree/AComparisonOp.java42
-rw-r--r--sources/scalac/atree/AConstant.java404
-rw-r--r--sources/scalac/atree/AField.java54
-rw-r--r--sources/scalac/atree/AFunction.java33
-rw-r--r--sources/scalac/atree/AInvokeStyle.java91
-rw-r--r--sources/scalac/atree/ALocation.java33
-rw-r--r--sources/scalac/atree/ALogicalOp.java42
-rw-r--r--sources/scalac/atree/AMember.java87
-rw-r--r--sources/scalac/atree/AMethod.java79
-rw-r--r--sources/scalac/atree/APrimitive.java72
-rw-r--r--sources/scalac/atree/ARepository.java51
-rw-r--r--sources/scalac/atree/AShiftOp.java42
-rw-r--r--sources/scalac/atree/ATestOp.java67
-rw-r--r--sources/scalac/atree/ATreeFactory.java531
-rw-r--r--sources/scalac/atree/ATreeFromSTree.java553
-rw-r--r--sources/scalac/atree/ATreePrinter.java557
-rw-r--r--sources/scalac/atree/ATreeTyper.java314
-rw-r--r--sources/scalac/atree/ATypeKind.java94
-rw-r--r--sources/scalac/backend/Primitive.java205
-rw-r--r--sources/scalac/backend/Primitives.java1304
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java1927
-rw-r--r--sources/scalac/backend/msil/GenMSIL.java2632
-rw-r--r--sources/scalac/backend/msil/TypeCreator.java1449
-rw-r--r--sources/scalac/checkers/CheckTreeNodes.java.tmpl42
-rw-r--r--sources/scalac/checkers/TreeChecker.java637
-rw-r--r--sources/scalac/framework/History.java277
-rw-r--r--sources/scalac/framework/Promise.java70
-rw-r--r--sources/scalac/symtab/AttributeInfo.java55
-rw-r--r--sources/scalac/symtab/ClosureHistory.java79
-rw-r--r--sources/scalac/symtab/Definitions.java1194
-rw-r--r--sources/scalac/symtab/EntryTags.java100
-rw-r--r--sources/scalac/symtab/Kinds.java24
-rw-r--r--sources/scalac/symtab/Modifiers.java154
-rw-r--r--sources/scalac/symtab/Scope.java332
-rw-r--r--sources/scalac/symtab/SourceCompleter.java46
-rw-r--r--sources/scalac/symtab/SymSet.java119
-rw-r--r--sources/scalac/symtab/Symbol.java2573
-rw-r--r--sources/scalac/symtab/SymbolCloner.java243
-rw-r--r--sources/scalac/symtab/SymbolComparator.java37
-rw-r--r--sources/scalac/symtab/SymbolLoader.java168
-rw-r--r--sources/scalac/symtab/SymbolNameWriter.java306
-rw-r--r--sources/scalac/symtab/SymbolOrigin.java52
-rw-r--r--sources/scalac/symtab/SymbolSubstTypeMap.java199
-rw-r--r--sources/scalac/symtab/SymbolTablePrinter.java602
-rw-r--r--sources/scalac/symtab/Type.java3736
-rw-r--r--sources/scalac/symtab/TypeTags.java28
-rw-r--r--sources/scalac/symtab/classfile/AttributeParser.java216
-rw-r--r--sources/scalac/symtab/classfile/CLRClassParser.java538
-rw-r--r--sources/scalac/symtab/classfile/CLRPackageParser.java151
-rw-r--r--sources/scalac/symtab/classfile/CLRTypes.java330
-rw-r--r--sources/scalac/symtab/classfile/ClassParser.java49
-rw-r--r--sources/scalac/symtab/classfile/ClassfileConstants.java79
-rw-r--r--sources/scalac/symtab/classfile/ClassfileParser.java323
-rw-r--r--sources/scalac/symtab/classfile/ConstantPool.java217
-rw-r--r--sources/scalac/symtab/classfile/JavaTypeCreator.java162
-rw-r--r--sources/scalac/symtab/classfile/JavaTypeFactory.java35
-rw-r--r--sources/scalac/symtab/classfile/MetaParser.java287
-rw-r--r--sources/scalac/symtab/classfile/PackageParser.java232
-rw-r--r--sources/scalac/symtab/classfile/Pickle.java616
-rw-r--r--sources/scalac/symtab/classfile/Signatures.java175
-rw-r--r--sources/scalac/symtab/classfile/SymblParser.java47
-rw-r--r--sources/scalac/symtab/classfile/UnPickle.java643
-rw-r--r--sources/scalac/transformer/AddAccessorsPhase.java146
-rw-r--r--sources/scalac/transformer/AddConstructors.java295
-rw-r--r--sources/scalac/transformer/AddConstructorsPhase.java63
-rw-r--r--sources/scalac/transformer/AddInterfaces.java304
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java313
-rw-r--r--sources/scalac/transformer/Erasure.java759
-rw-r--r--sources/scalac/transformer/ErasurePhase.java135
-rw-r--r--sources/scalac/transformer/ExpandMixinsPhase.java473
-rw-r--r--sources/scalac/transformer/ExplicitOuterClassesPhase.java558
-rw-r--r--sources/scalac/transformer/ICodePhase.java42
-rw-r--r--sources/scalac/transformer/LambdaLift.java763
-rw-r--r--sources/scalac/transformer/LambdaLiftPhase.java175
-rw-r--r--sources/scalac/transformer/MakeBoxingExplicitPhase.java50
-rw-r--r--sources/scalac/transformer/OwnerTransformer.java189
-rw-r--r--sources/scalac/transformer/TailCallPhase.java296
-rw-r--r--sources/scalac/transformer/TypesAsValuesPhase.java1415
-rw-r--r--sources/scalac/transformer/WholeProgPhase.java32
-rw-r--r--sources/scalac/typechecker/AnalyzerPhase.java32
-rw-r--r--sources/scalac/typechecker/Infer.java23
-rw-r--r--sources/scalac/util/AbstractFileReader.java113
-rw-r--r--sources/scalac/util/ArrayApply.java54
-rw-r--r--sources/scalac/util/Debug.java503
-rw-r--r--sources/scalac/util/EmptyPhase.java36
-rw-r--r--sources/scalac/util/FreshNameCreator.java58
-rw-r--r--sources/scalac/util/Name.java133
-rw-r--r--sources/scalac/util/NameTransformer.java100
-rw-r--r--sources/scalac/util/Names.java268
-rw-r--r--sources/scalac/util/OptionParser.java541
-rw-r--r--sources/scalac/util/PrefixMatcher.java114
-rw-r--r--sources/scalac/util/SourceRepresentation.java227
-rw-r--r--sources/scalac/util/Strings.java102
-rw-r--r--sources/scalac/util/TermName.java119
-rw-r--r--sources/scalac/util/TypeName.java36
-rw-r--r--sources/scalac/util/TypeNames.java16
-rw-r--r--support/make/csc.mk105
-rw-r--r--support/make/cygwin.mk32
-rw-r--r--support/make/default.mk43
-rw-r--r--support/make/exec.mk42
-rw-r--r--support/make/grep.mk51
-rw-r--r--support/make/ilasm.mk93
-rw-r--r--support/make/ildasm.mk85
-rw-r--r--support/make/jar.mk81
-rw-r--r--support/make/jc.mk113
-rw-r--r--support/make/latex.mk92
-rw-r--r--support/make/rmic.mk96
-rw-r--r--support/make/sc.mk110
-rw-r--r--support/make/scalatex.mk67
-rw-r--r--support/make/sdc.mk111
-rw-r--r--support/make/verbfilter.mk80
-rw-r--r--support/make/wc.mk45
-rwxr-xr-xsupport/nightly-build/scala-nightly-test.scm130
-rwxr-xr-xsupport/scripts/cvs-move-directory10
-rw-r--r--support/scripts/cvs-move-directory.sh89
-rwxr-xr-xsupport/scripts/cvs-remove-directory10
-rw-r--r--support/scripts/cvs-remove-directory.sh54
-rwxr-xr-xsupport/scripts/install10
-rw-r--r--support/scripts/install.sh131
-rwxr-xr-xsupport/scripts/mirror10
-rw-r--r--support/scripts/mirror.sh82
-rw-r--r--support/scripts/stdlib.sh94
-rwxr-xr-xsupport/scripts/version-manager10
-rw-r--r--support/scripts/version-manager.sh150
-rwxr-xr-xsupport/windows/scala_wrapper-footer.bat29
-rwxr-xr-xsupport/windows/scala_wrapper-header.bat10
355 files changed, 0 insertions, 95460 deletions
diff --git a/config/ia/CustomCode/refreshenvironment.jar.desired.sha1 b/config/ia/CustomCode/refreshenvironment.jar.desired.sha1
deleted file mode 100644
index 9d24ae9645..0000000000
--- a/config/ia/CustomCode/refreshenvironment.jar.desired.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d4b5c6c956fc6579c013a01c1467d0afad3511a2 ?refreshenvironment.jar
diff --git a/config/ia/images/Splash.png b/config/ia/images/Splash.png
deleted file mode 100644
index 8d0e8389cc..0000000000
--- a/config/ia/images/Splash.png
+++ /dev/null
Binary files differ
diff --git a/config/ia/locales/de/LICENSE.html b/config/ia/locales/de/LICENSE.html
deleted file mode 100644
index 90b5da193e..0000000000
--- a/config/ia/locales/de/LICENSE.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<html>
-
-<head>
- <style type="text/css">
- <!--
- body { font-family:Helvetica,Arial,Sans-Serif; }
- div.title { font-weight:bold; }
- p { font-size:small; }
- li { font-size:small; margin:0px 0px 6px 0px; }
- -->
- </style>
-</head>
-
-<body>
-
-<div class="title">
-SCALA LIZENZ
-</div>
-
-<p>
-Copyright &copy; 2002-05 <a href="http://www.epfl.ch/">EPFL</a>, Lausanne.
-Alle Rechte vorbehalten.
-</p>
-
-<p>
-Diese Software wurde von der Gruppe Methoden der Programmierung an
-der Eidgen&ouml;ssiche Technische Hochschule von Lausanne, Schweiz,
-entwickelt.
-</p>
-
-<p>
-Die Genehmigung zum Verwenden, Kopieren, &Auml;ndern and Weitervertreiben
-dieser Software im Quell- und Bin&auml;rformat zu einem beliebigen Zweck
-wird hiermit ohne Geb&uuml;hr erteilt, sofern folgende Konditionen
-erf&uuml;llt sind:
-</p>
-
-<ol>
- <li>
- Bei Weitervertrieb des Quellcodes m&uuml;ssen vorstehender
- Urheberrechtshinweis, diese Liste der Konditionen und die folgende
- Verzichtserkl&auml;rung beibehalten werden.
- </li>
- <li>
- Bei Weitervertrieb im Bin&auml;rformat müssen in der Dokumentation
- und/oder anderen Materialien, die vertrieben werden, vorstehender
- Urheberrechtshinweis, diese Liste der Konditionen und die folgende
- Verzichtserkl&auml;rung reproduziert werden.
- </li>
- <li>
- Neither the name of the EPFL nor the names of its contributors
- may be used to endorse or promote products derived from this
- software without specific prior written permission.
- </li>
-</ol>
-
-<p>
-DIESE SOFTWARE WIRD VON DEN AUTOREN WIE BESEHEN UND UNTER AUSSCHLUSS ALLER
-AUSDR&Uuml;CKLICHEN ODER KONKLUDENTEN GARANTIEN ZUR VERFÃœGUNG GESTELLT,
-EINSCHLIESSLICH, ABER NICHT BESCHR&Auml;NKT AUF KONKLUDENTE GARANTIEN DER
-HANDELS&Uuml;BLICHKEIT UND/ODER EIGNUNG F&Uuml;R EINEN BESTIMMTEN ZWECK.
-UNTER KEINEN UMST&Auml;NDEN KÖNNEN DIE AUTOREN F&Uuml;R DIREKTE, INDIREKTE,
-ZUF&Auml;LLIGE, BESONDERE, EXEMPLARISCHE ODER FOLGESCH&Auml;DEN (EINSCHLIESSLICH
-VON, ABER NICHT BESCHR&Auml;NKT AUF, BESCHAFFUNG VON ERSATZWAREN ODER
-ERSATZLEISTUNGEN, ENTGANGENEM NUTZEN, VERLUST VON DATEN, ENTGANGENEM GEWINN
-ODER GESCH&Auml;FTSAUSFALL) HAFTBAR GEMACHT WERDEN, DIE AUS EINER BELIEBIGEN
-URSACHE UND AUF GRUNDLAGE IRGENDEINES HAFTBARKEITSVERST&Auml;NDNISSES ENTSTEHEN,
-UNABH&Auml;NGIG VON VERTR&Auml;GEN, DER GEFÄHRDUNGSHAFTUNG ODER UNERLAUBTEN
-HANDLUNGEN (EINSCHLIESSLICH FAHRL&Auml;SSIGKEIT ODER ANDERWEITIG), DIE IN
-IRGENDEINER WEISE DURCH DIE VERWENDUNG DIESER SOFTWARE ENTSTEHEN, AUCH DANN,
-WENN DIE AUTOREN &Uuml;BER DIE M&Ouml;GLICHKEIT SOLCHER SCH&Auml;DEN UNTERRICHTET WURDEN.
-</p>
-
-</body>
-</html>
-
diff --git a/config/ia/locales/de/custom b/config/ia/locales/de/custom
deleted file mode 100644
index dab01ab460..0000000000
--- a/config/ia/locales/de/custom
+++ /dev/null
@@ -1,258 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: German (de)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /tmp/IA_Build_scala/scala.iap_xml
-# Generated: Thu Apr 08 09:54:21 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# ChooseJavaVMAction.55fb9178abea.header=Please Choose a Java VM for Use by the Installed Application
-ChooseJavaVMAction.55fb9178abea.header=Bitte w\u00E4hlen Sie eine Java-VM die von der installierten Anwendung verwendet werden soll.
-
-# ChooseJavaVMAction.55fb9178abea.title=Choose Java Virtual Machine
-ChooseJavaVMAction.55fb9178abea.title=Java Virtual Machine ausw\u00E4hlen
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Die Archivdateien werden extraiert ...
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Die Archivdateien werden extraiert ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Anwendung
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Hiermit wird die Anwendungsfunktion installiert.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=Bitte w\u00E4hlen Sie einen Zielordner f\u00FCr diese Installation aus.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Wo soll installiert werden?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Installationsordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Einf\u00FChrung
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Lizenzvertrag
-
-# Installer.3c471adea52a.installLabels.02=Choose Java Virtual Machine
-Installer.3c471adea52a.installLabels.02=Java Virtual Machine ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.03=Choose Install Folder
-Installer.3c471adea52a.installLabels.03=Zielordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.04=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.04=Zusammenfassung vor der Installation
-
-# Installer.3c471adea52a.installLabels.05=Installing...
-Installer.3c471adea52a.installLabels.05=Programm wird installiert...
-
-# Installer.3c471adea52a.installLabels.06=Install Complete
-Installer.3c471adea52a.installLabels.06=Installation abgeschlossen
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=Das Installationsprogramm kann unter Ihrer Systemkonfiguration nicht ausgef\u00FChrt werden. Es wird jetzt beendet.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installationsprogramm
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a\u000A\u000Aspecial focus on web services. It combines object-oriented,\u000A\u000Afunctional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind schwerwiegende Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Herzlichen Gl\u00FCckwunsch! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ wurde erfolgreich im folgenden Verzeichnis installiert:\u000A\u000A $USER_INSTALL_DIR$
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Warnungen w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Sie sollten das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Sie m\u00FCssen das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Installation abgeschlossen
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Deinstallation von $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Die am h\u00E4ufigsten verwendeten Funktionen der Anwendung werden installiert. Diese Option wird f\u00FCr die meisten Anwendungsf\u00E4lle empfohlen.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=W\u00E4hlen Sie diese Option, um die zu installierenden Funktionen anzupassen.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Benutzerdefiniert
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=\u00DCberpr\u00FCfen Sie bitte das Folgende bevor Sie fortfahren:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Zusammenfassung vor der Installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$.\u000A\u000A$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere f\u00FChrt Sie durch die Installation von $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ setzt Sun JDK/JRE Version 1.4 oder neuer voraus.\u000A\u000AEs wird dringend empfohlen, dass Sie alle Programme beenden, bevor Sie die Installation fortsetzen.\u000A\u000AKlicken Sie auf \u0027Weiter\u0027, um zum n\u00E4chsten Bildschirm zu wechseln. Wenn Sie eine Einstellung auf einem vorherigen Bildschirm \u00E4ndern wollen, klicken Sie auf \u0027Zur\u00FCck\u0027.\u000A\u000ASie k\u00F6nnen die Installation jederzeit abbrechen, indem Sie auf \u0027Abbrechen\u0027 klicken.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Einf\u00FChrung
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_de.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=F\u00FCr die Installation und die Verwendung von $PRODUCT_NAME$ m\u00FCssen Sie den folgenden Lizenzvertrag akzeptieren:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Lizenzvertrag
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=
-
-# MakeRegEntry.d98731608134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d98731608134.key=
-
-# MakeRegEntry.d98731608134.value=%SCALA_HOME%\u005Cbin
-MakeRegEntry.d98731608134.value=
-
-# MakeRegEntry.d98731608134.valueName=PATH
-MakeRegEntry.d98731608134.valueName=
-
diff --git a/config/ia/locales/de/custom_unix b/config/ia/locales/de/custom_unix
deleted file mode 100644
index e8740994b6..0000000000
--- a/config/ia/locales/de/custom_unix
+++ /dev/null
@@ -1,228 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: German (de)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_unix.iap_xml
-# Generated: Tue Jul 27 15:08:41 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Die Archivdateien werden extraiert ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Anwendung
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Hiermit wird die Anwendungsfunktion installiert.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=Bitte w\u00E4hlen Sie einen Zielordner f\u00FCr diese Installation aus.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Wo soll installiert werden?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Installationsordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Einf\u00FChrung
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Lizenzvertrag
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=Installationsordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=Zusammenfassung vor der Installation
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Programm wird installiert...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=Installation abgeschlossen
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=Das Installationsprogramm kann unter Ihrer Systemkonfiguration nicht ausgef\u00FChrt werden. Es wird jetzt beendet.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installationsprogramm
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind schwerwiegende Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Herzlichen Gl\u00FCckwunsch! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ wurde erfolgreich im folgenden Verzeichnis installiert:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000ADie $PRODUCT_NAME$ Tools verwenden die Variable PATH um die Java VM zu finden.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Warnungen w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Sie sollten das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Sie m\u00FCssen das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Installation abgeschlossen
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Deinstallation von $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Die am h\u00E4ufigsten verwendeten Funktionen der Anwendung werden installiert. Diese Option wird f\u00FCr die meisten Anwendungsf\u00E4lle empfohlen.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=W\u00E4hlen Sie diese Option, um die zu installierenden Funktionen anzupassen.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Benutzerdefiniert
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=\u00DCberpr\u00FCfen Sie bitte das Folgende bevor Sie fortfahren:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Zusammenfassung vor der Installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=Deinstallation von $PRODUCT_NAME$
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere f\u00FChrt Sie durch die Installation von $PRODUCT_NAME$.\u000A\u000AEs wird dringend empfohlen, dass Sie alle Programme beenden, bevor Sie die Installation fortsetzen.\u000A\u000AKlicken Sie auf \u0027Weiter\u0027, um zum n\u00E4chsten Bildschirm zu wechseln.\u000A\u000AWenn Sie eine Einstellung auf einem vorherigen Bildschirm \u00E4ndern wollen, klicken Sie auf \u0027Zur\u00FCck\u0027.\u000A\u000ASie k\u00F6nnen die Installation jederzeit abbrechen, indem Sie auf \u0027Abbrechen\u0027 klicken.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Einf\u00FChrung
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_de.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=F\u00FCr die Installation und die Verwendung von $PRODUCT_NAME$ m\u00FCssen Sie den folgenden Lizenzvertrag akzeptieren:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Lizenzvertrag
-
diff --git a/config/ia/locales/de/custom_win32 b/config/ia/locales/de/custom_win32
deleted file mode 100644
index 3fdfae7017..0000000000
--- a/config/ia/locales/de/custom_win32
+++ /dev/null
@@ -1,237 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: German (de)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_win32.iap_xml
-# Generated: Tue Jul 27 15:08:07 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Die Archivdateien werden extraiert ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Anwendung
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Hiermit wird die Anwendungsfunktion installiert.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=Bitte w\u00E4hlen Sie einen Zielordner f\u00FCr diese Installation aus.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Wo soll installiert werden?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Installationsordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Einf\u00FChrung
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Installationsordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=$SHORTCUT_NAME$-Ordner ausw\u00E4hlen
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=Zusammenfassung vor der Installation
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Programm wird installiert...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=Installation abgeschlossen
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=Das Installationsprogramm kann unter Ihrer Systemkonfiguration nicht ausgef\u00FChrt werden. Es wird jetzt beendet.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installationsprogramm
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind schwerwiegende Fehler w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Herzlichen Gl\u00FCckwunsch! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ wurde erfolgreich im folgenden Verzeichnis installiert:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000ADie $PRODUCT_NAME$ Tools verwenden die Variable PATH um die Java VM zu finden.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=Die Installation von $PRODUCT_NAME$ ist abgeschlossen, jedoch sind Warnungen w\u00E4hrend der Installation aufgetreten. Bitte entnehmen Sie dem Installationsprotokoll genauere Informationen.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Sie sollten das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Sie m\u00FCssen das System neu starten, um die Installation abzuschlie\u00DFen.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Installation abgeschlossen
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Deinstallation von $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Die am h\u00E4ufigsten verwendeten Funktionen der Anwendung werden installiert. Diese Option wird f\u00FCr die meisten Anwendungsf\u00E4lle empfohlen.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=W\u00E4hlen Sie diese Option, um die zu installierenden Funktionen anzupassen.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Benutzerdefiniert
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=\u00DCberpr\u00FCfen Sie bitte das Folgende bevor Sie fortfahren:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Zusammenfassung vor der Installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=Deinstallation von $PRODUCT_NAME$
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere f\u00FChrt Sie durch die Installation von $PRODUCT_NAME$.\u000A\u000AEs wird dringend empfohlen, dass Sie alle Programme beenden, bevor Sie die Installation fortsetzen.\u000A\u000AKlicken Sie auf \u0027Weiter\u0027, um zum n\u00E4chsten Bildschirm zu wechseln.\u000A\u000AWenn Sie eine Einstellung auf einem vorherigen Bildschirm \u00E4ndern wollen, klicken Sie auf \u0027Zur\u00FCck\u0027.\u000A\u000ASie k\u00F6nnen die Installation jederzeit abbrechen, indem Sie auf \u0027Abbrechen\u0027 klicken.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Einf\u00FChrung
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_de.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=F\u00FCr die Installation und die Verwendung von $PRODUCT_NAME$ m\u00FCssen Sie den folgenden Lizenzvertrag akzeptieren:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Lizenzvertrag
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=
-
diff --git a/config/ia/locales/en/LICENSE.html b/config/ia/locales/en/LICENSE.html
deleted file mode 100644
index 59ef4cc4e0..0000000000
--- a/config/ia/locales/en/LICENSE.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html>
-
-<head>
- <style type="text/css">
- <!--
- body { font-family:Helvetica,Arial,Sans-Serif; }
- div.title { font-weight:bold; }
- p { font-size:small; }
- li { font-size:small; margin:0px 0px 6px 0px; }
- -->
- </style>
-</head>
-
-<body>
-
-<div class="title">
-SCALA LICENSE
-</div>
-
-<p>
-Copyright &copy; 2002-05 <a href="http://www.epfl.ch/">EPFL</a>, Lausanne.
-All rights reserved.
-</p>
-
-<p>
-This software was developed by the Programming Methods Laboratory of
-the Swiss Federal Institute of Technology, Lausanne, Switzerland.
-</p>
-
-<p>
-Permission to use, copy, modify, and distribute this software in source
-or binary form for any purpose with or without fee is hereby granted,
-provided that the following conditions are met:
-</p>
-
-<ol>
- <li>
- Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- </li>
- <li>
- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- </li>
- <li>
- Neither the name of the EPFL nor the names of its contributors
- may be used to endorse or promote products derived from this
- software without specific prior written permission.
- </li>
-</ol>
-
-<p>
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-</p>
-
-</body>
-</html>
diff --git a/config/ia/locales/en/custom b/config/ia/locales/en/custom
deleted file mode 100644
index e2112ad1a4..0000000000
--- a/config/ia/locales/en/custom
+++ /dev/null
@@ -1,258 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: English (en)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /tmp/IA_Build_scala/scala.iap_xml
-# Generated: Thu Apr 08 09:54:21 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=billboard_default.png
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-
-# ChooseJavaVMAction.55fb9178abea.header=Please Choose a Java VM for Use by the Installed Application
-ChooseJavaVMAction.55fb9178abea.header=Please Choose a Java VM for Use by the Installed Application
-
-# ChooseJavaVMAction.55fb9178abea.title=Choose Java Virtual Machine
-ChooseJavaVMAction.55fb9178abea.title=Choose Java Virtual Machine
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=$PRODUCT_NAME$ API Documentation
-CreateShortcut.ceb023208130.destinationName=$PRODUCT_NAME$ API Documentation
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=Scala by Example
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Binaries
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=This installs the application feature.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=License Agreement
-
-# Installer.3c471adea52a.installLabels.02=Choose Java Virtual Machine
-Installer.3c471adea52a.installLabels.02=Choose Java Virtual Machine
-
-# Installer.3c471adea52a.installLabels.03=Choose Install Folder
-Installer.3c471adea52a.installLabels.03=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.04=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.04=Pre-Installation Summary
-
-# Installer.3c471adea52a.installLabels.05=Installing...
-Installer.3c471adea52a.installLabels.05=Installing...
-
-# Installer.3c471adea52a.installLabels.06=Install Complete
-Installer.3c471adea52a.installLabels.06=Install Complete
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=install
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a\u000A\u000Aspecial focus on web services. It combines object-oriented,\u000A\u000Afunctional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a\u000A\u000Aspecial focus on web services. It combines object-oriented,\u000A\u000Afunctional and concurrent elements.
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=Scala
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=typical.png
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Binary Distribution
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=customIcon.png
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Custom
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall $PRODUCT_NAME$
-InstallUninstaller.3c471b2da533.destinationName=Uninstall $PRODUCT_NAME$
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-
-# MakeRegEntry.d98731608134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d98731608134.key=HKEY_CURRENT_USER\u005CEnvironment
-
-# MakeRegEntry.d98731608134.value=%SCALA_HOME%\u005Cbin
-MakeRegEntry.d98731608134.value=%SCALA_HOME%\u005Cbin
-
-# MakeRegEntry.d98731608134.valueName=PATH
-MakeRegEntry.d98731608134.valueName=PATH
-
diff --git a/config/ia/locales/en/custom_unix b/config/ia/locales/en/custom_unix
deleted file mode 100644
index 2439133c6e..0000000000
--- a/config/ia/locales/en/custom_unix
+++ /dev/null
@@ -1,228 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: English (en)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_unix.iap_xml
-# Generated: Tue Jul 27 15:08:41 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=billboard_default.png
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=Scala by Example
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Binaries
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=This installs the application feature.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=License Agreement
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Installing...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=Install Complete
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=install
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=Scala
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000AThe $PRODUCT_NAME$ tools rely on the variable PATH to find a Java VM.\u000A\u000APress \u0022Done\u0022 to quit the installer.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=typical.png
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Binary Distribution
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=customIcon.png
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Custom
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-
diff --git a/config/ia/locales/en/custom_win32 b/config/ia/locales/en/custom_win32
deleted file mode 100644
index b52938acb8..0000000000
--- a/config/ia/locales/en/custom_win32
+++ /dev/null
@@ -1,237 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: English (en)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_win32.iap_xml
-# Generated: Tue Jul 27 15:08:07 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=billboard_default.png
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=Scala by Example
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Binaries
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=This installs the application feature.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=License Agreement
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=Choose Install Folder
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Installing...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=Install Complete
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=install
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=Scala
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000AThe $PRODUCT_NAME$ tools rely on the variable PATH to find a Java VM.\u000A\u000APress \u0022Done\u0022 to quit the installer.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=typical.png
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Binary Distribution
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=customIcon.png
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Custom
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-
diff --git a/config/ia/locales/fr/LICENSE.html b/config/ia/locales/fr/LICENSE.html
deleted file mode 100644
index dab0ccd677..0000000000
--- a/config/ia/locales/fr/LICENSE.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<html>
-
-<head>
- <style type="text/css">
- <!--
- body { font-family:Helvetica,Arial,Sans-Serif; }
- div.title { font-weight:bold; }
- p { font-size:small; }
- li { font-size:small; margin:0px 0px 6px 0px; }
- -->
- </style>
-</head>
-
-<body>
-
-<div class="title">
-LICENCE SCALA
-</div>
-
-<p>
-Copyright &copy; 2002-05 <a href="http://www.epfl.ch/">EPFL</a>, Lausanne.
-Tous droits r&eacute;serv&eacute;s.
-</p>
-
-<p>
-Ce logiciel a &eacute;t&eacute; d&eacute;velopp&eacute; par le Laboratoire
-des M&eacute;thodes de Programmation de l'Ecole Polytechnique
-F&eacute;d&eacute;rale de Lausanne (EPFL), Suisse.
-</p>
-
-<p>
-L'utilisation, la modification et la redistribution de ce logiciel sous forme
-de code source et/ou binaire, dans un but commercial ou non, sont permis
-&eacute;tant entendu que les conditions suivantes sont satisfaites:
-</p>
-
-<ol>
- <li>
- Toute redistribution du code source doit contenir la notice de droits
- d'auteur ci-dessus, la pr&eacute;sente liste des conditions
- d'utilisation et l'avis de non-responsabilit&eacute; mentionn&eacute;
- plus bas.
- </li>
- <li>
- Toute redistribution du code binaire doit contenir la notice de droits
- d'auteur ci-dessus, la pr&eacute;sente liste des conditions d'utilisation
- et l'avis de non-responsabilit&eacute; mentionn&eacute; plus bas dans
- la documentation et/ou tout autre support fourni dans la distribution.
- </li>
- <li>
- Ni le nom de l'EPFL, ni celui des personnes qui ont
- contribu&eacute; au d&eacute;veloppement de ce logiciel ne peuvent
- &ecirc;tre utilis&eacute;s dans le but de promouvoir des produits
- d&eacute;riv&eacute;s de ce logiciel sans permission &eacute;crite
- pr&eacute;alable.
- </li>
-</ol>
-
-<p>
-CE LOGICIEL EST FOURNI "EN L'&Eacute;TAT" SANS GARANTIE AUCUNE QUANT
-&Agrave; SON UTILISATION, Y COMPRIS, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. EN AUCUN CAS L'UNIVERSIT&Eacute; OU QUICONQUE AYANT
-CONTRIBU&Eacute; AU D&Eacute;VELOPPEMENT DU LOGICIEL NE SAURAIT &Ecirc;TRE
-TENU RESPONSABLE DE TOUS DOMMAGES DIRECTS OU INDIRECTS, CONS&Eacute;CUTIFS
-&Agrave; L'UTILISATION DU LOGICIEL ET, NOTAMMENT DE TOUTES PERTES DE PROFITS
-OU MANQUES &Agrave; GAGNER, PERTE D'INFORMATION, D&Eacute;FAILLANCE
-D'ORDINATEUR, INTERRUPTION DE TRAVAIL OU AUTRES D&Eacute;G&Acirc;TS, ET
-CELA QUAND BIEN M&Ecirc;ME UN REPR&Eacute;SENTANT DE L'UNIVERSIT&Eacute;
-AURAIT &Eacute;T&Eacute; INFORM&Eacute; DE LA POSSIBILIT&Eacute; DE TELS
-DOMMAGES.
-</p>
-
-<p>
-Seule la version anglaise de ce contrat fait foi juridiquement.
-Les traductions en d'autres langues sont fournies aux usagers &agrave;
-titre indicatif, mais elles ne sont pas n&eacute;cessairement exactes
-d'un point de vue juridique.
-</p>
-
-</body>
-</html>
diff --git a/config/ia/locales/fr/custom b/config/ia/locales/fr/custom
deleted file mode 100644
index c9008b97c9..0000000000
--- a/config/ia/locales/fr/custom
+++ /dev/null
@@ -1,258 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: French (fr)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /tmp/IA_Build_scala/scala.iap_xml
-# Generated: Thu Apr 08 09:54:21 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# ChooseJavaVMAction.55fb9178abea.header=Please Choose a Java VM for Use by the Installed Application
-ChooseJavaVMAction.55fb9178abea.header=S\u00E9lectionnez une Machine Virtuelle Java pour l\u0027application install\u00E9e
-
-# ChooseJavaVMAction.55fb9178abea.title=Choose Java Virtual Machine
-ChooseJavaVMAction.55fb9178abea.title=S\u00E9lection de la VM Java
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=$PRODUCT_NAME$ API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=Interpr\u00E9teur $PRODUCT_NAME$
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Extraction des fichiers ...
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Extraction des fichiers ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Application
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Installe la fonction requise pour les programmes.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=S\u00E9lectionnez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Sp\u00E9cifiez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Contrat de licence
-
-# Installer.3c471adea52a.installLabels.02=Choose Java Virtual Machine
-Installer.3c471adea52a.installLabels.02=S\u00E9lection de la Java VM
-
-# Installer.3c471adea52a.installLabels.03=Choose Install Folder
-Installer.3c471adea52a.installLabels.03=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.04=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.04=R\u00E9sum\u00E9 avant installation
-
-# Installer.3c471adea52a.installLabels.05=Installing...
-Installer.3c471adea52a.installLabels.05=Installation en cours...
-
-# Installer.3c471adea52a.installLabels.06=Install Complete
-Installer.3c471adea52a.installLabels.06=L\u0027installation est termin\u00E9e.
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=L\u0027installation est impossible avec votre configuration. Elle va \u00EAtre abandonn\u00E9e.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Intaller
-InstallerInfoData.3c471ae5a52b.installerTitle=Assistant Scala
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a\u000A\u000Aspecial focus on web services. It combines object-oriented,\u000A\u000Afunctional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais des erreurs graves se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ a \u00E9t\u00E9 install\u00E9 dans :\u000A\u000A $USER_INSTALL_DIR$
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=L\u0027installation est termin\u00E9e.
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=D\u00E9sinstalle $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Le programme va installer les fonctions de base de l\u0027application. Cette option est recommand\u00E9e pour la plupart des utilisateurs.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Activez cette option pour s\u00E9lectionner les fonctions \u00E0 installer.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Personnalis\u00E9e
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Avant de poursuivre veuillez prendre connaissance des informations ci-dessous :
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=R\u00E9sum\u00E9 avant installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall $PRODUCT_NAME$
-InstallUninstaller.3c471b2da533.destinationName=
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$.\u000A\u000A$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere va vous guider pendant l\u0027installation de $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ n\u00E9cessite Sun JDK/JRE version 1.4 ou ult\u00E9rieure.\u000A\u000AIl est fortement recommand\u00E9 de quitter toutes les applications actives avant de poursuivre l\u0027installation.\u000A\u000APour continuer, cliquez sur \u0027Suivant\u0027. Pour r\u00E9afficher un \u00E9cran ant\u00E9rieur, cliquez sur \u0027Pr\u00E9c\u00E9dent\u0027.\u000A\u000AVous pouvez abandonner l\u0027installation \u00E0 tout moment en cliquant sur \u0027Annuler\u0027.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_fr.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Pour pouvoir installer et utiliser $PRODUCT_NAME$ vous devez accepter les termes du contrat de licence suivant :
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Contrat de licence
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=
-
-# MakeRegEntry.d98731608134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d98731608134.key=
-
-# MakeRegEntry.d98731608134.value=%SCALA_HOME%\u005Cbin
-MakeRegEntry.d98731608134.value=
-
-# MakeRegEntry.d98731608134.valueName=PATH
-MakeRegEntry.d98731608134.valueName=
-
diff --git a/config/ia/locales/fr/custom_unix b/config/ia/locales/fr/custom_unix
deleted file mode 100644
index f98fd411b3..0000000000
--- a/config/ia/locales/fr/custom_unix
+++ /dev/null
@@ -1,228 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: French (fr)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_unix.iap_xml
-# Generated: Tue Jul 27 15:08:41 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=$PRODUCT_NAME$ API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=Interpr\u00E9teur $PRODUCT_NAME$
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.7b076ed5bd40.dialogLabel=Extracting files from archive ...
-ExecuteScript.7b076ed5bd40.dialogLabel=Extraction des fichiers ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Application
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Installe la fonction requise pour les programmes.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=S\u00E9lectionnez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Sp\u00E9cifiez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Contrat de licence
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=R\u00E9sum\u00E9 avant installation
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Installation en cours...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=L\u0027installation est termin\u00E9e.
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=L\u0027installation est impossible avec votre configuration. Elle va \u00EAtre abandonn\u00E9e.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Assistant $PRODUCT_NAME$
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais des erreurs graves se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ a \u00E9t\u00E9 install\u00E9 dans :\u000A\u000A $USER_INSTALL_DIR$\u000A\u000ALes outils $PRODUCT_NAME$ utilisent la variable PATH pour trouver la machine virtuelle Java.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=L\u0027installation est termin\u00E9e.
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=D\u00E9sinstalle $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Le programme va installer les fonctions de base de l\u0027application. Cette option est recommand\u00E9e pour la plupart des utilisateurs.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Activez cette option pour s\u00E9lectionner les fonctions \u00E0 installer.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Personnalis\u00E9e
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Avant de poursuivre veuillez prendre connaissance des informations ci-dessous :
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=R\u00E9sum\u00E9 avant installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall $PRODUCT_NAME$
-InstallUninstaller.3c471b2da533.destinationName=
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere va vous guider pendant l\u0027installation de $PRODUCT_NAME$.\u000A\u000AIl est fortement recommand\u00E9 de quitter toutes les applications actives avant de poursuivre l\u0027installation.\u000A\u000APour continuer, cliquez sur \u0027Suivant\u0027.\u000A\u000APour r\u00E9afficher un \u00E9cran ant\u00E9rieur, cliquez sur \u0027Pr\u00E9c\u00E9dent\u0027.\u000A\u000AVous pouvez abandonner l\u0027installation \u00E0 tout moment en cliquant sur \u0027Annuler\u0027.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_fr.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Pour pouvoir installer et utiliser $PRODUCT_NAME$ vous devez accepter les termes du contrat de licence suivant :
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Contrat de licence
-
diff --git a/config/ia/locales/fr/custom_win32 b/config/ia/locales/fr/custom_win32
deleted file mode 100644
index 1f85de2693..0000000000
--- a/config/ia/locales/fr/custom_win32
+++ /dev/null
@@ -1,237 +0,0 @@
-# InstallAnywhere Localization File
-#
-# External strings for locale: French (fr)
-# See the 'ProjectLocalizationInfo.txt' file in this same directory for information
-# regarding mappings between the properties shown below and your InstallAnywhere
-# project.
-#
-# External/Locale property names can take one of three forms:
-# <ActionName>.<ReferenceID>.<ActionProperty> (e.g., Installer.858175031081.productName)
-# <ActionName>.<ReferenceID>.<ActionProperty>.<Index> (e.g., Installer.858175031081.installLabels.01)
-# - where the <ActionProperty> is a Vector and the <Index> represents the place within the
-# Vector where the value of the property should be inserted
-# _ia.<SomeProperty> (e.g., _ia.MyCustomCodePanelProperty)
-# - where <SomeProperty> is used as an identifier for a localized value by custom code
-#
-# External/Locale property values should be plain text strings. Special or i18n characters
-# that cannot be represented by ASCII characters should be written using escaped unicode.
-# - see the utility 'native2ascii' distributed with your JDK
-#
-# Product Name: Scala
-# Project File: /home/michelou/projects/scala/config/ia/scala_win32.iap_xml
-# Generated: Tue Jul 27 15:08:07 CEST 2004
-
-
-# Billboard.3c471b21a52c.imageName=billboard_default.png
-Billboard.3c471b21a52c.imageName=
-
-# Billboard.3c471b21a52c.imagePath=com/zerog/ia/installer/images/
-Billboard.3c471b21a52c.imagePath=
-
-# CreateShortcut.ceb023208130.args=
-CreateShortcut.ceb023208130.args=
-
-# CreateShortcut.ceb023208130.destinationName=Scala API Documentation
-CreateShortcut.ceb023208130.destinationName=
-
-# CreateShortcut.ceb023208130.workingDir=
-CreateShortcut.ceb023208130.workingDir=
-
-# CreateShortcut.cf116791816c.args=
-CreateShortcut.cf116791816c.args=
-
-# CreateShortcut.cf116791816c.destinationName=Uninstall $PRODUCT_NAME$
-CreateShortcut.cf116791816c.destinationName=
-
-# CreateShortcut.cf116791816c.workingDir=
-CreateShortcut.cf116791816c.workingDir=
-
-# CreateShortcut.cf13ae0381ad.args=
-CreateShortcut.cf13ae0381ad.args=
-
-# CreateShortcut.cf13ae0381ad.destinationName=Scala Reference
-CreateShortcut.cf13ae0381ad.destinationName=
-
-# CreateShortcut.cf13ae0381ad.workingDir=
-CreateShortcut.cf13ae0381ad.workingDir=
-
-# CreateShortcut.cf1433cf81ad.args=
-CreateShortcut.cf1433cf81ad.args=
-
-# CreateShortcut.cf1433cf81ad.destinationName=Scala Tutorial
-CreateShortcut.cf1433cf81ad.destinationName=
-
-# CreateShortcut.cf1433cf81ad.workingDir=
-CreateShortcut.cf1433cf81ad.workingDir=
-
-# CreateShortcut.cf1c65588134.args=
-CreateShortcut.cf1c65588134.args=
-
-# CreateShortcut.cf1c65588134.destinationName=Scala by Example
-CreateShortcut.cf1c65588134.destinationName=
-
-# CreateShortcut.cf1c65588134.workingDir=
-CreateShortcut.cf1c65588134.workingDir=
-
-# CreateShortcut.d39fab9b812e.args=
-CreateShortcut.d39fab9b812e.args=
-
-# CreateShortcut.d39fab9b812e.destinationName=$PRODUCT_NAME$ Interpreter
-CreateShortcut.d39fab9b812e.destinationName=
-
-# CreateShortcut.d39fab9b812e.workingDir=
-CreateShortcut.d39fab9b812e.workingDir=
-
-# ExecuteScript.e78acd58b1b0.dialogLabel=Extracting files from archive ...
-ExecuteScript.e78acd58b1b0.dialogLabel=Extraction des fichiers ...
-
-# InstallBundle.3c471b25a52d.bundleName=Binaries
-InstallBundle.3c471b25a52d.bundleName=Application
-
-# InstallBundle.3c471b25a52d.description=This installs the application feature.
-InstallBundle.3c471b25a52d.description=Installe la fonction requise pour les programmes.
-
-# InstallDirAction.3c471b29a52f.additionalText=
-InstallDirAction.3c471b29a52f.additionalText=S\u00E9lectionnez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.prompt=Where Would You Like to Install?
-InstallDirAction.3c471b29a52f.prompt=Sp\u00E9cifiez le dossier d\u0027installation.
-
-# InstallDirAction.3c471b29a52f.stepTitle=Choose Install Folder
-InstallDirAction.3c471b29a52f.stepTitle=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.00=Introduction
-Installer.3c471adea52a.installLabels.00=Introduction
-
-# Installer.3c471adea52a.installLabels.01=License Agreement
-Installer.3c471adea52a.installLabels.01=Contrat de licence
-
-# Installer.3c471adea52a.installLabels.02=Choose Install Folder
-Installer.3c471adea52a.installLabels.02=S\u00E9lection du dossier d\u0027installation
-
-# Installer.3c471adea52a.installLabels.03=Pre-Installation Summary
-Installer.3c471adea52a.installLabels.03=R\u00E9sum\u00E9 avant installation
-
-# Installer.3c471adea52a.installLabels.04=Installing...
-Installer.3c471adea52a.installLabels.04=Installation en cours...
-
-# Installer.3c471adea52a.installLabels.05=Install Complete
-Installer.3c471adea52a.installLabels.05=L\u0027installation est termin\u00E9e.
-
-# Installer.3c471adea52a.rulesFailedMessage=The installer cannot run on your configuration. It will now quit.
-Installer.3c471adea52a.rulesFailedMessage=L\u0027installation est impossible avec votre configuration. Elle va \u00EAtre abandonn\u00E9e.
-
-# InstallerInfoData.3c471ae5a52b.email=scala@listes.epfl.ch
-InstallerInfoData.3c471ae5a52b.email=
-
-# InstallerInfoData.3c471ae5a52b.installerName=install
-InstallerInfoData.3c471ae5a52b.installerName=
-
-# InstallerInfoData.3c471ae5a52b.installerTitle=Scala Installer
-InstallerInfoData.3c471ae5a52b.installerTitle=Assistant $PRODUCT_NAME$
-
-# InstallerInfoData.3c471ae5a52b.productDescription=Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.
-InstallerInfoData.3c471ae5a52b.productDescription=
-
-# InstallerInfoData.3c471ae5a52b.productName=Scala
-InstallerInfoData.3c471ae5a52b.productName=
-
-# InstallerInfoData.3c471ae5a52b.productURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.productURL=
-
-# InstallerInfoData.3c471ae5a52b.supportURL=http://scala.epfl.ch/
-InstallerInfoData.3c471ae5a52b.supportURL=
-
-# InstallerInfoData.3c471ae5a52b.vendorName=LAMP - EPFL
-InstallerInfoData.3c471ae5a52b.vendorName=
-
-# InstallerInfoData.3c471ae5a52b.vendorURL=http://lampwww.epfl.ch/
-InstallerInfoData.3c471ae5a52b.vendorURL=
-
-# InstallFinishAction.3c471b2ba531.installErrorMessage=The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installErrorMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installFatalMessage=The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installFatalMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais des erreurs graves se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.installSuccessMessage=Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:\u000A\u000A $USER_INSTALL_DIR$\u000A\u000APress \u0022Done\u0022 to quit the installer.
-InstallFinishAction.3c471b2ba531.installSuccessMessage=$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ a \u00E9t\u00E9 install\u00E9 dans :\u000A\u000A $USER_INSTALL_DIR$\u000A\u000ALes outils $PRODUCT_NAME$ utilisent la variable PATH pour trouver la machine virtuelle Java.
-
-# InstallFinishAction.3c471b2ba531.installWarningMessage=The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.
-InstallFinishAction.3c471b2ba531.installWarningMessage=L\u0027installation de $PRODUCT_NAME$ est termin\u00E9e, mais certaines erreurs se sont produites (pour plus de d\u00E9tails, consultez le fichier-journal d\u0027installation).
-
-# InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-InstallFinishAction.3c471b2ba531.rebootNotNeededMessage=
-
-# InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=You should restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRecommendedMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.rebootRequiredMessage=You need to restart the system to complete the installation.
-InstallFinishAction.3c471b2ba531.rebootRequiredMessage=Pour valider l\u0027installation, vous devez red\u00E9marrer l\u0027ordinateur.
-
-# InstallFinishAction.3c471b2ba531.windowTitle=Install Complete
-InstallFinishAction.3c471b2ba531.windowTitle=L\u0027installation est termin\u00E9e.
-
-# InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=Uninstall $PRODUCT_NAME$
-InstallFrameConfigurator.3c471af3a52c.uninstallerTitle=D\u00E9sinstalle $PRODUCT_NAME$
-
-# InstallSet.3c471b26a52c.description=This will install the binary files for the $PRODUCT_NAME$ software.
-InstallSet.3c471b26a52c.description=Le programme va installer les fonctions de base de l\u0027application. Cette option est recommand\u00E9e pour la plupart des utilisateurs.
-
-# InstallSet.3c471b26a52c.imageName=typical.png
-InstallSet.3c471b26a52c.imageName=
-
-# InstallSet.3c471b26a52c.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c471b26a52c.imagePath=
-
-# InstallSet.3c471b26a52c.installSetName=Binary Distribution
-InstallSet.3c471b26a52c.installSetName=Standard
-
-# InstallSet.3c490688a568.description=Choose this option to customize the features to be installed.
-InstallSet.3c490688a568.description=Activez cette option pour s\u00E9lectionner les fonctions \u00E0 installer.
-
-# InstallSet.3c490688a568.imageName=customIcon.png
-InstallSet.3c490688a568.imageName=
-
-# InstallSet.3c490688a568.imagePath=com/zerog/ia/installer/images/
-InstallSet.3c490688a568.imagePath=
-
-# InstallSet.3c490688a568.installSetName=Custom
-InstallSet.3c490688a568.installSetName=Personnalis\u00E9e
-
-# InstallSummary.3c471b2ba530.stepPrompt=Please Review the Following Before Continuing:
-InstallSummary.3c471b2ba530.stepPrompt=Avant de poursuivre veuillez prendre connaissance des informations ci-dessous :
-
-# InstallSummary.3c471b2ba530.title=Pre-Installation Summary
-InstallSummary.3c471b2ba530.title=R\u00E9sum\u00E9 avant installation
-
-# InstallUninstaller.3c471b2da533.destinationName=Uninstall scala
-InstallUninstaller.3c471b2da533.destinationName=
-
-# IntroAction.3c471b27a52f.message=InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.\u000A\u000A$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.\u000A\u000AClick the \u0027Next\u0027 button to proceed to the next screen. If you want to change something on a previous screen, click the \u0027Previous\u0027 button.\u000A\u000AYou may cancel this installation at any time by clicking the \u0027Cancel\u0027 button.
-IntroAction.3c471b27a52f.message=InstallAnywhere va vous guider pendant l\u0027installation de $PRODUCT_NAME$.\u000A\u000AIl est fortement recommand\u00E9 de quitter toutes les applications actives avant de poursuivre l\u0027installation.\u000A\u000APour continuer, cliquez sur \u0027Suivant\u0027.\u000A\u000APour r\u00E9afficher un \u00E9cran ant\u00E9rieur, cliquez sur \u0027Pr\u00E9c\u00E9dent\u0027.\u000A\u000AVous pouvez abandonner l\u0027installation \u00E0 tout moment en cliquant sur \u0027Annuler\u0027.
-
-# IntroAction.3c471b27a52f.stepTitle=Introduction
-IntroAction.3c471b27a52f.stepTitle=Introduction
-
-# LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_en.html
-LicenseAgrAction.71a1c92bbcfa.resourceName=LICENSE_fr.html
-
-# LicenseAgrAction.71a1c92bbcfa.resourcePath=/tmp/IA_Build_scala
-LicenseAgrAction.71a1c92bbcfa.resourcePath=
-
-# LicenseAgrAction.71a1c92bbcfa.stepPrompt=Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:
-LicenseAgrAction.71a1c92bbcfa.stepPrompt=Pour pouvoir installer et utiliser $PRODUCT_NAME$ vous devez accepter les termes du contrat de licence suivant :
-
-# LicenseAgrAction.71a1c92bbcfa.title=License Agreement
-LicenseAgrAction.71a1c92bbcfa.title=Contrat de licence
-
-# MakeRegEntry.d9860f888134.key=HKEY_CURRENT_USER\u005CEnvironment
-MakeRegEntry.d9860f888134.key=
-
-# MakeRegEntry.d9860f888134.value=$USER_INSTALL_DIR$
-MakeRegEntry.d9860f888134.value=
-
-# MakeRegEntry.d9860f888134.valueName=SCALA_HOME
-MakeRegEntry.d9860f888134.valueName=
-
diff --git a/config/ia/scala.iap_xml b/config/ia/scala.iap_xml
deleted file mode 100644
index 6019909844..0000000000
--- a/config/ia/scala.iap_xml
+++ /dev/null
@@ -1,2521 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- This script was automatically generated using Zero G's InstallAnywhere 5.5.1 Standard, Build 2032
- STATUS: Fully Functional LICENSED Edition
- DATE: Thu Apr 08 17:40:08 CEST 2004 -->
-<InstallAnywhere_Deployment_Project increments="1998">
- <!-- ** DO NOT EDIT ** Essential authorization and configuration data ** DO NOT EDIT ** -->
- <essentialScriptInfo>
- <versionID major="5" minor="5" revision="1"/>
- <editionID>53,46,53,46,49,32,83,116,97,110,100,97,114,100,32,66,117,105,108,100,32,50,48,51,50</editionID>
- <scriptID>12,42,11,90,77,49,48,53,53,85,78,57,55,55,50,65</scriptID>
- <buildID>3,13,71,76,105,110,117,120,44,32,50,46,52,46,50,48,45,51,48,46,57,44,32,105,51,56,54,59,32,74,97,118,97,32,49,46,51,46,49,95,48,56,44,32,83,117,110,32,77,105,99,114,111,115,121,115,116,101,109,115,32,73,110,99,46,44,32,104,116,116,112,58,47,47,106,97,118,97,46,115,117,110,46,99,111,109,47,59,32,101,110,44,32,85,83,59,32,85,84,70,45,56</buildID>
- <!-- The authorizationID may change between project saves and builds. This does not effect the integrity of the project, nor do changes in this value represent changes in the actual InstallAnywhere project. -->
- <authorizationID>1,0,0,-16,-61,-52,-96,16,80,112,112,97,87,98,113,97,113,65,83,67,74,65,74,67,89,70,64,69,66,69,48,79,87,5,2,15,9,22,122,11,0,0,0</authorizationID>
- </essentialScriptInfo>
- <installationObjects uniqueObjects="82">
- <object class="com.zerog.ia.installer.Installer" objectID="3c471adea52a">
- <property name="classpath">
- <object class="java.util.Vector"/>
- </property>
- <property name="rulesFailedMessage">
- <string><![CDATA[The installer cannot run on your configuration. It will now quit.]]></string>
- </property>
- <property name="userSplashPath">
- <string><![CDATA[/tmp/IA_Build_scala/images/]]></string>
- </property>
- <property name="userSplashName">
- <string><![CDATA[Splash.png]]></string>
- </property>
- <property name="localesToBuild">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[en]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[fr]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[de]]></string>
- </method>
- </object>
- </property>
- <property name="installLabels">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Introduction]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[License Agreement]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Choose Java Virtual Machine]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Choose Install Folder]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Installing...]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Install Complete]]></string>
- </method>
- </object>
- </property>
- <property name="installProgressLabelIndex">
- <int>5</int>
- </property>
- <property name="installProgressLabelOption">
- <int>2</int>
- </property>
- <property name="preferredGUIMode">
- <int>2</int>
- </property>
- <property name="supportsAWTUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsSwingUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsConsoleUI">
- <boolean>false</boolean>
- </property>
- <property name="supportsSilentUI">
- <boolean>false</boolean>
- </property>
- <property name="panelImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="panelImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="installProgressImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImageOption">
- <int>0</int>
- </property>
- <property name="installLogEnabled">
- <boolean>false</boolean>
- </property>
- <property name="installLogFormat">
- <int>1</int>
- </property>
- <property name="splashHeight">
- <int>224</int>
- </property>
- <property name="splashWidth">
- <int>438</int>
- </property>
- <property name="defaultInstallSetIndex">
- <int>0</int>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="macOSXPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="preInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.IntroAction" objectID="3c471b27a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Introduction]]></string>
- </property>
- <property name="message">
- <string><![CDATA[InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.
-
-$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.
-
-Click the 'Next' button to proceed to the next screen. If you want to change something on a previous screen, click the 'Previous' button.
-
-You may cancel this installation at any time by clicking the 'Cancel' button.]]></string>
- </property>
- <property name="justification">
- <int>0</int>
- </property>
- <property name="alignment">
- <int>3</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>0</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b28a52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.LicenseAgrAction" objectID="71a1c92bbcfa">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[License Agreement]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:]]></string>
- </property>
- <property name="resourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="resourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="requiresUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="agreeWithLicenseByDefault">
- <boolean>false</boolean>
- </property>
- <property name="openExternalLinks">
- <boolean>true</boolean>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="71a1c92cbcfa">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ChooseJavaVMAction" objectID="55fb9178abea">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="userHasVMChoice">
- <boolean>false</boolean>
- </property>
- <property name="title">
- <string><![CDATA[Choose Java Virtual Machine]]></string>
- </property>
- <property name="header">
- <string><![CDATA[Please Choose a Java VM for Use by the Installed Application]]></string>
- </property>
- <property name="canUseJRE">
- <boolean>true</boolean>
- </property>
- <property name="canUseMicrosoft">
- <boolean>false</boolean>
- </property>
- <property name="canUseJDK">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>2</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="55fb9179abea">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallDirAction" objectID="3c471b29a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Choose Install Folder]]></string>
- </property>
- <property name="prompt">
- <string><![CDATA[Where Would You Like to Install?]]></string>
- </property>
- <property name="canSpecifyInstallFolderName">
- <boolean>true</boolean>
- </property>
- <property name="additionalText">
- <string><![CDATA[]]></string>
- </property>
- <property name="canManuallyEnterPath">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>3</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ba52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallSummary" objectID="3c471b2ba530">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Please Review the Following Before Continuing:]]></string>
- </property>
- <property name="requiresUserChoice">
- <boolean>false</boolean>
- </property>
- <property name="showProductName">
- <boolean>true</boolean>
- </property>
- <property name="showInstallDir">
- <boolean>true</boolean>
- </property>
- <property name="showShortcutDir">
- <boolean>false</boolean>
- </property>
- <property name="showInstallSets">
- <boolean>false</boolean>
- </property>
- <property name="showInstallBundles">
- <boolean>false</boolean>
- </property>
- <property name="showJREDir">
- <boolean>true</boolean>
- </property>
- <property name="showDiskSpace">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>4</int>
- </property>
- <property name="fieldList">
- <object class="java.util.Vector"/>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2aa531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="postInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="7b076ed5bd40">
- <property name="showPleaseWaitPanel">
- <boolean>false</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALL_DIR$" && gunzip -c "$INSTALLER_TEMP_DIR$/scala.tar.gz" | tar xfBp -;
-]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>true</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Extracting files from archive ...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[Extracting files]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="7b1f5b53bcf8">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="e78acd58b1b0">
- <property name="showPleaseWaitPanel">
- <boolean>true</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALL_DIR$" & del /q /s "src\*" & "$INSTALLER_TEMP_DIR$\unzip.exe" "$INSTALLER_TEMP_DIR$\scala.zip" "src\*"]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>true</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Extracting files from archive ...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[Extracting files]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="e78b195db1b0">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="d890aeae8134">
- <property name="showPleaseWaitPanel">
- <boolean>true</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALLER_DIR$" & "$INSTALLER_TEMP_DIR$\setenv.bat"]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>false</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Executing Installation Script...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[setenv.bat]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d9796d868134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.CustomAction" objectID="504b70648177">
- <property name="showPleaseWaitPanel">
- <boolean>false</boolean>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>false</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Executing Custom Code...]]></string>
- </property>
- <property name="clientClassFullName">
- <string><![CDATA[RefreshEnvironment]]></string>
- </property>
- <property name="resourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/CustomCode/]]></string>
- </property>
- <property name="resourceName">
- <string><![CDATA[refreshenvironment.jar]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="505669ee81b2">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallFinishAction" objectID="3c471b2ba531">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>6</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ca531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="showsInstallStatusMessage">
- <boolean>true</boolean>
- </property>
- <property name="installSuccessMessage">
- <string><![CDATA[Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:
-
- $USER_INSTALL_DIR$
-
-Press "Done" to quit the installer.]]></string>
- </property>
- <property name="installWarningMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installErrorMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installFatalMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="rebootNotNeededMessage">
- <string><![CDATA[]]></string>
- </property>
- <property name="rebootRecommendedMessage">
- <string><![CDATA[You should restart the system to complete the installation.]]></string>
- </property>
- <property name="rebootRequiredMessage">
- <string><![CDATA[You need to restart the system to complete the installation.]]></string>
- </property>
- <property name="showsRebootStatusMessage">
- <boolean>false</boolean>
- </property>
- <property name="allowUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="windowTitle">
- <string><![CDATA[Install Complete]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="installDir">
- <object class="com.zerog.ia.installer.util.magicfolders.InstallDirMF" factoryID="155" objectID="3c46d385a525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsDirMF" factoryID="159" objectID="3c46d386a525"/>
- </property>
- <property name="macMagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="win32MagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="shortcutDir">
- <object class="com.zerog.ia.installer.util.magicfolders.ShortcutsMF" factoryID="158" objectID="3c46d8daa525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.UserHomeMF" factoryID="994" objectID="3c46d8dba525"/>
- </property>
- <property name="macMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DesktopMF" factoryID="16" objectID="3c46d8dda525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="3c46d8dda525"/>
- </property>
- <property name="win32MagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsMenuMF" factoryID="2" objectID="3c46d8dea525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="bundledJREInstall">
- <int>2</int>
- </property>
- <property name="uninstallJRE">
- <boolean>true</boolean>
- </property>
- <property name="JREInstallDirectory">
- <int>155</int>
- </property>
- <property name="JREDirectoryName">
- <string><![CDATA[jre]]></string>
- </property>
- <property name="RPMSpec">
- <object class="com.zerog.ia.installer.RPMSpec" objectID="41126d3ba760">
- <property name="enabled">
- <boolean>false</boolean>
- </property>
- <property name="name">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="version">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="release">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements. ]]></string>
- </property>
- <property name="summary">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2003-2004]]></string>
- </property>
- <property name="url">
- <string><![CDATA[http://lamp.epfl.ch/]]></string>
- </property>
- <property name="distribution">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="vendor">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="group">
- <string><![CDATA[Applications/System]]></string>
- </property>
- <property name="packager">
- <string><![CDATA[]]></string>
- </property>
- </object>
- </property>
- <property name="buildSettings">
- <object class="java.util.Properties">
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.save.last.date]]></string>
- <string><![CDATA[Thu Apr 08 17:40:08 CEST 2004]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.max]]></string>
- <string><![CDATA[50331648]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.unix.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.unix.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.vm.version]]></string>
- <string><![CDATA[1.3.1]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.auto-populate.labels]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.build.last.date]]></string>
- <string><![CDATA[Mon Sep 08 20:16:55 CEST 2003]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stderr.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.initial]]></string>
- <string><![CDATA[16777216]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.linux.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.aix.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.unix.ui.default]]></string>
- <string><![CDATA[GUI]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication.gui]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.hpux.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.java.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.windows.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.solaris.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.valid.vm.list]]></string>
- <string><![CDATA[JDK_J2 JRE_J2 MRJ]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.web]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.macosx.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.web]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stdout.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- </object>
- </property>
- <property name="installFrameConfigurator">
- <object class="com.zerog.ia.installer.util.InstallFrameConfigurator" objectID="3c471af3a52c">
- <property name="decorationType">
- <int>2</int>
- </property>
- <property name="bevelDecoration">
- <boolean>false</boolean>
- </property>
- <property name="useLabelBackgroundImage">
- <boolean>false</boolean>
- </property>
- <property name="labelBackgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="labelBackgroundImageName">
- <string><![CDATA[labelBackground.png]]></string>
- </property>
- <property name="useBackgroundImage">
- <boolean>true</boolean>
- </property>
- <property name="backgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="backgroundImageName">
- <string><![CDATA[background_default.png]]></string>
- </property>
- <property name="currentLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="currentLabelIconName">
- <string><![CDATA[activeLabelIcon.png]]></string>
- </property>
- <property name="previousLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="previousLabelIconName">
- <string><![CDATA[completedLabelIcon.png]]></string>
- </property>
- <property name="futureLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="futureLabelIconName">
- <string><![CDATA[upcomingLabeIcon.png]]></string>
- </property>
- <property name="enablePathSubst">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageHorizontally">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageVertically">
- <boolean>true</boolean>
- </property>
- <property name="zerogBannerUI">
- <boolean>false</boolean>
- </property>
- <property name="uninstallerTitle">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="customInstallSet">
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c490688a568">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Choose this option to customize the features to be installed.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[customIcon.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[custom]]></string>
- </property>
- </object>
- </property>
- <property name="fileModificationTimestampBehavior">
- <int>1</int>
- </property>
- <property name="fileModificationTimestamp">
- <long>-1</long>
- </property>
- <property name="suiteObjects">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.Project" objectID="3c471b36a535">
- <property name="name">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="projectLocation">
- <string><![CDATA[Same as current product]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="defaultProject">
- <object refID="3c471b36a535"/>
- </property>
- <property name="advertisedVariables">
- <object class="java.util.Vector"/>
- </property>
- <property name="isMergeModule">
- <boolean>false</boolean>
- </property>
- <property name="installerInfoData">
- <object class="com.zerog.ia.installer.util.InstallerInfoData" objectID="3c471ae5a52b">
- <property name="installerTitle">
- <string><![CDATA[Scala Installer]]></string>
- </property>
- <property name="installerName">
- <string><![CDATA[install]]></string>
- </property>
- <property name="productName">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="productID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[41117495-1ec8-11b2-a760-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="productURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="productDescription">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.]]></string>
- </property>
- <property name="productVersionMajor">
- <int>0</int>
- </property>
- <property name="productVersionMinor">
- <int>0</int>
- </property>
- <property name="productVersionRevision">
- <int>0</int>
- </property>
- <property name="productVersionSubRevision">
- <int>0</int>
- </property>
- <property name="supportURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="vendorName">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="vendorID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471ae4-1ec8-11b2-a52c-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="vendorURL">
- <string><![CDATA[http://lampwww.epfl.ch/]]></string>
- </property>
- <property name="email">
- <string><![CDATA[scala@listes.epfl.ch]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2002-04]]></string>
- </property>
- </object>
- </property>
- <property name="installLogUninstall">
- <boolean>true</boolean>
- </property>
- <property name="neverReboots">
- <boolean>false</boolean>
- </property>
- <property name="suggestedMedias">
- <object class="com.zerog.resources.Medias" objectID="3c471ae4a52b">
- <property name="medias">
- <object class="java.util.Vector"/>
- </property>
- </object>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471ae2a52b">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="useInstallerHelp">
- <boolean>false</boolean>
- </property>
- <property name="contextualHelp">
- <boolean>true</boolean>
- </property>
- <property name="htmlHelp">
- <boolean>true</boolean>
- </property>
- <property name="defaultTargetCheckKind">
- <int>1</int>
- </property>
- <visualChildren>
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c471b26a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This will install the binary files for the $PRODUCT_NAME$ software.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[typical.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binary]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Binary Distribution]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[typical]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.InstallBundle" objectID="3c471b25a52d">
- <property name="bundleName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This installs the application feature.]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[application]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.Billboard" objectID="3c471b21a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[billboard_default.png]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.InstallComponent" objectID="3c471b27a52d">
- <property name="componentName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[This component holds resources (e.g., files, folders, actions) common to all Product Features]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="uniqueId">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471b28-1ec8-11b2-a52d-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="versionMajor">
- <int>1</int>
- </property>
- <property name="versionMinor">
- <int>0</int>
- </property>
- <property name="versionRevision">
- <int>0</int>
- </property>
- <property name="versionSubRevision">
- <int>0</int>
- </property>
- <property name="keyFile">
- <object class="com.zerog.ia.installer.actions.InstallUninstaller" objectID="3c471b2da533">
- <property name="unixPermissions">
- <string><![CDATA[777]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="guiLauncher">
- <boolean>true</boolean>
- </property>
- <property name="propertyList">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stderr.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b34a535">
- <property name="propertyValue">
- <string><![CDATA[2750]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.win32.microsoftvm.min.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[The minimum version of Microsoft's VM this application will run against]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b30a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdin.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa533">
- <property name="propertyValue">
- <string><![CDATA[.]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.user.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[left blank, this property will cause the native launcher to not
-alter the platform default behavior for setting the user dir.
-To override this you may set this property to a relative or absolute path.
-Relative paths are relative to the launcher.]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2ea533">
- <property name="propertyValue">
- <string><![CDATA[main]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.main.method]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the method in the main class that will be invoked]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a533">
- <property name="propertyValue">
- <string><![CDATA[$USER_INSTALL_DIR$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.root.install.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[path to the installdir magic folder]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa534">
- <property name="propertyValue">
- <string><![CDATA[$CMD_LINE_ARGUMENTS$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.command.line.args]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[what will be passed to the main method -- be sure to quote arguments with spaces in them]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a535">
- <property name="propertyValue">
- <string><![CDATA[$IA_CLASSPATH$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.class.path]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the Java classpath necessary to run this application
-Can be separated by colons (Mac OS/Unix) or semicolons (Windows)]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a534">
- <property name="propertyValue">
- <string><![CDATA[J2 J1 MSJ MRJ]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.valid.vm.list]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[a string containing one or more of [ ALL JDK JRE J1 J2 JRE_J1 JDK_J1 JRE_J2 JDK_J2 MSJ MRJ ]
- delimited by spaces or commas. If the native launcher cannot find the current vm,
-it will search for ones in this list]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a535">
- <property name="propertyValue">
- <string><![CDATA[5.5]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[version of LaunchAnywhere that created this properties file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdout.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall scala]]></string>
- </property>
- <property name="featureUninstallEnabled">
- <boolean>false</boolean>
- </property>
- <property name="neverRestarts">
- <boolean>false</boolean>
- </property>
- <property name="asksUserAboutRestart">
- <boolean>true</boolean>
- </property>
- </object>
- </property>
- <installChildren>
- <object refID="3c471b2da533"/>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="3c471b2ca533">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[UninstallerData]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>true</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="3c471b2da533"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="95f3984fbd04">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[scala.tar.gz]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[scala.tar.gz]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="95f3c129bd04">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.ExpandFile" objectID="95f49032bd3e">
- <property name="sourceName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="sizeOfArchive">
- <long>-1</long>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="95f4ce45bd3e">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1bbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1cbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="a45d601dbcfa">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallZipfile" objectID="e738659db1b1">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="e73877d0b1b1">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="ceb023208130">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$api$/$index.html]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala API Documentation]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf116791816c">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$UninstallerData$/$Uninstall scala.exe]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf13ae0381ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaReference.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Reference]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1433cf81ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaTutorial.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Tutorial]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1c65588134">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaByExample.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala by Example]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="d39fab9b812e">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$bin$/$scalaint.bat]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ Interpreter]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="d39fe577812e">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Documentation]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="ceb023208130"/>
- <object refID="cf1c65588134"/>
- <object refID="cf13ae0381ad"/>
- <object refID="cf1433cf81ad"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="ceb26b938130">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="d39fe577812e"/>
- <object refID="d39fab9b812e"/>
- <object refID="cf116791816c"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.ExpandFile" objectID="d976645f8134">
- <property name="sourceName">
- <string><![CDATA[tools.zip]]></string>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="sizeOfArchive">
- <long>-1</long>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d97752f68134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="d977cb518134">
- <property name="showPleaseWaitPanel">
- <boolean>true</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALLER_DIR$" & "$INSTALLER_TEMP_DIR$\getenv.bat"]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>false</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Executing Installation Script...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[getenv.bat]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d977e21d8134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.MakeRegEntry" objectID="d9860f888134">
- <property name="userLabel">
- <string><![CDATA[SCALA_HOME]]></string>
- </property>
- <property name="valueName">
- <string><![CDATA[SCALA_HOME]]></string>
- </property>
- <property name="value">
- <string><![CDATA[$USER_INSTALL_DIR$]]></string>
- </property>
- <property name="key">
- <string><![CDATA[HKEY_CURRENT_USER\Environment]]></string>
- </property>
- <property name="uninstallOptions">
- <int>0</int>
- </property>
- <property name="dataType">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d98706a08134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.MakeRegEntry" objectID="d98731608134">
- <property name="userLabel">
- <string><![CDATA[PATH]]></string>
- </property>
- <property name="valueName">
- <string><![CDATA[PATH]]></string>
- </property>
- <property name="value">
- <string><![CDATA[%SCALA_HOME%\bin]]></string>
- </property>
- <property name="key">
- <string><![CDATA[HKEY_CURRENT_USER\Environment]]></string>
- </property>
- <property name="uninstallOptions">
- <int>0</int>
- </property>
- <property name="dataType">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d987e74f8134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector"/>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- <object refID="3c471b25a52d"/>
- <object refID="3c471b27a52d"/>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="3c471b20a52c">
- <property name="destinationFolder">
- <object refID="3c46d385a525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="3c471b2ca533"/>
- <object refID="95f49032bd3e"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="95f2fa49bd04">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.IATempMF" factoryID="1114" objectID="93ec3332bcf4"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="95f3984fbd04"/>
- <object refID="e738659db1b1"/>
- <object refID="d976645f8134"/>
- <object refID="d977cb518134"/>
- <object refID="d9860f888134"/>
- <object refID="d98731608134"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="9f9e5260bcf5">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DoNotInstallMF" factoryID="993" objectID="9f9da4c2bcf1"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="a45d601dbcfa"/>
- <object refID="9f9e2f1bbcf5"/>
- <object refID="9f9e2f1cbcf5"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="ceb0ad8a8130">
- <property name="destinationFolder">
- <object refID="3c46d8dea525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="ceb26b938130"/>
- </visualChildren>
- </object>
- <object refID="3c471b21a52c"/>
- </visualChildren>
- <installChildren>
- <object refID="3c471b26a52c"/>
- </installChildren>
- </object>
- </installationObjects>
- <restorationObjects count="0"/>
-</InstallAnywhere_Deployment_Project>
diff --git a/config/ia/scala_unix.iap_xml b/config/ia/scala_unix.iap_xml
deleted file mode 100644
index 82b0452c13..0000000000
--- a/config/ia/scala_unix.iap_xml
+++ /dev/null
@@ -1,1645 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- This script was automatically generated using Zero G's InstallAnywhere 5.5.1 Standard, Build 2032
- STATUS: Fully Functional LICENSED Edition
- DATE: Thu Sep 01 17:20:25 CEST 2005 -->
-<InstallAnywhere_Deployment_Project increments="1346">
- <!-- ** DO NOT EDIT ** Essential authorization and configuration data ** DO NOT EDIT ** -->
- <essentialScriptInfo>
- <versionID major="5" minor="5" revision="1"/>
- <editionID>53,46,53,46,49,32,83,116,97,110,100,97,114,100,32,66,117,105,108,100,32,50,48,51,50</editionID>
- <scriptID>12,42,11,90,77,49,48,53,53,85,78,57,55,55,50,65</scriptID>
- <buildID>3,13,71,76,105,110,117,120,44,32,50,46,54,46,49,49,45,49,46,51,53,95,70,67,51,115,109,112,44,32,105,51,56,54,59,32,74,97,118,97,32,49,46,52,46,50,95,48,53,44,32,83,117,110,32,77,105,99,114,111,115,121,115,116,101,109,115,32,73,110,99,46,44,32,104,116,116,112,58,47,47,106,97,118,97,46,115,117,110,46,99,111,109,47,59,32,101,110,44,32,85,110,107,110,111,119,110,59,32,85,84,70,45,56</buildID>
- <!-- The authorizationID may change between project saves and builds. This does not effect the integrity of the project, nor do changes in this value represent changes in the actual InstallAnywhere project. -->
- <authorizationID>1,0,0,0,19,71,64,64,80,112,112,97,87,98,113,97,113,65,83,67,74,65,74,67,89,70,64,69,66,69,48,79,87,5,2,12,1,22,114,6,1,0,0</authorizationID>
- </essentialScriptInfo>
- <installationObjects uniqueObjects="64">
- <object class="com.zerog.ia.installer.Installer" objectID="3c471adea52a">
- <property name="classpath">
- <object class="java.util.Vector"/>
- </property>
- <property name="rulesFailedMessage">
- <string><![CDATA[The installer cannot run on your configuration. It will now quit.]]></string>
- </property>
- <property name="userSplashPath">
- <string><![CDATA[/tmp/IA_Build_scala/images/]]></string>
- </property>
- <property name="userSplashName">
- <string><![CDATA[Splash.png]]></string>
- </property>
- <property name="localesToBuild">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[en]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[fr]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[de]]></string>
- </method>
- </object>
- </property>
- <property name="installLabels">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Introduction]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[License Agreement]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Choose Install Folder]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Installing...]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Install Complete]]></string>
- </method>
- </object>
- </property>
- <property name="installProgressLabelIndex">
- <int>4</int>
- </property>
- <property name="installProgressLabelOption">
- <int>2</int>
- </property>
- <property name="preferredGUIMode">
- <int>2</int>
- </property>
- <property name="supportsAWTUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsSwingUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsConsoleUI">
- <boolean>false</boolean>
- </property>
- <property name="supportsSilentUI">
- <boolean>false</boolean>
- </property>
- <property name="panelImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="panelImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="installProgressImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImageOption">
- <int>0</int>
- </property>
- <property name="installLogEnabled">
- <boolean>false</boolean>
- </property>
- <property name="installLogFormat">
- <int>1</int>
- </property>
- <property name="splashHeight">
- <int>265</int>
- </property>
- <property name="splashWidth">
- <int>470</int>
- </property>
- <property name="defaultInstallSetIndex">
- <int>0</int>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="macOSXPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="preInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.IntroAction" objectID="3c471b27a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Introduction]]></string>
- </property>
- <property name="message">
- <string><![CDATA[InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.
-
-$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.
-
-Click the 'Next' button to proceed to the next screen. If you want to change something on a previous screen, click the 'Previous' button.
-
-You may cancel this installation at any time by clicking the 'Cancel' button.]]></string>
- </property>
- <property name="justification">
- <int>0</int>
- </property>
- <property name="alignment">
- <int>3</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>0</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b28a52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.LicenseAgrAction" objectID="71a1c92bbcfa">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[License Agreement]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:]]></string>
- </property>
- <property name="resourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="resourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="requiresUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="agreeWithLicenseByDefault">
- <boolean>false</boolean>
- </property>
- <property name="openExternalLinks">
- <boolean>true</boolean>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="71a1c92cbcfa">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallDirAction" objectID="3c471b29a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Choose Install Folder]]></string>
- </property>
- <property name="prompt">
- <string><![CDATA[Where Would You Like to Install?]]></string>
- </property>
- <property name="canSpecifyInstallFolderName">
- <boolean>true</boolean>
- </property>
- <property name="additionalText">
- <string><![CDATA[]]></string>
- </property>
- <property name="canManuallyEnterPath">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>2</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ba52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallSummary" objectID="3c471b2ba530">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Please Review the Following Before Continuing:]]></string>
- </property>
- <property name="requiresUserChoice">
- <boolean>false</boolean>
- </property>
- <property name="showProductName">
- <boolean>true</boolean>
- </property>
- <property name="showInstallDir">
- <boolean>true</boolean>
- </property>
- <property name="showShortcutDir">
- <boolean>false</boolean>
- </property>
- <property name="showInstallSets">
- <boolean>false</boolean>
- </property>
- <property name="showInstallBundles">
- <boolean>false</boolean>
- </property>
- <property name="showJREDir">
- <boolean>false</boolean>
- </property>
- <property name="showDiskSpace">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>3</int>
- </property>
- <property name="fieldList">
- <object class="java.util.Vector"/>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2aa531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="postInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="7b076ed5bd40">
- <property name="showPleaseWaitPanel">
- <boolean>false</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALL_DIR$" && gunzip -c "$INSTALLER_TEMP_DIR$/scala.tar.gz" | tar xfBp -;
-]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>true</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Extracting files from archive ...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[Extracting files]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="7b1f5b53bcf8">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallFinishAction" objectID="3c471b2ba531">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>5</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ca531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="showsInstallStatusMessage">
- <boolean>true</boolean>
- </property>
- <property name="installSuccessMessage">
- <string><![CDATA[Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:
-
- $USER_INSTALL_DIR$
-
-The $PRODUCT_NAME$ tools rely on the variable PATH to find a Java VM.
-
-Press "Done" to quit the installer.]]></string>
- </property>
- <property name="installWarningMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installErrorMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installFatalMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="rebootNotNeededMessage">
- <string><![CDATA[]]></string>
- </property>
- <property name="rebootRecommendedMessage">
- <string><![CDATA[You should restart the system to complete the installation.]]></string>
- </property>
- <property name="rebootRequiredMessage">
- <string><![CDATA[You need to restart the system to complete the installation.]]></string>
- </property>
- <property name="showsRebootStatusMessage">
- <boolean>false</boolean>
- </property>
- <property name="allowUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="windowTitle">
- <string><![CDATA[Install Complete]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="installDir">
- <object class="com.zerog.ia.installer.util.magicfolders.InstallDirMF" factoryID="155" objectID="3c46d385a525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.SystemDriveRootMF" factoryID="157" objectID="25a7e3c09d86"/>
- </property>
- <property name="macMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsDirMF" factoryID="159" objectID="3c46d386a525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="25a7e3c09d86"/>
- </property>
- <property name="win32MagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[usr/local]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[usr/local]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="shortcutDir">
- <object class="com.zerog.ia.installer.util.magicfolders.ShortcutsMF" factoryID="158" objectID="3c46d8daa525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.UserHomeMF" factoryID="994" objectID="3c46d8dba525"/>
- </property>
- <property name="macMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DesktopMF" factoryID="16" objectID="3c46d8dda525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="3c46d8dda525"/>
- </property>
- <property name="win32MagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsMenuMF" factoryID="2" objectID="3c46d8dea525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="bundledJREInstall">
- <int>2</int>
- </property>
- <property name="uninstallJRE">
- <boolean>true</boolean>
- </property>
- <property name="JREInstallDirectory">
- <int>155</int>
- </property>
- <property name="JREDirectoryName">
- <string><![CDATA[jre]]></string>
- </property>
- <property name="RPMSpec">
- <object class="com.zerog.ia.installer.RPMSpec" objectID="41126d3ba760">
- <property name="enabled">
- <boolean>false</boolean>
- </property>
- <property name="name">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="version">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="release">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements. ]]></string>
- </property>
- <property name="summary">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2003-2004]]></string>
- </property>
- <property name="url">
- <string><![CDATA[http://lamp.epfl.ch/]]></string>
- </property>
- <property name="distribution">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="vendor">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="group">
- <string><![CDATA[Applications/System]]></string>
- </property>
- <property name="packager">
- <string><![CDATA[]]></string>
- </property>
- </object>
- </property>
- <property name="buildSettings">
- <object class="java.util.Properties">
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.save.last.date]]></string>
- <string><![CDATA[Thu Sep 01 17:20:25 CEST 2005]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.max]]></string>
- <string><![CDATA[50331648]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.unix.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.unix.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.vm.version]]></string>
- <string><![CDATA[1.3.1]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.auto-populate.labels]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.build.last.date]]></string>
- <string><![CDATA[Mon Sep 08 20:16:55 CEST 2003]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stderr.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.initial]]></string>
- <string><![CDATA[16777216]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.linux.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.aix.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.unix.ui.default]]></string>
- <string><![CDATA[GUI]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication.gui]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.hpux.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.java.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.windows.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.solaris.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.valid.vm.list]]></string>
- <string><![CDATA[JDK_J2 JRE_J2 MRJ]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.web]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.macosx.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.web]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stdout.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- </object>
- </property>
- <property name="installFrameConfigurator">
- <object class="com.zerog.ia.installer.util.InstallFrameConfigurator" objectID="3c471af3a52c">
- <property name="decorationType">
- <int>2</int>
- </property>
- <property name="bevelDecoration">
- <boolean>false</boolean>
- </property>
- <property name="useLabelBackgroundImage">
- <boolean>false</boolean>
- </property>
- <property name="labelBackgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="labelBackgroundImageName">
- <string><![CDATA[labelBackground.png]]></string>
- </property>
- <property name="useBackgroundImage">
- <boolean>true</boolean>
- </property>
- <property name="backgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="backgroundImageName">
- <string><![CDATA[background_default.png]]></string>
- </property>
- <property name="currentLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="currentLabelIconName">
- <string><![CDATA[activeLabelIcon.png]]></string>
- </property>
- <property name="previousLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="previousLabelIconName">
- <string><![CDATA[completedLabelIcon.png]]></string>
- </property>
- <property name="futureLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="futureLabelIconName">
- <string><![CDATA[upcomingLabeIcon.png]]></string>
- </property>
- <property name="enablePathSubst">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageHorizontally">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageVertically">
- <boolean>true</boolean>
- </property>
- <property name="zerogBannerUI">
- <boolean>false</boolean>
- </property>
- <property name="uninstallerTitle">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="customInstallSet">
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c490688a568">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Choose this option to customize the features to be installed.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[customIcon.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[custom]]></string>
- </property>
- </object>
- </property>
- <property name="fileModificationTimestampBehavior">
- <int>1</int>
- </property>
- <property name="fileModificationTimestamp">
- <long>-1</long>
- </property>
- <property name="suiteObjects">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.Project" objectID="3c471b36a535">
- <property name="name">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="projectLocation">
- <string><![CDATA[Same as current product]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="defaultProject">
- <object refID="3c471b36a535"/>
- </property>
- <property name="advertisedVariables">
- <object class="java.util.Vector"/>
- </property>
- <property name="isMergeModule">
- <boolean>false</boolean>
- </property>
- <property name="installerInfoData">
- <object class="com.zerog.ia.installer.util.InstallerInfoData" objectID="3c471ae5a52b">
- <property name="installerTitle">
- <string><![CDATA[Scala Installer]]></string>
- </property>
- <property name="installerName">
- <string><![CDATA[install]]></string>
- </property>
- <property name="productName">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="productID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[41117495-1ec8-11b2-a760-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="productURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="productDescription">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.]]></string>
- </property>
- <property name="productVersionMajor">
- <int>0</int>
- </property>
- <property name="productVersionMinor">
- <int>0</int>
- </property>
- <property name="productVersionRevision">
- <int>0</int>
- </property>
- <property name="productVersionSubRevision">
- <int>0</int>
- </property>
- <property name="supportURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="vendorName">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="vendorID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471ae4-1ec8-11b2-a52c-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="vendorURL">
- <string><![CDATA[http://lampwww.epfl.ch/]]></string>
- </property>
- <property name="email">
- <string><![CDATA[scala@listes.epfl.ch]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2002-04]]></string>
- </property>
- </object>
- </property>
- <property name="installLogUninstall">
- <boolean>true</boolean>
- </property>
- <property name="neverReboots">
- <boolean>false</boolean>
- </property>
- <property name="suggestedMedias">
- <object class="com.zerog.resources.Medias" objectID="3c471ae4a52b">
- <property name="medias">
- <object class="java.util.Vector"/>
- </property>
- </object>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471ae2a52b">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="useInstallerHelp">
- <boolean>false</boolean>
- </property>
- <property name="contextualHelp">
- <boolean>true</boolean>
- </property>
- <property name="htmlHelp">
- <boolean>true</boolean>
- </property>
- <property name="defaultTargetCheckKind">
- <int>1</int>
- </property>
- <visualChildren>
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c471b26a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This will install the binary files for the $PRODUCT_NAME$ software.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[typical.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binary]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Binary Distribution]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[typical]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.InstallBundle" objectID="3c471b25a52d">
- <property name="bundleName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This installs the application feature.]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[application]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.Billboard" objectID="3c471b21a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[billboard_default.png]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.InstallComponent" objectID="3c471b27a52d">
- <property name="componentName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[This component holds resources (e.g., files, folders, actions) common to all Product Features]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="uniqueId">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471b28-1ec8-11b2-a52d-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="versionMajor">
- <int>1</int>
- </property>
- <property name="versionMinor">
- <int>0</int>
- </property>
- <property name="versionRevision">
- <int>0</int>
- </property>
- <property name="versionSubRevision">
- <int>0</int>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="95f3984fbd04">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[scala.tar.gz]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[scala.tar.gz]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="95f3c129bd04">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1bbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1cbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="a45d601dbcfa">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="ceb023208130">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$api$/$index.html]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala API Documentation]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf116791816c">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$UninstallerData$/$Uninstall scala.exe]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf13ae0381ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaReference.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Reference]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1433cf81ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaTutorial.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Tutorial]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1c65588134">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaByExample.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala by Example]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="d39fab9b812e">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$bin$/$scalaint.bat]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ Interpreter]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="d39fe577812e">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Documentation]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="ceb023208130"/>
- <object refID="cf1c65588134"/>
- <object refID="cf13ae0381ad"/>
- <object refID="cf1433cf81ad"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="ceb26b938130">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="d39fe577812e"/>
- <object refID="d39fab9b812e"/>
- <object refID="cf116791816c"/>
- </visualChildren>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- <object refID="3c471b25a52d"/>
- <object refID="3c471b27a52d"/>
- <object class="com.zerog.ia.installer.InstallComponent" objectID="25c710d09d90">
- <property name="componentName">
- <string><![CDATA[No Features Component]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[AUTOGENERATED COMMENT: The following comment is an autogenerated component comment. This component was created as a holder for Actions that exist in your project but have not been assigned to any product features. Actions assigned to this component will not be installed unless the feature assignments for this component are overridden.]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[No Features Component]]></string>
- </property>
- <property name="uniqueId">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[25c710d1-1ed8-11b2-9d90-874b5fb89e33]]></string>
- </method>
- </object>
- </property>
- <property name="versionMajor">
- <int>1</int>
- </property>
- <property name="versionMinor">
- <int>0</int>
- </property>
- <property name="versionRevision">
- <int>0</int>
- </property>
- <property name="versionSubRevision">
- <int>0</int>
- </property>
- <property name="keyFile">
- <object class="com.zerog.ia.installer.actions.InstallUninstaller" objectID="3c471b2da533">
- <property name="unixPermissions">
- <string><![CDATA[777]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="guiLauncher">
- <boolean>true</boolean>
- </property>
- <property name="propertyList">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stderr.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b34a535">
- <property name="propertyValue">
- <string><![CDATA[2750]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.win32.microsoftvm.min.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[The minimum version of Microsoft's VM this application will run against]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b30a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdin.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa533">
- <property name="propertyValue">
- <string><![CDATA[.]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.user.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[left blank, this property will cause the native launcher to not
-alter the platform default behavior for setting the user dir.
-To override this you may set this property to a relative or absolute path.
-Relative paths are relative to the launcher.]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2ea533">
- <property name="propertyValue">
- <string><![CDATA[main]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.main.method]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the method in the main class that will be invoked]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a533">
- <property name="propertyValue">
- <string><![CDATA[$USER_INSTALL_DIR$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.root.install.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[path to the installdir magic folder]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa534">
- <property name="propertyValue">
- <string><![CDATA[$CMD_LINE_ARGUMENTS$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.command.line.args]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[what will be passed to the main method -- be sure to quote arguments with spaces in them]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a535">
- <property name="propertyValue">
- <string><![CDATA[$IA_CLASSPATH$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.class.path]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the Java classpath necessary to run this application
-Can be separated by colons (Mac OS/Unix) or semicolons (Windows)]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a534">
- <property name="propertyValue">
- <string><![CDATA[J2 J1 MSJ MRJ]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.valid.vm.list]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[a string containing one or more of [ ALL JDK JRE J1 J2 JRE_J1 JDK_J1 JRE_J2 JDK_J2 MSJ MRJ ]
- delimited by spaces or commas. If the native launcher cannot find the current vm,
-it will search for ones in this list]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a535">
- <property name="propertyValue">
- <string><![CDATA[5.5]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[version of LaunchAnywhere that created this properties file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdout.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall scala]]></string>
- </property>
- <property name="featureUninstallEnabled">
- <boolean>false</boolean>
- </property>
- <property name="neverRestarts">
- <boolean>false</boolean>
- </property>
- <property name="asksUserAboutRestart">
- <boolean>true</boolean>
- </property>
- </object>
- </property>
- <installChildren>
- <object refID="3c471b2da533"/>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="3c471b2ca533">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[UninstallerData]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>true</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="3c471b2da533"/>
- </visualChildren>
- </object>
- </installChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="3c471b20a52c">
- <property name="destinationFolder">
- <object refID="3c46d385a525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="3c471b2ca533"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="95f2fa49bd04">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.IATempMF" factoryID="1114" objectID="93ec3332bcf4"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="95f3984fbd04"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="9f9e5260bcf5">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DoNotInstallMF" factoryID="993" objectID="9f9da4c2bcf1"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="a45d601dbcfa"/>
- <object refID="9f9e2f1bbcf5"/>
- <object refID="9f9e2f1cbcf5"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="ceb0ad8a8130">
- <property name="destinationFolder">
- <object refID="3c46d8dea525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="ceb26b938130"/>
- </visualChildren>
- </object>
- <object refID="3c471b21a52c"/>
- </visualChildren>
- <installChildren>
- <object refID="3c471b26a52c"/>
- </installChildren>
- </object>
- </installationObjects>
- <restorationObjects count="0"/>
-</InstallAnywhere_Deployment_Project>
diff --git a/config/ia/scala_win32.iap_xml b/config/ia/scala_win32.iap_xml
deleted file mode 100644
index 44d98a92d1..0000000000
--- a/config/ia/scala_win32.iap_xml
+++ /dev/null
@@ -1,2088 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- This script was automatically generated using Zero G's InstallAnywhere 5.5.1 Standard, Build 2032
- STATUS: Fully Functional LICENSED Edition
- DATE: Tue Jul 27 17:40:12 CEST 2004 -->
-<InstallAnywhere_Deployment_Project increments="1676">
- <!-- ** DO NOT EDIT ** Essential authorization and configuration data ** DO NOT EDIT ** -->
- <essentialScriptInfo>
- <versionID major="5" minor="5" revision="1"/>
- <editionID>53,46,53,46,49,32,83,116,97,110,100,97,114,100,32,66,117,105,108,100,32,50,48,51,50</editionID>
- <scriptID>12,42,11,90,77,49,48,53,53,85,78,57,55,55,50,65</scriptID>
- <buildID>3,13,71,76,105,110,117,120,44,32,50,46,52,46,50,48,45,51,49,46,57,44,32,105,51,56,54,59,32,74,97,118,97,32,49,46,51,46,49,95,48,56,44,32,83,117,110,32,77,105,99,114,111,115,121,115,116,101,109,115,32,73,110,99,46,44,32,104,116,116,112,58,47,47,106,97,118,97,46,115,117,110,46,99,111,109,47,59,32,101,110,44,32,85,83,59,32,85,84,70,45,56</buildID>
- <!-- The authorizationID may change between project saves and builds. This does not effect the integrity of the project, nor do changes in this value represent changes in the actual InstallAnywhere project. -->
- <authorizationID>1,0,0,-16,3,73,64,16,80,112,112,97,87,98,113,97,113,65,83,67,74,65,74,67,89,70,64,69,66,69,48,79,87,5,2,14,2,18,113,14,0,0,0</authorizationID>
- </essentialScriptInfo>
- <installationObjects uniqueObjects="72">
- <object class="com.zerog.ia.installer.Installer" objectID="3c471adea52a">
- <property name="classpath">
- <object class="java.util.Vector"/>
- </property>
- <property name="rulesFailedMessage">
- <string><![CDATA[The installer cannot run on your configuration. It will now quit.]]></string>
- </property>
- <property name="userSplashPath">
- <string><![CDATA[/tmp/IA_Build_scala/images/]]></string>
- </property>
- <property name="userSplashName">
- <string><![CDATA[Splash.png]]></string>
- </property>
- <property name="localesToBuild">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[en]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[fr]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[de]]></string>
- </method>
- </object>
- </property>
- <property name="installLabels">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Introduction]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[License Agreement]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Choose Install Folder]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Installing...]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Install Complete]]></string>
- </method>
- </object>
- </property>
- <property name="installProgressLabelIndex">
- <int>4</int>
- </property>
- <property name="installProgressLabelOption">
- <int>2</int>
- </property>
- <property name="preferredGUIMode">
- <int>2</int>
- </property>
- <property name="supportsAWTUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsSwingUI">
- <boolean>true</boolean>
- </property>
- <property name="supportsConsoleUI">
- <boolean>false</boolean>
- </property>
- <property name="supportsSilentUI">
- <boolean>false</boolean>
- </property>
- <property name="panelImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="panelImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="installProgressImageName">
- <string><![CDATA[introImage.png]]></string>
- </property>
- <property name="installProgressImageOption">
- <int>0</int>
- </property>
- <property name="installLogEnabled">
- <boolean>false</boolean>
- </property>
- <property name="installLogFormat">
- <int>1</int>
- </property>
- <property name="splashHeight">
- <int>224</int>
- </property>
- <property name="splashWidth">
- <int>438</int>
- </property>
- <property name="defaultInstallSetIndex">
- <int>0</int>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="macOSXPermissions">
- <string><![CDATA[755]]></string>
- </property>
- <property name="preInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.IntroAction" objectID="3c471b27a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Introduction]]></string>
- </property>
- <property name="message">
- <string><![CDATA[InstallAnywhere will guide you through the installation of $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$.
-
-$PRODUCT_NAME$ requires Sun JDK/JRE version 1.4 or newer.
-
-Click the 'Next' button to proceed to the next screen. If you want to change something on a previous screen, click the 'Previous' button.
-
-You may cancel this installation at any time by clicking the 'Cancel' button.]]></string>
- </property>
- <property name="justification">
- <int>0</int>
- </property>
- <property name="alignment">
- <int>3</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>0</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b28a52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.LicenseAgrAction" objectID="71a1c92bbcfa">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[License Agreement]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Installation and Use of $PRODUCT_NAME$ Requires Acceptance of the Following License Agreement:]]></string>
- </property>
- <property name="resourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="resourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="requiresUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="agreeWithLicenseByDefault">
- <boolean>false</boolean>
- </property>
- <property name="openExternalLinks">
- <boolean>true</boolean>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="71a1c92cbcfa">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallDirAction" objectID="3c471b29a52f">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="stepTitle">
- <string><![CDATA[Choose Install Folder]]></string>
- </property>
- <property name="prompt">
- <string><![CDATA[Where Would You Like to Install?]]></string>
- </property>
- <property name="canSpecifyInstallFolderName">
- <boolean>true</boolean>
- </property>
- <property name="additionalText">
- <string><![CDATA[]]></string>
- </property>
- <property name="canManuallyEnterPath">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>2</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ba52f">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallSummary" objectID="3c471b2ba530">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="title">
- <string><![CDATA[Pre-Installation Summary]]></string>
- </property>
- <property name="stepPrompt">
- <string><![CDATA[Please Review the Following Before Continuing:]]></string>
- </property>
- <property name="requiresUserChoice">
- <boolean>false</boolean>
- </property>
- <property name="showProductName">
- <boolean>true</boolean>
- </property>
- <property name="showInstallDir">
- <boolean>true</boolean>
- </property>
- <property name="showShortcutDir">
- <boolean>false</boolean>
- </property>
- <property name="showInstallSets">
- <boolean>false</boolean>
- </property>
- <property name="showInstallBundles">
- <boolean>false</boolean>
- </property>
- <property name="showJREDir">
- <boolean>false</boolean>
- </property>
- <property name="showDiskSpace">
- <boolean>true</boolean>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>3</int>
- </property>
- <property name="fieldList">
- <object class="java.util.Vector"/>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2aa531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="postInstallActions">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="e78acd58b1b0">
- <property name="showPleaseWaitPanel">
- <boolean>true</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALL_DIR$" & del /q /s "src\*" & "$INSTALLER_TEMP_DIR$\unzip.exe" "$INSTALLER_TEMP_DIR$\scala.zip" "src\*"]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>true</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Extracting files from archive ...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[Extracting files]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="e78b195db1b0">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.ExecuteScript" objectID="d890aeae8134">
- <property name="showPleaseWaitPanel">
- <boolean>true</boolean>
- </property>
- <property name="waitForProcess">
- <boolean>true</boolean>
- </property>
- <property name="script">
- <string><![CDATA[cd "$USER_INSTALLER_DIR$" & "$INSTALLER_TEMP_DIR$\scalaenv.bat"]]></string>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>false</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Executing Installation Script...]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[scalaenv.bat]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d9796d868134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.CustomAction" objectID="504b70648177">
- <property name="showPleaseWaitPanel">
- <boolean>false</boolean>
- </property>
- <property name="showIndeterminateDialog">
- <boolean>false</boolean>
- </property>
- <property name="dialogLabel">
- <string><![CDATA[Executing Custom Code...]]></string>
- </property>
- <property name="clientClassFullName">
- <string><![CDATA[RefreshEnvironment]]></string>
- </property>
- <property name="resourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/CustomCode/]]></string>
- </property>
- <property name="resourceName">
- <string><![CDATA[refreshenvironment.jar]]></string>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="505669ee81b2">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.actions.InstallFinishAction" objectID="3c471b2ba531">
- <property name="imageOption">
- <int>1</int>
- </property>
- <property name="labelOption">
- <int>2</int>
- </property>
- <property name="labelIndex">
- <int>5</int>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471b2ca531">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="showsInstallStatusMessage">
- <boolean>true</boolean>
- </property>
- <property name="installSuccessMessage">
- <string><![CDATA[Congratulations! $PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$ has been successfully installed to:
-
- $USER_INSTALL_DIR$
-
-The $PRODUCT_NAME$ tools rely on the PATH variable to find a Java VM.
-
-Press "Done" to quit the installer.]]></string>
- </property>
- <property name="installWarningMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some warnings occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installErrorMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="installFatalMessage">
- <string><![CDATA[The installation of $PRODUCT_NAME$ is finished, but some serious errors occurred during the install. Please see the installation log for details.]]></string>
- </property>
- <property name="rebootNotNeededMessage">
- <string><![CDATA[]]></string>
- </property>
- <property name="rebootRecommendedMessage">
- <string><![CDATA[You should restart the system to complete the installation.]]></string>
- </property>
- <property name="rebootRequiredMessage">
- <string><![CDATA[You need to restart the system to complete the installation.]]></string>
- </property>
- <property name="showsRebootStatusMessage">
- <boolean>false</boolean>
- </property>
- <property name="allowUserChoice">
- <boolean>true</boolean>
- </property>
- <property name="windowTitle">
- <string><![CDATA[Install Complete]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="installDir">
- <object class="com.zerog.ia.installer.util.magicfolders.InstallDirMF" factoryID="155" objectID="3c46d385a525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsDirMF" factoryID="159" objectID="3c46d386a525"/>
- </property>
- <property name="macMagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="win32MagicFolder">
- <object refID="3c46d386a525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="shortcutDir">
- <object class="com.zerog.ia.installer.util.magicfolders.ShortcutsMF" factoryID="158" objectID="3c46d8daa525">
- <property name="solarisMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.UserHomeMF" factoryID="994" objectID="3c46d8dba525"/>
- </property>
- <property name="macMagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DesktopMF" factoryID="16" objectID="3c46d8dda525"/>
- </property>
- <property name="macXMagicFolder">
- <object refID="3c46d8dda525"/>
- </property>
- <property name="win32MagicFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.ProgramsMenuMF" factoryID="2" objectID="3c46d8dea525"/>
- </property>
- <property name="solarisMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="macXMagicFolderPath">
- <string><![CDATA[]]></string>
- </property>
- <property name="win32MagicFolderPath">
- <string><![CDATA[$PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="bundledJREInstall">
- <int>2</int>
- </property>
- <property name="uninstallJRE">
- <boolean>true</boolean>
- </property>
- <property name="JREInstallDirectory">
- <int>155</int>
- </property>
- <property name="JREDirectoryName">
- <string><![CDATA[jre]]></string>
- </property>
- <property name="RPMSpec">
- <object class="com.zerog.ia.installer.RPMSpec" objectID="41126d3ba760">
- <property name="enabled">
- <boolean>false</boolean>
- </property>
- <property name="name">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="version">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="release">
- <string><![CDATA[0.0.0.0]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements. ]]></string>
- </property>
- <property name="summary">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2003-2004]]></string>
- </property>
- <property name="url">
- <string><![CDATA[http://lamp.epfl.ch/]]></string>
- </property>
- <property name="distribution">
- <string><![CDATA[<none>]]></string>
- </property>
- <property name="vendor">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="group">
- <string><![CDATA[Applications/System]]></string>
- </property>
- <property name="packager">
- <string><![CDATA[]]></string>
- </property>
- </object>
- </property>
- <property name="buildSettings">
- <object class="java.util.Properties">
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.save.last.date]]></string>
- <string><![CDATA[Tue Jul 27 17:40:12 CEST 2004]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.max]]></string>
- <string><![CDATA[50331648]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.unix.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.vm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.unix.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.vm.version]]></string>
- <string><![CDATA[1.3.1]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.auto-populate.labels]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.named_unix.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.project.build.last.date]]></string>
- <string><![CDATA[Mon Sep 08 20:16:55 CEST 2003]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stderr.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.heap.size.initial]]></string>
- <string><![CDATA[16777216]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.vmpack.linux.path]]></string>
- <string><![CDATA[SunJRE131_08LinuxINTEL.vm]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.aix.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.merge]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.linux.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.unix.ui.default]]></string>
- <string><![CDATA[GUI]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.platform.macosx.authentication.gui]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.hpux.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.java.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.windows.novm]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.solaris.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.valid.vm.list]]></string>
- <string><![CDATA[JDK_J2 JRE_J2 MRJ]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.web]]></string>
- <string><![CDATA[true]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.platform.macosx.novm]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.output.cdrom]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.build.options.optimization.platform.web]]></string>
- <string><![CDATA[false]]></string>
- </method>
- <method name="put">
- <string><![CDATA[com.zerog.ia.installer.options.stdout.redirect]]></string>
- <string><![CDATA[]]></string>
- </method>
- </object>
- </property>
- <property name="installFrameConfigurator">
- <object class="com.zerog.ia.installer.util.InstallFrameConfigurator" objectID="3c471af3a52c">
- <property name="decorationType">
- <int>2</int>
- </property>
- <property name="bevelDecoration">
- <boolean>false</boolean>
- </property>
- <property name="useLabelBackgroundImage">
- <boolean>false</boolean>
- </property>
- <property name="labelBackgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="labelBackgroundImageName">
- <string><![CDATA[labelBackground.png]]></string>
- </property>
- <property name="useBackgroundImage">
- <boolean>true</boolean>
- </property>
- <property name="backgroundImagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="backgroundImageName">
- <string><![CDATA[background_default.png]]></string>
- </property>
- <property name="currentLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="currentLabelIconName">
- <string><![CDATA[activeLabelIcon.png]]></string>
- </property>
- <property name="previousLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="previousLabelIconName">
- <string><![CDATA[completedLabelIcon.png]]></string>
- </property>
- <property name="futureLabelIconPath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="futureLabelIconName">
- <string><![CDATA[upcomingLabeIcon.png]]></string>
- </property>
- <property name="enablePathSubst">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageHorizontally">
- <boolean>true</boolean>
- </property>
- <property name="fitBackgroundImageVertically">
- <boolean>true</boolean>
- </property>
- <property name="zerogBannerUI">
- <boolean>false</boolean>
- </property>
- <property name="uninstallerTitle">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- </object>
- </property>
- <property name="customInstallSet">
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c490688a568">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[Choose this option to customize the features to be installed.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[customIcon.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Custom]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[custom]]></string>
- </property>
- </object>
- </property>
- <property name="fileModificationTimestampBehavior">
- <int>1</int>
- </property>
- <property name="fileModificationTimestamp">
- <long>-1</long>
- </property>
- <property name="suiteObjects">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.Project" objectID="3c471b36a535">
- <property name="name">
- <string><![CDATA[scala]]></string>
- </property>
- <property name="projectLocation">
- <string><![CDATA[Same as current product]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="defaultProject">
- <object refID="3c471b36a535"/>
- </property>
- <property name="advertisedVariables">
- <object class="java.util.Vector"/>
- </property>
- <property name="isMergeModule">
- <boolean>false</boolean>
- </property>
- <property name="installerInfoData">
- <object class="com.zerog.ia.installer.util.InstallerInfoData" objectID="3c471ae5a52b">
- <property name="installerTitle">
- <string><![CDATA[Scala Installer]]></string>
- </property>
- <property name="installerName">
- <string><![CDATA[install]]></string>
- </property>
- <property name="productName">
- <string><![CDATA[Scala]]></string>
- </property>
- <property name="productID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[41117495-1ec8-11b2-a760-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="productURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="productDescription">
- <string><![CDATA[Scala is a general purpose programming language with a special focus on web services. It combines object-oriented, functional and concurrent elements.]]></string>
- </property>
- <property name="productVersionMajor">
- <int>0</int>
- </property>
- <property name="productVersionMinor">
- <int>0</int>
- </property>
- <property name="productVersionRevision">
- <int>0</int>
- </property>
- <property name="productVersionSubRevision">
- <int>0</int>
- </property>
- <property name="supportURL">
- <string><![CDATA[http://scala.epfl.ch/]]></string>
- </property>
- <property name="vendorName">
- <string><![CDATA[LAMP - EPFL]]></string>
- </property>
- <property name="vendorID">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471ae4-1ec8-11b2-a52c-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="vendorURL">
- <string><![CDATA[http://lampwww.epfl.ch/]]></string>
- </property>
- <property name="email">
- <string><![CDATA[scala@listes.epfl.ch]]></string>
- </property>
- <property name="copyright">
- <string><![CDATA[2002-04]]></string>
- </property>
- </object>
- </property>
- <property name="installLogUninstall">
- <boolean>true</boolean>
- </property>
- <property name="neverReboots">
- <boolean>false</boolean>
- </property>
- <property name="suggestedMedias">
- <object class="com.zerog.resources.Medias" objectID="3c471ae4a52b">
- <property name="medias">
- <object class="java.util.Vector"/>
- </property>
- </object>
- </property>
- <property name="help">
- <object class="com.zerog.ia.installer.util.Help" objectID="3c471ae2a52b">
- <property name="showHelp">
- <boolean>false</boolean>
- </property>
- </object>
- </property>
- <property name="useInstallerHelp">
- <boolean>false</boolean>
- </property>
- <property name="contextualHelp">
- <boolean>true</boolean>
- </property>
- <property name="htmlHelp">
- <boolean>true</boolean>
- </property>
- <property name="defaultTargetCheckKind">
- <int>1</int>
- </property>
- <visualChildren>
- <object class="com.zerog.ia.installer.InstallSet" objectID="3c471b26a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This will install the binary files for the $PRODUCT_NAME$ software.]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[typical.png]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binary]]></string>
- </property>
- <property name="installSetName">
- <string><![CDATA[Binary Distribution]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[typical]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.InstallBundle" objectID="3c471b25a52d">
- <property name="bundleName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="description">
- <string><![CDATA[This installs the application feature.]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Binaries]]></string>
- </property>
- <property name="preferredLocalizationVariant">
- <string><![CDATA[application]]></string>
- </property>
- <installChildren>
- <object class="com.zerog.ia.installer.Billboard" objectID="3c471b21a52c">
- <property name="imagePath">
- <string><![CDATA[com/zerog/ia/installer/images/]]></string>
- </property>
- <property name="imageName">
- <string><![CDATA[billboard_default.png]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.InstallComponent" objectID="3c471b27a52d">
- <property name="componentName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="comment">
- <string><![CDATA[This component holds resources (e.g., files, folders, actions) common to all Product Features]]></string>
- </property>
- <property name="shortName">
- <string><![CDATA[Common]]></string>
- </property>
- <property name="uniqueId">
- <object class="com.zerog.registry.UUID">
- <method name="update">
- <string><![CDATA[3c471b28-1ec8-11b2-a52d-94b092094ad1]]></string>
- </method>
- </object>
- </property>
- <property name="versionMajor">
- <int>1</int>
- </property>
- <property name="versionMinor">
- <int>0</int>
- </property>
- <property name="versionRevision">
- <int>0</int>
- </property>
- <property name="versionSubRevision">
- <int>0</int>
- </property>
- <property name="keyFile">
- <object class="com.zerog.ia.installer.actions.InstallUninstaller" objectID="3c471b2da533">
- <property name="unixPermissions">
- <string><![CDATA[777]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="guiLauncher">
- <boolean>true</boolean>
- </property>
- <property name="propertyList">
- <object class="java.util.Vector">
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stderr.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b34a535">
- <property name="propertyValue">
- <string><![CDATA[2750]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.win32.microsoftvm.min.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[The minimum version of Microsoft's VM this application will run against]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b30a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdin.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa533">
- <property name="propertyValue">
- <string><![CDATA[.]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.user.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[left blank, this property will cause the native launcher to not
-alter the platform default behavior for setting the user dir.
-To override this you may set this property to a relative or absolute path.
-Relative paths are relative to the launcher.]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2ea533">
- <property name="propertyValue">
- <string><![CDATA[main]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.main.method]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the method in the main class that will be invoked]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a533">
- <property name="propertyValue">
- <string><![CDATA[$USER_INSTALL_DIR$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.root.install.dir]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[path to the installdir magic folder]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b2fa534">
- <property name="propertyValue">
- <string><![CDATA[$CMD_LINE_ARGUMENTS$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.command.line.args]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[what will be passed to the main method -- be sure to quote arguments with spaces in them]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b32a535">
- <property name="propertyValue">
- <string><![CDATA[$IA_CLASSPATH$]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.class.path]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[the Java classpath necessary to run this application
-Can be separated by colons (Mac OS/Unix) or semicolons (Windows)]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a534">
- <property name="propertyValue">
- <string><![CDATA[J2 J1 MSJ MRJ]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.nl.valid.vm.list]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[a string containing one or more of [ ALL JDK JRE J1 J2 JRE_J1 JDK_J1 JRE_J2 JDK_J2 MSJ MRJ ]
- delimited by spaces or commas. If the native launcher cannot find the current vm,
-it will search for ones in this list]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b33a535">
- <property name="propertyValue">
- <string><![CDATA[5.5]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.version]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[version of LaunchAnywhere that created this properties file]]></string>
- </property>
- </object>
- </method>
- <method name="addElement">
- <object class="com.zerog.ia.installer.util.LAXPropertyData" objectID="3c471b31a534">
- <property name="propertyValue">
- <string><![CDATA[]]></string>
- </property>
- <property name="propertyName">
- <string><![CDATA[lax.stdout.redirect]]></string>
- </property>
- <property name="propertyComment">
- <string><![CDATA[leave blank for no input, "console" to read from the console window,
-and any path to a file to read from that file]]></string>
- </property>
- </object>
- </method>
- </object>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall scala]]></string>
- </property>
- <property name="featureUninstallEnabled">
- <boolean>false</boolean>
- </property>
- <property name="neverRestarts">
- <boolean>false</boolean>
- </property>
- <property name="asksUserAboutRestart">
- <boolean>true</boolean>
- </property>
- </object>
- </property>
- <installChildren>
- <object refID="3c471b2da533"/>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="3c471b2ca533">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[UninstallerData]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>true</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="3c471b2da533"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.ExpandFile" objectID="95f49032bd3e">
- <property name="sourceName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="sizeOfArchive">
- <long>-1</long>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="95f4ce45bd3e">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1bbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_en.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="9f9e2f1cbcf5">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_fr.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallFile" objectID="a45d601dbcfa">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[LICENSE_de.html]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallZipfile" objectID="e738659db1b1">
- <property name="unixPermissions">
- <string><![CDATA[664]]></string>
- </property>
- <property name="sourceName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[scala.zip]]></string>
- </property>
- <property name="fileSize">
- <long>-1</long>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <property name="targetCheckKind">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="e73877d0b1b1">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="ceb023208130">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$api$/$index.html]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala API Documentation]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf116791816c">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$UninstallerData$/$Uninstall scala.exe]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Uninstall $PRODUCT_NAME$]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf13ae0381ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaReference.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Reference]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1433cf81ad">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaTutorial.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala Tutorial]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="cf1c65588134">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$doc$/$ScalaByExample.pdf]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Scala by Example]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.CreateShortcut" objectID="d39fab9b812e">
- <property name="useInstalledFile">
- <boolean>false</boolean>
- </property>
- <property name="existingFilePath">
- <string><![CDATA[$USER_INSTALL_DIR$$/$bin$/$scalaint.bat]]></string>
- </property>
- <property name="workingDir">
- <string><![CDATA[]]></string>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ Interpreter]]></string>
- </property>
- <property name="args">
- <string><![CDATA[]]></string>
- </property>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="d39fe577812e">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[Documentation]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="ceb023208130"/>
- <object refID="cf1c65588134"/>
- <object refID="cf13ae0381ad"/>
- <object refID="cf1433cf81ad"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.InstallDirectory" objectID="ceb26b938130">
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="destinationName">
- <string><![CDATA[$PRODUCT_NAME$ $PRODUCT_VERSION_NUMBER$]]></string>
- </property>
- <property name="removeRecursively">
- <boolean>false</boolean>
- </property>
- <property name="macBinary">
- <boolean>false</boolean>
- </property>
- <visualChildren>
- <object refID="d39fe577812e"/>
- <object refID="d39fab9b812e"/>
- <object refID="cf116791816c"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.actions.ExpandFile" objectID="d976645f8134">
- <property name="sourceName">
- <string><![CDATA[tools.zip]]></string>
- </property>
- <property name="sourcePath">
- <string><![CDATA[/tmp/IA_Build_scala/]]></string>
- </property>
- <property name="sourceFileType">
- <int>0</int>
- </property>
- <property name="shouldUninstall">
- <boolean>true</boolean>
- </property>
- <property name="sizeOfArchive">
- <long>-1</long>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d97752f68134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- <object class="com.zerog.ia.installer.actions.MakeRegEntry" objectID="d9860f888134">
- <property name="userLabel">
- <string><![CDATA[SCALA_HOME]]></string>
- </property>
- <property name="valueName">
- <string><![CDATA[SCALA_HOME]]></string>
- </property>
- <property name="value">
- <string><![CDATA[$USER_INSTALL_DIR$]]></string>
- </property>
- <property name="key">
- <string><![CDATA[HKEY_CURRENT_USER\Environment]]></string>
- </property>
- <property name="uninstallOptions">
- <int>0</int>
- </property>
- <property name="dataType">
- <int>0</int>
- </property>
- <rules logicalOperation="AND">
- <object class="com.zerog.ia.installer.rules.PlatformChk" objectID="d98706a08134">
- <property name="installOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Windows 95]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 98]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows NT]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows Me]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2000]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows XP]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Windows 2003]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[OS/2]]></string>
- </method>
- </object>
- </property>
- <property name="doNotInstallOnPlatformList">
- <object class="java.util.Vector">
- <method name="addElement">
- <string><![CDATA[Mac OS X]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Solaris]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[SunOS]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[HP-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Linux]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[AIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Irix]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[DG-UX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Compaq's Digital UNIX]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[FreeBSD]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Rhapsody]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[NetWare]]></string>
- </method>
- <method name="addElement">
- <string><![CDATA[Unlisted Platforms]]></string>
- </method>
- </object>
- </property>
- </object>
- </rules>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- </installChildren>
- </object>
- <object refID="3c471b25a52d"/>
- <object refID="3c471b27a52d"/>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="3c471b20a52c">
- <property name="destinationFolder">
- <object refID="3c46d385a525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="3c471b2ca533"/>
- <object refID="95f49032bd3e"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="95f2fa49bd04">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.IATempMF" factoryID="1114" objectID="93ec3332bcf4"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="e738659db1b1"/>
- <object refID="d976645f8134"/>
- <object refID="d9860f888134"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="9f9e5260bcf5">
- <property name="destinationFolder">
- <object class="com.zerog.ia.installer.util.magicfolders.DoNotInstallMF" factoryID="993" objectID="9f9da4c2bcf1"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="a45d601dbcfa"/>
- <object refID="9f9e2f1bbcf5"/>
- <object refID="9f9e2f1cbcf5"/>
- </visualChildren>
- </object>
- <object class="com.zerog.ia.installer.GhostDirectory" objectID="ceb0ad8a8130">
- <property name="destinationFolder">
- <object refID="3c46d8dea525"/>
- </property>
- <property name="overrideUnixPermissions">
- <boolean>false</boolean>
- </property>
- <property name="unixPermissions">
- <string><![CDATA[775]]></string>
- </property>
- <visualChildren>
- <object refID="ceb26b938130"/>
- </visualChildren>
- </object>
- <object refID="3c471b21a52c"/>
- </visualChildren>
- <installChildren>
- <object refID="3c471b26a52c"/>
- </installChildren>
- </object>
- </installationObjects>
- <restorationObjects count="0"/>
-</InstallAnywhere_Deployment_Project>
diff --git a/config/ia/setversion.xsl b/config/ia/setversion.xsl
deleted file mode 100644
index a235502692..0000000000
--- a/config/ia/setversion.xsl
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <xsl:output method="xml" version="1.0" encoding="UTF-8"
- doctype-public="-//W3C//DTD XHTML 1.1//EN"
- doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
- indent="yes"/>
-
- <!-- ##################### Match Rules ####################### -->
-
- <xsl:template match="/">
- <xsl:apply-templates/>
- </xsl:template>
-
-
- <!-- ELEMENT object -->
-
- <xsl:template match="object">
- <xsl:text disable-output-escaping="yes"><![CDATA[<object]]></xsl:text>
- <xsl:for-each select="@*">
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <xsl:value-of select="name()"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[="]]></xsl:text><xsl:value-of select="."/><xsl:text disable-output-escaping="yes"><![CDATA["]]></xsl:text>
- </xsl:for-each>
- <xsl:choose>
- <xsl:when test=".!=''">
- <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
- <xsl:apply-templates/>
- <xsl:text disable-output-escaping="yes"><![CDATA[</object>]]></xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text disable-output-escaping="yes"><![CDATA[/>]]></xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- ELEMENT property -->
-
- <xsl:template match="property">
- <xsl:choose>
- <xsl:when test="@name='productVersionMajor'">
- <xsl:variable name="major" select="substring-before($version,'.')" />
- <property name="productVersionMajor">
- <int><xsl:value-of select="$major"/></int>
- </property>
- </xsl:when>
- <xsl:when test="@name='productVersionMinor'">
- <xsl:variable name="minor"
- select="substring-before(substring-after($version,'.'),'.')" />
- <property name="productVersionMinor">
- <int><xsl:value-of select="$minor"/></int>
- </property>
- </xsl:when>
- <xsl:when test="@name='productVersionRevision'">
- <xsl:variable name="revision"
- select="substring-before(substring-after(substring-after($version,'.'),'.'),'.')" />
- <property name="productVersionRevision">
- <int><xsl:value-of select="$revision"/></int>
- </property>
- </xsl:when>
- <xsl:when test="@name='productVersionSubRevision'">
- <xsl:variable name="subrevision"
- select="substring-after(substring-after(substring-after($version,'.'),'.'),'.')" />
- <property name="productVersionSubRevision">
- <int><xsl:value-of select="$subrevision"/></int>
- </property>
- </xsl:when>
- <xsl:otherwise>
- <xsl:copy>
- <xsl:copy-of select="@*"/>
- <xsl:apply-templates/>
- </xsl:copy>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- ELEMENT restorationObjects -->
-
- <xsl:template match="restorationObjects">
- <xsl:text disable-output-escaping="yes"><![CDATA[<restorationObjects]]></xsl:text>
- <xsl:for-each select="@*">
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <xsl:value-of select="name()"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[="]]></xsl:text><xsl:value-of select="."/><xsl:text disable-output-escaping="yes"><![CDATA["]]></xsl:text>
- </xsl:for-each>
- <xsl:choose>
- <xsl:when test=".!=''">
- <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
- <xsl:apply-templates/>
- <xsl:text disable-output-escaping="yes"><![CDATA[</restorationObjects>]]></xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text disable-output-escaping="yes"><![CDATA[/>]]></xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- ELEMENT string -->
-
- <xsl:template match="string">
- <string><xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>![CDATA[<xsl:value-of select="." disable-output-escaping="yes"/>]]<xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text></string>
- </xsl:template>
-
-
- <!-- ELEMENT versionID -->
-
- <xsl:template match="versionID">
- <xsl:text disable-output-escaping="yes"><![CDATA[<versionID]]></xsl:text>
- <xsl:for-each select="@*">
- <xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
- <xsl:value-of select="name()"/>
- <xsl:text disable-output-escaping="yes"><![CDATA[="]]></xsl:text><xsl:value-of select="."/><xsl:text disable-output-escaping="yes"><![CDATA["]]></xsl:text>
- </xsl:for-each>
- <xsl:choose>
- <xsl:when test=".!=''">
- <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
- <xsl:apply-templates/>
- <xsl:text disable-output-escaping="yes"><![CDATA[</versionID>]]></xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text disable-output-escaping="yes"><![CDATA[/>]]></xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
-
- <!-- otherwise -->
-
- <xsl:template match="*">
- <xsl:copy>
- <xsl:copy-of select="@*"/>
- <xsl:apply-templates/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/config/ia/tools.readme b/config/ia/tools.readme
deleted file mode 100644
index 54c23bcb95..0000000000
--- a/config/ia/tools.readme
+++ /dev/null
@@ -1,17 +0,0 @@
-Contents
---------
-
-README
- This file
-
-scalaenv.bat
- Batch file(s) executed from the IA installer
-
-reg.exe (Console Registry Tool for Windows - Version 3.0)
- See http://www.microsoft.com/
-
-sed15.exe (HHsed - Version 1.5)
- See http://www.student.northpark.edu/pemente/sed/
-
-unzip.exe (UnZip 5.50 of 17 February 2002, by Info-ZIP)
- See http://www.info-zip.org/pub/infozip/
diff --git a/config/ia/tools.zip b/config/ia/tools.zip
deleted file mode 100644
index 4b58534119..0000000000
--- a/config/ia/tools.zip
+++ /dev/null
Binary files differ
diff --git a/config/list/emacs.lst b/config/list/emacs.lst
deleted file mode 100644
index a6a0f9cb0f..0000000000
--- a/config/list/emacs.lst
+++ /dev/null
@@ -1,12 +0,0 @@
-############################################################-*-Makefile-*-####
-# emacs scala-mode files (paths are relative to ./support/emacs)
-##############################################################################
-# $Id$
-
-inferior-scala-mode.el
-scala-mode-auto.el
-scala-mode.el
-Makefile
-README
-
-##############################################################################
diff --git a/config/list/examples.lst b/config/list/examples.lst
deleted file mode 100644
index 03eeb0544a..0000000000
--- a/config/list/examples.lst
+++ /dev/null
@@ -1,45 +0,0 @@
-############################################################-*-Makefile-*-####
-# scala examples (paths are relative to ./sources/examples)
-##############################################################################
-# $Id$
-
-auction.scala
-boundedbuffer.scala
-computeserver.scala
-fors.scala
-futures.scala
-iterators.scala
-maps.scala
-oneplacebuffer.scala
-Parsers.scala
-parsers1.scala
-parsers2.scala
-patterns.scala
-sort.scala
-sort1.scala
-sort2.scala
-# typeinf.scala
-
-expressions/expressions-current.scala
-
-# jolib/Ref.scala
-# jolib/parallelOr.scala
-
-mobile/sort.scala
-
-monads/callccInterpreter.scala
-monads/directInterpreter.scala
-monads/errorInterpreter.scala
-monads/simpleInterpreter.scala
-monads/stateInterpreter.scala
-
-pilib/elasticBuffer.scala
-pilib/handover.scala
-pilib/mobilePhoneProtocol.scala
-pilib/piNat.scala
-pilib/rwlock.scala
-pilib/scheduler.scala
-pilib/semaphore.scala
-pilib/twoPlaceBuffer.scala
-
-##############################################################################
diff --git a/config/list/lamplib.lst b/config/list/lamplib.lst
deleted file mode 100644
index 1b95fc6aae..0000000000
--- a/config/list/lamplib.lst
+++ /dev/null
@@ -1,14 +0,0 @@
-############################################################-*-Makefile-*-####
-# lamp library source files (paths are relative to ./sources/ch/epfl/lamp)
-##############################################################################
-# $Id$
-
-util/CodePrinter.java
-util/ForwardingMap.java
-util/HTMLPrinter.java
-util/HTMLRepresentation.java
-util/Pair.java
-util/XHTMLPrinter.java
-util/XMLAttribute.java
-
-##############################################################################
diff --git a/config/list/library-msil.lst b/config/list/library-msil.lst
deleted file mode 100644
index 54cfd8d3f3..0000000000
--- a/config/list/library-msil.lst
+++ /dev/null
@@ -1,304 +0,0 @@
-############################################################-*-Makefile-*-####
-# scala library files (paths are relative to ./sources/scala)
-##############################################################################
-# $Id$
-
-_trait_.scala
-AnyVal.cs
-Application.scala
-Array.cs
-Attribute.scala
-Boolean.cs
-BufferedIterator.scala
-Byte.cs
-CaseClass.scala
-Cell.scala
-Char.cs
-cloneable.scala
-../msil/scala/Console.scala
-Double.cs
-Enumeration.scala
-Float.cs
-Function0.scala
-Function1.scala
-Function2.scala
-Function3.scala
-Function4.scala
-Function5.scala
-Function6.scala
-Function7.scala
-Function8.scala
-Function9.scala
-Int.cs
-Iterable.scala
-IterableProxy.scala
-Iterator.scala
-../msil/scala/List.scala
-Long.cs
-MatchError.cs
-None.scala
-Option.scala
-Ordered.scala
-PartialFunction.scala
-PartiallyOrdered.scala
-../msil/scala/Predef.scala
-Proxy.scala
-Ref.cs
-ScalaObject.cs
-Seq.scala
-SeqProxy.scala
-SerialVersionUID.scala
-serializable.scala
-Short.cs
-Some.scala
-../msil/scala/Stream.scala
-Symbol.scala
-Tuple1.scala
-Tuple2.scala
-Tuple3.scala
-Tuple4.scala
-Tuple5.scala
-Tuple6.scala
-Tuple7.scala
-Tuple8.scala
-Tuple9.scala
-#Type.java
-Unit.cs
-transient.scala
-volatile.scala
-
-collection/BitSet.scala
-collection/Map.scala
-collection/MapProxy.scala
-collection/Set.scala
-collection/SetProxy.scala
-
-collection/mutable/ArrayBuffer.scala
-collection/mutable/BitSet.scala
-collection/mutable/Buffer.scala
-collection/mutable/BufferProxy.scala
-collection/mutable/DefaultMapModel.scala
-collection/mutable/DoubleLinkedList.scala
-collection/mutable/HashMap.scala
-collection/mutable/HashSet.scala
-collection/mutable/HashTable.scala
-collection/mutable/History.scala
-collection/mutable/ImmutableMapAdaptor.scala
-collection/mutable/ImmutableSetAdaptor.scala
-#collection/mutable/JavaMapAdaptor.scala
-#collection/mutable/JavaSetAdaptor.scala
-collection/mutable/LinkedList.scala
-collection/mutable/ListBuffer.scala
-collection/mutable/Location.scala
-collection/mutable/Map.scala
-collection/mutable/MapProxy.scala
-collection/mutable/Message.scala
-collection/mutable/MultiMap.scala
-collection/mutable/MutableList.scala
-collection/mutable/ObservableBuffer.scala
-collection/mutable/ObservableMap.scala
-collection/mutable/ObservableSet.scala
-collection/mutable/PriorityQueue.scala
-collection/mutable/PriorityQueueProxy.scala
-collection/mutable/Publisher.scala
-collection/mutable/Queue.scala
-collection/mutable/QueueProxy.scala
-collection/mutable/ResizableArray.scala
-collection/mutable/RevertableHistory.scala
-collection/mutable/Scriptable.scala
-collection/mutable/Set.scala
-collection/mutable/SetProxy.scala
-collection/mutable/SingleLinkedList.scala
-collection/mutable/Stack.scala
-collection/mutable/StackProxy.scala
-collection/mutable/Subscriber.scala
-collection/mutable/SynchronizedBuffer.scala
-collection/mutable/SynchronizedMap.scala
-collection/mutable/SynchronizedPriorityQueue.scala
-collection/mutable/SynchronizedQueue.scala
-collection/mutable/SynchronizedSet.scala
-collection/mutable/SynchronizedStack.scala
-collection/mutable/Undoable.scala
-
-collection/immutable/BitSet.scala
-collection/immutable/ListMap.scala
-collection/immutable/ListSet.scala
-collection/immutable/Map.scala
-collection/immutable/Queue.scala
-collection/immutable/Set.scala
-collection/immutable/Stack.scala
-collection/immutable/Tree.scala
-collection/immutable/TreeMap.scala
-collection/immutable/TreeSet.scala
-
-# concurrent/Actor.scala
-# concurrent/Channel.scala
-# concurrent/Lock.scala
-# concurrent/MailBox.scala
-# concurrent/NameServer.scala
-# concurrent/Process.scala
-# concurrent/SyncChannel.scala
-# concurrent/SyncVar.scala
-# concurrent/TIMEOUT.scala
-# # concurrent/jolib.scala
-# concurrent/ops.scala
-# concurrent/pilib.scala
-
-#io/Source.scala
-io/Position.scala
-
-#mobile/Code.scala
-#mobile/Location.scala
-
-#runtime/AtomicReference.java
-# runtime/BoxedBoolean.java
-# runtime/BoxedByte.java
-# runtime/BoxedChar.java
-# runtime/BoxedDouble.java
-# runtime/BoxedFloat.java
-# runtime/BoxedInt.java
-# runtime/BoxedLong.java
-# runtime/BoxedNumber.java
-# runtime/BoxedShort.java
-# runtime/BoxedUnit.java
-# runtime/BoxedAnyArray.scala
-# runtime/BoxedArray.scala
-# runtime/BoxedBooleanArray.scala
-# runtime/BoxedByteArray.scala
-# runtime/BoxedCharArray.scala
-# runtime/BoxedDoubleArray.scala
-# runtime/BoxedFloatArray.scala
-# runtime/BoxedIntArray.scala
-# runtime/BoxedLongArray.scala
-# runtime/BoxedObjectArray.scala
-# runtime/BoxedShortArray.scala
-#runtime/FNV_Hash.java
-#runtime/IOMap.java
-#runtime/InterpreterSupport.java
-runtime/MetaAttribute.cs
-runtime/RunTime.cs
-runtime/SymtabAttribute.cs
-../msil/scala/runtime/ScalaRunTime.scala
-
-../msil/scala/runtime/compat/Math.scala
-../msil/scala/runtime/compat/Platform.scala
-../msil/scala/runtime/compat/StringBuilder.scala
-
-runtime/matching/Address.scala
-#runtime/matching/Matcher.scala
-runtime/matching/NonTerm.scala
-#runtime/matching/PatternGrammar.scala
-runtime/matching/PatternTests.scala
-runtime/matching/Rule.scala
-runtime/matching/TestAlphabet.scala
-
-#text/Document.scala
-
-# runtime/types/ClassType.java
-# runtime/types/JavaClassType.java
-# runtime/types/JavaRefArrayType.java
-# runtime/types/ScalaClassType.java
-# runtime/types/LazyParents.java
-# runtime/types/CompoundType.java
-# runtime/types/SingleType.java
-# runtime/types/ValueType.java
-# runtime/types/TypeBoolean.java
-# runtime/types/TypeByte.java
-# runtime/types/TypeChar.java
-# runtime/types/TypeConstructor.java
-# runtime/types/TypeDouble.java
-# runtime/types/TypeFloat.java
-# runtime/types/TypeInt.java
-# runtime/types/TypeLong.java
-# runtime/types/TypeShort.java
-# runtime/types/TypeUnit.java
-# runtime/types/SpecialType.java
-# runtime/types/TypeAll.java
-# runtime/types/TypeAllRef.java
-# runtime/types/TypeAny.java
-# runtime/types/TypeAnyVal.java
-# runtime/types/Statistics.java
-
-testing/UnitTest.scala
-#testing/SUnit.scala
-#testing/Benchmark.scala
-
-util/automata/BaseBerrySethi.scala
-../msil/scala/util/automata/DetWordAutom.scala
-util/automata/Inclusion.scala
-../msil/scala/util/automata/NondetWordAutom.scala
-util/automata/SubsetConstruction.scala
-util/automata/WordBerrySethi.scala
-util/grammar/HedgeRHS.scala
-#util/grammar/ImmutableTreeHedgeGrammar.scala
-#util/grammar/MutableTreeHedgeGrammar.scala
-#util/grammar/TreeHedgeGrammar.scala
-util/grammar/TreeRHS.scala
-util/regexp/Base.scala
-util/regexp/PointedHedgeExp.scala
-../msil/scala/util/regexp/SyntaxError.scala
-util/regexp/WordExp.scala
-util/logging/Logged.scala
-util/logging/ConsoleLogger.scala
-
-# xml/Atom.scala
-# xml/Comment.scala
-# xml/Document.scala
-# xml/Elem.scala
-# xml/EntityRef.scala
-# xml/MetaData.scala
-# xml/Molecule.scala
-# xml/NamespaceBinding.scala
-# xml/Node.scala
-# xml/NodeBuffer.scala
-# xml/NodeSeq.scala
-# xml/Null.scala
-# xml/NodeTraverser.scala
-# xml/Parsing.scala
-# xml/PrettyPrinter.scala
-# xml/PrefixedAttribute.scala
-# xml/ProcInstr.scala
-# xml/SpecialNode.scala
-# xml/Text.scala
-# xml/TextBuffer.scala
-# xml/TopScope.scala
-# xml/TypeSymbol.scala
-# xml/UnprefixedAttribute.scala
-# xml/Utility.scala
-# xml/XML.scala
-
-# xml/dtd/ContentModel.scala
-# xml/dtd/DocType.scala
-# xml/dtd/DTD.scala
-# xml/dtd/Decl.scala
-# xml/dtd/ElementValidator.scala
-# xml/dtd/ExternalID.scala
-# xml/dtd/ContentModelParser.scala
-# xml/dtd/Scanner.scala
-# xml/dtd/Tokens.scala
-# xml/dtd/DtdTypeSymbol.scala
-# #xml/dtd/Validation.scala
-# xml/dtd/ValidationException.scala
-
-# xml/factory/NodeFactory.scala
-# xml/factory/LoggedNodeFactory.scala
-
-# xml/parsing/ConstructingHandler.scala
-# xml/parsing/ConstructingParser.scala
-# xml/parsing/DefaultMarkupHandler.scala
-# xml/parsing/ExternalSources.scala
-# xml/parsing/FatalError.scala
-# xml/parsing/MarkupHandler.scala
-# xml/parsing/MarkupParser.scala
-# xml/parsing/FactoryAdapter.scala
-# xml/parsing/NoBindingFactoryAdapter.scala
-# xml/parsing/TokenTests.scala
-# xml/parsing/ValidatingMarkupHandler.scala
-
-# xml/path/Expression.scala
-
-# xml/transform/BasicTransformer.scala
-# xml/transform/RewriteRule.scala
-# xml/transform/RuleTransformer.scala
-
-##############################################################################
diff --git a/config/list/library.lst b/config/list/library.lst
deleted file mode 100644
index e5b92dd561..0000000000
--- a/config/list/library.lst
+++ /dev/null
@@ -1,400 +0,0 @@
-############################################################-*-Makefile-*-####
-# scala library files (paths are relative to ./sources/scala)
-##############################################################################
-# $Id$
-
-_trait_.scala
-AnyVal.java
-Application.scala
-Array.java
-Attribute.scala
-Boolean.java
-BufferedIterator.scala
-Byte.java
-CaseClass.scala
-Cell.scala
-Char.java
-cloneable.scala
-Console.scala
-Double.java
-Enumeration.scala
-Float.java
-Function0.scala
-Function1.scala
-Function2.scala
-Function3.scala
-Function4.scala
-Function5.scala
-Function6.scala
-Function7.scala
-Function8.scala
-Function9.scala
-Int.java
-Iterable.scala
-IterableProxy.scala
-Iterator.scala
-List.scala
-Long.java
-MatchError.java
-None.scala
-Option.scala
-Ordered.scala
-PartialFunction.scala
-PartiallyOrdered.scala
-Predef.scala
-Proxy.scala
-Ref.java
-ScalaObject.java
-Seq.scala
-SeqProxy.scala
-SerialVersionUID.scala
-serializable.scala
-Short.java
-Some.scala
-Stream.scala
-Symbol.scala
-Tuple1.scala
-Tuple2.scala
-Tuple3.scala
-Tuple4.scala
-Tuple5.scala
-Tuple6.scala
-Tuple7.scala
-Tuple8.scala
-Tuple9.scala
-Type.java
-Unit.java
-transient.scala
-volatile.scala
-
-collection/BitSet.scala
-collection/Map.scala
-collection/MapProxy.scala
-collection/Set.scala
-collection/SetProxy.scala
-
-collection/mutable/ArrayBuffer.scala
-collection/mutable/BitSet.scala
-collection/mutable/Buffer.scala
-collection/mutable/BufferProxy.scala
-collection/mutable/DefaultMapModel.scala
-collection/mutable/DoubleLinkedList.scala
-collection/mutable/HashMap.scala
-collection/mutable/HashSet.scala
-collection/mutable/HashTable.scala
-collection/mutable/History.scala
-collection/mutable/ImmutableMapAdaptor.scala
-collection/mutable/ImmutableSetAdaptor.scala
-collection/mutable/JavaMapAdaptor.scala
-collection/mutable/JavaSetAdaptor.scala
-collection/mutable/LinkedList.scala
-collection/mutable/ListBuffer.scala
-collection/mutable/Location.scala
-collection/mutable/Map.scala
-collection/mutable/MapProxy.scala
-collection/mutable/Message.scala
-collection/mutable/MultiMap.scala
-collection/mutable/MutableList.scala
-collection/mutable/ObservableBuffer.scala
-collection/mutable/ObservableMap.scala
-collection/mutable/ObservableSet.scala
-collection/mutable/PriorityQueue.scala
-collection/mutable/PriorityQueueProxy.scala
-collection/mutable/Publisher.scala
-collection/mutable/Queue.scala
-collection/mutable/QueueProxy.scala
-collection/mutable/ResizableArray.scala
-collection/mutable/RevertableHistory.scala
-collection/mutable/Scriptable.scala
-collection/mutable/Set.scala
-collection/mutable/SetProxy.scala
-collection/mutable/SingleLinkedList.scala
-collection/mutable/Stack.scala
-collection/mutable/StackProxy.scala
-collection/mutable/Subscriber.scala
-collection/mutable/SynchronizedBuffer.scala
-collection/mutable/SynchronizedMap.scala
-collection/mutable/SynchronizedPriorityQueue.scala
-collection/mutable/SynchronizedQueue.scala
-collection/mutable/SynchronizedSet.scala
-collection/mutable/SynchronizedStack.scala
-collection/mutable/Undoable.scala
-
-collection/immutable/BitSet.scala
-collection/immutable/ListMap.scala
-collection/immutable/ListSet.scala
-collection/immutable/Map.scala
-collection/immutable/Queue.scala
-collection/immutable/Set.scala
-collection/immutable/Stack.scala
-collection/immutable/Tree.scala
-collection/immutable/TreeMap.scala
-collection/immutable/TreeSet.scala
-
-concurrent/Actor.scala
-concurrent/Channel.scala
-concurrent/Lock.scala
-concurrent/MailBox.scala
-concurrent/NameServer.scala
-concurrent/Process.scala
-concurrent/SyncChannel.scala
-concurrent/SyncVar.scala
-concurrent/TIMEOUT.scala
-# concurrent/jolib.scala
-concurrent/ops.scala
-concurrent/pilib.scala
-
-dbc/Database.scala
-dbc/Utilities.scala
-#dbc/Test.scala
-dbc/Value.scala
-dbc/Syntax.scala
-dbc/datatype/ApproximateNumeric.scala
-dbc/datatype/Boolean.scala
-dbc/datatype/CharacterLargeObject.scala
-dbc/datatype/Character.scala
-dbc/datatype/CharacterString.scala
-dbc/datatype/CharacterVarying.scala
-dbc/datatype/ExactNumeric.scala
-dbc/datatype/Factory.scala
-dbc/datatype/Numeric.scala
-dbc/DataType.scala
-dbc/datatype/String.scala
-dbc/datatype/Unknown.scala
-dbc/exception/IncompatibleSchema.scala
-dbc/exception/UnsupportedFeature.scala
-dbc/result/FieldMetadata.scala
-dbc/result/Field.scala
-dbc/result/Relation.scala
-dbc/result/Status.scala
-dbc/result/Tuple.scala
-dbc/statement/AccessMode.scala
-dbc/statement/DerivedColumn.scala
-dbc/statement/expression/Aggregate.scala
-dbc/statement/expression/BinaryOperator.scala
-dbc/statement/expression/Constant.scala
-dbc/statement/expression/Default.scala
-dbc/statement/expression/Field.scala
-dbc/statement/expression/FunctionCall.scala
-dbc/statement/Expression.scala
-dbc/statement/expression/Select.scala
-dbc/statement/expression/SetFunction.scala
-dbc/statement/expression/TypeCast.scala
-dbc/statement/expression/UnaryOperator.scala
-dbc/statement/InsertionData.scala
-dbc/statement/Insert.scala
-dbc/statement/IsolationLevel.scala
-dbc/statement/Jointure.scala
-dbc/statement/JoinType.scala
-dbc/statement/Relation.scala
-dbc/statement/Select.scala
-dbc/statement/SetClause.scala
-dbc/statement/SetQuantifier.scala
-dbc/statement/Statement.scala
-dbc/statement/Status.scala
-dbc/statement/Table.scala
-dbc/statement/Transaction.scala
-dbc/statement/Update.scala
-dbc/syntax/Database.scala
-dbc/syntax/DataTypeUtil.scala
-dbc/syntax/StatementExpression.scala
-dbc/syntax/Statement.scala
-dbc/value/ApproximateNumeric.scala
-dbc/value/Boolean.scala
-dbc/value/CharacterLargeObject.scala
-dbc/value/Character.scala
-dbc/value/CharacterVarying.scala
-dbc/value/Conversion.scala
-dbc/value/ExactNumeric.scala
-dbc/value/Factory.scala
-dbc/value/Unknown.scala
-dbc/vendor/PostgreSQL.scala
-dbc/Vendor.scala
-
-#distributed/Channel.scala
-#distributed/ChannelException.scala
-#distributed/RemoteRef.scala
-#distributed/RemoteExecution.scala
-
-io/Position.scala
-io/Source.scala
-
-mobile/Code.scala
-mobile/Location.scala
-
-reflect/Code.scala
-reflect/Symbol.scala
-reflect/Type.scala
-reflect/TypedCode.scala
-reflect/Print.scala
-
-runtime/AtomicReference.java
-runtime/BooleanRef.java
-runtime/BoxedBoolean.java
-runtime/BoxedByte.java
-runtime/BoxedChar.java
-runtime/BoxedDouble.java
-runtime/BoxedFloat.java
-runtime/BoxedInt.java
-runtime/BoxedLong.java
-runtime/BoxedNumber.java
-runtime/BoxedShort.java
-runtime/BoxedUnit.java
-runtime/BoxedAnyArray.scala
-runtime/BoxedArray.scala
-runtime/BoxedBooleanArray.scala
-runtime/BoxedByteArray.scala
-runtime/BoxedCharArray.scala
-runtime/BoxedDoubleArray.scala
-runtime/BoxedFloatArray.scala
-runtime/BoxedIntArray.scala
-runtime/BoxedLongArray.scala
-runtime/BoxedObjectArray.scala
-runtime/BoxedShortArray.scala
-runtime/ByteRef.java
-runtime/CharRef.java
-runtime/DoubleRef.java
-runtime/FNV_Hash.java
-runtime/FloatRef.java
-runtime/IOMap.java
-runtime/IntRef.java
-runtime/InterpreterSupport.java
-runtime/LongRef.java
-runtime/ObjectRef.java
-runtime/RunTime.java
-runtime/ScalaRunTime.scala
-runtime/ShortRef.java
-
-runtime/compat/Math.scala
-runtime/compat/Platform.scala
-runtime/compat/StringBuilder.scala
-
-#runtime/distributed/Channel.java
-#runtime/distributed/ChannelImpl.java
-#runtime/distributed/Reference.java
-#runtime/distributed/ReferenceImpl.java
-
-runtime/matching/Address.scala
-#runtime/matching/Matcher.scala
-runtime/matching/NonTerm.scala
-#runtime/matching/PatternGrammar.scala
-runtime/matching/PatternTests.scala
-runtime/matching/Rule.scala
-runtime/matching/TestAlphabet.scala
-
-text/Document.scala
-
-runtime/types/ClassType.java
-runtime/types/JavaClassType.java
-runtime/types/JavaRefArrayType.java
-runtime/types/ScalaClassType.java
-runtime/types/LazyParents.java
-runtime/types/CompoundType.java
-runtime/types/SingleType.java
-runtime/types/ValueType.java
-runtime/types/TypeBoolean.java
-runtime/types/TypeByte.java
-runtime/types/TypeChar.java
-runtime/types/TypeConstructor.java
-runtime/types/TypeDouble.java
-runtime/types/TypeFloat.java
-runtime/types/TypeInt.java
-runtime/types/TypeLong.java
-runtime/types/TypeShort.java
-runtime/types/TypeUnit.java
-runtime/types/SpecialType.java
-runtime/types/TypeAll.java
-runtime/types/TypeAllRef.java
-runtime/types/TypeAny.java
-runtime/types/TypeAnyVal.java
-runtime/types/Statistics.java
-
-testing/UnitTest.scala
-testing/SUnit.scala
-testing/Benchmark.scala
-
-util/automata/BaseBerrySethi.scala
-util/automata/DetWordAutom.scala
-util/automata/Inclusion.scala
-util/automata/NondetWordAutom.scala
-util/automata/SubsetConstruction.scala
-util/automata/WordBerrySethi.scala
-util/grammar/HedgeRHS.scala
-#util/grammar/ImmutableTreeHedgeGrammar.scala
-#util/grammar/MutableTreeHedgeGrammar.scala
-#util/grammar/TreeHedgeGrammar.scala
-util/grammar/TreeRHS.scala
-util/regexp/Base.scala
-util/regexp/PointedHedgeExp.scala
-util/regexp/SyntaxError.scala
-util/regexp/WordExp.scala
-util/logging/Logged.scala
-util/logging/ConsoleLogger.scala
-
-xml/Atom.scala
-xml/Comment.scala
-xml/Document.scala
-xml/Elem.scala
-xml/EntityRef.scala
-xml/MalformedAttributeException.scala
-xml/MetaData.scala
-xml/Molecule.scala
-xml/NamespaceBinding.scala
-xml/Node.scala
-xml/NodeBuffer.scala
-xml/NodeSeq.scala
-xml/Null.scala
-xml/NodeTraverser.scala
-xml/Parsing.scala
-xml/PrettyPrinter.scala
-xml/PrefixedAttribute.scala
-xml/ProcInstr.scala
-xml/SpecialNode.scala
-xml/Text.scala
-xml/TextBuffer.scala
-xml/TopScope.scala
-xml/TypeSymbol.scala
-xml/UnprefixedAttribute.scala
-xml/Utility.scala
-xml/XML.scala
-
-xml/dtd/ContentModel.scala
-xml/dtd/DocType.scala
-xml/dtd/DTD.scala
-xml/dtd/Decl.scala
-xml/dtd/ElementValidator.scala
-xml/dtd/ExternalID.scala
-xml/dtd/ContentModelParser.scala
-xml/dtd/Scanner.scala
-xml/dtd/Tokens.scala
-xml/dtd/DtdTypeSymbol.scala
-#xml/dtd/Validation.scala
-xml/dtd/ValidationException.scala
-
-xml/factory/Binder.scala
-xml/factory/NodeFactory.scala
-xml/factory/LoggedNodeFactory.scala
-
-xml/parsing/ConstructingHandler.scala
-xml/parsing/ConstructingParser.scala
-xml/parsing/DefaultMarkupHandler.scala
-xml/parsing/ExternalSources.scala
-xml/parsing/FatalError.scala
-xml/parsing/MarkupHandler.scala
-xml/parsing/MarkupParser.scala
-xml/parsing/FactoryAdapter.scala
-xml/parsing/NoBindingFactoryAdapter.scala
-xml/parsing/TokenTests.scala
-xml/parsing/ValidatingMarkupHandler.scala
-
-xml/path/Expression.scala
-
-xml/transform/BasicTransformer.scala
-xml/transform/RewriteRule.scala
-xml/transform/RuleTransformer.scala
-
-xml/xsd/Decl.scala
-xml/xsd/ContentModel.scala
-xml/xsd/XsTypeSymbol.scala
-
-##############################################################################
diff --git a/config/list/meta.lst b/config/list/meta.lst
deleted file mode 100644
index 3274c22e2e..0000000000
--- a/config/list/meta.lst
+++ /dev/null
@@ -1,46 +0,0 @@
-############################################################-*-Makefile-*-####
-# meta programming source files (paths are relative to ./sources/meta)
-##############################################################################
-# $Id$
-
-GenerateAll.java
-
-util/AbstractFileExpander.java
-util/AbstractMain.java
-util/TextExpander.java
-util/TextWriter.java
-
-java/AbstractJavaExpander.java
-java/JavaWriter.java
-java/Type.java
-
-scala/AbstractScalaExpander.java
-scala/MetaFunction.java
-scala/MetaTuple.java
-
-scalac/Phase.java
-
-scalac/ast/AbstractTreeCaseExpander.java
-scalac/ast/AbstractTreeExpander.java
-scalac/ast/AbstractTreeMethodExpander.java
-
-scalac/ast/MetaDefaultTreeFactory.java
-scalac/ast/MetaLazyTreeCopier.java
-scalac/ast/MetaStrictTreeCopier.java
-scalac/ast/MetaTransformer.java
-scalac/ast/MetaTraverser.java
-scalac/ast/MetaTree.java
-scalac/ast/MetaTreeCopier.java
-scalac/ast/MetaTreeFactory.java
-
-scalac/ast/Tree.java
-scalac/ast/TreeField.java
-scalac/ast/TreeFieldLink.java
-scalac/ast/TreeKind.java
-scalac/ast/TreeNode.java
-scalac/ast/TreeSymbol.java
-scalac/ast/TreeType.java
-
-scalac/checkers/MetaCheckTreeNodes.java
-
-##############################################################################
diff --git a/config/list/scala4ant.lst b/config/list/scala4ant.lst
deleted file mode 100644
index 6337cbc38d..0000000000
--- a/config/list/scala4ant.lst
+++ /dev/null
@@ -1,15 +0,0 @@
-############################################################-*-Makefile-*-####
-# scala4ant source files (paths are relative to ./sources/scala/tools/scala4ant)
-##############################################################################
-# $Id$
-
-../scalac/ant/Scalac.java
-
-AntAdaptor.scala
-AntTask.scala
-ScalaRuntime.scala
-ScalaTask.scala
-ScalacTask.scala
-ScalapTask.scala
-
-##############################################################################
diff --git a/config/list/scalac.lst b/config/list/scalac.lst
deleted file mode 100644
index c12acca3b6..0000000000
--- a/config/list/scalac.lst
+++ /dev/null
@@ -1,223 +0,0 @@
-############################################################-*-Makefile-*-####
-# scalac source files (paths are relative to ./sources/scala/tools/scalac)
-##############################################################################
-# $Id$
-
-../../../scalac/ApplicationError.java
-../../../scalac/CompilerCommand.java
-../../../scalac/CompilerPhases.java
-../../../scalac/Global.java
-../../../scalac/Phase.java
-../../../scalac/PhaseDescriptor.java
-../../../scalac/CompilationLoop.java
-../../../scalac/CompilationUnit.java
-
-../../../scalac/ast/DefaultTreeFactory.java
-../../../scalac/ast/LazyTreeCopier.java
-../../../scalac/ast/StrictTreeCopier.java
-../../../scalac/ast/Transformer.java
-../../../scalac/ast/Traverser.java
-../../../scalac/ast/Tree.java
-../../../scalac/ast/TreeCloner.java
-../../../scalac/ast/TreeCopier.java
-../../../scalac/ast/TreeFactory.java
-../../../scalac/ast/TreeGen.java
-../../../scalac/ast/TreeInfo.java
-../../../scalac/ast/TreeList.java
-
-../../../scalac/ast/printer/TreePrinter.java
-
-../../../scalac/atree/AArithmeticOp.java
-../../../scalac/atree/AClass.java
-../../../scalac/atree/ACode.java
-../../../scalac/atree/AComparisonOp.java
-../../../scalac/atree/AConstant.java
-../../../scalac/atree/AField.java
-../../../scalac/atree/AFunction.java
-../../../scalac/atree/AInvokeStyle.java
-../../../scalac/atree/ALocation.java
-../../../scalac/atree/ALogicalOp.java
-../../../scalac/atree/AMember.java
-../../../scalac/atree/AMethod.java
-../../../scalac/atree/APrimitive.java
-../../../scalac/atree/ARepository.java
-../../../scalac/atree/AShiftOp.java
-../../../scalac/atree/ATestOp.java
-../../../scalac/atree/ATreeFactory.java
-../../../scalac/atree/ATreeFromSTree.java
-../../../scalac/atree/ATreePrinter.java
-../../../scalac/atree/ATreeTyper.java
-../../../scalac/atree/ATypeKind.java
-
-../../../scalac/backend/Primitive.java
-../../../scalac/backend/Primitives.java
-../../../scalac/backend/jvm/GenJVM.java
-../../../scalac/backend/msil/GenMSIL.java
-../../../scalac/backend/msil/TypeCreator.java
-
-../../../scalac/checkers/CheckTreeNodes.java
-../../../scalac/checkers/TreeChecker.java
-
-../../../scalac/framework/History.java
-../../../scalac/framework/Promise.java
-
-../../../scalac/symtab/classfile/AttributeParser.java
-../../../scalac/symtab/classfile/CLRClassParser.java
-../../../scalac/symtab/classfile/CLRPackageParser.java
-../../../scalac/symtab/classfile/CLRTypes.java
-../../../scalac/symtab/classfile/ClassParser.java
-../../../scalac/symtab/classfile/ClassfileConstants.java
-../../../scalac/symtab/classfile/ClassfileParser.java
-../../../scalac/symtab/classfile/ConstantPool.java
-../../../scalac/symtab/classfile/JavaTypeCreator.java
-../../../scalac/symtab/classfile/JavaTypeFactory.java
-../../../scalac/symtab/classfile/MetaParser.java
-../../../scalac/symtab/classfile/PackageParser.java
-../../../scalac/symtab/classfile/Signatures.java
-../../../scalac/symtab/classfile/SymblParser.java
-../../../scalac/symtab/classfile/Pickle.java
-../../../scalac/symtab/classfile/UnPickle.java
-
-../../../scalac/symtab/AttributeInfo.java
-../../../scalac/symtab/ClosureHistory.java
-../../../scalac/symtab/Definitions.java
-../../../scalac/symtab/EntryTags.java
-../../../scalac/symtab/Kinds.java
-../../../scalac/symtab/Modifiers.java
-../../../scalac/symtab/Scope.java
-../../../scalac/symtab/SourceCompleter.java
-../../../scalac/symtab/SymSet.java
-../../../scalac/symtab/Symbol.java
-../../../scalac/symtab/SymbolCloner.java
-../../../scalac/symtab/SymbolComparator.java
-../../../scalac/symtab/SymbolLoader.java
-../../../scalac/symtab/SymbolNameWriter.java
-../../../scalac/symtab/SymbolOrigin.java
-../../../scalac/symtab/SymbolSubstTypeMap.java
-../../../scalac/symtab/SymbolTablePrinter.java
-../../../scalac/symtab/Type.java
-../../../scalac/symtab/TypeTags.java
-
-../../../scalac/transformer/AddAccessorsPhase.java
-../../../scalac/transformer/AddConstructors.java
-../../../scalac/transformer/AddConstructorsPhase.java
-../../../scalac/transformer/AddInterfaces.java
-../../../scalac/transformer/AddInterfacesPhase.java
-../../../scalac/transformer/Erasure.java
-../../../scalac/transformer/ErasurePhase.java
-../../../scalac/transformer/ExpandMixinsPhase.java
-../../../scalac/transformer/ExplicitOuterClassesPhase.java
-../../../scalac/transformer/LambdaLift.java
-../../../scalac/transformer/LambdaLiftPhase.java
-../../../scalac/transformer/MakeBoxingExplicitPhase.java
-../../../scalac/transformer/OwnerTransformer.java
-../../../scalac/transformer/TailCallPhase.java
-../../../scalac/transformer/TypesAsValuesPhase.java
-
-../../../scalac/typechecker/AnalyzerPhase.java
-../../../scalac/typechecker/Infer.java
-
-../../../scalac/util/ArrayApply.java
-../../../scalac/util/Debug.java
-../../../scalac/util/EmptyPhase.java
-../../../scalac/util/FreshNameCreator.java
-../../../scalac/util/Name.java
-../../../scalac/util/NameTransformer.java
-../../../scalac/util/Names.java
-../../../scalac/util/OptionParser.java
-../../../scalac/util/PrefixMatcher.java
-../../../scalac/util/SourceRepresentation.java
-../../../scalac/util/Strings.java
-../../../scalac/util/TermName.java
-../../../scalac/util/TypeName.java
-../../../scalac/util/TypeNames.java
-
-../../../scalac/transformer/ICodePhase.java
-../../../scalac/transformer/WholeProgPhase.java
-
-CompilerPhases.scala
-Global.scala
-Main.scala
-
-ast/TreeList.scala
-
-ast/parser/MarkupParser.scala
-ast/parser/Parser.scala
-ast/parser/ParserPhase.scala
-ast/parser/PatternNormalizer.scala
-ast/parser/Scanner.scala
-ast/parser/SymbolicXMLBuilder.scala
-ast/parser/TokenData.scala
-ast/parser/Tokens.scala
-
-ast/printer/HTMLPrinter.scala
-ast/printer/TextTreePrinter.scala
-ast/printer/SwingPrinter.scala
-ast/printer/TreeInfo.scala
-
-transformer/TransMatch.scala
-transformer/TransMatchPhase.scala
-transformer/UnCurry.scala
-transformer/UnCurryPhase.scala
-transformer/matching/AlgebraicMatcher.scala
-transformer/matching/Autom2Scala.scala
-transformer/matching/BindingBerrySethi.scala
-transformer/matching/BerrySethi.scala
-transformer/matching/CaseEnv.scala
-transformer/matching/CodeFactory.scala
-transformer/matching/DetWordAutom.scala
-transformer/matching/Label.scala
-transformer/matching/LeftTracerInScala.scala
-transformer/matching/NondetWordAutom.scala
-transformer/matching/PartialMatcher.scala
-transformer/matching/PatternMatcher.scala
-transformer/matching/PatternNode.scala
-transformer/matching/PatternNodeCreator.scala
-transformer/matching/PatternNodeDebugPrinter.scala
-transformer/matching/PatternTool.scala
-transformer/matching/RightTracerInScala.scala
-transformer/matching/TracerInScala.scala
-transformer/matching/StateSetComparator.scala
-transformer/matching/Npair.scala
-transformer/matching/WordAutomInScala.scala
-transformer/matching/SequenceMatcher.scala
-
-#transformer/matching/FullRegularTranslator.scala
-#transformer/matching/MutableGrammar.scala
-#transformer/matching/NonTermFactory.scala
-#transformer/matching/PatternExp.scala
-#transformer/matching/PatternTest.scala
-#transformer/matching/PatternInfo.scala
-
-typechecker/Analyzer.scala
-typechecker/AnalyzerPhase.scala
-typechecker/ConstantFolder.scala
-typechecker/Context.scala
-typechecker/DeSugarize.scala
-# typechecker/ImportList.scala
-typechecker/Infer.scala
-typechecker/RefCheck.scala
-typechecker/RefCheckPhase.scala
-typechecker/Substituter.scala
-typechecker/View.scala
-
-util/NewArray.scala
-
-icode/ICodePhase.scala
-icode/IBasicBlock.scala
-icode/ICInstruction.scala
-icode/ICode.scala
-icode/ICodePrinter.scala
-icode/ICTypeStack.scala
-
-backend/GenJVMFromICode.scala
-
-wholeprog/ApplicationBuilder.scala
-wholeprog/PrintDotFile.scala
-wholeprog/MonomorphicCS.scala
-wholeprog/Inline.scala
-wholeprog/WholeProgPhase.scala
-
-wholeprog/graph/Graph.scala
-
-##############################################################################
diff --git a/config/list/scaladoc.lst b/config/list/scaladoc.lst
deleted file mode 100644
index 2b9a805499..0000000000
--- a/config/list/scaladoc.lst
+++ /dev/null
@@ -1,22 +0,0 @@
-############################################################-*-Makefile-*-####
-# scaladoc source files (paths are relative to ./sources/scala/tools/scaladoc)
-##############################################################################
-# $Id$
-
-Comment.java
-# DocModule.java
-HTMLGenerator.java
-HTMLGeneratorCommand.java
-HTTPServer.java
-Location.java
-MLType.scala
-Main.scala
-Page.java
-ScalaSearch.java
-# StandardDocModule.java
-SymbolTablePrinter.java
-SymbolTablePrinterFactory.java
-Tag.java
-TypeIsomorphism.java
-
-##############################################################################
diff --git a/config/list/scalai.lst b/config/list/scalai.lst
deleted file mode 100644
index 7a1be5d141..0000000000
--- a/config/list/scalai.lst
+++ /dev/null
@@ -1,34 +0,0 @@
-############################################################-*-Makefile-*-####
-# scalai source files (paths are relative to ./sources/scala/tools/scalai)
-##############################################################################
-# $Id$
-
-Code.java
-CodeBuffer.java
-CodeContainer.java
-CodeGenerator.java
-CodePromise.java
-Compiler.java
-Constants.java
-Environment.java
-Evaluator.java
-EvaluatorException.java
-EvaluatorResult.java
-ExpressionCompiler.java
-ExpressionContext.java
-Function.java
-Interpreter.java
-InterpreterCommand.java
-InterpreterPrinter.java
-InterpreterShell.java
-JavaMirror.java
-Main.java
-Override.java
-PathClassLoader.java
-ScalaFunction.java
-ScalaObject.java
-ScalaTemplate.java
-Template.java
-Variable.java
-
-##############################################################################
diff --git a/config/list/scalap.lst b/config/list/scalap.lst
deleted file mode 100644
index e42e57b906..0000000000
--- a/config/list/scalap.lst
+++ /dev/null
@@ -1,20 +0,0 @@
-############################################################-*-Makefile-*-####
-# scalap source files (paths are relative to ./sources/scala/tools/scalap)
-##############################################################################
-# $Id$
-
-ByteArrayReader.scala
-Classfile.scala
-Classfiles.scala
-CodeWriter.scala
-Entity.scala
-EntityTable.scala
-Flags.scala
-JavaWriter.scala
-Main.scala
-MetaParser.scala
-Names.scala
-ScalaAttribute.scala
-ScalaWriter.scala
-
-##############################################################################
diff --git a/config/list/scalatest.lst b/config/list/scalatest.lst
deleted file mode 100644
index 24f7aa7022..0000000000
--- a/config/list/scalatest.lst
+++ /dev/null
@@ -1,14 +0,0 @@
-############################################################-*-Makefile-*-####
-# scalatest source files (paths are relative to ./sources/scala/tools/scalatest)
-##############################################################################
-# $Id$
-
-Command.java
-Console.java
-Diff.java
-DiffPrint.java
-FileUtils.java
-Main.java
-Test.java
-
-##############################################################################
diff --git a/config/list/test.lst b/config/list/test.lst
deleted file mode 100644
index 033b9e7f9c..0000000000
--- a/config/list/test.lst
+++ /dev/null
@@ -1,264 +0,0 @@
-############################################################-*-Makefile-*-####
-# test files (paths are relative to ./test/files)
-##############################################################################
-# $Id$
-
-dis/List.scala
-
-jvm/JavaInteraction.scala
-#jvm/RunTimeTypes.scala
-#jvm/matching.scala
-jvm/serialization.scala
-jvm/xmlLiterals.scala
-jvm/xmlstuff.scala
-
-neg/S2.scala
-neg/S4.scala
-neg/S6.scala
-neg/S7.scala
-neg/Y.scala
-neg/abstract.scala
-neg/altherr2.scala
-neg/altherr3.scala
-neg/bounds.scala
-neg/bug105.scala
-neg/bug106.scala
-neg/bug107.scala
-neg/bug112.scala
-neg/bug113.scala
-neg/bug117.scala
-neg/bug118.scala
-neg/bug122.scala
-neg/bug128_129.scala
-neg/bug144.scala
-neg/bug145.scala
-neg/bug152.scala
-neg/bug169.scala
-neg/bug170.scala
-neg/bug191.scala
-neg/bug228.scala
-neg/bug236.scala
-neg/bug283.scala
-neg/bug38.scala
-neg/bug40.scala
-neg/bug43.scala
-neg/bug44.scala
-neg/bug45.scala
-neg/bug47.scala
-neg/bug52.scala
-neg/bug58.scala
-neg/bug63.scala
-neg/bug67.scala
-neg/bug72.scala
-neg/bug74.scala
-neg/bug75.scala
-neg/bug86.scala
-neg/bug87.scala
-neg/bug95.scala
-neg/bug96.scala
-neg/bug97.scala
-neg/bugs.scala
-neg/constrparams.scala
-neg/cyclic.scala
-neg/dep.scala
-neg/doubledefs.scala
-neg/imports.scala
-neg/matthias2.scala
-neg/michel2.scala
-neg/negSeq.scala
-neg/overlapping.scala
-neg/overload.scala
-neg/protected.scala
-neg/refine.scala
-neg/seqtest.scala
-neg/stable.scala
-neg/tests.scala
-neg/variances.scala
-neg/vincent1.scala
-neg/xmlParsing001.scala
-neg/xmlParsing002.scala
-neg/xmlstart.scala
-
-pos/304.scala
-pos/A.scala
-pos/List1.scala
-pos/MailBox.scala
-pos/S1.scala
-pos/S3.scala
-pos/S5.scala
-pos/S8.scala
-pos/X.scala
-pos/Z.scala
-pos/abstract.scala
-pos/aliases.scala
-pos/arrays2.scala
-pos/attributes.scala
-pos/bug082.scala
-pos/bug1.scala
-pos/bug115.scala
-pos/bug116.scala
-pos/bug119.scala
-pos/bug121.scala
-pos/bug123.scala
-pos/bug124.scala
-pos/bug151.scala
-pos/bug159.scala
-pos/bug160.scala
-pos/bug17.scala
-pos/bug175.scala
-pos/bug177.scala
-pos/bug183.scala
-pos/bug193.scala
-pos/bug2.scala
-pos/bug20.scala
-pos/bug201.scala
-pos/bug204.scala
-pos/bug210.scala
-pos/bug211.scala
-pos/bug229.scala
-pos/bug245.scala
-pos/bug267.scala
-pos/bug287.scala
-pos/bug289.scala
-pos/bug29.scala
-pos/bug295.scala
-pos/bug30.scala
-pos/bug304.scala
-pos/bug31.scala
-pos/bug318.scala
-pos/bug32.scala
-pos/bug342.scala
-pos/bug359.scala
-pos/bug36.scala
-pos/bug360.scala
-pos/bug361.scala
-pos/bug372.scala
-pos/bug39.scala
-pos/bug49.scala
-pos/bug53.scala
-pos/bug54.scala
-pos/bug61.scala
-pos/bug64.scala
-pos/bug66.scala
-pos/bug68.scala
-pos/bug69.scala
-pos/bug76.scala
-pos/bug81.scala
-pos/bug85.scala
-pos/bug91.scala
-pos/bug93.scala
-pos/cls.scala
-pos/cls1.scala
-pos/clsrefine.scala
-pos/compile.scala
-pos/compound.scala
-pos/constfold.scala
-pos/context.scala
-pos/eta.scala
-pos/exceptions.scala
-pos/expressions-current.scala
-pos/gui.scala
-pos/imports.scala
-pos/infer.scala
-pos/infer2.scala
-pos/lambda.scala
-pos/lambdalift.scala
-pos/lambdalift1.scala
-pos/localmodules.scala
-pos/matthias1.scala
-pos/matthias3.scala
-pos/matthias4.scala
-pos/matthias5.scala
-pos/maxim1.scala
-pos/michel1.scala
-pos/michel2.scala
-pos/michel3.scala
-pos/michel4.scala
-pos/michel5.scala
-pos/michel6.scala
-pos/mixins.scala
-pos/modules.scala
-pos/modules1.scala
-pos/moduletrans.scala
-pos/nested.scala
-pos/null.scala
-pos/orderedpoints.scala
-pos/override.scala
-pos/partialfun.scala
-pos/patterns.scala
-pos/patterns1.scala
-pos/patterns2.scala
-pos/patterns3.scala
-pos/philippe1.scala
-pos/philippe2.scala
-pos/philippe3.scala
-pos/philippe4.scala
-pos/pmbug.scala
-pos/propagate.scala
-pos/rebind.scala
-pos/refine.scala
-pos/reftest.scala
-pos/scoping1.scala
-pos/scoping2.scala
-pos/scoping3.scala
-pos/seqtest2.scala
-pos/simplelists.scala
-pos/stable.scala
-pos/strings.scala
-pos/test1.scala
-pos/test2.scala
-pos/test4.scala
-pos/test4a.scala
-pos/test4refine.scala
-pos/test5.scala
-pos/test5refine.scala
-pos/testcast.scala
-pos/thistype.scala
-pos/thistypes.scala
-pos/traits.scala
-pos/valdefs.scala
-pos/variances.scala
-pos/viewtest1.scala
-pos/viewtest2.scala
-pos/viewtest3.scala
-
-run/Course-2002-01.scala
-run/Course-2002-02.scala
-run/Course-2002-03.scala
-run/Course-2002-04.scala
-run/Course-2002-05.scala
-run/Course-2002-06.scala
-run/Course-2002-07.scala
-run/Course-2002-08.scala
-run/Course-2002-09.scala
-run/Course-2002-10.scala
-run/Course-2002-13.scala
-run/NestedClasses.scala
-run/arrays.scala
-run/bridges.scala
-run/bug508.scala
-run/bugs.scala
-run/boolexprs.scala
-run/constructors.scala
-run/enums.scala
-run/exceptions.scala
-run/imports.scala
-run/iq.scala
-run/iterators.scala
-run/lisp.scala
-run/lists.scala
-run/literals.scala
-run/map_test.scala
-run/misc.scala
-run/mixins.scala
-run/overloads.scala
-run/regularpatmat.scala
-run/runtime.scala
-run/tailcalls.scala
-
-shl/basic.scala
-
-#xml/lnk.scala
-#xml/xhtml.scala
-
-##############################################################################
diff --git a/config/list/util.lst b/config/list/util.lst
deleted file mode 100644
index 85e585a918..0000000000
--- a/config/list/util.lst
+++ /dev/null
@@ -1,38 +0,0 @@
-############################################################-*-Makefile-*-####
-# tools util source files (paths are relative to ./sources/scala/tools/util)
-##############################################################################
-# $Id$
-
-AbstractFile.java
-AbstractFileReader.java
-AbstractReporter.java
-AbstractTimer.java
-ByteArrayFile.java
-CharArrayFile.java
-ClassPath.java
-ConsoleReporter.java
-DirectoryPath.java
-DummyTimer.java
-EmptyIterator.java
-PlainFile.java
-Position.java
-Reporter.java
-ReporterTimer.java
-SourceFile.java
-SourceReader.java
-StringBufferWriter.java
-Timer.java
-UTF8Codec.java
-VirtualDirectory.java
-VirtualFile.java
-ZipArchive.java
-
-debug/AbortError.java
-debug/ArrayDebugger.java
-debug/Debug.java
-debug/Debugger.java
-debug/ObjectDebugger.java
-debug/ThrowableDebugger.java
-debug/ToStringDebugger.java
-
-##############################################################################
diff --git a/config/list/website.lst b/config/list/website.lst
deleted file mode 100644
index 15b4cc3b90..0000000000
--- a/config/list/website.lst
+++ /dev/null
@@ -1,95 +0,0 @@
-############################################################-*-Makefile-*-####
-# website files (paths are relative to ./website/sources)
-##############################################################################
-# $Id$
-
-robots.txt
-
-bugs/index.html
-
-community/activities.html
-community/index.html
-
-css/acrobat.css
-css/index.html
-css/print.css
-css/screen.css
-
-docu/ant.html
-docu/faq.html
-docu/index.html
-docu/rationale.html
-docu/related.html
-docu/clr/index.html
-docu/clr/quirks.html
-docu/eclipse/changes.html
-docu/eclipse/index.html
-
-downloads/changes.html
-downloads/history.html
-downloads/index.html
-downloads/install.html
-downloads/instructions.html
-downloads/distrib/index.html
-downloads/license.html
-downloads/js/ia.js
-downloads/js/ia_fr.js
-downloads/status.html
-
-examples/index.html
-examples/more.html
-
-images/arobase.gif
-images/background.gif
-images/bz2.gif
-images/classhierarchy.png
-images/colpoint2d.png
-images/colpoint3d.png
-images/eclipse_run_config.jpg
-images/eclipse_run_hello.jpg
-images/eclipse_scala_wizards.jpg
-images/eclipse_update_site.jpg
-images/html1.gif
-images/index.html
-images/small_pdf.png
-images/small_ps.png
-images/tgz.gif
-images/valid-xhtml11.png
-images/zip.gif
-
-index.html
-
-intro/abstracttypes.html
-intro/caseclasses.html
-intro/classes.html
-intro/coercions.html
-intro/compoundtypes.html
-intro/comprehensions.html
-intro/currying.html
-intro/funnesting.html
-intro/funsyntax.html
-intro/generics.html
-intro/hofuns.html
-intro/inference.html
-intro/innerclasses.html
-intro/lowbounds.html
-intro/mixin.html
-intro/operators.html
-intro/patmatch.html
-intro/polymethods.html
-intro/regexppat.html
-intro/selfrefs.html
-intro/subclassing.html
-intro/targettyping.html
-intro/traits.html
-intro/unifiedtypes.html
-intro/upbounds.html
-intro/variances.html
-intro/views.html
-intro/xml.html
-
-#js/decls.js
-#js/decls_fr.js
-#js/index.html
-
-##############################################################################
diff --git a/docs/devel/nscNodes.dot b/docs/devel/nscNodes.dot
deleted file mode 100644
index eb0b792451..0000000000
--- a/docs/devel/nscNodes.dot
+++ /dev/null
@@ -1,104 +0,0 @@
-digraph SQLTypes {
-
- size="4,4"
- rankdir=BT
- rank=max
- ratio=compress
-
- node [shape = record]
-
- Tree
-
- SymTree -> Tree
-
- DefTree -> SymTree
-
- TermTree -> Tree
-
- TypTree -> Tree
-
- EmptyTree -> TermTree
-
- PackageDef -> DefTree
-
- ClassDef -> DefTree
-
- ModuleDef -> DefTree
-
- ValDef -> DefTree
-
- DefDef -> DefTree
-
- AbsTypeDef -> DefTree
-
- AliasTypeDef -> DefTree
-
- LabelDef -> DefTree
- LabelDef -> TermTree
-
- Import -> SymTree
-
- Attributed -> Tree
-
- DocDef -> Tree
-
- Template -> SymTree
-
- Block -> TermTree
-
- CaseDef -> Tree
-
- Sequence -> TermTree
-
- Alternative -> TermTree
-
- Star -> TermTree
-
- Bind -> DefTree
-
- ArrayValue -> TermTree
-
- Function -> TermTree
-
- Assign -> TermTree
-
- If -> TermTree
-
- Match -> TermTree
-
- Return -> TermTree
-
- Try -> TermTree
-
- Throw -> TermTree
-
- New -> TermTree
-
- TypeApply -> TermTree
-
- Apply -> TermTree
-
- Super -> TermTree
- Super -> SymTree
-
- This -> TermTree
- This -> SymTree
-
- Select -> SymTree
-
- Ident -> SymTree
-
- Literal -> TermTree
-
- TypeTree -> TypTree
-
- SingletonTypeTree -> TypTree
-
- SelectFromTypeTree -> TypTree
- SelectFromTypeTree -> SymTree
-
- CompoundTypeTree -> TypTree
-
- AppliedTypeTree -> TypTree
-
-} \ No newline at end of file
diff --git a/docs/devel/nscTypes.dot b/docs/devel/nscTypes.dot
deleted file mode 100644
index 8e4e531aa6..0000000000
--- a/docs/devel/nscTypes.dot
+++ /dev/null
@@ -1,73 +0,0 @@
-digraph SQLTypes {
-
- size="4,4"
- rankdir=BT
- rank=max
- ratio=compress
-
- node [shape = record]
-
- Type
-
- SubType -> Type
-
- SingletonType -> SubType
-
- ErrorType -> Type
-
- WildcardType -> Type
-
- NoType -> Type
-
- NoPrefix -> Type
-
- ThisType [label = "{ThisType|sym: Symbol}"]
- ThisType -> SingletonType
-
- SingleType [label = "{SingleType|pre: Type\nsym: Symbol}"]
- SingleType -> SingletonType
-
- SuperType [label = "{SuperType|thistpe: Type\nsupertp: Type}"]
- SuperType -> SingletonType
-
- TypeBounds [label = "{TypeBounds|lo: Type\nhi: Type}"]
- TypeBounds -> SubType
-
- CompoundType -> Type
-
- RefinedType[label = "{RefinedType|parents: List[Type]\ndecls: Scope}"]
- RefinedType -> CompoundType
-
- ClassInfoType[label = "{ClassInfoType|parents: List[Type]\ndecls: Scope\nsymbol: Symbol}"]
- ClassInfoType -> CompoundType
-
- PackageClassInfoType[label = "{PackageClassInfoType|decls: Scope\nclazz: Symbol}"]
- PackageClassInfoType -> ClassInfoType
-
- ConstantType[label = "{ConstantType|value: Constant}"]
- ConstantType -> SingletonType
-
- TypeRef[label = "{TypeRef|pre: Type\nsym: Symbol\nargs: List[Type]}"]
- TypeRef -> Type
-
- MethodType[label = "{MethodType|paramTypes: List[Type]\nresultType: Type}"]
- MethodType -> Type
-
- PolyType[label = "{PolyType|typeParams: List[Symbol]\nresultType: Type}"]
- PolyType -> Type
-
- OverloadedType[label = "{OverloadedType|pre: Type\nalternatives: List[Symbol]}"]
- OverloadedType -> Type
-
- AntiPolyType[label = "{AntiPolyType|pre: Type\ntargs: List[Type]}"]
- AntiPolyType -> Type
-
- TypeVar[label = "{TypeVar|origin: Type\nconstr: TypeConstraint}"]
- TypeVar -> Type
-
- LazyType -> Type
-
- LazyPolyType[label = "{LazyPolyType|typeParams: List[Symbol]\nrestp: Type}"]
- LazyPolyType -> LazyType
-
-} \ No newline at end of file
diff --git a/docs/man/man1/scaladoc.1 b/docs/man/man1/scaladoc.1
deleted file mode 100644
index 5063c72918..0000000000
--- a/docs/man/man1/scaladoc.1
+++ /dev/null
@@ -1,119 +0,0 @@
-.\" ##########################################################################
-.\" # __ #
-.\" # ________ ___ / / ___ Scala On-line Manual Pages #
-.\" # / __/ __// _ | / / / _ | (c) 2002-2005, LAMP/EPFL #
-.\" # __\ \/ /__/ __ |/ /__/ __ | #
-.\" # /____/\___/_/ |_/____/_/ | | http://scala.epfl.ch/ #
-.\" # |/ #
-.\" ##########################################################################
-.\"
-.\" Process this file with nroff -man scaladoc.1
-.\"
-.TH scaladoc 1 "April 29, 2005" "version 0.1" "USER COMMANDS"
-.\"
-.\" ################################# NAME ###################################
-.\"
-.SH NAME
-scaladoc \- Scala API documentation generator
-.\"
-.\" ############################### SYNOPSIS #################################
-.\"
-.SH SYNOPSIS
-\fBscaladoc\fR [ <\fIoptions\fR> ] <\fIsource files\fR> [ -- <\fIpackages\fR> ]
-.\"
-.\" ############################### PARAMETERS ###############################
-.\"
-.SH PARAMETERS
-.TP
-<\fIoptions\fR>
-Command line options. See \fBOPTIONS\fR below.
-.TP
-<\fIsource files\fR>
-A series of source file names, separated by spaces, each of which can
-include paths and wildcards such as asterisk (*).
-.TP
-<\fIpackages\fR>
-.
-.\"
-.\" ############################## DESCRIPTION ###############################
-.\"
-.SH DESCRIPTION
-The Scaladoc tool parses the declarations and documentation comments in a
-set of Scala source files and produces a corresponding set of HTML pages
-describing (by default) the public and protected classes, nested classes,
-traits, objects, methods, and fields.
-
-During a run, the Scaladoc tool automatically adds cross-reference links to
-package, class and member names that are being documented as part of that run.
-Links appear in several places:
-
- · Declarations (return types, argument types, field types)
-
- · "See Also" sections generated from @see tags
-
- · In-line text generated from {@link} tags
-
- · Exception names generated from @throws tags
-
-.\"
-.\" ############################### OPTIONS ##################################
-.\"
-.SH OPTIONS
-The Scaladoc tool supports the following options.
-.TP
-\fB\-g\fR
-Generate debugging info.
-.TP
-\fB\-d\fR <\fIdirectory\fR>
-Specify where to place generated HTML files. The output directory
-<\fIdirectory\fR> must exist.
-.TP
-\fB\-windowtitle\fR <\fItext\fR>
-Browser window title for the documentation.
-.TP
-\fB\-doctitle\fR <\fIhtml-code\fR>
-Include title for the overview page.
-.\"
-.\" ############################### EXAMPLES #################################
-.\"
-.SH EXAMPLES
-.TP
-Generate the Scala documentation in the specified directory \fB/tmp\fR
-.BR
-\fBscaladoc\fR -d /tmp HelloWorld
-.PP
-.\"
-.\" ############################# EXIT STATUS ################################
-.\"
-.SH "EXIT STATUS"
-\fBscaladoc\fR returns a zero exist status if it succeeds. Non zero is
-returned in case of failure.
-.\"
-.\" ############################## AUTHOR(S) #################################
-.\"
-.SH AUTHOR
-Written by Stephane Micheloud.
-.\"
-.\" ################################ BUGS ####################################
-.\"
-.SH "REPORTING BUGS"
-Report bugs to <scala@lists.epfl.ch>.
-.\"
-.\" ############################# COPYRIGHT ##################################
-.\"
-.SH COPYRIGHT
-Copyright \(co 2002-2005 LAMP/EPFL
-.PP
-This is free software; see the distribution for copying conditions. There is
-NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.\"
-.\" ############################### SEE ALSO #################################
-.\"
-.SH "SEE ALSO"
-.BR scala(1),
-.BR scalac(1),
-.BR scalaint(1),
-.BR scalarun(1)
-.\"
-.\" ##########################################################################
-.\" $Id$
diff --git a/docs/man/man1/scalaint.1 b/docs/man/man1/scalaint.1
deleted file mode 100644
index 5f67995723..0000000000
--- a/docs/man/man1/scalaint.1
+++ /dev/null
@@ -1,127 +0,0 @@
-.\" ##########################################################################
-.\" # __ #
-.\" # ________ ___ / / ___ Scala On-line Manual Pages #
-.\" # / __/ __// _ | / / / _ | (c) 2002-2005, LAMP/EPFL #
-.\" # __\ \/ /__/ __ |/ /__/ __ | #
-.\" # /____/\___/_/ |_/____/_/ | | http://scala.epfl.ch/ #
-.\" # |/ #
-.\" ##########################################################################
-.\"
-.\" Process this file with nroff -man scalaint.1
-.\"
-.TH scalaint 1 "April 29, 2005" "version 0.1" "USER COMMANDS"
-.\"
-.\" ################################# NAME ###################################
-.\"
-.SH NAME
-scalaint \- Interactive interpreter for the Scala language
-.\"
-.\" ############################### SYNOPSIS #################################
-.\"
-.SH SYNOPSIS
-\fBscalaint\fR [ <\fIoptions\fR> ] <\fIsource files\fR> [ -- <\fImodule\fR> [ <\fIargs\fR> ] ]
-.\"
-.\" ############################### PARAMETERS ###############################
-.\"
-.SH PARAMETERS
-.TP
-<\fIoptions\fR>
-Command line options. See \fBOPTIONS\fR below.
-.TP
-<\fIsource files\fR>
-One or more source files to be interpreted (such as MyClass.scala).
-.TP
-<\fImodule\fR>
-Name of the Scala object containing the main function.
-.TP
-<\fIargs\fR>
-Program arguments passed to the main function.
-.\"
-.\" ############################## DESCRIPTION ###############################
-.\"
-.SH DESCRIPTION
-The \fBscalaint\fR utility starts an interpreter shell and executes the
-specified Scala application. It does this by loading the class <\fImodule\fR>
-and invoking that class’s \fBmain\fR method. The method must have the
-following signature:
-.PP
- \fBdef\fR main(args: Array[String]): Unit
-.PP
-The method must not return any value, and it must accept a String array as a
-parameter.
-.PP
-The Scala interpreter searches for the startup class, and other classes used,
-in three sets of locations: the bootstrap class path, the installed
-extensions, and the user class path.
-.\"
-.\" ############################### OPTIONS ##################################
-.\"
-.SH OPTIONS
-The \fBscalaint\fR command supports the following options
-.TP
-\fB\-c\fR <\fIstring\fR>
-Evaluate <\fIstring\fR> and print result.
-.TP
-\fB\-interactive\fR
-Start interpreter in interactive mode.
-.TP
-\fB\-nologo\fR
-Print no logo at interactive interpreter start.
-.TP
-\fB\-emacs\fR
-Use Emacs editing mode.
-.TP
-\fB\-g\fR
-Generate debugging info.
-.TP
-\fB\-nowarn\fR
-Generate no warnings.
-.TP
-\fB\-classpath\fR <\fIpath\fR>
-Specify where to find user class files (on Unix-based systems
-a colon-separated list of paths, on Windows-based systems, a
-semicolon-separate list of paths).
-.\"
-.\" ############################### EXAMPLES #################################
-.\"
-.SH EXAMPLES
-.TP
-Run a Scala program located in the current directory
-.BR
-\fBscalaint\fR -nologo HelloWorld.scala -- HelloWorld
-.PP
-.\"
-.\" ############################# EXIT STATUS ################################
-.\"
-.SH "EXIT STATUS"
-\fBscalaint\fR returns a zero exist status if it succeeds. Non zero is
-returned in case of failure.
-.\"
-.\" ############################## AUTHOR(S) #################################
-.\"
-.SH AUTHOR
-Written by Stephane Micheloud.
-.\"
-.\" ################################ BUGS ####################################
-.\"
-.SH "REPORTING BUGS"
-Report bugs to <scala@lists.epfl.ch>.
-.\"
-.\" ############################# COPYRIGHT ##################################
-.\"
-.SH COPYRIGHT
-Copyright \(co 2002-2005 LAMP/EPFL
-.PP
-This is free software; see the distribution for copying conditions. There is
-NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.\"
-.\" ############################### SEE ALSO #################################
-.\"
-.SH "SEE ALSO"
-.BR scala(1),
-.BR scalac(1),
-.BR scaladoc(1),
-.BR scalarun(1)
-.\"
-.\" ##########################################################################
-.\" $Id$
diff --git a/docs/man/man1/scalarun.1 b/docs/man/man1/scalarun.1
deleted file mode 100644
index 14bc78faaf..0000000000
--- a/docs/man/man1/scalarun.1
+++ /dev/null
@@ -1,123 +0,0 @@
-.\" ##########################################################################
-.\" # __ #
-.\" # ________ ___ / / ___ Scala On-line Manual Pages #
-.\" # / __/ __// _ | / / / _ | (c) 2002-2005, LAMP/EPFL #
-.\" # __\ \/ /__/ __ |/ /__/ __ | #
-.\" # /____/\___/_/ |_/____/_/ | | http://scala.epfl.ch/ #
-.\" # |/ #
-.\" ##########################################################################
-.\"
-.\" Process this file with nroff -man scalarun.1
-.\"
-.TH scalarun 1 "April 29, 2005" "version 0.1" "USER COMMANDS"
-.\"
-.\" ################################# NAME ###################################
-.\"
-.SH NAME
-scalarun \- Non-interactive interpreter for the Scala language
-.\"
-.\" ############################### SYNOPSIS #################################
-.\"
-.SH SYNOPSIS
-\fBscalarun\fR [ <\fIoptions\fR> ] <\fIsource files\fR> [ -- <\fImodule\fR> [ <\fIargs\fR> ] ]
-.\"
-.\" ############################### PARAMETERS ###############################
-.\"
-.SH PARAMETERS
-.TP
-<\fIoptions\fR>
-Command line options. See \fBOPTIONS\fR below.
-.TP
-<\fIsource files\fR>
-One or more source files to be interpreted (such as MyClass.scala).
-.TP
-<\fImodule\fR>
-Name of the Scala object containing the main function.
-.TP
-<\fIargs\fR>
-Program arguments passed to the main function.
-.\"
-.\" ############################## DESCRIPTION ###############################
-.\"
-.SH DESCRIPTION
-The \fBscalarun\fR utility interpretes a Scala application. It does this by
-loading the class <\fImodule\fR> and invoking that class’s \fBmain\fR method.
-The method must have the following signature:
-.PP
- \fBdef\fR main(args: Array[String]): Unit
-.PP
-The method must not return any value, and it must accept a String array as a
-parameter.
-.PP
-The Scala interpreter searches for the startup class, and other classes used,
-in three sets of locations: the bootstrap class path, the installed
-extensions, and the user class path.
-.\"
-.\" ############################### OPTIONS ##################################
-.\"
-.SH OPTIONS
-The \fBscalarun\fR command supports the following options
-.TP
-\fB\-c\fR <\fIstring\fR>
-Evaluate <\fIstring\fR> and print result.
-.TP
-\fB\-classpath\fR <\fIpath\fR>
-Specify where to find user class files (on Unix-based systems
-a colon-separated list of paths, on Windows-based systems, a
-semicolon-separate list of paths).
-.TP
-\fB\-nologo\fR
-Print no logo at interactive interpreter start.
-.TP
-\fB\-emacs\fR
-Use Emacs editing mode.
-.TP
-\fB\-g\fR
-Generate debugging info.
-.TP
-\fB\-nowarn\fR
-Generate no warnings.
-.\"
-.\" ############################### EXAMPLES #################################
-.\"
-.SH EXAMPLES
-.TP
-Run a Scala program located in the current directory
-.BR
-\fBscalarun\fR HelloWorld.scala -- HelloWord
-.PP
-.\"
-.\" ############################# EXIT STATUS ################################
-.\"
-.SH "EXIT STATUS"
-\fBscalarun\fR returns a zero exist status if it succeeds. Non zero is
-returned in case of failure.
-.\"
-.\" ############################## AUTHOR(S) #################################
-.\"
-.SH AUTHOR
-Written by Stephane Micheloud.
-.\"
-.\" ################################ BUGS ####################################
-.\"
-.SH "REPORTING BUGS"
-Report bugs to <scala@lists.epfl.ch>.
-.\"
-.\" ############################# COPYRIGHT ##################################
-.\"
-.SH COPYRIGHT
-Copyright \(co 2002-2005 LAMP/EPFL
-.PP
-This is free software; see the distribution for copying conditions. There is
-NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.\"
-.\" ############################### SEE ALSO #################################
-.\"
-.SH "SEE ALSO"
-.BR scala(1),
-.BR scalac(1),
-.BR scaladoc(1),
-.BR scalaint(1)
-.\"
-.\" ##########################################################################
-.\" $Id$
diff --git a/sources/MANIFEST b/sources/MANIFEST
deleted file mode 100644
index cca1bee615..0000000000
--- a/sources/MANIFEST
+++ /dev/null
@@ -1 +0,0 @@
-Main-Class: scala.compiler.Main
diff --git a/sources/ch/epfl/lamp/util/CodePrinter.java b/sources/ch/epfl/lamp/util/CodePrinter.java
deleted file mode 100644
index 7bce133a43..0000000000
--- a/sources/ch/epfl/lamp/util/CodePrinter.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-import java.io.Writer;
-import java.io.StringWriter;
-import java.io.IOException;
-
-/**
- * This class provides methods for printing code. It has support for
- * indentation and spacing.
- */
-public class CodePrinter {
-
- //########################################################################
- // Public Constants
-
- /** The default indentation string */
- public static final String STEP = " ";
-
- /** The line separator */
- public static final String LINE = System.getProperty("line.separator");
-
- //########################################################################
- // Private Fields
-
- /** The underlying writer */
- private final Writer writer;
-
- /** The indentation string */
- private String step;
-
- /** The indentation level */
- private int level;
-
- /** Do we need to align? */
- private boolean align;
-
- /** Do we need to print a white space? */
- private boolean space;
-
- /** Is there already a empty line? */
- private boolean line;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new instance. */
- public CodePrinter() {
- this(new StringWriter());
- }
-
- /** Creates a new instance. */
- public CodePrinter(String step) {
- this(new StringWriter(), step);
- }
-
- /** Creates a new instance. */
- public CodePrinter(Writer writer) {
- this(writer, STEP);
- }
-
- /** Creates a new instance. */
- public CodePrinter(Writer writer, String step) {
- this.writer = writer;
- this.step = step;
- this.level = 0;
- this.align = true;
- this.space = false;
- this.line = false;
- }
-
- //########################################################################
- // Public Methods - Getting & Setting
-
- /** Returns the underlying writer. */
- public Writer getWriter() {
- return writer;
- }
-
- /** Returns the indentation level. */
- public int getIndentLevel() {
- return level;
- }
-
- /** Returns the indentation width. */
- public int getIndentWidth() {
- return step == null ? -1 : step.length();
- }
-
- /** Returns the indentation string. */
- public String getIndentString() {
- return step;
- }
-
- /** Sets the indentation level. */
- public CodePrinter setIndentLevel(int level) {
- this.level = level;
- return this;
- }
-
- /** Sets the indentation width. */
- public CodePrinter setIndentWidth(int width) {
- StringBuffer buffer = new StringBuffer(width);
- for (int i = 0; i < width; i++) buffer.append(' ');
- return setIndentString(buffer.toString());
- }
-
- /** Sets the indentation string. */
- public CodePrinter setIndentString(String step) {
- this.step = step;
- return this;
- }
-
- //########################################################################
- // Public Methods - Formating
-
- /** Increases the indentation level by one. */
- public CodePrinter indent() {
- level++;
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public CodePrinter undent() {
- level--;
- return this;
- }
-
- /** Inserts a new line. */
- public CodePrinter line() {
- if (step == null) return space();
- if (line) return this;
- write(LINE);
- line = align;
- align = true;
- space = false;
- return this;
- }
-
- /** Inserts a white space. */
- public CodePrinter space() {
- space = !align;
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing
-
- /** Prints a new line. */
- public CodePrinter println() {
- return line();
- }
-
- /** Prints the boolean value followed by a new line. */
- public CodePrinter println(boolean value) {
- return print(value).line();
- }
-
- /** Prints the byte value followed by a new line. */
- public CodePrinter println(byte value) {
- return print(value).line();
- }
-
- /** Prints the short value followed by a new line. */
- public CodePrinter println(short value) {
- return print(value).line();
- }
-
- /** Prints the char value followed by a new line. */
- public CodePrinter println(char value) {
- return print(value).line();
- }
-
- /** Prints the int value followed by a new line. */
- public CodePrinter println(int value) {
- return print(value).line();
- }
-
- /** Prints the long value followed by a new line. */
- public CodePrinter println(long value) {
- return print(value).line();
- }
-
- /** Prints the float value followed by a new line. */
- public CodePrinter println(float value) {
- return print(value).line();
- }
-
- /** Prints the double value followed by a new line. */
- public CodePrinter println(double value) {
- return print(value).line();
- }
-
- /** Prints the string followed by a new line. */
- public CodePrinter println(String value) {
- return print(value).line();
- }
-
- /** Prints the boolean value. */
- public CodePrinter print(boolean value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the byte value. */
- public CodePrinter print(byte value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the short value. */
- public CodePrinter print(short value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the char value. */
- public CodePrinter print(char value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the int value. */
- public CodePrinter print(int value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the long value. */
- public CodePrinter print(long value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the float value. */
- public CodePrinter print(float value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the long value. */
- public CodePrinter print(double value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the string. */
- public CodePrinter print(String value) {
- if (align) for (int i = 0; i < level; i++) write(step);
- if (space) write(" ");
- write(value);
- align = false;
- space = false;
- line = false;
- return this;
- }
-
- //########################################################################
- // Public Methods - Converting
-
- /** Returns the string representation of this printer. */
- public String toString() {
- return writer.toString();
- }
-
- //########################################################################
- // Private Methods
-
- private void write(String string) {
- try {
- writer.write(string);
- } catch (IOException exception) {
- throw new Error(exception);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/ch/epfl/lamp/util/ForwardingMap.java b/sources/ch/epfl/lamp/util/ForwardingMap.java
deleted file mode 100644
index 7efc3627b0..0000000000
--- a/sources/ch/epfl/lamp/util/ForwardingMap.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package ch.epfl.lamp.util;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * This class implements the interface Map by forwarding all its
- * operations to an underlying instance of Map.
- */
-public class ForwardingMap implements Map {
-
- //########################################################################
- // Protected Fields
-
- protected final Map delegate;
-
- //########################################################################
- // Public Constructors
-
- public ForwardingMap(Map delegate) {
- this.delegate = delegate;
- }
-
- //########################################################################
- // Public Methods - Query operations
-
- public int size() {
- return delegate.size();
- }
-
- public boolean isEmpty() {
- return delegate.isEmpty();
- }
-
- public boolean containsKey(Object key) {
- return delegate.containsKey(key);
- }
-
- public boolean containsValue(Object value) {
- return delegate.containsValue(value);
- }
-
- public Object get(Object key) {
- return delegate.get(key);
- }
-
- //########################################################################
- // Public Methods - Modification operations
-
- public Object put(Object key, Object value) {
- return delegate.put(key, value);
- }
-
- public Object remove(Object key) {
- return delegate.remove(key);
- }
-
- //########################################################################
- // Public Methods - Bulk operations
-
- public void putAll(Map map) {
- delegate.putAll(map);
- }
-
- public void clear() {
- delegate.clear();
- }
-
- //########################################################################
- // Public Methods - Views
-
- public Set keySet() {
- return delegate.keySet();
- }
-
- public Collection values() {
- return delegate.values();
- }
-
- public Set entrySet() {
- return delegate.entrySet();
- }
-
- //########################################################################
- // Public Methods - Comparison and hashing
-
- public boolean equals(Object that) {
- return delegate.equals(that);
- }
-
- public int hashCode() {
- return delegate.hashCode();
- }
-
- //########################################################################
-}
diff --git a/sources/ch/epfl/lamp/util/HTMLPrinter.java b/sources/ch/epfl/lamp/util/HTMLPrinter.java
deleted file mode 100644
index bc1afcd441..0000000000
--- a/sources/ch/epfl/lamp/util/HTMLPrinter.java
+++ /dev/null
@@ -1,886 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-import java.io.Writer;
-
-/**
- * This class provides methods to print HTML document.
- *
- * @author Stephane Micheloud
- * @version 1.1
- */
-public class HTMLPrinter {
-
- public static final String DEFAULT_STYLESHEET = "style.css";
- public static final String DEFAULT_JAVASCRIPT = "script.js";
-
- //########################################################################
- // Private Constants
-
- /*
- * The characters which must be HTML encoded
- */
- private static final Character AMP = new Character('&');
- private static final Character GT = new Character('>');
- private static final Character LT = new Character('<');
- private static final Character QUOT = new Character('"');
-
- //########################################################################
- // Private Fields
-
- /**
- * The underlying code printer.
- */
- private final CodePrinter printer;
-
- /**
- * The document title.
- */
- private final String title;
-
- //########################################################################
- // Protected Fields
-
- /**
- * The document representation.
- */
- protected final HTMLRepresentation representation;
-
- /**
- * The document stylesheet.
- */
- protected final String stylesheet;
-
- /**
- * The document script.
- */
- protected final String script;
-
- //########################################################################
- // Public Constructors
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param representation
- * @param stylesheet
- * @param script
- */
- public HTMLPrinter(Writer writer, String title, HTMLRepresentation representation,
- String stylesheet, String script)
- {
- this.printer = new CodePrinter(writer, " ");
- this.title = title;
- this.representation = representation;
- this.stylesheet = stylesheet;
- this.script = script;
- }
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param representation
- * @param stylesheet
- */
- public HTMLPrinter(Writer writer, String title, HTMLRepresentation representation,
- String stylesheet)
- {
- this(writer, title, representation, stylesheet, DEFAULT_JAVASCRIPT);
- }
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param representation
- */
- public HTMLPrinter(Writer writer, String title, HTMLRepresentation representation) {
- this(writer, title, representation, DEFAULT_STYLESHEET);
- }
-
- /**
- * Creates a new instance with "HTML 4.01 Transitional" as default
- * document type.
- *
- * @param writer
- * @param title
- * @param encoding
- */
- public HTMLPrinter(Writer writer, String title, String docencoding) {
- this(
- writer,
- title,
- new HTMLRepresentation(HTMLRepresentation.DEFAULT_DOCTYPE, docencoding)
- );
- }
-
- /**
- * Creates a new instance with "iso-8859-1" as default character encoding.
- *
- * @param writer
- * @param title
- */
- public HTMLPrinter(Writer writer, String title) {
- this(writer, title, HTMLRepresentation.DEFAULT_DOCENCODING);
- }
-
- //########################################################################
- // Public Methods - Getting & Setting
-
- /**
- * Returns the underlying code printer.
- */
- public CodePrinter getCodePrinter() {
- return printer;
- }
-
- /**
- * Returns the underlying title.
- */
- public String getTitle() {
- return title;
- }
-
- //########################################################################
- // Public Methods - Character encoding
-
- /**
- * Encodes the special character <code>ch</code> to its
- * corresponding HTML encoding.
- *
- * @param ch
- */
- public static String encode(Character ch) {
- if (AMP.compareTo(ch) == 0) return "&amp;";
- else if (GT.compareTo(ch) == 0) return "&gt;";
- else if (LT.compareTo(ch) == 0) return "&lt;";
- else if (QUOT.compareTo(ch) == 0) return "&quot;";
- else return ch.toString();
- }
-
- /**
- * Encodes the special characters to their corresponding HTML encodings.
- *
- * @param text
- */
- public static String encode(String text) {
- return text;
- }
-
- //########################################################################
- // Public Methods - Formatting
-
- /**
- * Increases the indentation level by one.
- */
- public HTMLPrinter indent() {
- printer.indent();
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public HTMLPrinter undent() {
- printer.undent();
- return this;
- }
-
- /** Inserts a new line. */
- public HTMLPrinter line() {
- printer.line();
- return this;
- }
-
- /** Inserts a white space. */
- public HTMLPrinter space() {
- printer.space();
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing simple values followed by a new line
-
- /** Prints a new line. */
- public HTMLPrinter println() {
- printer.println();
- return this;
- }
-
- /** Prints the boolean value followed by a new line. */
- public HTMLPrinter println(boolean value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the byte value followed by a new line. */
- public HTMLPrinter println(byte value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the short value followed by a new line. */
- public HTMLPrinter println(short value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the char value followed by a new line. */
- public HTMLPrinter println(char value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the int value followed by a new line. */
- public HTMLPrinter println(int value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the long value followed by a new line. */
- public HTMLPrinter println(long value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the float value followed by a new line. */
- public HTMLPrinter println(float value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the double value followed by a new line. */
- public HTMLPrinter println(double value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the string followed by a new line. */
- public HTMLPrinter println(String value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the opening HTML tag followed by a new line. */
- public HTMLPrinter printlnOTag(String label) {
- printer.print("<");
- printer.print(label);
- printer.println(">");
- return this;
- }
-
- /** Prints the HTML tag with attributes followed by a new line. */
- public HTMLPrinter printlnOTag(String label, XMLAttribute[] attrs) {
- printer.print("<");
- printer.print(label);
- printer.print(" ");
- printer.print(StringOf.object.array(attrs, "", " ", ""));
- printer.println(">");
- return this;
- }
-
- /** Prints the closing HTML tag followed by a new line. */
- public HTMLPrinter printlnCTag(String label) {
- printer.print("</");
- printer.print(label);
- printer.println(">");
- return this;
- }
-
- /**
- * Prints HTML tag with label and contents followed by a new line.
- *
- * @param label
- * @param text
- */
- public HTMLPrinter printlnTag(String label, String text) {
- printlnOTag(label);
- print(text);
- return printlnCTag(label);
- }
-
- /**
- * Prints the HTML tag <code>label</code> with attributes <code>attrs</code>
- * and contents <code>text</code> followed by a new line.
- *
- * @param label
- * @param attrs
- * @param text
- */
- public HTMLPrinter printlnTag(String label, XMLAttribute[] attrs, String text) {
- printOTag(label, attrs);
- print(text);
- return printlnCTag(label);
- }
-
- /**
- * Prints the short HTML tag followed by a new line.
- *
- * @param label
- */
- public HTMLPrinter printlnSTag(String label) {
- printer.print("<");
- printer.print(label);
- printer.println("/>");
- return this;
- }
-
- /**
- * Prints the short HTML tag with attributes <code>attrs</code>
- * followed by a new line.
- *
- * @param label
- * @param attrs
- */
- public HTMLPrinter printlnSTag(String label, XMLAttribute[] attrs) {
- printer.print("<");
- printer.print(label);
- printer.print(" ");
- printer.print(StringOf.object.array(attrs, "", " ", ""));
- printer.println("/>");
- return this;
- }
-
- /**
- * Prints <A HREF=link> text </a> tag followed by a new line.
- *
- * @param dest
- * @param text
- */
- public HTMLPrinter printlnAhref(String dest, String text) {
- printOTag("a", new XMLAttribute[]{ new XMLAttribute("href", dest) });
- print(text);
- return printlnCTag("a");
- }
-
- /**
- * Prints <A HREF=dest TARGET=target> text </a> tag followed by a new line.
- *
- * @param dest
- * @param target
- * @param text
- */
- public HTMLPrinter printlnAhref(String dest, String target, String text) {
- printOTag("a", new XMLAttribute[]{
- new XMLAttribute("href", dest),
- new XMLAttribute("target", target)});
- print(text);
- return printlnCTag("a");
- }
-
- /**
- * Prints <A NAME=name> text </a> tag followed by a new line.
- *
- * @param anchor
- * @param text
- */
- public HTMLPrinter printlnAname(String anchor, String text) {
- printOTag("a", new XMLAttribute[]{new XMLAttribute("name", anchor)});
- print(text);
- return printlnCTag("a");
- }
-
- /**
- * Prints text <code>text</code> in bold followed by a new line.
- *
- * @param text
- */
- public HTMLPrinter printlnBold(String text) {
- return printlnTag("b", text);
- }
-
- /**
- * Prints text <code>text</code> in color <code>color</code> followed by a new line.
- *
- * @param color
- * @param text
- */
- public HTMLPrinter printlnFontColor(String color, String text) {
- return printlnTag(
- "font",
- new XMLAttribute[]{ new XMLAttribute("color", color)},
- text);
- }
-
- /**
- * Prints comment with contents <code>text</code> followed by a new line.
- *
- * @param text
- */
- public HTMLPrinter printlnComment(String text) {
- printer.print("<!--");
- printer.print(text);
- printer.println("-->");
- return this;
- }
-
- /**
- * Prints script followed by a new line.
- *
- * @param script
- */
- public HTMLPrinter printlnScript(String script) {
- printOTag("script", new XMLAttribute[]{
- new XMLAttribute("type", "text/javascript"),
- new XMLAttribute("src", script)
- });
- return printlnCTag("script");
- }
-
- /**
- * Prints <code>n</code> HTML blank spaces followed by a new line.
- *
- * @param n The parameter <code>n</code> gives the number
- * of printed blank spaces
- */
- public HTMLPrinter printlnNbsp(int n) {
- return printNbsp(n).line();
- }
-
- /**
- * Prints an horizontal line separator followed by a new line.
- */
- public HTMLPrinter printlnHLine() {
- return printlnOTag("hr");
- }
-
- /**
- * Prints an horizontal line separator with attributes <code>attrs</code>.
- *
- * @param attrs
- */
- public HTMLPrinter printlnHLine(XMLAttribute[] attrs) {
- return printlnOTag("hr", attrs);
- }
-
- /**
- * Prints the <meta> tag with attributes 'attrs' followed by a new line.
- *
- * @param attrs
- */
- public HTMLPrinter printlnMeta(XMLAttribute[] attrs) {
- return printlnOTag("meta", attrs);
- }
-
- /**
- * Prints the <link> tag with attributes 'attrs' followed by a new line.
- *
- * @param attrs
- */
- public HTMLPrinter printlnLink(XMLAttribute[] attrs) {
- return printlnOTag("link", attrs);
- }
-
- //########################################################################
- // Public Methods - Printing simple values
-
- /** Prints the boolean value. */
- public HTMLPrinter print(boolean value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the byte value. */
- public HTMLPrinter print(byte value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the short value. */
- public HTMLPrinter print(short value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the char value. */
- public HTMLPrinter print(char value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the int value. */
- public HTMLPrinter print(int value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public HTMLPrinter print(long value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the float value. */
- public HTMLPrinter print(float value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public HTMLPrinter print(double value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the string. */
- public HTMLPrinter print(String value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the opening HTML tag. */
- public HTMLPrinter printOTag(String label) {
- printer.print("<");
- printer.print(label);
- printer.print(">");
- return this;
- }
-
- /** Prints the opening HTML tag 'label' with attributes 'attrs'. */
- public HTMLPrinter printOTag(String label, XMLAttribute[] attrs) {
- printer.print("<");
- printer.print(label);
- printer.print(" ");
- printer.print(StringOf.object.array(attrs, "", " ", ""));
- printer.print(">");
- return this;
- }
-
- /** Prints the closing HTML tag 'label'. */
- public HTMLPrinter printCTag(String label) {
- printer.print("</");
- printer.print(label);
- printer.print(">");
- return this;
- }
-
- /**
- * Prints the HTML tag <code>label</code> with contents <code>text</code>.
- *
- * @param label
- * @param text
- */
- public HTMLPrinter printTag(String label, String text) {
- printOTag(label);
- print(text);
- return printCTag(label);
- }
-
- /** Prints the HTML tag 'label' with attributes 'attrs' and contents 'text'. */
- public HTMLPrinter printTag(String label, XMLAttribute[] attrs, String text) {
- printOTag(label, attrs);
- print(text);
- printCTag(label);
- return this;
- }
-
- /** Prints the short HTML tag 'label'. */
- public HTMLPrinter printSTag(String label) {
- printer.print("<");
- printer.print(label);
- printer.print("/>");
- return this;
- }
-
- /** Prints <A HREF=link> text </a> tag. */
- public HTMLPrinter printAhref(String dest, String text) {
- printOTag("a", new XMLAttribute[]{ new XMLAttribute("href", dest) });
- print(text);
- return printCTag("a");
- }
-
- /** Prints <A HREF=dest TARGET=target> text </a> tag. */
- public HTMLPrinter printAhref(String dest, String target, String text) {
- printOTag("a", new XMLAttribute[]{
- new XMLAttribute("href", dest),
- new XMLAttribute("target", target)});
- print(text);
- return printCTag("a");
- }
-
- /** Prints <A NAME=name> text </a> tag. */
- public HTMLPrinter printAname(String anchor, String text) {
- printOTag("a", new XMLAttribute[]{ new XMLAttribute("name", anchor) });
- print(text);
- return printCTag("a");
- }
-
- /**
- * Prints text <code>text</code> in bold.
- *
- * @param text
- */
- public HTMLPrinter printBold(String text) {
- return printTag("b", text);
- }
-
- /**
- * Prints text <code>text</code> in color <code>color</code>.
- *
- * @param color
- * @param text
- */
- public HTMLPrinter printFontColor(String color, String text) {
- return printTag("font", new XMLAttribute[]{ new XMLAttribute("color", color) }, text);
- }
-
- /**
- * Prints comment with contents <code>text</code>.
- *
- * @param text
- */
- public HTMLPrinter printComment(String text) {
- printer.print("<!-- ");
- printer.print(text);
- printer.print(" -->");
- return this;
- }
-
- /**
- * Prints <code>n</code> HTML blank spaces.
- *
- * @param n The parameter <code>n</code> gives the number
- * of printed blank spaces
- */
- public HTMLPrinter printNbsp(int n) {
- while (n > 0) {
- print("&nbsp;");
- n--;
- }
- return this;
- }
-
- /**
- * Prints an horizontal line separator.
- */
- public HTMLPrinter printHLine() {
- return printOTag("hr");
- }
-
- /**
- * Prints an horizontal line separator with attributes <code>attrs</code>.
- *
- * @param attrs
- */
- public HTMLPrinter printHLine(XMLAttribute[] attrs) {
- return printOTag("hr", attrs);
- }
-
- //########################################################################
- // Public Methods - Converting
-
- /**
- * Returns the string representation of this printer.
- */
- public String toString() {
- return printer.toString();
- }
-
- //########################################################################
-
- /**
- * Prints the HTML preamble of the current page.
- */
- protected void printPreamble() {
- println("<!DOCTYPE html PUBLIC \"-//W3C//DTD " +
- representation.getType() + "//" + representation.getLanguage() + "\">");
- printlnOTag("html").line();
- }
-
- /**
- * Prints HTML meta informations.
- *
- * @param metaAttrs
- */
- protected void printMetaInfo(XMLAttribute[] metaAttrs) {
- printlnMeta(new XMLAttribute[]{
- new XMLAttribute("http-equiv", "content-type"),
- new XMLAttribute("content",
- "text/html; charset=" + representation.getEncoding())});
- for (int i = 0; i < metaAttrs.length; i++) {
- printlnMeta(new XMLAttribute[]{
- new XMLAttribute("name", metaAttrs[i].name),
- new XMLAttribute("content", metaAttrs[i].value)});
- }
- }
-
- /**
- * Prints HTML link information for the given stylesheet.
- *
- * @param stylesheet The stylesheet to be linked
- * to the current HTML document
- */
- protected void printlnStyle(String stylesheet) {
- printlnLink(new XMLAttribute[]{
- new XMLAttribute("rel", "stylesheet"),
- new XMLAttribute("type", "text/css"),
- new XMLAttribute("href", stylesheet)});
- }
-
- /**
- * Prints HTML header section of the current page.
- *
- * @param metaAttrs
- * @param generator
- * @param stylesheets
- */
- public void printHeader(XMLAttribute[] metaAttrs,
- String[] comments, String[] stylesheets, String[] scripts)
- {
- printPreamble();
- printlnOTag("head").indent();
- printlnTag("title", title);
- for (int i = 0; i < comments.length; i++)
- printlnComment(comments[i]);
- printMetaInfo(metaAttrs);
- for (int i = 0; i < stylesheets.length; i++)
- printlnStyle(stylesheets[i]);
- for (int i = 0; i < scripts.length; i++)
- printlnScript(scripts[i]);
- undent().printlnCTag("head").line();
- }
-
- /**
- * Prints HTML header section.
- *
- * @param metaXMLAttributes
- * @param generator
- * @param stylesheet
- */
- public void printHeader(XMLAttribute[] metaAttrs, String comment,
- String stylesheet, String script)
- {
- printHeader(metaAttrs,
- new String[]{ comment },
- new String[]{ stylesheet },
- new String[]{ script });
- }
-
- /**
- * Prints HTML header section.
- *
- * @param metaXMLAttributes
- * @param generator
- * @param stylesheet
- */
- public void printHeader(XMLAttribute[] metaAttrs, String comment,
- String stylesheet)
- {
- printHeader(metaAttrs, comment, stylesheet, script);
- }
-
- /**
- * Prints HTML header section.
- *
- * @param metaXMLAttributes
- * @param generator
- */
- public void printHeader(XMLAttribute[] metaAttrs, String comment) {
- printHeader(metaAttrs, comment, stylesheet);
- }
-
- /**
- * Prints the header section of the current page.
- *
- * @param metaXMLAttributes
- */
- public void printHeader(XMLAttribute[] metaAttrs) {
- printHeader(metaAttrs, null);
- }
-
- /**
- * Open the body section of the current page.
- */
- public void printOpenBody(XMLAttribute[] attrs) {
- printlnOTag("body", attrs).indent();
- }
-
- /**
- * Open the body section of the current page.
- */
- public void printOpenBody() {
- printlnOTag("body").indent();
- }
-
- /**
- * Prints the HTML footer of the current page.
- */
- public void printFootpage() {
- undent().printlnCTag("body");
- printlnCTag("html");
- }
-
- //########################################################################
-}
-
-
-/**
- * Map from Object to String.
- */
-public abstract class StringOf {
-
- /**
- * Gives the string representation of an object.
- *
- * @param o
- */
- public abstract String element(Object o);
-
- /**
- * Gives the string representation of an array of objects.
- * Return delimiters for empty arrays depending on "delimWhenEmpty".
- *
- * @param objects
- * @param open
- * @param sep
- * @param close
- * @param delimWhenEmpty
- */
- public String array(Object[] objects, String open, String sep, String close, boolean delimWhenEmpty) {
- if ((objects.length == 0) && !delimWhenEmpty)
- return "";
- else {
- StringBuffer str = new StringBuffer();
- str.append(open);
- if (objects.length > 0) {
- str.append(element(objects[0]));
- for(int i = 1; i < objects.length; i++)
- str.append(sep + element(objects[i]));
- }
- str.append(close);
- return str.toString();
- }
- }
-
- /**
- * Returns always delimiters.
- *
- * @param objects
- * @param open
- * @param sep
- * @param close
- */
- public String array(Object[] objects, String open, String sep, String close) {
- return array(objects, open, sep, close, true);
- }
-
- /**
- * Basic map.
- */
- public static StringOf object = new StringOf() {
- public String element(Object o) {
- return o.toString();
- }
- };
-
-}
diff --git a/sources/ch/epfl/lamp/util/HTMLRepresentation.java b/sources/ch/epfl/lamp/util/HTMLRepresentation.java
deleted file mode 100644
index debe5288bd..0000000000
--- a/sources/ch/epfl/lamp/util/HTMLRepresentation.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-/**
- * This class contains properties of HTML document representation
- * (see http://www.w3.org/TR/REC-html40/charset.html).
- */
-public class HTMLRepresentation {
-
- public static final String DEFAULT_DOCTYPE = "HTML 4.01 Transitional";
- public static final String DEFAULT_DOCENCODING = "iso-8859-1";
- public static final String DEFAULT_DOCLANGUAGE = "EN";
-
- //########################################################################
- // Private Fields
-
- /** The document type */
- private final String doctype;
-
- /** The document character encoding */
- private final String docencoding;
-
- /** The document language */
- private final String language;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new instance */
- public HTMLRepresentation(String doctype, String docencoding, String language) {
- this.doctype = doctype;
- this.docencoding = docencoding;
- this.language = language;
- }
-
- /** Creates a new instance */
- public HTMLRepresentation(String doctype, String docencoding) {
- this(doctype, docencoding, DEFAULT_DOCLANGUAGE);
- }
-
- /** Creates a new instance */
- public HTMLRepresentation(String doctype) {
- this(doctype, DEFAULT_DOCENCODING, DEFAULT_DOCLANGUAGE);
- }
-
- /** Creates a new instance */
- public HTMLRepresentation() {
- this(DEFAULT_DOCTYPE, DEFAULT_DOCENCODING, DEFAULT_DOCLANGUAGE);
- }
-
- //########################################################################
- // Public Methods - Getting & Setting
-
- /**
- * Returns the underlying document type.
- */
- public String getType() {
- return doctype;
- }
-
- /**
- * Returns the underlying character encoding.
- */
- public String getEncoding() {
- return docencoding;
- }
-
- /**
- * Returns the underlying document language.
- *
- * @ return the language name of the underlying document
- */
- public String getLanguage() {
- return language;
- }
-
- /**
- * Returns <code>true</code> if the document type is HTML.
- */
- public boolean isHTMLType() {
- return doctype.toLowerCase().matches("^html\\p{Space}\\d\\.\\d.*");
- }
-
- /**
- * Returns <code>true</code> if the document type is XHTML.
- */
- public boolean isXHTMLType() {
- return doctype.toLowerCase().matches("^xhtml\\p{Space}\\d\\.\\d.*");
- }
-
- //########################################################################
-}
diff --git a/sources/ch/epfl/lamp/util/Pair.java b/sources/ch/epfl/lamp/util/Pair.java
deleted file mode 100644
index 1b755ca18a..0000000000
--- a/sources/ch/epfl/lamp/util/Pair.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-/**
- * Pairs of values.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-
-public class Pair {
- public final Object fst, snd;
- public Pair(Object fst, Object snd) {
- this.fst = fst;
- this.snd = snd;
- }
- public String toString() {
- return "Pair(" + fst + ", " + snd + ")";
- }
-}
diff --git a/sources/ch/epfl/lamp/util/XHTMLPrinter.java b/sources/ch/epfl/lamp/util/XHTMLPrinter.java
deleted file mode 100644
index be76c45023..0000000000
--- a/sources/ch/epfl/lamp/util/XHTMLPrinter.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-import java.io.Writer;
-
-/**
- * This class provides methods to print XHTML document.
- *
- * @author Stephane Micheloud
- * @version 1.1
- */
-public class XHTMLPrinter extends HTMLPrinter {
-
- //########################################################################
- // Public Constructors
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param representation
- * @param stylesheet
- * @param script
- */
- public XHTMLPrinter(Writer writer, String title, HTMLRepresentation representation,
- String stylesheet, String script)
- {
- super(writer, title, representation, stylesheet, script);
- }
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param representation
- * @param stylesheet
- */
- public XHTMLPrinter(Writer writer, String title, HTMLRepresentation representation,
- String stylesheet)
- {
- this(writer, title, representation, stylesheet, DEFAULT_JAVASCRIPT);
- }
-
- /**
- * Creates a new instance.
- *
- * @param writer
- * @param title
- * @param repr
- */
- public XHTMLPrinter(Writer writer, String title, HTMLRepresentation representation) {
- this(writer, title, representation, DEFAULT_STYLESHEET);
- }
-
- /**
- * Creates a new instance with "XHTML 1.0 Transitional" as default document type.
- *
- * @param writer
- * @param title
- * @param docencoding
- */
- public XHTMLPrinter(Writer writer, String title, String docencoding) {
- this(writer, title, new HTMLRepresentation("XHTML 1.0 Transitional", docencoding));
- }
-
- /**
- * Creates a new instance with "utf-8" as default character encoding.
- *
- * @param writer
- * @param title
- */
- public XHTMLPrinter(Writer writer, String title) {
- this(writer, title, "utf-8");
- }
-
- //########################################################################
- // Public Methods - Printing simple values followed by a new line
-
- /**
- * Prints text <code>text</code> in bold followed by a new line.
- *
- * @param text
- * @return the current HTML printer
- */
- public HTMLPrinter printlnBold(String text) {
- return printlnTag("span",
- new XMLAttribute[]{ new XMLAttribute("style", "font-weight:bold;") },
- text);
- }
-
- /**
- * Prints an horizontal line separator followed by a new line.
- *
- * @return the current HTML printer
- */
- public HTMLPrinter printlnHLine() {
- printOTag("div", new XMLAttribute[] {
- new XMLAttribute("style", "border:1px solid #aaaaaa; " +
- "margin:10px 0px 5px 0px;height:1px;") });
- return printlnCTag("div");
- }
-
- //########################################################################
- // Public Methods - Printing simple values
-
- /**
- * Prints text <code>text</code> in bold.
- *
- * @param text
- * @return the current HTML printer
- */
- public HTMLPrinter printBold(String text) {
- return printTag("span",
- new XMLAttribute[]{ new XMLAttribute("style", "font-weight:bold;") },
- text);
- }
-
- /**
- * Prints an horizontal line separator
- *
- * @return the current HTML printer
- */
- public HTMLPrinter printHLine() {
- printOTag("div", new XMLAttribute[] {
- new XMLAttribute("style", "border:1px solid #aaaaaa; " +
- "margin:10px 0px 5px 0px;height:1px;") });
- return printCTag("div");
- }
-
- /**
- * Prints an horizontal line separator with attributes <code>attrs</code>.
- *
- * @param attrs
- * @return the current HTML printer
- */
- public HTMLPrinter printHLine(XMLAttribute[] attrs) {
- return printHLine();
- }
-
- /**
- * Prints the &lt;meta/&gt; tag with attributes <code>attrs</code>
- * followed by a new line.
- *
- * @param attrs
- * @return the current HTML printer
- */
- public HTMLPrinter printlnMeta(XMLAttribute[] attrs) {
- return printlnSTag("meta", attrs);
- }
-
- /**
- * Prints the &lt;link&gt; tag with attributes <code>attrs</code>
- * followed by a new line.
- *
- * @param attrs
- * @return the current HTML printer
- */
- public HTMLPrinter printlnLink(XMLAttribute[] attrs) {
- return printlnSTag("link", attrs);
- }
-
- //########################################################################
-
- /**
- * Prints XHTML preamble.
- */
- protected void printPreamble() {
- println("<!--");
- println("< ?xml version=\"1.0\" encoding=\"" +
- representation.getEncoding() + "\"?>");
- println("//-->");
- println("<!DOCTYPE html PUBLIC \"-//W3C//DTD " +
- representation.getType() + "//" + representation.getLanguage() +
- "\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
- println("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"" +
- representation.getLanguage() + "\">").line();
- }
-
- //########################################################################
-}
diff --git a/sources/ch/epfl/lamp/util/XMLAttribute.java b/sources/ch/epfl/lamp/util/XMLAttribute.java
deleted file mode 100644
index 309a4cc621..0000000000
--- a/sources/ch/epfl/lamp/util/XMLAttribute.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package ch.epfl.lamp.util;
-
-/** An XML attribute.
- */
-public class XMLAttribute {
-
- /** Name of the attribute.
- */
- public String name;
-
- /** Value of the attribute.
- */
- public String value;
-
- public XMLAttribute(String name, String value) {
- this.name = name;
- this.value = value;
- }
-
- public String toString() {
- return name + "=\"" + value + "\"";
- }
-} \ No newline at end of file
diff --git a/sources/meta/GenerateAll.java b/sources/meta/GenerateAll.java
deleted file mode 100644
index d522fbcb58..0000000000
--- a/sources/meta/GenerateAll.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.BufferedWriter;
-import java.io.PrintWriter;
-import java.io.PrintStream;
-import java.io.IOException;
-
-import meta.util.AbstractMain;
-import meta.util.AbstractFileExpander;
-import meta.util.TextExpander;
-import meta.util.TextWriter;
-
-/** A program that invokes all file generators. */
-public class GenerateAll extends AbstractMain {
-
- //########################################################################
- // Public Constants
-
- public static final AbstractFileExpander[] expanders = {
- new meta.scala.MetaFunction(0),
- new meta.scala.MetaFunction(1),
- new meta.scala.MetaFunction(2),
- new meta.scala.MetaFunction(3),
- new meta.scala.MetaFunction(4),
- new meta.scala.MetaFunction(5),
- new meta.scala.MetaFunction(6),
- new meta.scala.MetaFunction(7),
- new meta.scala.MetaFunction(8),
- new meta.scala.MetaFunction(9),
- new meta.scala.MetaTuple(1),
- new meta.scala.MetaTuple(2),
- new meta.scala.MetaTuple(3),
- new meta.scala.MetaTuple(4),
- new meta.scala.MetaTuple(5),
- new meta.scala.MetaTuple(6),
- new meta.scala.MetaTuple(7),
- new meta.scala.MetaTuple(8),
- new meta.scala.MetaTuple(9),
- new meta.scalac.ast.MetaTree(),
- new meta.scalac.ast.MetaTreeFactory(),
- new meta.scalac.ast.MetaDefaultTreeFactory(),
- new meta.scalac.ast.MetaTreeCopier(),
- new meta.scalac.ast.MetaStrictTreeCopier(),
- new meta.scalac.ast.MetaLazyTreeCopier(),
- new meta.scalac.ast.MetaTraverser(),
- new meta.scalac.ast.MetaTransformer(),
- new meta.scalac.checkers.MetaCheckTreeNodes(),
- };
-
- //########################################################################
- // Public Functions
-
- public static void usage(PrintStream out) {
- out.println("usage: " + script() + " <outputdir> [<logfile>]");
- }
-
- public static void main(String[] args) throws Exception {
- if (args.length < 1 || 2 < args.length) {
- usage(System.err);
- throw abort();
- }
- int errors = 0;
- File root = new File(args[0]);
- PrintWriter filelist = args.length <= 1 ? null :
- new PrintWriter(new BufferedWriter(new FileWriter(args[1])));
- for (int i = 0; i < expanders.length; i++) {
- File source = expanders[i].getSourceFile(root);
- File target = expanders[i].getTargetFile(root);
- System.out.println("Generating file " + target);
- if (filelist != null) {filelist.println(target);filelist.flush();}
- try {
- TextWriter writer = expanders[i].getTextWriter();
- TextExpander expander = new TextExpander(writer, expanders[i]);
- expander.expandText(source);
- errors += expander.getErrorCount();
- target.delete();
- FileWriter output = new FileWriter(target);
- output.write(writer.toString());
- output.close();
- target.setReadOnly();
- } catch (IOException exception) {
- throw abort(exception);
- }
- }
- if (errors > 0) throw abort();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/java/AbstractJavaExpander.java b/sources/meta/java/AbstractJavaExpander.java
deleted file mode 100644
index c633ef8c45..0000000000
--- a/sources/meta/java/AbstractJavaExpander.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.java;
-
-import meta.util.TextWriter;
-import meta.util.AbstractFileExpander;
-
-/** A base class for java file expanders. */
-public abstract class AbstractJavaExpander extends AbstractFileExpander {
-
- //########################################################################
- // Public Fields
-
- /** The underlying java writer */
- public final JavaWriter writer;
-
- //########################################################################
- // Public Constructors
-
- public AbstractJavaExpander() {
- this.writer = new JavaWriter(getPackage());
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the TextWriter in which this expander writes. */
- public TextWriter getTextWriter() {
- return writer.getTextWriter();
- }
-
- /** Returns the suffix of the target file. Returns "java". */
- public String getTargetSuffix() {
- return "java";
- }
-
- /** Prints the import statements. */
- public void printImports() {
- writer.printImports();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/java/JavaWriter.java b/sources/meta/java/JavaWriter.java
deleted file mode 100644
index d0106f3215..0000000000
--- a/sources/meta/java/JavaWriter.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.java;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.TreeSet;
-
-import meta.util.TextWriter;
-import meta.util.TextExpander;
-
-/** A string generator with support for java source code generation. */
-public class JavaWriter {
-
- //########################################################################
- // Public Constants
-
- /** The width of a separator */
- public static final int SEPARATOR_WIDTH = 78;
-
- //########################################################################
- // Private Fields
-
- /** The underlying text writer */
- private final TextWriter writer;
-
- /** The current package */
- private final String peckage;
-
- /** List of imports on-demand */
- private final Set/*<String>*/ owners;
-
- /** List of explicit imports (maps short names to full names) */
- private final Map/*<String,String>*/ types;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new JavaPrinter with no current package. */
- public JavaWriter() {
- this((String)null);
- }
-
- /** Creates a new JavaPrinter with the given current package. */
- public JavaWriter(String peckage) {
- this(new TextWriter(" "), peckage);
- }
-
- /** Creates a new JavaPrinter with no current package. */
- public JavaWriter(TextWriter writer) {
- this(writer, null);
- }
-
- /** Creates a new JavaPrinter with the given current package. */
- public JavaWriter(TextWriter writer, String peckage) {
- this.writer = writer;
- this.peckage = peckage;
- this.owners = new HashSet();
- this.types = new HashMap();
- }
-
- //########################################################################
- // Public Methods - Importing types
-
- /** Returns the current package. */
- public String getPackage() {
- return peckage;
- }
-
- /** Returns true if the given type needs to be fully qualified. */
- public boolean needsQualification(Type type) {
- type = type.getBaseType();
- String owner = type.getOwner();
- if (owner == null) return true;
- Object current = types.get(type.getName());
- if (current != null) return !type.getFullName().equals(current);
- return !owner.equals(getPackage()) && !owners.contains(owner);
- }
-
- /** If necessary, adds an explicit import for the given type. */
- public void importType(Type type) {
- importType(type, false);
- }
-
- /** If necessary, adds an explicit import for the given type. */
- public void importType(Type type, boolean force) {
- type = type.getBaseType();
- String owner = type.getOwner();
- if (owner == null) return;
- if (!force && owner.equals(getPackage())) return;
- if (!force && owners.contains(owner)) return;
- String shortname = type.getName();
- String longname = type.getFullName();
- Object current = types.get(shortname);
- if (current == null) {
- types.put(shortname, longname);
- } else if (!longname.equals(current)) {
- throw new Error();
- }
- }
-
- /** Adds an import on demand for members of the given type. */
- public void importFrom(Type type) {
- importFrom(type.getFullName());
- }
-
- /** Adds an import on demand for members of the given owner. */
- public void importFrom(String owner) {
- owners.add(owner);
- }
-
- //########################################################################
- // Public Methods - Printing java statements and expressions
-
- /** Prints a package statement for the current package. */
- public JavaWriter printPackage() {
- return getPackage() == null ? this : printPackage(getPackage());
- }
-
- /** Prints a package statement. */
- public JavaWriter printPackage(String peckage) {
- return print("package ").print(peckage).println(";");
- }
-
- /** Prints an import statement. */
- public JavaWriter printImport(String inport) {
- return print("import ").print(inport).println(";");
- }
-
- /** Prints import statements for the current imports. */
- public JavaWriter printImports() {
- return printImports(getImports());
- }
-
- /** Prints a list of import statements. */
- public JavaWriter printImports(Set imports) {
- for (Iterator i = imports.iterator(); i.hasNext(); )
- printImport((String)i.next());
- if (imports.size() > 0) println();
- return this;
- }
-
- /** Prints a "do not edit" comment. */
- public JavaWriter printDoNotEdit() {
- return printComment(TextExpander.DO_NOT_EDIT);
- }
-
- /** Prints a single-line Java documentation comment. */
- public JavaWriter printDescription(String line) {
- return print("/** ").print(line).println(" */");
- }
-
- /** Prints a multi-line Java documentation comment. */
- public JavaWriter printDescription(String[] lines) {
- println("/**");
- for (int i = 0; i < lines.length; i++) print(" * ").println(lines[i]);
- return println(" */");
- }
-
- /** Prints a single-line comment. */
- public JavaWriter printComment(String comment) {
- return print("// ").println(comment);
- }
-
- /** Prints a separator. */
- public JavaWriter printSeparator() {
- println().print("//");
- int width = SEPARATOR_WIDTH - 2 - getIndentLevel() * getIndentWidth();
- for (int i = 0; i < width; i++) print("#");
- return println();
- }
-
- /** Prints a separator with the given title. */
- public JavaWriter printSeparator(String title) {
- return printSeparator().printComment(title).println();
- }
-
- /** Prints a separator with the given title and subtitle. */
- public JavaWriter printSeparator(String title, String subtitle) {
- return printSeparator(title + " - " + subtitle);
- }
-
- //########################################################################
- // Public Methods - Printing simple values
-
- /** Prints a new line. */
- public JavaWriter println() {
- return line();
- }
-
- /** Prints the boolean value followed by a new line. */
- public JavaWriter println(boolean value) {
- return print(value).line();
- }
-
- /** Prints the byte value followed by a new line. */
- public JavaWriter println(byte value) {
- return print(value).line();
- }
-
- /** Prints the short value followed by a new line. */
- public JavaWriter println(short value) {
- return print(value).line();
- }
-
- /** Prints the char value followed by a new line. */
- public JavaWriter println(char value) {
- return print(value).line();
- }
-
- /** Prints the int value followed by a new line. */
- public JavaWriter println(int value) {
- return print(value).line();
- }
-
- /** Prints the long value followed by a new line. */
- public JavaWriter println(long value) {
- return print(value).line();
- }
-
- /** Prints the float value followed by a new line. */
- public JavaWriter println(float value) {
- return print(value).line();
- }
-
- /** Prints the double value followed by a new line. */
- public JavaWriter println(double value) {
- return print(value).line();
- }
-
- /** Prints the string followed by a new line. */
- public JavaWriter println(String value) {
- return print(value).line();
- }
-
- /** Prints the type followed by a new line. */
- public JavaWriter println(Type value) {
- return print(value).line();
- }
-
- /** Prints the boolean value. */
- public JavaWriter print(boolean value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the byte value. */
- public JavaWriter print(byte value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the short value. */
- public JavaWriter print(short value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the char value. */
- public JavaWriter print(char value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the int value. */
- public JavaWriter print(int value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public JavaWriter print(long value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the float value. */
- public JavaWriter print(float value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public JavaWriter print(double value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the string. */
- public JavaWriter print(String value) {
- writer.print(value);
- return this;
- }
-
- /** Prints the type. */
- public JavaWriter print(Type value) {
- return print(value.getName(needsQualification(value)));
- }
-
- //########################################################################
- // Public Methods - Formating
-
- /** Returns the indentation width. */
- public int getIndentWidth() {
- return writer.getIndentWidth();
- }
-
- /** Returns the indentation level. */
- public int getIndentLevel() {
- return writer.getIndentLevel();
- }
-
- /** Returns the indentation level. */
- public JavaWriter setIndentLevel(int level) {
- writer.setIndentLevel(level);
- return this;
- }
-
- /** Increases the indentation level by one. */
- public JavaWriter indent() {
- writer.indent();
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public JavaWriter undent() {
- writer.undent();
- return this;
- }
-
- /** Starts a new line. */
- public JavaWriter line() {
- writer.line();
- return this;
- }
-
- /** Inserts a white space. */
- public JavaWriter space() {
- writer.space();
- return this;
- }
-
- /** Prints an opening brace followed by a new line. */
- public JavaWriter lbrace() {
- return space().println("{").indent();
- }
-
- /** Prints a closing brace followed by a new line. */
- public JavaWriter rbrace() {
- return undent().space().println("}");
- }
-
- //########################################################################
- // Public Methods - Accessing
-
- /** Returns the underlying StringBuffer. */
- public TextWriter getTextWriter() {
- return writer;
- }
-
- /** Returns the underlying StringBuffer. */
- public StringBuffer getBuffer() {
- return writer.getBuffer();
- }
-
- /** Returns the generated string. */
- public String toString() {
- return writer.toString();
- }
-
- //########################################################################
- // Private Methods
-
- /** Returns the current list of imports (explicit and on-demand). */
- private Set getImports() {
- Set imports = new TreeSet();
- for (Iterator i = owners.iterator(); i.hasNext(); )
- imports.add(i.next() + ".*");
- for (Iterator i = types.values().iterator(); i.hasNext(); )
- imports.add(i.next());
- return imports;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/java/Type.java b/sources/meta/java/Type.java
deleted file mode 100644
index 0d4545cbd4..0000000000
--- a/sources/meta/java/Type.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.java;
-
-/** A representation for Java types. */
-public class Type {
-
- //########################################################################
- // Public Constants
-
- /** The Java primitive type void */
- public static final Type VOID = Primitive("void");
-
- /** The Java primitive type boolean */
- public static final Type BOOLEAN = Primitive("boolean");
-
- /** The Java primitive type byte */
- public static final Type BYTE = Primitive("byte");
-
- /** The Java primitive type short */
- public static final Type SHORT = Primitive("short");
-
- /** The Java primitive type char */
- public static final Type CHAR = Primitive("char");
-
- /** The Java primitive type int */
- public static final Type INT = Primitive("int");
-
- /** The Java primitive type long */
- public static final Type LONG = Primitive("long");
-
- /** The Java primitive type float */
- public static final Type FLOAT = Primitive("float");
-
- /** The Java primitive type double */
- public static final Type DOUBLE = Primitive("double");
-
- //########################################################################
- // Public Cases
-
- /** A primitive type */
- public case Primitive(String name);
-
- /** A reference type (the owner may be null) */
- public case Reference(String owner, String name);
-
- /** An array type */
- public case Array(Type item);
-
- //########################################################################
- // Public Methods
-
- /** Returns the type's fully qualified name. */
- public String getFullName() {
- return getName(true);
- }
-
- /** Returns the type's short name. */
- public String getName() {
- return getName(false);
- }
-
- /** Returns the type's (possibly fully qualified) name. */
- public String getName(boolean qualified) {
- switch (this) {
- case Primitive(String name):
- return name;
- case Reference(String owner, String name):
- return qualified && owner != null ? owner + "." + name : name;
- case Array(Type item):
- return item.getName(qualified) + "[]";
- default:
- throw new Error("illegal case: " + getName(true));
- }
- }
-
- /** Returns the type's owner (its package or enclosing type). */
- public String getOwner() {
- switch (this) {
- case Primitive(_):
- return null;
- case Reference(String owner, _):
- return owner;
- case Array(Type item):
- return item.getOwner();
- default:
- throw new Error("illegal case: " + getName(true));
- }
- }
-
- /** If this is an array type, returns the type of the elements. */
- public Type getItemType() {
- switch (this) {
- case Array(Type item):
- return item;
- default:
- throw new Error("not an array type: " + getName(true));
- }
- }
-
- /** Returns the base type of this type. */
- public Type getBaseType() {
- return isArray() ? getItemType() : this;
- }
-
- /** Returns true if this is a primitive type. */
- public boolean isPrimitive() {
- switch (this) {
- case Primitive(_):
- return true;
- default:
- return false;
- }
- }
-
- /** Returns true if this is an array type. */
- public boolean isArray() {
- switch (this) {
- case Array(_):
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Returns the string representation of an array instantiation
- * with the given bounds and whose elements are of this type.
- */
- public String newArray(String bounds) {
- switch (this) {
- case Array(Type item):
- return item.newArray(bounds + "[]");
- default:
- return this + bounds;
- }
- }
-
-
- /** Returns the string representation of this type. */
- public String toString() {
- return getName();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scala/AbstractScalaExpander.java b/sources/meta/scala/AbstractScalaExpander.java
deleted file mode 100644
index 0e121bfca9..0000000000
--- a/sources/meta/scala/AbstractScalaExpander.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scala;
-
-import meta.java.JavaWriter;
-import meta.util.TextWriter;
-import meta.util.AbstractFileExpander;
-
-/** A base class for scala file expanders. */
-public abstract class AbstractScalaExpander extends AbstractFileExpander {
-
- //########################################################################
- // Public Fields
-
- /** The underlying java writer */
- public final JavaWriter writer;
-
- //########################################################################
- // Public Constructors
-
- public AbstractScalaExpander() {
- this.writer = new JavaWriter(getPackage());
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the TextWriter in which this expander writes. */
- public TextWriter getTextWriter() {
- return writer.getTextWriter();
- }
-
- /** Returns the suffix of the target file. Returns "scala". */
- public String getTargetSuffix() {
- return "scala";
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scala/MetaFunction.java b/sources/meta/scala/MetaFunction.java
deleted file mode 100644
index 11ed9cc159..0000000000
--- a/sources/meta/scala/MetaFunction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scala;
-
-import meta.java.AbstractJavaExpander;
-
-public class MetaFunction extends AbstractScalaExpander {
-
- //########################################################################
- // Public Fields
-
- public final int arity;
-
- //########################################################################
- // Public Constructors
-
- public MetaFunction(int arity) {
- this.arity = arity;
- }
-
- //########################################################################
- // Public Methods
-
- public String getTargetBaseName() {
- return super.getTargetBaseName() + arity;
- }
-
- public void printn() {
- writer.print(arity);
- }
-
- public void printClassSignature() {
- writer.print("[");
- for (int i = 0; i < arity; i++)
- writer.print("-T").print(i).print(", ");
- writer.print("+R]");
- }
-
- public void printApplySignature() {
- writer.print("(");
- for (int i = 0; i < arity; i++) {
- if (i > 0) writer.print(", ");
- writer.print("v").print(i).print(":").space().print("T").print(i);
- }
- writer.print("): R");
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scala/MetaTuple.java b/sources/meta/scala/MetaTuple.java
deleted file mode 100644
index 2c67d9b919..0000000000
--- a/sources/meta/scala/MetaTuple.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scala;
-
-public class MetaTuple extends AbstractScalaExpander {
-
- //########################################################################
- // Public Fields
-
- public final int arity;
-
- //########################################################################
- // Public Constructors
-
- public MetaTuple(int arity) {
- this.arity = arity;
- }
-
- //########################################################################
- // Public Methods
-
- public String getTargetBaseName() {
- return super.getTargetBaseName() + arity;
- }
-
- public void printn() {
- writer.print(arity);
- }
-
- public void printTParams() {
- for (int i = 1; i <= arity; i++) {
- if (i > 1) writer.print(", ");
- writer.print("+T").print(i);
- }
- }
-
- public void printVParams() {
- for (int i = 1; i <= arity; i++) {
- if (i > 1) writer.print(", ");
- writer.print("_").print(i).print(": T").print(i);
- }
- }
-
- public void printToStringBody() {
- for (int i = 1; i <= arity; i++) {
- if (i > 1) writer.print(" + \",\" + ");
- writer.print("_").print(i);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/Phase.java b/sources/meta/scalac/Phase.java
deleted file mode 100644
index 8092d6125b..0000000000
--- a/sources/meta/scalac/Phase.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac;
-
-/** A representation for Scala compiler phases. */
-public class Phase {
-
- //########################################################################
- // Public Constants
-
- public static final Phase
- START = new Phase("start", null),
- PARSER = new Phase("parser", "PARSER"),
- DESUGARIZER = new Phase("desugarizer", "ANALYZER"),
- ANALYZER = new Phase("analyzer", "ANALYZER"),
- REFCHECK = new Phase("refcheck", "REFCHECK"),
- UNCURRY = new Phase("uncurry", "UNCURRY"),
- TRANSMATCH = new Phase("transmatch", "TRANSMATCH"),
- LAMBDALIFT = new Phase("lambdalift", "LAMBDALIFT"),
- EXPLICITOUTER = new Phase("explicitouter", "EXPLICITOUTER"),
- ERASURE = new Phase("erasure", "ERASURE"),
- UNKNOWN = new Phase("? !!!", null),
- END = new Phase("-", null);
-
- //########################################################################
- // Public Fields
-
- public final String name;
- public final String constant;
-
- //########################################################################
- // Public Constructors
-
- public Phase(String name, String constant) {
- this.name = name;
- this.constant = constant;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/AbstractTreeCaseExpander.java b/sources/meta/scalac/ast/AbstractTreeCaseExpander.java
deleted file mode 100644
index c7e023c16f..0000000000
--- a/sources/meta/scalac/ast/AbstractTreeCaseExpander.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-/** A base class for expanders that generate switches on tree nodes. */
-public abstract class AbstractTreeCaseExpander extends AbstractTreeExpander {
-
- //########################################################################
- // Public Constructors
-
- public AbstractTreeCaseExpander() {
- writer.importType(t_Debug);
- }
-
- //########################################################################
- // Public Methods
-
- public void printTreeSwitch() {
- writer.println("switch (tree) {");
- writer.println();
- printTreeCases();
- writer.println("default:");
- writer.indent();
- writer.print("throw ").print(t_Debug).
- println(".abort(\"unknown tree\", tree);");
- writer.undent();
- writer.println("}");
- }
-
- public void printTreeCases() {
- for (int i = 0; i < tree.nodes.length; i++) {
- printTreeCase(tree.nodes[i]);
- writer.println();
- }
- }
-
- public void printTreeCase(TreeNode node) {
- printTreeCaseHeader(node);
- writer.println().indent();
- printTreeCaseBody(node);
- printTreeCaseFooter(node);
- writer.undent();
- }
-
- public void printTreeCaseHeader(TreeNode node) {
- node.printCase(writer, false);
- }
-
- public abstract void printTreeCaseBody(TreeNode node);
-
- public void printTreeCaseFooter(TreeNode node) {
- // do nothing
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/AbstractTreeExpander.java b/sources/meta/scalac/ast/AbstractTreeExpander.java
deleted file mode 100644
index 503a9651a2..0000000000
--- a/sources/meta/scalac/ast/AbstractTreeExpander.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-import meta.java.AbstractJavaExpander;
-
-/** A base class for expanders that handle tree nodes. */
-public abstract class AbstractTreeExpander extends AbstractJavaExpander {
-
- //########################################################################
- // Public Fields
-
- public final Type t_Debug;
- public final Tree tree;
-
- //########################################################################
- // Public Constructors
-
- public AbstractTreeExpander() {
- this.t_Debug = TreeType.Reference("scalac.util", "Debug");
- this.tree = new Tree();
- writer.importFrom(t_Debug);
- writer.importFrom(tree.getType(0));
- for (int i = 0; i < tree.nodes.length; i++) {
- if (tree.nodes[i].fields != null)
- for (int j = 0; j < tree.nodes[i].fields.length; j++)
- writer.importType(tree.nodes[i].fields[j].type);
- if (tree.nodes[i].hasSymbol())
- writer.importType(tree.nodes[i].getSymbol().type);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/AbstractTreeMethodExpander.java b/sources/meta/scalac/ast/AbstractTreeMethodExpander.java
deleted file mode 100644
index 7444759111..0000000000
--- a/sources/meta/scalac/ast/AbstractTreeMethodExpander.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-/** A base class for expanders that generate one method per tree node. */
-public abstract class AbstractTreeMethodExpander extends AbstractTreeExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethods() {
- for (int i = 0; i < tree.nodes.length; i++) {
- if (tree.nodes[i].fields != null) {
- printTreeMethod(tree.nodes[i], false);
- if (tree.nodes[i].hasSymbol())
- printTreeMethod(tree.nodes[i], true);
- }
- writer.println();
- }
- }
-
- public abstract void printTreeMethod(TreeNode node, boolean withSymbol);
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaDefaultTreeFactory.java b/sources/meta/scalac/ast/MetaDefaultTreeFactory.java
deleted file mode 100644
index fde4fe7773..0000000000
--- a/sources/meta/scalac/ast/MetaDefaultTreeFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-public class MetaDefaultTreeFactory extends AbstractTreeMethodExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethod(TreeNode node, boolean withSymbol) {
- node.printMethod(writer, "int pos", withSymbol).lbrace();
- node.printNew(writer.print(node + " t = "), withSymbol).println(";");
- writer.println("t.pos = pos;");
- writer.println("return t;");
- writer.rbrace();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaLazyTreeCopier.java b/sources/meta/scalac/ast/MetaLazyTreeCopier.java
deleted file mode 100644
index c389ab9404..0000000000
--- a/sources/meta/scalac/ast/MetaLazyTreeCopier.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-public class MetaLazyTreeCopier extends AbstractTreeMethodExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethod(TreeNode node, boolean withSymbol) {
- TreeField symbol = node.getSymbol();
- node.printMethod(writer, tree.getFormal("tree"), withSymbol).lbrace();
- if (!withSymbol && node.hasLinkedFields())
- writer.println("assert tree.symbol() == null : "+
- "\"tree's symbol is not null\";");
- writer.print(node.getType(0)).print(" t = (").
- print(node.getType(0)).println(")tree;");
- TreeField[] fields = node.getFields(withSymbol);
- // !!! why do we copy if there is no symbol and no field
- if (withSymbol || node.fields.length > 0) {
- writer.print("if (").indent();
- if (withSymbol) writer.print("t.symbol() == " + symbol);
- for (int i = 0; i < fields.length; i++) {
- if (i > 0 ? true : withSymbol) writer.println(" &&");
- writer.print("t." + fields[i] + " == " + fields[i]);
- }
- writer.println(")");
- writer.println("return t;").undent();
- }
- writer.print("return copier.");
- node.printCall(writer, "tree", withSymbol).println(";");
- writer.rbrace();
-
- if (withSymbol && node.hasLinkedFields()) {
- node.printMethod(writer, tree.getFormal("tree"), false, true);
- writer.lbrace();
- symbol.print(writer, true).println(" = tree.symbol();");
- node.printCall(writer.print("return "), "tree", true).println(";");
- writer.rbrace();
- return;
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaStrictTreeCopier.java b/sources/meta/scalac/ast/MetaStrictTreeCopier.java
deleted file mode 100644
index 62823377dd..0000000000
--- a/sources/meta/scalac/ast/MetaStrictTreeCopier.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-public class MetaStrictTreeCopier extends AbstractTreeMethodExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethod(TreeNode node, boolean withSymbol) {
- TreeField symbol = node.getSymbol();
- node.printMethod(writer, tree.getFormal("tree"), withSymbol).lbrace();
- if (!withSymbol && node.hasLinkedFields())
- writer.println("assert tree.symbol() == null : "+
- "\"tree's symbol is not null\";");
- writer.print(node.getType(0)).print(" t = make.");
- node.printCall(writer, "tree.pos", withSymbol).println(";");
- writer.println("t.type = tree.type;");
- if (!withSymbol && node.hasSymbol() && !node.hasLinkedFields()) {
- symbol.print(writer, true).println(" = tree.symbol();");
- writer.println("if ("+symbol+" != null) t.setSymbol("+symbol+");");
- }
- writer.println("return t;");
- writer.rbrace();
-
- if (withSymbol && node.hasLinkedFields()) {
- node.printMethod(writer, tree.getFormal("tree"), false, true);
- writer.lbrace();
- symbol.print(writer, true).println(" = tree.symbol();");
- node.printCall(writer.print("return "), "tree", true).println(";");
- writer.rbrace();
- }
- }
-
- //########################################################################
-}
-
-
diff --git a/sources/meta/scalac/ast/MetaTransformer.java b/sources/meta/scalac/ast/MetaTransformer.java
deleted file mode 100644
index 79ebebaf2f..0000000000
--- a/sources/meta/scalac/ast/MetaTransformer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-
-public class MetaTransformer extends AbstractTreeCaseExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeCaseBody(TreeNode node) {
- if (node.fields == null) {
- writer.println("return tree;");
- } else {
- if (node.hasSymbol()) {
- writer.print("if (tree.symbol() != null)").lbrace();
- printTransformNode(node, true);
- writer.undent().print("} else").lbrace();
- }
- printTransformNode(node, false);
- if (node.hasSymbol()) writer.rbrace();
- }
- }
-
- public void printTransformNode(TreeNode node, boolean withSymbol) {
- TreeField[] fields = node.getFields(withSymbol);
- writer.print("return copy." + node + "(tree");
- if (withSymbol) writer.print(", tree.symbol()");
- for (int i = 0; i < fields.length; i++) {
- writer.print(", ");
- if (Tree.isTree(fields[i].type))
- writer.print("transform(" + fields[i].name + ")");
- else
- writer.print(fields[i].name);
- }
- writer.println(");");
- }
-
- public void printTransformArrays() {
- for (int j = 1; j <= tree.arrays; j++)
- printTransformArray(tree.getType(j), false);
- for (int i = 0; i < tree.nodes.length; i++)
- for (int j = 1; j <= tree.nodes[i].arrays; j++)
- printTransformArray(tree.nodes[i].getType(j), j == 1);
- }
-
- public void printTransformArray(Type type, boolean needCast) {
- Type item = type.getItemType();
- Type erased = needCast ? tree.getType(0) : item;
- String cast = needCast ? "(" + item + ")" : "";
- writer.print("public ").print(type).print(" transform").
- print("(").print(type).print(" ts)").lbrace();
- writer.print("for (int i = 0; i < ts.length; i++)").lbrace();
- writer.println(erased + " t = transform(ts[i]);");
- writer.print("if (t != ts[i])").lbrace();
- writer.println(type+" res = new "+item.newArray("[ts.length]")+";");
- writer.println("System.arraycopy(ts, 0, res, 0, i);");
- writer.println("res[i++] = "+cast+"t;");
- writer.print("for (; i < ts.length; i++)").
- println("res[i] = "+cast+"transform(ts[i]);");
- writer.println("return res;");
- writer.rbrace();
- writer.rbrace();
- writer.println("return ts;");
- writer.rbrace();
- writer.line();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaTraverser.java b/sources/meta/scalac/ast/MetaTraverser.java
deleted file mode 100644
index 0f166510db..0000000000
--- a/sources/meta/scalac/ast/MetaTraverser.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-
-public class MetaTraverser extends AbstractTreeCaseExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeCaseBody(TreeNode node) {
- if (node.fields != null)
- for (int i = 0; i < node.fields.length; i++)
- if (Tree.isTree(node.fields[i].type))
- writer.println("traverse(" + node.fields[i] + ");");
- writer.println("return;");
- }
-
- public void printTraverseArrays() {
- int max = tree.arrays;
- for (int i = 0; i < tree.nodes.length; i++)
- max = Math.max(max, tree.nodes[i].arrays);
- for (int i = 1; i <= max; i++)
- printTraverseArray(tree.getType(i));
- }
-
- public void printTraverseArray(Type type) {
- writer.print("public void traverse").
- print("(").print(type).print(" trees)").lbrace();
- writer.print("for (int i = 0; i < trees.length; i++) ").
- println("traverse(trees[i]);");
- writer.rbrace();
- writer.line();
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaTree.java b/sources/meta/scalac/ast/MetaTree.java
deleted file mode 100644
index 31b98d1d4b..0000000000
--- a/sources/meta/scalac/ast/MetaTree.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-
-public class MetaTree extends AbstractTreeExpander {
-
- //########################################################################
- // Public Methods
-
- public void printEmptyArrays() {
- printEmptyArrays(tree.getType(0), "EMPTY", tree.arrays);
- for (int i = 0; i < tree.nodes.length; i++) {
- TreeNode node = tree.nodes[i];
- printEmptyArrays(node.getType(0), node + "_EMPTY", node.arrays);
- }
- }
-
- public void printEmptyArrays(Type base, String prefix, int maxRank) {
- Type type = base;
- for (int rank = 1; rank <= maxRank; rank++) {
- type = Type.Array(type);
- writer.print("public static final ").print(type).print(" "+prefix);
- for (int i = 0; i < rank; i++) writer.print("_ARRAY");
- writer.print(" = new ").print(base).print("[0]");
- for (int i = 1; i < rank; i++) writer.print("[]");
- writer.println(";");
- }
- }
-
- public void printTreeCases() {
- for (int i = 0; i < tree.nodes.length; i++)
- printTreeCase(tree.nodes[i]);
- }
-
- private void printTreeCase(TreeNode node) {
- writer.printDescription(new String[] {
- node.description,
- "- kind : " + description(node.kind),
- "- symbol : " + description(node.symbol),
- "- introduced by: " + node.start.name,
- "- eliminated by: " + node.stop.name,
- });
- node.printDecl(writer.print("public case "), null, false);
- if (node.fields != null) {
- writer.lbrace();
- writer.println("assert CheckTreeNodes.instance.checkNode(this);");
- writer.rbrace();
- } else {
- writer.println(";");
- }
- if (node == tree.n_Empty)
- writer.print("static { " + node + ".type = Type.NoType; }");
- writer.println();
- }
-
- private String description(TreeKind kind) {
- switch (kind) {
- case Any : return "this tree is of any kind";
- case Type: return "this tree is a type";
- case Term: return "this tree is a term";
- case Dual: return "this tree is a type or a term";
- case Test: return "this tree is a type or a term " +
- "(determined by the kind of the name field)";
- case None: return "this tree is neither a type nor a term";
- default : throw new Error(kind.getClass().getName());
- }
- }
-
- private String description(TreeSymbol symbol) {
- switch (symbol) {
- case NoSym : return "this tree has no symbol";
- case HasSym(_, false): return "this tree references a symbol";
- case HasSym(_, true ): return "this tree defines a symbol";
- default : throw new Error(symbol.getClass().getName());
- }
- }
-
- public void printIsKind() {
- printIsKind(tree.nodes, TreeKind.Type);
- printIsKind(tree.nodes, TreeKind.Term);
- }
-
- private void printIsKind(TreeNode[] nodes, TreeKind kind) {
- writer.println("/** Returns true if this tree is a " +
- kind.toString().toLowerCase() + ". */");
- writer.print("public boolean is" + kind + "()").lbrace();
- writer.println("switch (this) {");
-
- for (int i = 0; i < nodes.length; i++)
- if (nodes[i].kind != TreeKind.Test && nodes[i].kind.isA(kind))
- nodes[i].printCase(writer, true).println();
- writer.indent().println("return true;").undent();
-
- for (int i = 0; i < nodes.length; i++) {
- if (nodes[i].kind != TreeKind.Test) continue;
- writer.print("case " + nodes[i].name + "(");
- for (int j = 0; j < nodes[i].fields.length; j++) {
- if (j > 0) writer.print(", ");
- switch (nodes[i].fields[j].type) {
- case TreeType.Name(Test):
- writer.print(nodes[i].fields[j].type + " name");
- break;
- default:
- writer.print("_");
- break;
- }
- }
- writer.println("):");
- writer.indent().print("return ");
- switch (kind) {
- case TreeKind.Type:
- writer.print("name.isTypeName() && (symbol() == null || !symbol().isConstructor()) || name == Names.ERROR");
- break;
- case TreeKind.Term:
- writer.print("name.isTermName() || (symbol() != null && symbol().isConstructor())");
- break;
- default:
- throw new Error("unexpected kind " + kind);
- }
- writer.println(";").undent();
- }
-
- writer.println("default:");
- writer.indent().println("return false;").undent();
-
- writer.println("}");
- writer.rbrace();
- writer.println();
- }
-
- public void printExtClasses() {
- for (int i = 0;i < tree.nodes.length;i++) printExtClass(tree.nodes[i]);
- }
-
- private void printExtClass(TreeNode node) {
- TreeField symbol = node.getSymbol();
- if (symbol == null) return;
- writer.print("public static class Ext"+node+" extends "+node).lbrace();
- symbol.print(writer.print("private "), true).println(";");
- writer.println();
-
- printExtConstructor(node, false);
- printExtConstructor(node, true);
- writer.println();
-
- writer.print("public boolean hasSymbol()").lbrace();
- writer.println("return true;");
- writer.rbrace();
- writer.println();
-
- if (node.definesSymbol()) {
- writer.print("public boolean definesSymbol()").lbrace();
- writer.println("return true;");
- writer.rbrace();
- writer.println();
- }
-
- writer.print("public ").print(symbol.type).print(" symbol()");
- writer.lbrace();
- writer.println("return " + symbol + ";");
- writer.rbrace();
- writer.println();
-
- writer.print("public ").print(tree.getType(0)).print(" setSymbol");
- symbol.print(writer.print("("), true).print(")").lbrace();
- printSetSymbol(symbol);
- for (int i = 0; i < node.fields.length; i++) {
- TreeField field = node.fields[i];
- TreeFieldLink link = field.link;
- if (link == null) continue;
- link.print(writer.print("this."+field+" = "),symbol).println(";");
- }
- writer.println("return this;");
- writer.rbrace();
-
- writer.rbrace();
- writer.println();
- }
-
- private void printExtConstructor(TreeNode node, boolean withSymbol) {
- node.printDecl(writer.print("public Ext"), null, withSymbol).lbrace();
- TreeField symbol = node.getSymbol();
- writer.print("super(");
- for (int i = 0; i < node.fields.length; i++) {
- if (i > 0) writer.print(", ");
- if (withSymbol && node.fields[i].link != null) {
- node.fields[i].link.print(writer, symbol);
- } else {
- writer.print(node.fields[i].name);
- }
- }
- writer.println(");");
- if (withSymbol) printSetSymbol(symbol);
- writer.rbrace();
- }
-
- private void printSetSymbol(TreeField symbol) {
- writer.println("assert " + symbol + " != null : \"null symbol\";");
- writer.println("this." + symbol + " = " + symbol + ";");
- }
-
- public void printEmptyCases() {
- for (int i = 0;i < tree.nodes.length;i++) {
- tree.nodes[i].printCase(writer, false).println();
- writer.println();
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaTreeCopier.java b/sources/meta/scalac/ast/MetaTreeCopier.java
deleted file mode 100644
index 785c3a99da..0000000000
--- a/sources/meta/scalac/ast/MetaTreeCopier.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-public class MetaTreeCopier extends AbstractTreeMethodExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethod(TreeNode node, boolean withSymbol) {
- node.printMethod(writer,tree.getFormal("tree"),withSymbol);
- writer.println(";");
- if (withSymbol && node.hasLinkedFields()) {
- node.printMethod(writer, tree.getFormal("tree"), false, true);
- writer.println(";");
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/MetaTreeFactory.java b/sources/meta/scalac/ast/MetaTreeFactory.java
deleted file mode 100644
index 28b1f381c9..0000000000
--- a/sources/meta/scalac/ast/MetaTreeFactory.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-public class MetaTreeFactory extends AbstractTreeMethodExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeMethod(TreeNode node, boolean withSymbol) {
- node.printMethod(writer, "int pos", withSymbol).println(";");
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/Tree.java b/sources/meta/scalac/ast/Tree.java
deleted file mode 100644
index 492461bc59..0000000000
--- a/sources/meta/scalac/ast/Tree.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import meta.java.Type;
-import meta.scalac.Phase;
-
-/** This class describes all tree nodes. */
-public class Tree {
-
- //########################################################################
- // Private Fields
-
- private final TreeKind
- Any = TreeKind.Any,
- Type = TreeKind.Type,
- Term = TreeKind.Term,
- Dual = TreeKind.Dual,
- Test = TreeKind.Test,
- None = TreeKind.None;
-
- private final Type
- t_int = TreeType.INT,
- t_ints = TreeType.Array(t_int),
- t_Object = TreeType.Reference(null, "Object"),
- t_String = TreeType.Reference(null, "String"),
- t_Global = TreeType.Reference("scalac", "Global"),
- t_Unit = TreeType.Reference("scalac", "Unit"),
- t_TreeGen = TreeType.Reference("scalac.ast", "TreeGen"),
- t_AConstant = TreeType.Reference("scalac.atree", "AConstant"),
- t_Symbol = TreeType.Reference("scalac.symtab", "Symbol"),
- t_Type = TreeType.Reference("scalac.symtab", "Type"),
- t_Name = TreeType.Name(Any),
- t_TypeName = TreeType.Name(Type),
- t_TermName = TreeType.Name(Term),
- t_TestName = TreeType.Name(Test),
- t_Names = TreeType.Array(t_Name),
- t_Tree = getType(0),
- t_TypeTree = getType(0, Type),
- t_TermTree = getType(0, Term),
- t_Trees = getType(1),
- t_TypeTrees = getType(1, Type),
- t_TermTrees = getType(1, Term);
-
- private final TreeFieldLink
- SymFlags = TreeFieldLink.SymFlags,
- SymName = TreeFieldLink.SymName;
-
- private final TreeField
- tree_symbol = new TreeField(t_Symbol, "symbol");
-
- private final TreeSymbol
- NoSym = TreeSymbol.NoSym,
- HasSym = TreeSymbol.HasSym(tree_symbol, false),
- DefSym = TreeSymbol.HasSym(tree_symbol, true);
-
- private final List list
- = new ArrayList();
-
- //########################################################################
- // Public Fields
-
- public final TreeNode
- n_Empty = node("Empty" , Any , NoSym),
- n_Attributed = node("Attributed" , None, NoSym),
- n_DocDef = node("DocDef" , None, NoSym),
- n_ClassDef = node("ClassDef" , None, DefSym),
- n_PackageDef = node("PackageDef" , None, NoSym),
- n_ModuleDef = node("ModuleDef" , None, DefSym),
- n_ValDef = node("ValDef" , None, DefSym),
- n_PatDef = node("PatDef" , None, NoSym),
- n_DefDef = node("DefDef" , None, DefSym),
- n_AbsTypeDef = node("AbsTypeDef" , None, DefSym),
- n_AliasTypeDef = node("AliasTypeDef" , None, DefSym),
- n_Import = node("Import" , None, HasSym),
- n_CaseDef = node("CaseDef" , None, NoSym),
- n_Template = node("Template" , None, HasSym),
- n_LabelDef = node("LabelDef" , Term, DefSym),
- n_Block = node("Block" , Term, NoSym),
- n_Sequence = node("Sequence" , Term, NoSym),
- n_Alternative = node("Alternative" , Term, NoSym),
- n_Bind = node("Bind" , Term, DefSym),
- n_Visitor = node("Visitor" , Term, NoSym),
- n_Function = node("Function" , Term, NoSym),
- n_Assign = node("Assign" , Term, NoSym),
- n_If = node("If" , Term, NoSym),
- n_Switch = node("Switch" , Term, NoSym),
- n_Return = node("Return" , Term, HasSym),
- n_Throw = node("Throw" , Term, NoSym),
- n_New = node("New" , Term, NoSym),
- n_Create = node("Create" , Term, HasSym),
- n_Typed = node("Typed" , Term, NoSym),
- n_TypeApply = node("TypeApply" , Term, NoSym),
- n_Apply = node("Apply" , Term, NoSym),
- n_Super = node("Super" , Term, HasSym),
- n_This = node("This" , Term, HasSym),
- n_Select = node("Select" , Test, HasSym),
- n_Ident = node("Ident" , Test, HasSym),
- n_Literal = node("Literal" , Term, NoSym),
- n_TypeTerm = node("TypeTerm" , Type, NoSym),
- n_SingletonType = node("SingletonType" , Type, NoSym),
- n_SelectFromType = node("SelectFromType", Type, HasSym),
- n_FunType = node("FunType" , Type, NoSym),
- n_CompoundType = node("CompoundType" , Type, NoSym),
- n_AppliedType = node("AppliedType" , Type, NoSym),
- n_Try = node("Try" , Term, NoSym);
-
- public final TreeNode[] nodes;
- public int arrays;
-
- //########################################################################
- // Public Constructors
-
- public Tree() {
- nodes = (TreeNode[])list.toArray(new TreeNode[list.size()]);
-
- n_Empty.
- setDescription("A tree node for the absence of a tree").
- setRange(Phase.PARSER, Phase.UNKNOWN).
- noFields();
-
- n_Attributed.
- setDescription("Attributed definition").
- setRange(Phase.PARSER, Phase.ANALYZER).
- addField(t_Tree, "attribute").
- addField(t_Tree, "definition");
-
- n_DocDef.
- setDescription("Documented definition").
- setRange(Phase.PARSER, Phase.ANALYZER).
- addField(t_String, "comment").
- addField(t_Tree, "definition");
-
- n_ClassDef.
- setDescription("Class and data declaration").
- setRange(Phase.PARSER, Phase.END).
- addField(t_int, "mods", SymFlags).
- addField(t_TypeName, "name", SymName).
- addField(n_AbsTypeDef.getType(1), "tparams").
- addField(n_ValDef.getType(2), "vparams").
- addField(t_TypeTree, "tpe").
- addField(n_Template.getType(0), "impl");
-
- n_PackageDef.
- setDescription("Package declaration").
- setRange(Phase.PARSER, Phase.UNKNOWN).
- addField(t_TermTree, "packaged").
- addField(n_Template.getType(0), "impl");
-
- n_ModuleDef.
- setDescription("Module declaration").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_int, "mods", SymFlags).
- addField(t_TermName, "name", SymName).
- addField(t_TypeTree, "tpe").
- addField(n_Template.getType(0), "impl");
-
- n_ValDef.
- setDescription("Value declaration (var or let)").
- setRange(Phase.PARSER, Phase.END).
- addField(t_int, "mods", SymFlags).
- addField(t_TermName, "name", SymName).
- addField(t_TypeTree, "tpe").
- addField(t_TermTree, "rhs");
-
-
- n_PatDef.
- setDescription("Value declaration with patterns (val)").
- setRange(Phase.PARSER, Phase.DESUGARIZER).
- addField(t_int, "mods").
- addField(t_TermTree, "pat").
- addField(t_TermTree, "rhs");
-
- n_DefDef.
- setDescription("Function declaration (def)").
- setRange(Phase.PARSER, Phase.END).
- addField(t_int, "mods", SymFlags).
- addField(t_TermName, "name", SymName).
- addField(n_AbsTypeDef.getType(1), "tparams").
- addField(n_ValDef.getType(2), "vparams").
- addField(t_TypeTree, "tpe").
- addField(t_TermTree, "rhs");
-
- n_AbsTypeDef.
- setDescription("Type declaration").
- setRange(Phase.PARSER, Phase.END). // !!! needed for type params
- addField(t_int, "mods", SymFlags).
- addField(t_TypeName, "name", SymName).
- addField(t_TypeTree, "rhs").
- addField(t_TypeTree, "lobound");
-
- n_AliasTypeDef.
- setDescription("Type alias").
- setRange(Phase.PARSER, Phase.EXPLICITOUTER).
- addField(t_int, "mods", SymFlags).
- addField(t_TypeName, "name", SymName).
- addField(n_AbsTypeDef.getType(1), "tparams").
- addField(t_TypeTree, "rhs");
-
- n_Import.
- setDescription("Import declaration").
- setRange(Phase.PARSER, Phase.ANALYZER).
- addField(t_TermTree, "expr").
- addField(t_Names, "selectors");
-
- n_CaseDef.
- setDescription("Case declaration").
- setRange(Phase.PARSER, Phase.TRANSMATCH).
- addField(t_TermTree, "pat").
- addField(t_TermTree, "guard").
- addField(t_TermTree, "body");
-
- n_Template.
- setDescription("Instantiation templates").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTrees, "parents").
- addField(t_Trees, "body");
-
- n_LabelDef.
- setDescription("Labelled expression - the symbols in the array (must be Idents!) are those the label takes as argument").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermName, "name", SymName).
- addField(n_Ident.getType(1), "params").
- addField(t_TermTree, "rhs");
-
- n_Block.
- setDescription("Block of expressions " +
- "(semicolon separated expressions)").
- setRange(Phase.PARSER, Phase.END).
- addField(t_Trees, "stats").
- addField(t_TermTree, "expr");
-
- n_Sequence.
- setDescription("Sequence of expressions (comma separated expressions)").
- setRange(Phase.PARSER, Phase.TRANSMATCH).
- addField(t_TermTrees, "trees");
-
- n_Alternative.
- setDescription("Alternatives of expressions/patterns").
- setRange(Phase.PARSER, Phase.TRANSMATCH).
- addField(t_TermTrees, "trees");
-
- n_Bind.
- setDescription("Bind of a variable to a rhs pattern, possibly recursive").
- setRange(Phase.PARSER, Phase.TRANSMATCH).
- addField(t_TermName, "name", SymName).
- addField(t_TermTree, "rhs");
-
-
- n_Visitor.
- setDescription("Visitor (a sequence of cases)").
- setRange(Phase.PARSER, Phase.TRANSMATCH).
- addField(n_CaseDef.getType(1), "cases");
-
-
- n_Function.
- setDescription("Anonymous function").
- setRange(Phase.PARSER, Phase.ANALYZER).
- addField(n_ValDef.getType(1), "vparams").
- addField(t_TermTree, "body");
-
- n_Assign.
- setDescription("Assignment").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "lhs").
- addField(t_TermTree, "rhs");
-
- n_If.
- setDescription("Conditional expression").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "cond").
- addField(t_TermTree, "thenp").
- addField(t_TermTree, "elsep");
-
- n_Switch.
- setDescription("Switch").
- setRange(Phase.REFCHECK, Phase.END).
- addField(t_TermTree, "test").
- addField(t_ints, "tags").
- addField(t_TermTrees, "bodies").
- addField(t_TermTree, "otherwise");
-
- n_Return.
- setDescription("Return").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "expr");
-
- n_Throw.
- setDescription("Throw").
- setRange(Phase.PARSER, Phase.ANALYZER).
- addField(t_TermTree, "expr");
-
- n_New.
- setDescription("Instantiation").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "init");
-
- n_Create.
- setDescription("Instance creation").
- setRange(Phase.ANALYZER, Phase.END).
- addField(t_TermTree, "qualifier").
- addField(t_TypeTrees, "targs");
-
- n_Typed.
- setDescription("Type annotation").
- setRange(Phase.PARSER, Phase.EXPLICITOUTER).
- addField(t_TermTree, "expr").
- addField(t_TypeTree, "tpe");
-
-
- n_TypeApply.
- setDescription("Type application").
- setRange(Phase.PARSER, Phase.END).
- addField(t_Tree, "fun").
- addField(t_TypeTrees, "args");
-
- n_Apply.
- setDescription("Value application").
- setRange(Phase.PARSER, Phase.END).
- addField(t_Tree, "fun"). // !!! should be t_TermTree
- addField(t_TermTrees, "args");
-
- n_Super.
- setDescription("Super reference").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TypeName, "qualifier", SymName).
- addField(t_TypeName, "mixin");
-
- n_This.
- setDescription("Self reference").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TypeName, "qualifier", SymName);
-
- n_Select.
- setDescription("Designator").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "qualifier").
- addField(t_TestName, "selector", SymName);
-
- n_Ident.
- setDescription("Identifier").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TestName, "name", SymName);
-
- n_Literal.
- setDescription("Literal").
- setRange(Phase.PARSER, Phase.END).
- addField(t_AConstant, "value");
-
- n_TypeTerm.
- setDescription("TypeTerm").
- setRange(Phase.PARSER, Phase.END);
-
- n_SingletonType.
- setDescription("Singleton type").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_TermTree, "ref");
-
- n_SelectFromType.
- setDescription("Type selection").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_TypeTree, "qualifier").
- addField(t_TypeName, "selector", SymName);
-
- n_FunType.
- setDescription("Function type").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_TypeTrees, "argtpes").
- addField(t_TypeTree, "restpe");
-
- n_CompoundType.
- setDescription("Object type (~ Template)").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_TypeTrees, "parents").
- addField(t_Trees, "refinements");
-
- n_AppliedType.
- setDescription("Applied type").
- setRange(Phase.PARSER, Phase.REFCHECK).
- addField(t_TypeTree, "tpe").
- addField(t_TypeTrees, "args");
-
- n_Try.
- setDescription("Try Expression").
- setRange(Phase.PARSER, Phase.END).
- addField(t_TermTree, "block").
- addField(t_TermTree, "catcher").
- addField(t_TermTree, "finalizer");
- }
-
- //########################################################################
- // Public Functions
-
- public static boolean isTree(Type type) {
- switch (type) {
- case Array(Type item):
- return isTree(item);
- case TreeType.Tree(_):
- case TreeType.Node(_):
- return true;
- default:
- return false;
- }
- }
-
- //########################################################################
- // Public Methods
-
- public Type getType(int rank) {
- return getType(rank, Any);
- }
-
- public Type getType(int rank, TreeKind kind) {
- arrays = Math.max(arrays , rank);
- return rank==0 ? TreeType.Tree(kind) : TreeType.Array(getType(rank-1));
- }
-
- public String getFormal(String name) {
- return getType(0) + " " + name;
- }
-
- //########################################################################
- // Private Methods
-
- private TreeNode node(String name, TreeKind kind, TreeSymbol symbol) {
- TreeNode node = new TreeNode(name, kind, symbol);
- list.add(node);
- return node;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeField.java b/sources/meta/scalac/ast/TreeField.java
deleted file mode 100644
index 19df9cb42e..0000000000
--- a/sources/meta/scalac/ast/TreeField.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-import meta.java.JavaWriter;
-
-/** This class describes a tree node field. */
-public class TreeField {
-
- //########################################################################
- // Public Fields
-
- public final Type type;
- public final String name;
- public final TreeFieldLink link;
-
- //########################################################################
- // Public Constructors
-
- public TreeField(Type type, String name) {
- this(type, name, null);
- }
-
- public TreeField(Type type, String name, TreeFieldLink link) {
- this.type = type;
- this.name = name;
- this.link = link;
- }
-
- //########################################################################
- // Public Function
-
- public static JavaWriter print(JavaWriter writer, TreeField[] fields,
- boolean withType)
- {
- for (int i = 0; i < fields.length; i++) {
- if (i > 0) writer.print(", ");
- fields[i].print(writer, withType);
- }
- return writer;
- }
-
- //########################################################################
- // Public Methods
-
- public JavaWriter print(JavaWriter writer, boolean withType) {
- if (withType) writer.print(type).space();
- return writer.print(name);
- }
-
- public String toString() {
- return name;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeFieldLink.java b/sources/meta/scalac/ast/TreeFieldLink.java
deleted file mode 100644
index 62e8dcfb10..0000000000
--- a/sources/meta/scalac/ast/TreeFieldLink.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.JavaWriter;
-
-/**
- * This class describes the possible links between a given field of a
- * tree and the symbol of that tree.
- */
-public class TreeFieldLink {
-
- //########################################################################
- // Public Cases
-
- /** Field is linked to the symbol's flags */
- public case SymFlags;
-
- /** Field is linked to the symbol's name */
- public case SymName;
-
- //########################################################################
- // Public Methods
-
- /** Returns the field or method to invoke to get the linked value. */
- public String getLink() {
- switch (this) {
- case SymFlags:
- return "flags";
- case SymName:
- return "name";
- default:
- throw new Error("unknown case: " + this);
- }
- }
-
- /** Returns the name of this link. */
- public String toString() {
- switch (this) {
- case SymFlags:
- return "flags";
- case SymName:
- return "name";
- default:
- throw new Error("unknown case: " + this);
- }
- }
-
- public JavaWriter print(JavaWriter writer, TreeField symbol) {
- return writer.print(symbol.name).print('.').print(getLink());
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeKind.java b/sources/meta/scalac/ast/TreeKind.java
deleted file mode 100644
index 35dcd0dd55..0000000000
--- a/sources/meta/scalac/ast/TreeKind.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-/** This class enumerates the different kinds of tree nodes. */
-public class TreeKind {
-
- //########################################################################
- // Public Cases
-
- /** Designates a type, a term or anything else. */
- public case Any;
-
- /** Designates a type. */
- public case Type;
-
- /** Designates a term. */
- public case Term;
-
- /** Designates either a type or a term. */
- public case Dual;
-
- /** Designates either a type or a term (a test may indicate which one). */
- public case Test;
-
- /** Designates neither a type nor a term. */
- public case None;
-
- //########################################################################
- // Public Method
-
- public boolean isA(TreeKind that) {
- switch (this) {
- case Any : return true;
- case Type: return that == Type;
- case Term: return that == Term;
- case Dual: return that == Type || that == Term || that == Dual;
- case Test: return that == Type || that == Term || that == Dual;
- case None: return that == None;
- default : throw new Error();
- }
- }
-
- public String toString() {
- switch(this) {
- case Any : return "Any";
- case Type: return "Type";
- case Term: return "Term";
- case Dual: return "Dual";
- case Test: return "Test";
- case None: return "None";
- default : throw new Error();
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeNode.java b/sources/meta/scalac/ast/TreeNode.java
deleted file mode 100644
index 340eaa8109..0000000000
--- a/sources/meta/scalac/ast/TreeNode.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-import meta.java.JavaWriter;
-import meta.scalac.Phase;
-
-/** This class describes a tree node. */
-public class TreeNode {
-
- //########################################################################
- // Public Fields
-
- public final String name;
- public final TreeKind kind;
- public final TreeSymbol symbol;
- public String description;
- public Phase start;
- public Phase stop;
- public TreeField[] fields;
- public int arrays;
-
- //########################################################################
- // Public Constructors
-
- public TreeNode(String name, TreeKind kind, TreeSymbol symbol) {
- this(name, kind, symbol, new TreeField[0]);
- }
-
- public TreeNode(String name, TreeKind kind, TreeSymbol symbol,
- TreeField[] fields)
- {
- this.name = name;
- this.kind = kind;
- this.symbol = symbol;
- this.fields = fields;
- }
-
- //########################################################################
- // Public Methods - Initializing
-
- public TreeNode setDescription(String description) {
- this.description = description;
- return this;
- }
-
- public TreeNode setRange(Phase start, Phase stop) {
- this.start = start;
- this.stop = stop;
- return this;
- }
-
- public TreeNode noFields() {
- fields = null;
- return this;
- }
-
- public TreeNode addField(Type type, String name) {
- return addField(type, name, null);
- }
-
- public TreeNode addField(Type type, String name, TreeFieldLink link) {
- if (link != null && !hasSymbol())
- throw new Error("node "+this+" may not have linked fields");
- TreeField[] array = new TreeField[fields.length + 1];
- for (int i = 0; i < fields.length; i++) array[i] = fields[i];
- array[fields.length] = new TreeField(type, name, link);
- fields = array;
- return this;
- }
-
- //########################################################################
- // Public Methods - Querying
-
- public Type getType(int rank) {
- arrays = Math.max(arrays , rank);
- return rank == 0 ? TreeType.Node(this) : Type.Array(getType(rank - 1));
- }
-
- public boolean hasExtClass() {
- return hasSymbol();
- }
-
- public boolean hasSymbol() {
- switch (symbol) {
- case TreeSymbol.HasSym(_, _):
- return true;
- default:
- return false;
- }
- }
-
- public boolean definesSymbol() {
- switch (symbol) {
- case TreeSymbol.HasSym(_, true):
- return true;
- default:
- return false;
- }
- }
-
- public TreeField getSymbol() {
- switch (symbol) {
- case TreeSymbol.HasSym(TreeField field, _):
- return field;
- default:
- return null;
- }
- }
-
- public boolean hasLinkedFields() {
- for (int i = 0; i < fields.length; i++)
- if (fields[i].link != null) return true;
- return false;
- }
-
- public TreeField[] getFields(boolean withoutLinkedFields) {
- if (fields == null || !withoutLinkedFields) return fields;
- int count = 0;;
- for (int i = 0; i < fields.length; i++)
- if (fields[i].link == null) count++;
- TreeField[] array = new TreeField[count];
- for (int i = 0, j = 0; i < fields.length; i++)
- if (fields[i].link == null) array[j++] = fields[i];
- return array;
- }
-
- public String toString() {
- return name;
- }
-
- //########################################################################
- // Public Methods - Printing
-
- public JavaWriter printCase(JavaWriter writer, boolean withWildcards) {
- writer.print("case ");
- if (fields != null && withWildcards) {
- writer.print(name).print('(');
- for (int i = 0; i < fields.length; i++) {
- if (i > 0) writer.print(", ");
- writer.print("_");
- }
- writer.print(')');
- } else {
- printDecl(writer, null, false);
- }
- return writer.print(":").space();
- }
-
- public JavaWriter printNew(JavaWriter writer, boolean withSymbol) {
- writer.print("new ");
- if (hasExtClass()) writer.print("Ext");
- return printCall(writer, null, withSymbol);
- }
-
- public JavaWriter printMethod(JavaWriter writer, String prefix,
- boolean withSymbol)
- {
- return printMethod(writer, prefix, withSymbol, withSymbol);
- }
-
- public JavaWriter printMethod(JavaWriter writer, String prefix,
- boolean withSymbol, boolean withoutLinkedFields)
- {
- writer.print("public ").print(name).space();
- return printDecl(writer, prefix, withSymbol, withoutLinkedFields);
- }
-
- public JavaWriter printDecl(JavaWriter writer, String prefix,
- boolean withSymbol)
- {
- return printDecl(writer, prefix, withSymbol, withSymbol);
- }
-
- public JavaWriter printDecl(JavaWriter writer, String prefix,
- boolean withSymbol, boolean withoutLinkedFields)
- {
- return printPattern(writer,true,prefix,withSymbol,withoutLinkedFields);
- }
-
- public JavaWriter printCall(JavaWriter writer, String prefix,
- boolean withSymbol)
- {
- return printCall(writer, prefix, withSymbol, withSymbol);
- }
-
- public JavaWriter printCall(JavaWriter writer, String prefix,
- boolean withSymbol, boolean withoutLinkedFields)
- {
- return printPattern(
- writer, false, prefix, withSymbol, withoutLinkedFields);
- }
-
- public JavaWriter printPattern(JavaWriter writer, boolean withType,
- String prefix, boolean withSymbol, boolean withoutLinkedFields)
- {
- writer.print(name);
- if (fields != null || prefix != null || withSymbol) {
- writer.print('(');
- printFields(writer,withType,prefix,withSymbol,withoutLinkedFields);
- writer.print(')');
- }
- return writer;
- }
-
- public JavaWriter printFields(JavaWriter writer, boolean withType,
- String prefix, boolean withSymbol, boolean withoutLinkedFields)
- {
- TreeField[] fields = getFields(withoutLinkedFields);
- if (prefix != null) {
- writer.print(prefix);
- if (withSymbol || (fields != null && fields.length > 0))
- writer.print(", ");
- }
- if (withSymbol) {
- getSymbol().print(writer, withType);
- if (fields != null && fields.length > 0) writer.print(", ");
- }
- TreeField.print(writer, fields, withType);
- return writer;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeSymbol.java b/sources/meta/scalac/ast/TreeSymbol.java
deleted file mode 100644
index 1e53be4013..0000000000
--- a/sources/meta/scalac/ast/TreeSymbol.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-/** This class describes the symbol stored in some tree nodes. */
-public class TreeSymbol {
-
- //########################################################################
- // Public Cases
-
- /** Indicates the absence of symbol. */
- public case NoSym;
-
- /** Indicates the presence of a symbol. */
- public case HasSym(TreeField field, boolean isDef);
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/ast/TreeType.java b/sources/meta/scalac/ast/TreeType.java
deleted file mode 100644
index 52c2e6d9b3..0000000000
--- a/sources/meta/scalac/ast/TreeType.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.ast;
-
-import meta.java.Type;
-
-/** This class describes types used in tree nodes. */
-public class TreeType extends Type {
-
- //########################################################################
- // Private Constants
-
- private static final String NAME_PACKAGE = "scalac.util";
- private static final String NAME_NAME = "Name";
- private static final String NAME_FULLNAME = NAME_PACKAGE + "." + NAME_NAME;
- private static final String TREE_PACKAGE = "scalac.ast";
- private static final String TREE_NAME = "Tree";
- private static final String TREE_FULLNAME = TREE_PACKAGE + "." + TREE_NAME;
-
- //########################################################################
- // Public Cases
-
- public case Name(TreeKind kind);
- public case Tree(TreeKind kind);
- public case Node(TreeNode node);
-
- //########################################################################
- // Public Methods
-
- /** Returns the type's (possibly fully qualified) name. */
- public String getName(boolean qualified) {
- switch (this) {
- case Name(_):
- return qualified ? NAME_FULLNAME : NAME_NAME;
- case Tree(_):
- return qualified ? TREE_FULLNAME : TREE_NAME;
- case Node(TreeNode node):
- return qualified ? TREE_FULLNAME + "." + node.name : node.name;
- default:
- return super.getName(qualified);
- }
- }
-
- /** Returns the type's owner (its package or enclosing type). */
- public String getOwner() {
- switch (this) {
- case Name(_):
- return NAME_PACKAGE;
- case Tree(_):
- return TREE_PACKAGE;
- case Node(TreeNode node):
- return TREE_FULLNAME;
- default:
- return super.getOwner();
- }
- }
-
- //########################################################################
-}
diff --git a/sources/meta/scalac/checkers/MetaCheckTreeNodes.java b/sources/meta/scalac/checkers/MetaCheckTreeNodes.java
deleted file mode 100644
index 11ad75d77a..0000000000
--- a/sources/meta/scalac/checkers/MetaCheckTreeNodes.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.scalac.checkers;
-
-import meta.java.Type;
-import meta.scalac.ast.AbstractTreeCaseExpander;
-import meta.scalac.ast.TreeKind;
-import meta.scalac.ast.TreeType;
-import meta.scalac.ast.TreeNode;
-import meta.scalac.ast.TreeField;
-import meta.scalac.ast.TreeFieldLink;
-
-public class MetaCheckTreeNodes extends AbstractTreeCaseExpander {
-
- //########################################################################
- // Public Methods
-
- public void printTreeCaseBody(TreeNode node) {
- if (node.fields != null) {
- for (int i = 0; i < node.fields.length; i++) {
- TreeField field = node.fields[i];
- printCheckField(node, field.type, field.name, "i");
- }
- if (node.hasLinkedFields()) {
- writer.println("Symbol symbol = tree.symbol();");
- writer.print("if (symbol != null)").lbrace();
- for (int i = 0; i < node.fields.length; i++)
- if (node.fields[i].link != null)
- printCheckFieldLink(node.fields[i]);
- writer.rbrace();
- }
- }
- printCheckNode(node);
- writer.println("return;");
- }
-
- private void printCheckNode(TreeNode node) {
- if (node.start.constant != null) {
- writer.println("assert global.currentPhase.id >= " +
- "phases."+node.start.constant + ".id() :").indent();
- writer.println("\"cannot create instance of " + node.name +
- " before phase " + node.start.name + ", \" +");
- writer.println(
- "\"current phase is \" + " + "global.currentPhase;").undent();
- }
- if (node.stop.constant != null) {
- writer.println("assert global.currentPhase.id <= " +
- "phases."+node.stop.constant + ".id() :").indent();
- writer.println("\"cannot create instance of " + node.name +
- " after phase " + node.stop.name + ", \" +");
- writer.println(
- "\"current phase is \" + " + "global.currentPhase;").undent();
- }
- }
-
- private void printCheckField(TreeNode node,Type type,String name,String i){
- if (type.isPrimitive()) return;
- writer.println("assert " + name + " != null :").indent();
- printNullValue(node, name);
- writer.println(";").undent();
- switch (type) {
- case Reference(_, _):
- break;
-
- case Array(Type item):
- writer.print(
- "for (int "+i+" = 0; "+i+" < "+name+".length; "+i+"++)");
- writer.lbrace();
- printCheckField(node, item, name+"["+i+"]", i+"i");
- writer.rbrace();
- break;
-
- case TreeType.Name(TreeKind kind):
- if (kind != TreeKind.Any && kind != TreeKind.Test) {
- writer.println("assert " + name + ".is" + kind + "Name() :")
- .indent();
- printWrongKind(node, name, kind);
- writer.println(";").undent();
- }
- break;
-
- case TreeType.Tree(TreeKind kind):
- if (kind != TreeKind.Any) {
- writer.println("assert " +
- name + ".is" + kind + "() :").indent();
- printWrongKind(node, name, kind);
- writer.println(";").undent();
- }
- break;
-
- case TreeType.Node(_):
- break;
-
- default:
- throw new Error(type.getClass().getName());
- }
- }
-
- private void printCheckFieldLink(TreeField field) {
- String getter = field.link.getLink();
- writer.println("assert symbol." +getter+ " == " +field+ " :").indent();
- writer.println("\"symbol and tree " + field.link + " differ: \"+" +
- "symbol." + getter + "+\" != \"+" +field+ ";");
- writer.undent();
- }
-
- private void printNullValue(TreeNode node, String field) {
- String expanded = getExpandedField(field);
- writer.print("\"field " +expanded+ " of class " +node+ " is null\"");
- }
-
- private void printWrongKind(TreeNode node, String field, TreeKind kind) {
- String expanded = getExpandedField(field);
- writer.println("\"field " + expanded + " of class " + node +
- " is not of kind " + kind + ", \" +");
- writer.print("\"found: \" + Debug.show("+field+")");
- // !!! " + \" of kind \" + kind("+field+")";
- }
-
- private String getExpandedField(String field) {
- int begin = field.indexOf('[');
- if (begin < 0) return field;
- StringBuffer buffer = new StringBuffer(field.substring(0, begin));
- for (int end; (end = field.indexOf(']', begin)) >= 0; begin = end + 1){
- String index = field.substring(begin + 1, end);
- buffer.append("[\"+").append(index).append("+\"]");
- }
- return buffer.toString();
- }
-
- //########################################################################
-}
-
-
-/* !!!
-
- protected static String kind(Tree tree) {
- switch (tree) {
- case Select(_, Name name): return kind(name);
- case Ident(Name name): return kind(name);
- }
- return "unknown";
- }
-
- protected static String kind(Name name) {
- if (name.isTypeName()) return "Type";
- if (name.isTermName()) return "Term";
- if (name.isConstrName()) return "Constr";
- return "unknown";
- }
-
-*/
diff --git a/sources/meta/util/AbstractFileExpander.java b/sources/meta/util/AbstractFileExpander.java
deleted file mode 100644
index d77f6b81b3..0000000000
--- a/sources/meta/util/AbstractFileExpander.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.util;
-
-import java.io.File;
-
-/** A base class for file expanders. */
-public abstract class AbstractFileExpander {
-
- //########################################################################
- // Private Constants
-
- /** The meta package */
- private static final String meta = "meta";
-
- /** The meta name prefix */
- private static final String Meta = "Meta";
-
- //########################################################################
- // Public Methods
-
- /** Returns the TextWriter in which this expander writes. */
- public abstract TextWriter getTextWriter();
-
- /**
- * Returns the package associated with this expander or null if
- * there no such package. The default implementation returns the
- * package of this instance's class. If the outermost package is
- * named "meta", this package is omitted.
- */
- public String getPackage() {
- String fullname = getClass().getName();
- int end = fullname.lastIndexOf('.');
- if (end < 0) return null;
- int start = fullname.startsWith(meta + ".") ? meta.length() + 1 : 0;
- return fullname.substring(start, end);
- }
-
- /**
- * Returns the name associated with this expander. The default
- * implementation returns the name of this instance's class. If
- * that name starts with "Meta", this prefix is omitted.
- */
- public String getName() {
- String fullname = getClass().getName();
- int index = fullname.lastIndexOf('.');
- String name = index < 0 ? fullname : fullname.substring(index + 1);
- return name.startsWith(Meta) ? name.substring(Meta.length()) : name;
- }
-
- /**
- * Returns the directory of the target file. The default
- * implementation returns the directory corresponding to the
- * this instance's associated package.
- */
- public String getTargetDirectory() {
- String peckage = getPackage();
- return peckage == null ? "." : peckage.replace('.',File.separatorChar);
- }
-
- /**
- * Returns the base name of the target file. The default
- * implementation returns this instance's associated name.
- */
- public String getTargetBaseName() {
- return getName();
- }
-
- /**
- * Returns the suffix of the target file or null if it has no
- * suffix. The default implementation returns null.
- */
- public String getTargetSuffix() {
- return null;
- }
-
- /** Returns the target file. */
- public File getTargetFile(File root) {
- String suffix = getTargetSuffix();
- String name = getTargetBaseName();
- if (suffix != null) name = name + "." + suffix;
- return new File(new File(root, getTargetDirectory()), name);
- }
-
- /**
- * Returns the directory of the source file. The default
- * implementation returns the directory of the target file.
- */
- public String getSourceDirectory() {
- return getTargetDirectory();
- }
-
- /**
- * Returns the base name of the source file. The default
- * implementation returns this instance's associated name.
- */
- public String getSourceBaseName() {
- return getName();
- }
-
- /**
- * Returns the suffix of the source file or null if it has no
- * suffix. The default implementation returns the target suffix
- * suffixed with ".tmpl".
- */
- public String getSourceSuffix() {
- String suffix = getTargetSuffix();
- return (suffix == null ? "" : suffix + ".") + "tmpl";
- }
-
- /** Returns the source file. */
- public File getSourceFile(File root) {
- String suffix = getSourceSuffix();
- String name = getSourceBaseName();
- if (suffix != null) name = name + "." + suffix;
- return new File(new File(root, getSourceDirectory()), name);
- }
-
- //########################################################################
-}
diff --git a/sources/meta/util/AbstractMain.java b/sources/meta/util/AbstractMain.java
deleted file mode 100644
index b7a3e190ff..0000000000
--- a/sources/meta/util/AbstractMain.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.util;
-
-/** A base class for Java programs. */
-public abstract class AbstractMain {
-
- //########################################################################
- // Public Functions
-
- public static String script() {
- StackTraceElement[] stack = new Throwable().getStackTrace();
- return stack[stack.length - 1].getClassName();
- }
-
- public static Error abort() {
- System.exit(1);
- throw new Error("abort");
- }
-
- public static Error abort(String error) {
- System.err.println(script() + ": " + error);
- System.exit(1);
- throw new Error();
- }
-
- public static Error abort(Exception exception) {
- return abort("caught exception " + exception.toString());
- }
-
- //########################################################################
-}
diff --git a/sources/meta/util/TextExpander.java b/sources/meta/util/TextExpander.java
deleted file mode 100644
index 5fe7fbdb38..0000000000
--- a/sources/meta/util/TextExpander.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.util;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.BufferedReader;
-import java.io.IOException;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
-/** A macro expander with support for indentation */
-public class TextExpander {
-
- //########################################################################
- // Public Constants
-
- /** Default macro name prefix */
- public static final String MACRO_PREFIX = "print";
-
- /** Default macro left quote */
- public static final String MACRO_LQUOTE = "{#";
-
- /** Default macro right quote */
- public static final String MACRO_RQUOTE = "#}";
-
- /** Do not edit warning */
- public static final String DO_NOT_EDIT =
- "DO NOT EDIT. Automatically generated file!";
-
- //########################################################################
- // Private Constants
-
- /** An empty array of Classes */
- private static final Class [] NO_PARAMS = new Class[0];
-
- /** An empty array of Objects */
- private static final Object[] NO_ARGS = new Object[0];
-
- //########################################################################
- // Private Fields
-
- /** The output text writer */
- private final TextWriter writer;
-
- /** The macro expander */
- private final Object expander;
-
- /** The current macro name prefix */
- private String prefix;
-
- /** The current macro left quote */
- private String lquote;
-
- /** The current macro right quote */
- private String rquote;
-
- /** The current input name */
- private String name;
-
- /** The current input line number */
- private int line;
-
- /** The current error count */
- private int errors;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new TextExpander. */
- public TextExpander(TextWriter writer, Object expander) {
- this.writer = writer;
- this.expander = expander;
- this.prefix = MACRO_PREFIX;
- this.lquote = MACRO_LQUOTE;
- this.rquote = MACRO_RQUOTE;
- }
-
- //########################################################################
- // Public Methods - Text expansion
-
- /** Expands the text from the given file. */
- public void expandText(File file) {
- setInputName(file.toString());
- setInputLine(0);
- try {
- BufferedReader reader = new BufferedReader(new FileReader(file));
- expandText(reader);
- reader.close();
- } catch (IOException exception) {
- error("input error", exception);
- }
- }
-
- /** Expands the text from the given character stream. */
- public void expandText(BufferedReader reader) {
- try {
- for (String line; (line = reader.readLine()) != null;) {
- this.line++;
- expandLine(line);
- }
- } catch (IOException exception) {
- error("input error", exception);
- }
- }
-
- /** Expands the given line. */
- public void expandLine(String line) {
- int index = 0;
- int column = 0;
- for (; index < line.length(); index++) {
- switch (line.charAt(index)) {
- case ' ' : column += 1; continue;
- case '\t': column += 8 - (column % 8); continue;
- }
- break;
- }
- if (index < line.length()) {
- int width = writer.getIndentWidth();
- writer.setIndentLevel(column / width);
- for (int i = 0; i < column % width; i++) writer.print(' ');
- line = line.substring(index);
- if (line.indexOf("$Id") >= 0)
- line = line.replaceFirst("[$]Id.*[$]", DO_NOT_EDIT);
- expand(line);
- }
- writer.println();
- }
-
- /** Expands the given string. */
- public void expand(String input) {
- int start = 0;
- while (true) {
- int lindex = input.indexOf(lquote, start);
- if (lindex < 0) break;
- int rindex = input.indexOf(rquote, lindex + lquote.length());
- if (rindex < 0) { error("unclosed macro"); break; }
- String macro = input.substring(lindex + lquote.length(), rindex);
- if (macro.indexOf(lquote) >= 0) { error("unclosed macro"); break; }
- if (start < lindex) writer.print(input.substring(start, lindex));
- expandMacro(macro);
- start = rindex + rquote.length();
- }
- if (start < input.length()) writer.print(input.substring(start));
- }
-
- //########################################################################
- // Public Methods - Macro expansion
-
- /** Expands the given macro. */
- public void expandMacro(String macro) {
- String member = prefix + macro;
- Class clasz = expander.getClass();
- try {
- expandMacro(macro, clasz.getMethod(member, NO_PARAMS));
- } catch (NoSuchMethodException exception) {
- error("macro '" + macro + "' is undefined");
- writer.print(lquote + macro + rquote);
- }
- }
-
- /** Expands the given macro by invoking the given method. */
- public void expandMacro(String macro, Method method) {
- try {
- method.invoke(expander, NO_ARGS);
- } catch (IllegalAccessException exception) {
- error("macro '" + macro + "' could not access method " + method);
- writer.print(lquote + macro + rquote);
- } catch (InvocationTargetException exception) {
- error("macro '" + macro + "' raised an exception");
- exception.getTargetException().printStackTrace();
- }
- }
-
- //########################################################################
- // Public Methods - Error messages
-
- /** Prints an error message. */
- public void error(String error) {
- String prefix = name != null ? name + ":" : "error:";
- if (line > 0) prefix = prefix + line + ":";
- System.err.println(prefix + " " + error);
- errors++;
- }
-
- /** Prints an error message. */
- public void error(String error, Throwable exception) {
- if (exception.getMessage() != null)
- error(exception.getMessage());
- else
- error(error + " (" + exception.getClass().getName() + ")");
- }
-
- //########################################################################
- // Public Methods - Getters
-
- /** Returns the output text writer. */
- public TextWriter getOutputWriter() {
- return writer;
- }
-
- /** Returns the macro expander. */
- public Object getMacroExpander() {
- return expander;
- }
-
- /** Returns the current macro name prefix. */
- public String getMacroPrefix() {
- return prefix;
- }
-
- /** Returns the current macro left quote. */
- public String getMacroLeftQuote() {
- return lquote;
- }
-
- /** Returns the current macro right quote. */
- public String getMacroRightQuote() {
- return lquote;
- }
-
- /** Returns the current input name. */
- public String getInputName() {
- return name;
- }
-
- /** Returns the current input line. */
- public int getInputLine() {
- return line;
- }
-
- /** Returns the current error count. */
- public int getErrorCount() {
- return errors;
- }
-
- //########################################################################
- // Public Methods - Setters
-
- /** Sets the current macro name prefix. */
- public void setMacroPrefix(String prefix) {
- this.prefix = prefix;
- }
-
- /** Sets the current macro quotes. */
- public void setMacroQuotes(String lquote, String rquote) {
- this.lquote = lquote;
- this.rquote = rquote;
- }
-
- /** Sets the current input name. */
- public void setInputName(String name) {
- this.name = name;
- }
-
- /** Sets the current input line. */
- public void setInputLine(int line) {
- this.line = line;
- }
-
- /** Sets the current error count. */
- public void setErrorCount(int errors) {
- this.errors = errors;
- }
-
- //########################################################################
-}
diff --git a/sources/meta/util/TextWriter.java b/sources/meta/util/TextWriter.java
deleted file mode 100644
index 2884848e83..0000000000
--- a/sources/meta/util/TextWriter.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package meta.util;
-
-/** A string generator with support for indentation and spacing. */
-public class TextWriter {
-
- //########################################################################
- // Private Constants
-
- /** The line separator */
- private static final String LINE = System.getProperty("line.separator");
-
- /** The default width of an indentation level */
- private static final String STEP = " ";
-
- //########################################################################
- // Private Fields
-
- /** The output buffer */
- private final StringBuffer buffer;
-
- /** The width of an indentation level */
- private final String step;
-
- /** The current indentation level */
- private int level;
-
- /** Do we need to align? */
- private boolean align;
-
- /** Do we need to print a white space? */
- private boolean space;
-
- /** Is there already a empty line? */
- private boolean line;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new TextWriter. */
- public TextWriter() {
- this(new StringBuffer());
- }
-
- /** Creates a new TextWriter. */
- public TextWriter(String step) {
- this(new StringBuffer(), step);
- }
-
- /** Creates a new TextWriter. */
- public TextWriter(String step, int level) {
- this(new StringBuffer(), step, level);
- }
-
- /** Creates a new TextWriter. */
- public TextWriter(StringBuffer buffer) {
- this(buffer, STEP, 0);
- }
-
- /** Creates a new TextWriter. */
- public TextWriter(StringBuffer buffer, String step) {
- this(buffer, step, 0);
- }
-
- /** Creates a new TextWriter. */
- public TextWriter(StringBuffer buffer, String step, int level) {
- this.buffer = buffer;
- this.step = step;
- this.level = level;
- this.align = false;
- this.space = false;
- this.line = false;
- }
-
- //########################################################################
- // Public Methods - Printing
-
- /** Prints a new line. */
- public TextWriter println() {
- return line();
- }
-
- /** Prints the boolean value followed by a new line. */
- public TextWriter println(boolean value) {
- return print(value).line();
- }
-
- /** Prints the byte value followed by a new line. */
- public TextWriter println(byte value) {
- return print(value).line();
- }
-
- /** Prints the short value followed by a new line. */
- public TextWriter println(short value) {
- return print(value).line();
- }
-
- /** Prints the char value followed by a new line. */
- public TextWriter println(char value) {
- return print(value).line();
- }
-
- /** Prints the int value followed by a new line. */
- public TextWriter println(int value) {
- return print(value).line();
- }
-
- /** Prints the long value followed by a new line. */
- public TextWriter println(long value) {
- return print(value).line();
- }
-
- /** Prints the float value followed by a new line. */
- public TextWriter println(float value) {
- return print(value).line();
- }
-
- /** Prints the double value followed by a new line. */
- public TextWriter println(double value) {
- return print(value).line();
- }
-
- /** Prints the string followed by a new line. */
- public TextWriter println(String value) {
- return print(value).line();
- }
-
- /** Prints the boolean value. */
- public TextWriter print(boolean value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the byte value. */
- public TextWriter print(byte value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the short value. */
- public TextWriter print(short value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the char value. */
- public TextWriter print(char value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the int value. */
- public TextWriter print(int value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the long value. */
- public TextWriter print(long value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the float value. */
- public TextWriter print(float value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the long value. */
- public TextWriter print(double value) {
- return print(String.valueOf(value));
- }
-
- /** Prints the string. */
- public TextWriter print(String value) {
- if (align) for (int i = 0; i < level; i++) buffer.append(step);
- if (space) buffer.append(' ');
- buffer.append(value);
- align = false;
- space = false;
- line = false;
- return this;
- }
-
- //########################################################################
- // Public Methods - Formating
-
- /** Returns the indentation width. */
- public int getIndentWidth() {
- return step == null ? -1 : step.length();
- }
-
- /** Returns the indentation level. */
- public int getIndentLevel() {
- return level;
- }
-
- /** Sets the indentation level. */
- public TextWriter setIndentLevel(int level) {
- this.level = level;
- return this;
- }
-
- /** Increases the indentation level by one. */
- public TextWriter indent() {
- level++;
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public TextWriter undent() {
- level--;
- return this;
- }
-
- /** Starts a new line. */
- public TextWriter line() {
- if (step == null) return space();
- if (line) return this;
- buffer.append(LINE);
- line = align;
- align = true;
- space = false;
- return this;
- }
-
- /** Inserts a white space. */
- public TextWriter space() {
- space = !align;
- return this;
- }
-
- //########################################################################
- // Public Methods - Accessing
-
- /** Returns the underlying StringBuffer. */
- public StringBuffer getBuffer() {
- return buffer;
- }
-
- /** Returns the generated string. */
- public String toString() {
- return buffer.toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scala4ant/AntAdaptor.scala b/sources/scala/tools/scala4ant/AntAdaptor.scala
deleted file mode 100644
index d60ef9c652..0000000000
--- a/sources/scala/tools/scala4ant/AntAdaptor.scala
+++ /dev/null
@@ -1,209 +0,0 @@
-
-import scalac._;
-import scala.tools.util.Reporter;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Execute;
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.taskdefs.LogStreamHandler;
-import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter;
-import org.apache.tools.ant.types.Commandline;
-import org.apache.tools.ant.types.Path;
-import java.io.IOException;
-
-package scala.tools.scala4ant {
-
- /** Scala compiler adaptor. adapted from (see below for additions to Scala license)
- * jaco.framework.ant.AntCompilerAdaptor (c) Matthias Zenger, and
- * org.apache.tools.ant.taskdefs.DefaultCompilerAdapter
- * (c) the Apache Software Foundation
- *
- * @author Burak Emir
- * @version 1.6
- * $Id$
- */
-
- class AntAdaptor extends DefaultCompilerAdapter {
-
- final val FSEP = java.io.File.separator;
- final val PSEP = java.io.File.pathSeparator;
-
- final val PRODUCT = System.getProperty("scala.product", "scalac");
- final val VERSION = System.getProperty("scala.version", "unknown version");
-
- def runCompiler( args:Array[String] ) = {
- var ex:Throwable = _;
- //Console.println("runCompiler");
- var result = true;
- try {
- scala.tools.scalac.Main.main1( false, args );
- } catch {
- case e:Throwable =>
- ex = e;
- }
- if( null != ex ) {
- ex.printStackTrace();
- throw new BuildException("internal error of scalac:"+ex.getClass());
- }
-
- if( scala.tools.scalac.Main.reporter.errors() > 0 )
- throw new BuildException("there were compile errors");
-
- true
- }
-
- def compilerName() = "scalac";
-
- override def setJavac( attributes:Javac ) = {
- super.setJavac( attributes );
- }
-
- def execute() = {
- attributes.log("Using " + compilerName() + " as scala compiler",
- Project.MSG_VERBOSE);
- runCompiler( setupScalacCommand().getArguments() );
- }
-
- def inferScalaPath( paths:Array[String] ) = {
-
- //Console.println("inferScalaPath");
- var x:List[String] = Nil;
- for (val p <- paths) {
- val z = p.lastIndexOf("lib"+FSEP+"scala.jar");
- if( z > -1 ) { // distribution
- val p1 = new StringBuffer( p.substring( 0, z ) );
- x = p1.append("src").toString() :: p :: x ;
- x = p::x;
- } else {
- val z2 = p.lastIndexOf("scala"+FSEP+"classes");
- if( z2 > -1 ) { // developer version
- val p1 = new StringBuffer(
- p.substring( 0, z2 + 6 /* length of "scala"+SEP */ )
- );
- x = p :: p1.append("sources").toString() :: x ;
- }
- }
- }
- //Console.println("DONE inferScalaPath");
- x
- };
-
- def setupScalacCommand() = {
- //Console.println("setupScalaCommand");
- val cmd = new Commandline();
- val cp = new Path( this.project );
-
- //- encoding?
- val stask = this.attributes.asInstanceOf[ScalacTask];
- if(null != stask.getEncoding()) {
- cmd.createArgument().setValue( "-encoding" );
- cmd.createArgument().setValue( stask.getEncoding() );
- }
-
- if( destDir != null ) {
- cmd.createArgument().setValue( "-d" );
- cmd.createArgument().setFile( destDir );
- cp.setLocation( destDir );
- }
-
- if ( debug )
- cmd.createArgument().setValue( "-g" );
-
- /* cp.addExisting( Path.systemClasspath );*/
- /* cp.addJavaRuntime(); */
-
- if( compileClasspath != null ) {
- cp.addExisting( compileClasspath );
- }
-
- cmd.createArgument().setValue("-classpath");
- cmd.createArgument().setPath( cp );
-
- var bcp = inferScalaPath(Path.systemClasspath.list());
- val bcps = (bcp./: (PSEP) { (x:String,y:String) => x+PSEP+y });
-
- /* scala.tools.util.ClassPath replaces "::" / ";;" at the beginning
- with something meaningful
- */
- cmd.createArgument().setValue("-bootclasspath");
- cmd.createArgument().setValue( bcps );
-
- cmd.createArgument().setValue("-sourcepath");
- cmd.createArgument().setPath(
- if (compileSourcepath != null) {
- compileSourcepath;
- } else {
- src;
- }
- );
-
-
- if (bootclasspath != null && bootclasspath.size() > 0) {
- cmd.createArgument().setValue("-bootclasspath");
- cmd.createArgument().setPath(bootclasspath);
- }
-
- if (extdirs != null && extdirs.size() > 0) {
- cmd.createArgument().setValue("-extdirs");
- cmd.createArgument().setPath(extdirs);
- }
-
- logAndAddFilesToCompile(cmd);
- //Console.println("DONE setupScalaCommand");
- cmd
- }
- }
-}
-
-/*
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
- * reserved.
- * Copyright (c) 2000-2002 Matthias Zenger. All rights reserved.
- * Copyright (c) 2003-2004 Burak Emir. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Ant", and "Apache Software
- * Foundation" must not be used to endorse or promote products derived
- * from this software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- * nor may "Apache" appear in their names without prior written
- * permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
-*/
diff --git a/sources/scala/tools/scala4ant/AntTask.scala b/sources/scala/tools/scala4ant/AntTask.scala
deleted file mode 100644
index 61b529cf35..0000000000
--- a/sources/scala/tools/scala4ant/AntTask.scala
+++ /dev/null
@@ -1,13 +0,0 @@
-package scala.tools.scala4ant;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.taskdefs.Javac;
-
-// obsolete
-
-class AntTask extends Javac {
- override def execute():unit = {
- throw new BuildException("please use ScalacTask$class instead of AntTask$class");
- }
-
-}
diff --git a/sources/scala/tools/scala4ant/NscAdaptor.scala b/sources/scala/tools/scala4ant/NscAdaptor.scala
deleted file mode 100644
index 57d8fd5059..0000000000
--- a/sources/scala/tools/scala4ant/NscAdaptor.scala
+++ /dev/null
@@ -1,134 +0,0 @@
-
-//import scalac._;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Execute;
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.taskdefs.LogStreamHandler;
-import org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter;
-import org.apache.tools.ant.types.Commandline;
-import org.apache.tools.ant.types.Path;
-import java.io.IOException;
-
-package scala.tools.scala4ant {
-
- /** Scala compiler adaptor. adapted from (see below for additions to Scala license)
- * jaco.framework.ant.AntCompilerAdaptor (c) Matthias Zenger, and
- * org.apache.tools.ant.taskdefs.DefaultCompilerAdapter
- * (c) the Apache Software Foundation
- *
- * @author Burak Emir
- * @version 1.6
- * $Id$
- */
-
- class NscAdaptor extends DefaultCompilerAdapter {
-
- def runCompiler( args:Array[String] ) = {
- var ex:Throwable = _;
- //Console.println("runCompiler");
- var result = true;
- try {
- scala.tools.nsc.Main.process( args );
- } catch {
- case e:Throwable =>
- ex = e;
- }
- if( null != ex ) {
- ex.printStackTrace();
- throw new BuildException("internal error of nsc:"+ex.getClass());
- }
-
- if( scala.tools.nsc.Main.errors() > 0 )
- throw new BuildException("there were compile errors");
-
- true
- }
-
- def compilerName() = "nsc";
-
- def execute() = {
- attributes.log("Using " + compilerName() + " as scala compiler",
- Project.MSG_VERBOSE);
-
- runCompiler( setupNscCommand().getArguments() );
- }
-
- def setupNscCommand() = {
- //Console.println("setupScalaCommand");
- val cmd = new Commandline();
- val cp = new Path( this.project );
-
- //- attribute @nscArgs in order to pass anything you like
- val moreargs = this.attributes.asInstanceOf[NscTask].moreArgs();
- for(val a <- moreargs) {
- if(a.length() > 0) {
- Console.println("NscAdaptor adds argument '"+a+"'");
- cmd.createArgument().setValue(a);
- }
- }
-
-
- //- encoding? @todo
- //val stask = this.attributes.asInstanceOf[ScalacTask];
- //if(null != stask.getEncoding()) {
- // cmd.createArgument().setValue( "-encoding" );
- // cmd.createArgument().setValue( stask.getEncoding() );
- //}
-
- //- destdir
- if( destDir != null ) {
- cmd.createArgument().setValue( "-d" );
- cmd.createArgument().setFile( destDir );
- cp.setLocation( destDir );
- }
-
- /* cp.addExisting( Path.systemClasspath );*/
- /* cp.addJavaRuntime(); */
-
- //- classpath
- if( compileClasspath != null ) {
- cp.addExisting( compileClasspath );
- }
-
- cmd.createArgument().setValue("-classpath");
- cmd.createArgument().setPath( cp );
-
- //var bcp = inferScalaPath(Path.systemClasspath.list());
- //val bcps = (bcp./: (PSEP) { (x:String,y:String) => x+PSEP+y });
-
- /* scala.tools.util.ClassPath replaces "::" / ";;" at the beginning
- with something meaningful
- */
- //cmd.createArgument().setValue("-bootclasspath");
- //cmd.createArgument().setValue( bcps );
-
- cmd.createArgument().setValue("-sourcepath");
- cmd.createArgument().setPath(
- if (compileSourcepath != null) {
- compileSourcepath;
- } else {
- src;
- }
- );
-
- if (bootclasspath != null && bootclasspath.size() > 0) {
- cmd.createArgument().setValue("-bootclasspath");
- cmd.createArgument().setPath(bootclasspath);
- }
-
- //if (extdirs != null && extdirs.size() > 0) {
- // cmd.createArgument().setValue("-extdirs");
- // cmd.createArgument().setPath(extdirs);
- //}
-
- logAndAddFilesToCompile(cmd);
- //Console.println("DONE setupScalaCommand");
- cmd
- }
-
-
- }
-}
-
diff --git a/sources/scala/tools/scala4ant/NscTask.scala b/sources/scala/tools/scala4ant/NscTask.scala
deleted file mode 100644
index e50199f6ac..0000000000
--- a/sources/scala/tools/scala4ant/NscTask.scala
+++ /dev/null
@@ -1,118 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2004, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-package scala.tools.scala4ant;
-
-import java.io.File;
-
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.util._;
-
-
-/**
- * The <code>NscTask</code> class provides an Ant task for
- * for the as-yet nonexistent <code>nsc</code> command.
- * i.e.<pre>
- * &lt;nsc srcdir="${src}" destdir="${build}"&gt;
- * &lt;include name="test.scala"/&gt;
- * &lt;/nsc&gt;
- * </pre>
- *
- * @author Burak Emir, Stephane Micheloud
- * @version 1.0
- */
-
-class NscTask extends Javac {
-
- private val fileUtils: FileUtils = FileUtils.newFileUtils();
-
- private var verbose = false;
- private var force = false;
- private var nscArgs = "";
-
- def setCp(s: Path) = setClasspath(s);
-
- def setForce(b: Boolean) = this.force = b;
- def getForce() = force;
-
- def setNscArgs(s: String) = this.nscArgs = s;
- def getNscArgs() = nscArgs;
-
- def moreArgs():Array[String] = {
- getNscArgs().split(";");
- }
-
- override def execute() = {
- System.setProperty("scala.home", ScalaRuntime.home.toString());
- //System.setProperty("scala.product", scala.tools.scalac.Main.PRODUCT);
- //System.setProperty("scala.version", scala.tools.scalac.Main.VERSION);
- System.setProperty("scala.class.path", ".");
- System.setProperty("scala.boot.class.path", ScalaRuntime.bootclasspath.toString());
-
- getProject().setProperty("build.compiler",
- "scala.tools.scala4ant.NscAdaptor$class");
-
- super.execute();
- }
-
- override protected def scanDir(srcDir: File, destDir: File, files: Array[String]): Unit = {
- if (force) {
- val newCompileList = new Array[File](compileList.length + files.length);
- System.arraycopy(compileList, 0, newCompileList, 0, compileList.length);
- var j, i = 0;
-
- def handleFile( theFile:String ):unit = {
- /* this, because wile create anon-class -> access violation */
- if (theFile.endsWith(".scala")) {
- if (srcDir == null) {
- newCompileList(compileList.length + j) = new File(theFile);
- j = j + 1;
- }
- else {
- newCompileList(compileList.length + j) =
- fileUtils.resolveFile(srcDir, theFile);
- j = j + 1
- }
- }
- }
-
- while (i < files.length) {
- handleFile(files(i));
- i = i + 1;
- }
-
- if (j == files.length)
- compileList = newCompileList;
- else {
- compileList = new Array[File](j);
- System.arraycopy(newCompileList, 0, compileList, 0, j);
- }
- } else {
- val m = new GlobPatternMapper();
-
- def handleNewFiles(newFiles:Array[File]): Unit = {
- if (newFiles.length > 0) {
- val newCompileList =
- new Array[File](compileList.length + newFiles.length);
- System.arraycopy(compileList, 0, newCompileList, 0,
- compileList.length);
- System.arraycopy(newFiles, 0, newCompileList,
- compileList.length, newFiles.length);
- compileList = newCompileList;
- }
- }
- m.setFrom("*.scala");
- m.setTo("*.class");
- val sfs = new SourceFileScanner(this);
- handleNewFiles(sfs.restrictAsFiles(files, srcDir, destDir, m));
- }
- }
-
-}
diff --git a/sources/scala/tools/scala4ant/ScalaRuntime.scala b/sources/scala/tools/scala4ant/ScalaRuntime.scala
deleted file mode 100644
index 72cfdf0ae7..0000000000
--- a/sources/scala/tools/scala4ant/ScalaRuntime.scala
+++ /dev/null
@@ -1,133 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2004, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-package scala.tools.scala4ant;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.types.Path;
-
-
-/**
- * The <code>ScalaRuntime</code> object provides informations
- * about the Scala runtime environment.
- *
- * @author Stephane Micheloud
- * @version 1.1
- */
-
-object ScalaRuntime {
-
- private val SCALA_RUNTIME_LIB = "lib";
- private val SCALA_RUNTIME_SOURCES = "sources";
- private val SCALA_RUNTIME_CLASSES = "classes";
-
- private val SCALA_JAR_SOME_CLASS = "scala.ScalaObject";
- private val TOOLS_JAR_SOME_CLASS = getClass().getName(); // myself !
- private val FJBG_JAR_SOME_CLASS = "ch.epfl.lamp.fjbg.JFieldOrMethod";
-
- check(SCALA_JAR_SOME_CLASS, "scala.jar");
- check(TOOLS_JAR_SOME_CLASS, "tools.jar");
- check(FJBG_JAR_SOME_CLASS, "fjbg.jar");
-
- val home: Path = {
- val p = Path.systemClasspath.createPath();
- val name = getResourceLocation(SCALA_JAR_SOME_CLASS);
- val i = Math.max(name.lastIndexOf(SCALA_RUNTIME_LIB),
- name.lastIndexOf(SCALA_RUNTIME_CLASSES));
- p.setPath(if (i > 0) name.substring(0, i - 1) else name);
- p
- }
-
- val sourcepath: Path = {
- val p = Path.systemClasspath.createPath();
- val s = home.toString() + java.io.File.separator + SCALA_RUNTIME_SOURCES;
- p.setPath(s);
- p
- }
-
- val scalapath: Path =
- getResourcePath(SCALA_JAR_SOME_CLASS);
-
- val classpath: Path = {
- val toolsPath = getResourcePath(TOOLS_JAR_SOME_CLASS);
- val fjbgPath = getResourcePath(FJBG_JAR_SOME_CLASS);
- val p = Path.systemClasspath.createPath();
- p.append(scalapath);
- p.append(toolsPath);
- p.append(fjbgPath);
- p
- }
-
- val bootclasspath: Path = {
- val p = Path.systemClasspath.createPath();
- p.append(scalapath);
- p.append(sourcepath);
- p
- }
-
- /**
- * Check if the required Scala libraries are present.
- */
- private def check(className: String, jarName: String) = try {
- Class.forName(className)
- } catch {
- case e: ClassNotFoundException =>
- throw new BuildException("Cannot run scala4ant.\n"
- + "It seems " + jarName + " is not in your CLASSPATH.");
- }
-
- /**
- * Return the full path string of the the jar file or the
- * directory containing the class <code>className</code>.
- *
- * @param classname
- * @return
- */
- private def getResourceLocation(className: String): String = {
- def asResourceName(resource: String) = {
- val name =
- if (! resource.startsWith("/")) "/" + resource else resource;
- name.replace('.', '/') + ".class"
- }
- val rsrcName = asResourceName(className);
- val url = getClass().getResource(rsrcName);
- if (url != null) {
- val fn = url.getFile();
- val name = if (fn.startsWith("file:")) fn.substring(5) else fn;
- val inx = name.lastIndexOf('!');
- val end = if (inx > 0) inx else name.lastIndexOf(rsrcName);
- name.substring(0, end);
- }
- else
- throw new BuildException("Cannot run scala4ant.\n"
- + "Scala installation directory cannot be found.");
- }
-
- /**
- * Return the Ant path of the class <code>className</code>.
- *
- * @param classname
- * @return
- */
- private def getResourcePath(className: String) = {
- val name = getResourceLocation(className);
- val p = Path.systemClasspath.createPath();
- p.setPath(name);
- p
- }
-
- // for testing
- def main(args: Array[String]): Unit = {
- System.out.println("ScalaRuntime.home = " + ScalaRuntime.home);
- System.out.println("ScalaRuntime.classpath = " + ScalaRuntime.classpath);
- System.out.println("ScalaRuntime.bootclasspath = " + ScalaRuntime.bootclasspath);
- System.out.println("ScalaRuntime.sourcepath = " + ScalaRuntime.sourcepath);
- System.out.println("ScalaRuntime.scalapath = " + ScalaRuntime.scalapath);
- }
-}
diff --git a/sources/scala/tools/scala4ant/ScalaTask.scala b/sources/scala/tools/scala4ant/ScalaTask.scala
deleted file mode 100644
index 7b1a53984d..0000000000
--- a/sources/scala/tools/scala4ant/ScalaTask.scala
+++ /dev/null
@@ -1,51 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2004, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-package scala.tools.scala4ant;
-
-import org.apache.tools.ant.taskdefs.Java;
-import org.apache.tools.ant.types.Path;
-
-
-/**
- * The <code>ScalaTask</code> class provides an Ant task for
- * the <code>scala</code> command.
- * i.e.<pre>
- * &lt;scala classpath="${build}" classname="examples.sort"/&gt;
- * </pre>
- *
- * @author Stephane Micheloud
- * @version 1.0
- */
-
-class ScalaTask extends Java {
-
- private val PRODUCT = "scala";
-
- private val classpath = ScalaRuntime.scalapath;
-
- private var debug = false;
-
- override def getTaskName(): String = PRODUCT;
-
- override def setClasspath(s: Path): Unit = {
- classpath.append(s);
- super.setClasspath(classpath)
- }
-
- def setDebug(debug: Boolean): Unit = this.debug = debug;
-
- override def execute() = {
- if (debug) {
- log("CLASSPATH=" + classpath.toString());
- }
- super.execute()
- }
-
-}
diff --git a/sources/scala/tools/scala4ant/ScalacTask.scala b/sources/scala/tools/scala4ant/ScalacTask.scala
deleted file mode 100644
index 76d130e0fa..0000000000
--- a/sources/scala/tools/scala4ant/ScalacTask.scala
+++ /dev/null
@@ -1,109 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2004, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-package scala.tools.scala4ant;
-
-import java.io.File;
-
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.util._;
-
-
-/**
- * The <code>ScalacTask</code> class provides an Ant task for
- * for the <code>scalac</code> command.
- * i.e.<pre>
- * &lt;scalac srcdir="${src}" destdir="${build}"&gt;
- * &lt;include name="test.scala"/&gt;
- * &lt;/scalac&gt;
- * </pre>
- *
- * @author Burak Emir, Stephane Micheloud
- * @version 1.0
- */
-
-class ScalacTask extends Javac {
-
- private val fileUtils: FileUtils = FileUtils.newFileUtils();
-
- private var force = false;
-
- def setCp(s: Path) = setClasspath(s);
-
- def setForce(b: Boolean) = this.force = b;
- def getForce() = force;
-
- override def execute() = {
- System.setProperty("scala.home", ScalaRuntime.home.toString());
- System.setProperty("scala.product", scala.tools.scalac.Main.PRODUCT);
- System.setProperty("scala.version", scala.tools.scalac.Main.VERSION);
- System.setProperty("scala.class.path", ".");
- System.setProperty("scala.boot.class.path", ScalaRuntime.bootclasspath.toString());
-
- getProject().setProperty("build.compiler",
- "scala.tools.scala4ant.AntAdaptor$class");
-
- super.execute();
- }
-
- override protected def scanDir(srcDir: File, destDir: File, files: Array[String]): Unit = {
- if (force) {
- val newCompileList = new Array[File](compileList.length + files.length);
- System.arraycopy(compileList, 0, newCompileList, 0, compileList.length);
- var j, i = 0;
-
- def handleFile( theFile:String ):unit = {
- /* this, because wile create anon-class -> access violation */
- if (theFile.endsWith(".scala")) {
- if (srcDir == null) {
- newCompileList(compileList.length + j) = new File(theFile);
- j = j + 1;
- }
- else {
- newCompileList(compileList.length + j) =
- fileUtils.resolveFile(srcDir, theFile);
- j = j + 1
- }
- }
- }
-
- while (i < files.length) {
- handleFile(files(i));
- i = i + 1;
- }
-
- if (j == files.length)
- compileList = newCompileList;
- else {
- compileList = new Array[File](j);
- System.arraycopy(newCompileList, 0, compileList, 0, j);
- }
- } else {
- val m = new GlobPatternMapper();
-
- def handleNewFiles(newFiles:Array[File]): Unit = {
- if (newFiles.length > 0) {
- val newCompileList =
- new Array[File](compileList.length + newFiles.length);
- System.arraycopy(compileList, 0, newCompileList, 0,
- compileList.length);
- System.arraycopy(newFiles, 0, newCompileList,
- compileList.length, newFiles.length);
- compileList = newCompileList;
- }
- }
- m.setFrom("*.scala");
- m.setTo("*.class");
- val sfs = new SourceFileScanner(this);
- handleNewFiles(sfs.restrictAsFiles(files, srcDir, destDir, m));
- }
- }
-
-}
diff --git a/sources/scala/tools/scala4ant/ScalapTask.scala b/sources/scala/tools/scala4ant/ScalapTask.scala
deleted file mode 100644
index 837453b82f..0000000000
--- a/sources/scala/tools/scala4ant/ScalapTask.scala
+++ /dev/null
@@ -1,81 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2004, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-package scala.tools.scala4ant;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.Commandline;
-import org.apache.tools.ant.types.Path;
-
-
-/**
- * The <code>ScalapTask</code> class provides an Ant task for
- * for the <code>scalap</code> command.
- * i.e.<pre>
- * &lt;scalap classpath="${build}" classname="examples.sort" private="true"/&gt;
- * </pre>
- *
- * @author Stephane Micheloud
- * @version 1.0
- */
-
-class ScalapTask extends Task {
-
- private val PRODUCT = "scalap";
-
- private var classpath = ScalaRuntime.classpath;
- private var classname = "";
-
- private var showPrivateDefs = false;
- private var isVerbose = false;
- private var debug = false;
-
- override def getTaskName(): String = PRODUCT;
-
- def setClasspath(s: Path): Unit = classpath.append(s);
-
- def setCp(s: Path) = setClasspath(s);
-
- def setClassname(name: String): Unit = classname = name;
-
- def setPrivate(show: Boolean): Unit = showPrivateDefs = show;
-
- def setVerbose(verbose: Boolean): Unit = isVerbose = verbose;
-
- def setDebug(debug: Boolean): Unit = this.debug = debug;
-
- override def execute() = try {
- System.setProperty("scala.home", ScalaRuntime.home.toString());
- System.setProperty("scala.product", PRODUCT);
- System.setProperty("scala.version", scala.tools.scalap.Main.VERSION);
- System.setProperty("scala.class.path", ".");
- System.setProperty("scala.boot.class.path", ScalaRuntime.bootclasspath.toString());
-
- if (debug) {
- for (val arg <- getArgs())
- System.out.println(arg);
- }
- scala.tools.scalap.Main.main(getArgs());
- }
- catch {
- case e =>
- throw new BuildException("exception occurred:" + e.getClass());
- }
-
- private def getArgs() = {
- val cmd = new Commandline();
- cmd.createArgument().setValue("-classpath");
- cmd.createArgument().setPath(classpath);
- if (showPrivateDefs) cmd.createArgument().setValue("-private");
- if (isVerbose) cmd.createArgument().setValue("-verbose");
- cmd.createArgument().setValue(classname);
- cmd.getArguments()
- }
-}
diff --git a/sources/scala/tools/scalac/CompilerPhases.scala b/sources/scala/tools/scalac/CompilerPhases.scala
deleted file mode 100644
index 9983a73e90..0000000000
--- a/sources/scala/tools/scalac/CompilerPhases.scala
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{CompilerPhases => scalac_CompilerPhases}
-
-package scala.tools.scalac {
-
-/**
- * This class defines all compiler phases and maintains a list of
- * active phases.
- */
-class CompilerPhases extends scalac_CompilerPhases {
-
- protected override def PARSER_PHASE(): Class =
- Class.forName("scala.tools.scalac.ast.parser.ParserPhase$class");
- protected override def NAMER_PHASE(): Class =
- Class.forName("scala.tools.scalac.typechecker.NamerPhase$class");
- protected override def ANALYZER_PHASE(): Class =
- Class.forName("scala.tools.scalac.typechecker.AnalyzerPhase$class");
- protected override def REFCHECK_PHASE(): Class =
- Class.forName("scala.tools.scalac.typechecker.RefCheckPhase$class");
- protected override def UNCURRY_PHASE(): Class =
- Class.forName("scala.tools.scalac.transformer.UnCurryPhase$class");
- protected override def TRANSMATCH_PHASE(): Class =
- Class.forName("scala.tools.scalac.transformer.TransMatchPhase$class");
- protected override def WHOLEPROG_PHASE(): Class =
- Class.forName("scala.tools.scalac.wholeprog.WholeProgPhase$class");
- protected override def ICODE_PHASE(): Class =
- Class.forName("scala.tools.scalac.icode.ICodePhase$class");
-
- }
-}
diff --git a/sources/scala/tools/scalac/Global.scala b/sources/scala/tools/scalac/Global.scala
deleted file mode 100644
index 03fb13986e..0000000000
--- a/sources/scala/tools/scalac/Global.scala
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id: Global.scala
-\* */
-
-
-import java.io.PrintWriter;
-
-import scalac.{CompilationUnit, CompilerCommand, Global => scalac_Global};
-import scalac.ast.printer.TreePrinter;
-import scalac.backend.jvm.GenJVM;
-import scalac.backend.msil.GenMSIL;
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-import scala.tools.util.Timer;
-
-package scala.tools.scalac {
-
-import ast.printer.{TextTreePrinter, HTMLTreePrinter, SwingTreePrinter};
-import backend.GenJVMFromICode;
-import typechecker.Infer;
-
-
-/** The global environment of a compiler run
- *
- */
-class Global(args: CompilerCommand, timer: Timer, interpret: Boolean) extends scalac_Global(args, timer, interpret) {
-
- def this(args: CompilerCommand, interpret: Boolean) =
- this(args, scalac_Global.getTimer(args.reporter()), interpret);
-
- def this(args: CompilerCommand) = this(args, false);
-
- override def newInfer(): Infer =
- new Infer(this, treeGen, make);
-
- override def newTextTreePrinter(writer: PrintWriter): TreePrinter =
- new TextTreePrinter(this, writer);
-
- override def newHTMLTreePrinter(writer: PrintWriter): TreePrinter =
- new HTMLTreePrinter(this, writer);
-
- override def newSwingTreePrinter(writer: PrintWriter): TreePrinter =
- new SwingTreePrinter(this);
-
- /** ..
- *
- * @param units
- */
- override def dump(units: Array[CompilationUnit]): Unit = {
- if (target == scalac_Global.TARGET_JVM) {
- GenJVM.translate(this, units);
- } else if (target == scalac_Global.TARGET_MSIL) {
- GenMSIL.translate(this, units);
- } else if (target == scalac_Global.TARGET_JVMFROMICODE) {
- GenJVMFromICode.translate(this, units);
- }
- symdata.clear();
- }
-
- /** ..
- *
- */
- protected override def loadFunctions(): Unit = {
- val mixinOnly = target != scalac_Global.TARGET_INT;
- List.range(0, definitions.FUNCTION_COUNT).foreach(
- i => loadCode(definitions.FUNCTION_CLASS(i), mixinOnly));
- }
-
- /** ..
- *
- * @param clasz
- * @param mixinOnly
- */
- private def loadCode(clasz: Symbol, mixinOnly: Boolean): Unit = {
- assert(clasz.isClass() && !clasz.isModuleClass(), Debug.show(clasz));
- if (clasz.isExternal()) {
- try {
- compileLate(getSourceFile(clasz), mixinOnly);
- } catch {
- case exception: java.io.IOException =>
- if (debug) exception.printStackTrace();
- error(exception.getMessage() + "; source file for "
- + clasz + " is needed");
- }
- }
- }
-
-} // class Global
-
-}
diff --git a/sources/scala/tools/scalac/Main.scala b/sources/scala/tools/scalac/Main.scala
deleted file mode 100644
index 1542f98a21..0000000000
--- a/sources/scala/tools/scalac/Main.scala
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-import scala.tools.util.{AbstractReporter, ConsoleReporter};
-import scalac.{CompilerCommand, Global => scalac_Global};
-import scalac.symtab.classfile.CLRTypes;
-
-package scala.tools.scalac {
-
-/** The main class for SoCoS, a compiler for the programming
- * language Scala.
- *
- * @author Matthias Zenger
- * @version 1.0
- */
-object Main {
-
- val PRODUCT: String =
- System.getProperty("scala.product", "socos");
- val VERSION: String =
- System.getProperty("scala.version", "unknown version");
-
- def main(args: Array[String]): unit = main1( true, args );
-
- // ant task needs to be aware of reporter.errors
- var reporter: AbstractReporter = _;
-
- def main1( exitOnError:boolean, args: Array[String] ):unit = {
- val reporter = new ConsoleReporter();
- this.reporter = reporter;
- val command = new CompilerCommand(
- PRODUCT, VERSION, reporter, new CompilerPhases());
- var ok = true;
- if (command.parse(args) && command.files.list.size() > 0) {
- if (command.target.value == scalac_Global.TARGET_MSIL) {
- try { CLRTypes.init(command); }
- catch { case e: Error =>
- e.printStackTrace();
- ok = false;
- }
- }
- if (ok) {
- val timer = scalac_Global.getTimer(reporter);
- timer.start();
- val global = new Global(command, timer, false);
- try {
- val units = global.compile(command.files.toArray(), false);
- if (reporter.errors() == 0)
- if (!global.PHASE.CODEGEN.hasSkipFlag()) global.dump(units);
- } catch {
- case e: scala.tools.util.debug.AbortError =>
- if (global.debug)
- e.printStackTrace();
- else
- global.error("Internal compiler error: " + e.getMessage()
- + "; use -debug to see a stack trace");
- }
- timer.stop("total");
- reporter.printSummary();
- }
- }
- if( exitOnError ) {
- System.exit(if (reporter.errors() > 0 || !ok) 1 else 0);
- }
- }
-}
-}
diff --git a/sources/scala/tools/scalac/ant/Scalac.java b/sources/scala/tools/scalac/ant/Scalac.java
deleted file mode 100644
index ba0278deeb..0000000000
--- a/sources/scala/tools/scalac/ant/Scalac.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
- ** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
- ** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
- ** /_____/\____/\___/\____/____/ **
- ** **
-\* */
-
-// $Id: $
-
-package scala.tools.scalac.ant;
-
-import java.io.File;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Vector;
-
-import org.apache.tools.ant.AntClassLoader;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.util.FileUtils;
-import org.apache.tools.ant.util.GlobPatternMapper;
-import org.apache.tools.ant.util.SourceFileScanner;
-import org.apache.tools.ant.types.Reference;
-
-import scala.tools.scalac.CompilerPhases$class;
-import scala.tools.scalac.Global$class;
-import scala.tools.util.ConsoleReporter;
-import scala.tools.util.Reporter;
-import scala.tools.util.Timer;
-import scala.tools.util.debug.AbortError;
-import scalac.CompilationUnit;
-import scalac.CompilerCommand;
-
-/**
- * An Ant task to compile with the old Scala compiler.
- * This task can take the following parameters as attributes:<ul>
- * <li>srcdir (mandatory),</li>
- * <li>srcref,</li>
- * <li>destdir,</li>
- * <li>classpath,</li>
- * <li>classpathref,</li>
- * <li>sourcepath,</li>
- * <li>sourcepathref,</li>
- * <li>bootclasspath,</li>
- * <li>bootclasspathref,</li>
- * <li>extdirs,</li>
- * <li>extdirsref,</li>
- * <li>encoding,</li>
- * <li>verbose,</li>
- * <li>debug,</li>
- * <li>usepredefs,</li>
- * <li>useimports,</li>
- * <li>force.</li>
- * </ul>
- * It also takes the following parameters as nested elements:<ul>
- * <li>src (for srcdir),</li>
- * <li>classpath,</li>
- * <li>sourcepath,</li>
- * <li>bootclasspath,</li>
- * <li>extdirs.</li>
- * </ul>
- */
-public class Scalac extends MatchingTask {
-
- private FileUtils fileUtils = FileUtils.newFileUtils();
-
- private String SCALA_PRODUCT =
- System.getProperty("scala.product", "Scalac Ant compiler");
- private String SCALA_VERSION =
- System.getProperty("scala.version", "Unknown version");
-
- // ###################################################################
- // ##### Ant Properties #####
- // ###################################################################
-
- /** The directories that contain source files to compile. */
- private Path origin = null;
- /** The directory to put the compiled files in. */
- private File destination = null;
-
- /** The class path to use for this compilation. */
- private Path classpath = null;
- /** The source path to use for this compilation. */
- private Path sourcepath = null;
- /** The boot class path to use for this compilation. */
- private Path bootclasspath = null;
- /** The external extensions path to use for this compilation. */
- private Path extpath = null;
-
- /** The text encoding of the files to compile. */
- private String encoding = null;
-
- /** Whether to use verbose output or not. */
- private boolean verbose = false;
- /** Whether to print-out some additional ant compilation information. */
- private boolean debug = false;
- /** Whether to use implicit predefined values or not. */
- private boolean usepredefs = true;
- /** Whether to implicitly import or not. */
- private boolean useimports = true;
- /** What type of force compilation to use, if any. */
- private String force = "never";
-
- // ###################################################################
- // ##### Properties setters #####
- // ###################################################################
-
- /**
- * A setter for the srcdir attribute. Used by Ant.
- * @param input The value of <code>origin</code>.
- */
- public void setSrcdir(Path input) {
- if (origin == null) {
- origin = input;
- } else {
- origin.append(input);
- }
- }
-
- /**
- * A setter of the <code>origin</code> as a nested src Ant parameter.
- * @return An origin path to be configured.
- */
- public Path createSrc() {
- if (origin == null) {
- origin = new Path(getProject());
- }
- return origin.createPath();
- }
-
- /**
- * A setter of the <code>origin</code> as an external reference Ant parameter.
- * @param input A reference to an origin path.
- */
- public void setSrcref(Reference input) {
- createSrc().setRefid(input);
- }
-
- /**
- * A setter for the destdir attribute. Used by Ant.
- * @param input The value of <code>destination</code>.
- */
- public void setDestdir(File input) {
- destination = input;
- }
-
- /**
- * A setter for the classpath attribute. Used by Ant.
- * @param input The value of <code>classpath</code>.
- */
- public void setClasspath(Path input) {
- if (classpath == null) {
- classpath = input;
- } else {
- classpath.append(input);
- }
- }
-
- /**
- * A setter of the <code>classpath</code> as a nested classpath Ant parameter.
- * @return A class path to be configured.
- */
- public Path createClasspath() {
- if (classpath == null) {
- classpath = new Path(getProject());
- }
- return classpath.createPath();
- }
-
- /**
- * A setter of the <code>classpath</code> as an external reference Ant parameter.
- * @param input A reference to a class path.
- */
- public void setClasspathref(Reference input) {
- createClasspath().setRefid(input);
- }
-
- /**
- * A setter for the sourcepath attribute. Used by Ant.
- * @param input The value of <code>sourcepath</code>.
- */
- public void setSourcepath(Path input) {
- if (sourcepath == null) {
- sourcepath = input;
- } else {
- sourcepath.append(input);
- }
- }
-
- /**
- * A setter of the <code>sourcepath</code> as a nested sourcepath Ant parameter.
- * @return A source path to be configured.
- */
- public Path createSourcepath() {
- if (sourcepath == null) {
- sourcepath = new Path(getProject());
- }
- return sourcepath.createPath();
- }
-
- /**
- * A setter of the <code>sourcepath</code> as an external reference Ant parameter.
- * @param input A reference to a source path.
- */
- public void setSourcepathref(Reference input) {
- createSourcepath().setRefid(input);
- }
-
- /**
- * A setter for the boot classpath attribute. Used by Ant.
- * @param input The value of <code>bootclasspath</code>.
- */
- public void setBootclasspath(Path input) {
- if (bootclasspath == null) {
- bootclasspath = input;
- } else {
- bootclasspath.append(input);
- }
- }
-
- /**
- * A setter of the <code>bootclasspath</code> as a nested sourcepath Ant parameter.
- * @return A source path to be configured.
- */
- public Path createBootclasspath() {
- if (bootclasspath == null) {
- bootclasspath = new Path(getProject());
- }
- return bootclasspath.createPath();
- }
-
- /**
- * A setter of the <code>bootclasspath</code> as an external reference Ant parameter.
- * @param input A reference to a source path.
- */
- public void setBootclasspathref(Reference input) {
- createBootclasspath().setRefid(input);
- }
-
- /**
- * A setter for the external extensions path attribute. Used by Ant.
- * @param input The value of <code>extpath</code>.
- */
- public void setExtdirs(Path input) {
- if (extpath == null) {
- extpath = input;
- } else {
- extpath.append(input);
- }
- }
-
- /**
- * A setter of the <code>extpath</code> as a nested sourcepath Ant parameter.
- * @return A source path to be configured.
- */
- public Path createExtdirs() {
- if (extpath == null) {
- extpath = new Path(getProject());
- }
- return extpath.createPath();
- }
-
- /**
- * A setter of the <code>extpath</code> as an external reference Ant parameter.
- * @param input A reference to a source path.
- */
- public void setExtdirsref(Reference input) {
- createExtdirs().setRefid(input);
- }
-
- /**
- * A setter for the encoding attribute. Used by Ant.
- * @param input The value of <code>encoding</code>.
- */
- public void setEncoding(String input) {
- encoding = input;
- }
-
- /**
- * A setter for the verbose attribute. Used by Ant.
- * @param input The value for <code>verbose</code>.
- */
- public void setVerbose(boolean input) {
- verbose = input;
- }
-
- /**
- * A setter for the debug attribute. Used by Ant.
- * @param input The value for <code>debug</code>.
- */
- public void setDebug(boolean input) {
- debug = input;
- }
-
- /**
- * A setter for the use predefs attribute. Used by Ant.
- * @param input The value for <code>usepredefs</code>.
- */
- public void setUsepredefs(boolean input) {
- usepredefs = input;
- }
-
- /**
- * A setter for the use imports attribute. Used by Ant.
- * @param input The value for <code>useimport</code>.
- */
- public void setUseimports(boolean input) {
- useimports = input;
- }
-
- /**
- * A setter for the force attribute. Used by Ant.
- * @param input The value for <code>force</code>.
- */
- public void setForce(ForceMode input) {
- force = input.getValue();
- }
-
- // ###################################################################
- // ##### Compilation and support methods #####
- // ###################################################################
-
- /**
- * Generates a build error. Error location will be the current task in the ant file.
- *
- * @param message The message of the error. This message should be end-user readable.
- * @throws org.apache.tools.ant.BuildException The build error exception.
- * Will be thrown in all conditions.
- */
- private void error(String message) throws BuildException {
- throw new BuildException(message, getLocation());
- }
-
- /**
- * Performs the compilation.
- */
- public void execute() throws BuildException {
-
- // Tests if all mandatory attributes are set and valid.
- if (origin == null) error("Attribute 'srcdir' is not set.");
- if (origin.size() == 0) error("Attribute 'srcdir' is not set.");
- if (destination != null && !destination.isDirectory())
- error("Attribute 'destdir' does not refer to an existing directory.");
-
- Vector sourceFilesList = new Vector();
-
- // Scans source directories to build up a compile lists.
- // If force is false, only files were the .class file in destination
- // is newer than the .suffix file will be used.
- String[] originList = origin.list();
- for (int i = 0; i < originList.length; i++) {
- File originDir = getProject().resolveFile(originList[i]);
- if (!originDir.exists()) {
- log("Element '" + originDir.getPath() + "' in attribute 'srcdir' does not refer to an existing directory.", Project.MSG_WARN);
- break;
- }
- DirectoryScanner originDirScanner = this.getDirectoryScanner(originDir);
- String[] files = originDirScanner.getIncludedFiles();
-
- if (force.compareToIgnoreCase("always") == 0) {
- addFilesToSourceList(files, originDir, sourceFilesList);
- }
- else {
- GlobPatternMapper mapper = new GlobPatternMapper();
- mapper.setTo("*.class");
- mapper.setFrom("*.scala");
- SourceFileScanner scanner = new SourceFileScanner(this);
- String[] newFiles = scanner.restrict(files, originDir, destination, mapper);
- if (force.compareToIgnoreCase("changed") == 0 && (newFiles.length > 0)) {
- addFilesToSourceList(files, originDir, sourceFilesList);
- }
- else if (force.compareToIgnoreCase("never") == 0) {
- addFilesToSourceList(newFiles, originDir, sourceFilesList);
- }
- }
- }
-
- if (sourceFilesList.isEmpty()) {
- log("No files selected for compilation");
- }
- else {
- log("Compiling " + sourceFilesList.size() + " source file" + (sourceFilesList.size() == 1 ? "" : "s") + (destination != null ? " to " + destination.toString() : ""));
- }
-
- // Builds-up the compilation settings for Scalac with the existing Ant parameters.
- Reporter reporter = new ConsoleReporter();
- CompilerCommand command = new CompilerCommand(SCALA_PRODUCT, SCALA_VERSION, reporter, new CompilerPhases$class());
- if (destination != null) command.outpath.value = destination.getAbsolutePath();
- if (classpath != null) command.classpath.value = makeAbsolutePath(classpath, "classpath");
- if (sourcepath != null) {
- command.sourcepath.value = makeAbsolutePath(sourcepath, "sourcepath");
- }
- else {
- command.sourcepath.value = destination.getAbsolutePath();
- }
- // The bootclasspath needs to be treated specially.
- // When no bootclasspath is provided, the classpath of the current classloader is used:
- // This is where the scala classes should be.
- // Furthermore, the source files for the library must be available in the bootclasspath too.
- // Notice also how the bootclasspath must finish with a ":" for it to work.
- Path baseBootclasspath;
- if (bootclasspath != null) {
- baseBootclasspath = bootclasspath;
- }
- else {
- baseBootclasspath = getClassLoaderClasspath(this.getClass().getClassLoader());
- }
- command.bootclasspath.value =
- makeAbsolutePath(baseBootclasspath, "bootclasspath") + File.pathSeparator;
- if (!containsScala(command.bootclasspath.value)) {
- log("Bootclasspath does not contain a recognized Scala distribution. This might cause unexpected errors (Stack Overflow)", Project.MSG_WARN);
- }
- if (extpath != null) command.extdirs.value = makeAbsolutePath(extpath, "extpath");
- if (encoding != null) command.encoding.value = encoding;
- command.verbose.value = verbose;
- command.debug.value = debug;
- command.noimports.value = !useimports;
- command.nopredefs.value = !usepredefs;
- Timer timer = scalac.Global.getTimer(reporter);
-
- // Compiles the actual code
- Global$class compiler = new Global$class(command, timer, false);
-
- String[] stringArray = new String[sourceFilesList.size()];
- try {
- timer.start();
- CompilationUnit[] classes = compiler.compile((String[])sourceFilesList.toArray(stringArray), false);
- if (reporter.errors() > 0) {
- error("Compile failed with " + reporter.errors() + " error" + (reporter.errors() == 1 ? "" : "s") + "; see the compiler error output for details.");
- }
- compiler.dump(classes);
- }
- catch (AbortError exception) {
- if (debug) exception.printStackTrace();
- error("Compile failed because of an internal compiler error; see the error output for details.");
- }
- finally {
- timer.stop("Compile time");
- }
- if (reporter.warnings() > 0) {
- log("Compile suceeded with " + reporter.errors() + " warning" + (reporter.warnings() == 1 ? "" : "s") + "; see the compiler output for details.");
- }
- }
-
- private void addFilesToSourceList(String[] files, File originDir, Vector sourceFilesList) {
- for (int i = 0; i < files.length; i++) {
- String sourceFile = fileUtils.resolveFile(originDir, files[i]).toString();
- log(sourceFile, Project.MSG_VERBOSE);
- sourceFilesList.add(sourceFile);
- }
- }
-
- private String makeAbsolutePath(Path path, String pathName) {
- String result = "";
- String[] pathList = path.list();
- for (int i = 0; i < pathList.length; i++) {
- File pathFile = new File(pathList[i]);
- if (pathFile.exists()) {
- result = result + ((result == "") ? "" : File.pathSeparator) + pathFile.getAbsolutePath();
- }
- else {
- log("Element '" + pathFile.toString() + "' in " + pathName + " does not exist.", Project.MSG_WARN);
- result = result + ((result == "") ? "" : File.pathSeparator) + pathFile.toString();
- }
- }
- return result;
- }
-
- private Path getClassLoaderClasspath(ClassLoader classLoader) throws BuildException {
- Path classLoaderClasspath = new Path(getProject());
- ClassLoader parentClassLoader = classLoader.getParent();
- String classloaderName = classLoader.getClass().getName();
- boolean isURLClassLoader = classloaderName.endsWith("URLClassLoader");
- boolean isAntClassLoader = classloaderName.endsWith("AntClassLoader2") || classloaderName.endsWith("AntClassLoader");
- if (isURLClassLoader) {
- URL[] urls = ((URLClassLoader) classLoader).getURLs();
- for (int i = 0; i < urls.length; i++) {
- classLoaderClasspath.append(new Path(getProject(), urls[i].toString()));
- }
- }
- else if (isAntClassLoader) {
- String[] paths = ((AntClassLoader) classLoader).getClasspath().split(File.pathSeparator);
- for (int i = 0; i < paths.length; i++) {
- classLoaderClasspath.append(new Path(getProject(), paths[i]));
- }
- }
- if (parentClassLoader != null && parentClassLoader != classLoader) {
- classLoaderClasspath.append(getClassLoaderClasspath(parentClassLoader));
- }
- return classLoaderClasspath;
- }
-
- private boolean containsScala(String path) {
- boolean containsLibrary = false;
- boolean containsTools = false;
- String[] paths = path.split(File.pathSeparator);
- for (int i = 0; i < paths.length; i++) {
- if (paths[i].endsWith("scala.jar") || paths[i].endsWith("scala")) {
- containsLibrary = true;
- }
- if (paths[i].endsWith("tools.jar") || paths[i].endsWith("tools")) {
- containsTools = true;
- }
- }
- return containsLibrary && containsTools;
- }
-
- /**
- * Enumerated attribute with the values "never", "always", "changed".
- */
- public static class ForceMode extends EnumeratedAttribute {
- /**
- * @see EnumeratedAttribute#getValues
- */
- public String[] getValues() {
- return new String[] {"never", "always", "changed"};
- }
- }
-
-}
diff --git a/sources/scala/tools/scalac/ast/TreeList.scala b/sources/scala/tools/scalac/ast/TreeList.scala
deleted file mode 100644
index e8ac0fb35b..0000000000
--- a/sources/scala/tools/scalac/ast/TreeList.scala
+++ /dev/null
@@ -1,86 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import scalac.ast._;
-
-package scala.tools.scalac.ast {
-
-/** List of trees.
- */
-
-final class TreeList(ts: Array[Tree]) extends Iterable[Tree] {
-
- private var trees = ts;
- private var len = ts.length;
-
- def this() = { this(new Array[Tree](4)); len = 0 }
-
- def append(tree: Tree): TreeList = {
- if (len == trees.length) {
- val ts = new Array[Tree](if (len == 0) 4 else len * 2);
- System.arraycopy(trees, 0, ts, 0, len);
- trees = ts;
- }
- trees(len) = tree;
- len = len + 1;
- this
- }
-
- def append(tts: Array[Tree]): unit = {
- for (val j <- Iterator.range(0, tts.length))
- append(tts(j));
- }
-
- def append(tl: TreeList): unit = {
- for (val j <- Iterator.range(0, tl.len))
- append(tl.trees(j));
- }
-
- def clear(): unit = {
- trees = new Array[Tree](4);
- len = 0;
- }
-
- def elements = new Iterator[Tree] { // don't change treelist while iterating!
- private var i = 0;
- def hasNext: Boolean = i < len;
- def next: Tree =
- if (i < len) { val x = trees(i) ; i = i + 1 ; x }
- else error("next on empty iterator");
- }
-
- def length(): int = len;
-
- def get(i: int): Tree = trees(i);
-
- def first(): Tree = trees(0);
-
- def removeLast(): Tree = {
- len = len - 1;
- trees(len)
- }
-
- def toArray(): Array[Tree] = {
- val tts = new Array[Tree](len);
- System.arraycopy(trees, 0, tts, 0, len);
- tts
- }
-
- def copyTo[t <: Tree](ts: Array[t]): Array[t] = copyTo(ts, 0);
-
- def copyTo[t <: Tree](ts: Array[t], from: int): Array[t] = {
- System.arraycopy(trees, 0, ts, from, len);
- ts;
- }
-
- override def toString() = {
- Iterator.fromArray(this.toArray()).toList.toString();
- }
-}
-}
diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
deleted file mode 100644
index a817767544..0000000000
--- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala
+++ /dev/null
@@ -1,608 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2003-2005, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-** $Id$
-\* */
-
-import java.lang.{Integer, Long, Float, Double};
-
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.symtab.Modifiers;
-
-import scala.Iterator;
-import scala.collection.immutable.ListMap ;
-import scala.collection.mutable;
-import scala.tools.scalac.util.NewArray;
-import scala.tools.util.Position;
-import scala.xml.{Text,TextBuffer};
-
-package scala.tools.scalac.ast.parser {
-
-class MarkupParser(unit: CompilationUnit, s: Scanner, p: Parser, presWS: boolean) /*with scala.xml.parsing.MarkupParser[Tree,Tree] */{
-
- import Tokens.{EMPTY, LBRACE, RBRACE};
- import scala.tools.scalac.ast.{TreeList => myTreeList}
-
- final val preserveWS = presWS;
-
- /** the XML tree factory */
- val handle: SymbolicXMLBuilder =
- new SymbolicXMLBuilder(unit.global.make, unit.global.treeGen, p, presWS);
-
- /** holds the position in the source file */
- /*[Duplicate]*/ var pos: Int = _;
-
- /** holds temporary values of pos */
- /*[Duplicate]*/ var tmppos: Int = _;
-
- /** holds the next character */
- /*[Duplicate]*/ var ch: Char = _;
-
- /** character buffer, for names */
- /*[Duplicate]*/ protected val cbuf = new StringBuffer();
-
- /** append Unicode character to name buffer*/
- /*[Duplicate]*/ protected def putChar(c: char) = cbuf.append( c );
-
- /*[Duplicate]*/ var xEmbeddedBlock = false;
-
- /** munch expected XML token, report syntax error for unexpected */
- /*[Duplicate]*/ def xToken(that: Char): Unit = {
- if( ch == that )
- nextch;
- else
- reportSyntaxError("'" + that + "' expected instead of '" + ch + "'");
- }
-
- var debugLastStartElement = new mutable.Stack[Pair[Int,String]];
-
- /** checks whether next character starts a Scala block, if yes, skip it.
- * @return true if next character starts a scala block
- */
- /*[Duplicate]*/ def xCheckEmbeddedBlock:Boolean = {
- xEmbeddedBlock =
- enableEmbeddedExpressions && ( ch == '{' ) && { nextch;( ch != '{' ) };
- return xEmbeddedBlock;
- }
-
- /** parse attribute and add it to listmap
- * [41] Attributes ::= { S Name Eq AttValue }
- * AttValue ::= `'` { _ } `'`
- * | `"` { _ } `"`
- * | `{` scalablock `}`
- */
- /*[Duplicate]*/ def xAttributes = {
- var aMap = new mutable.HashMap[String, Tree]();
- while (xml.Parsing.isNameStart(ch)) {
- val key = xName;
- xEQ;
- val delim = ch;
- val pos1 = pos;
- val value: /* AttribValue[*/Tree/*]*/ = ch match {
- case '"' | '\'' =>
- nextch;
- val tmp = xAttributeValue( delim );
- nextch;
- gen.mkStringLit(pos1, tmp);
- case '{' if enableEmbeddedExpressions =>
- nextch;
- xEmbeddedExpr;
- case _ =>
- reportSyntaxError( "' or \" delimited attribute value or '{' scala-expr '}' expected" );
- gen.mkStringLit(pos1, "<syntax-error>" )
- };
- // well-formedness constraint: unique attribute names
- if( aMap.contains( key ))
- reportSyntaxError( "attribute "+key+" may only be defined once" );
- aMap.update( key, value );
- if(( ch != '/' )&&( ch != '>' ))
- xSpace;
- };
- aMap
- }
-
- /** attribute value, terminated by either ' or ". value may not contain <.
- * @param endch either ' or "
- */
- /*[Duplicate]*/ def xAttributeValue(endCh: char): String = {
- while (ch != endCh) {
- putChar(ch);
- nextch;
- };
- val str = cbuf.toString();
- cbuf.setLength(0);
- // @todo: normalize attribute value
- // well-formedness constraint
- if (str.indexOf('<') != -1) {
- reportSyntaxError( "'<' not allowed in attrib value" ); ""
- } else {
- str
- }
- }
-
- /** parse a start or empty tag.
- * [40] STag ::= '<' Name { S Attribute } [S]
- * [44] EmptyElemTag ::= '<' Name { S Attribute } [S]
- */
- /*[Duplicate]*/ def xTag: Pair[String, mutable.Map[String, Tree]] = {
- val elemName = xName;
- xSpaceOpt;
- val aMap = if (xml.Parsing.isNameStart(ch)) {
- xAttributes;
- } else {
- new mutable.HashMap[String, Tree]();
- }
- Tuple2( elemName, aMap );
- }
-
- /* [42] '<' xmlEndTag ::= '<' '/' Name S? '>' */
- /*[Duplicate]*/ def xEndTag(n: String) = {
- xToken('/');
- val m = xName;
- if(n != m) reportSyntaxError( "expected closing tag of " + n/* +", not "+m*/);
- xSpaceOpt;
- xToken('>')
- }
-
- /** '<! CharData ::= [CDATA[ ( {char} - {char}"]]>"{char} ) ']]>'
- *
- * see [15]
- */
- /*[Duplicate]*/ def xCharData: Tree = {
- xToken('[');
- xToken('C');
- xToken('D');
- xToken('A');
- xToken('T');
- xToken('A');
- xToken('[');
- val pos1 = pos;
- val sb:StringBuffer = new StringBuffer();
- while (true) {
- if (ch==']' &&
- { sb.append( ch ); nextch; ch == ']' } &&
- { sb.append( ch ); nextch; ch == '>' } ) {
- sb.setLength( sb.length() - 2 );
- nextch;
- return handle.charData( pos1, sb.toString() );
- } else sb.append( ch );
- nextch;
- }
- throw new ApplicationError("this cannot happen");
- };
-
- /** CharRef ::= "&#" '0'..'9' {'0'..'9'} ";"
- * | "&#x" '0'..'9'|'A'..'F'|'a'..'f' { hexdigit } ";"
- *
- * see [66]
- */
- /*[Duplicate]*/ def xCharRef:String = {
- val hex = ( ch == 'x' ) && { nextch; true };
- val base = if (hex) 16 else 10;
- var i = 0;
- while (ch != ';') {
- ch match {
- case '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' =>
- i = i * base + Character.digit( ch, base );
- case 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
- | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' =>
- if( !hex )
- reportSyntaxError("hex char not allowed in decimal char ref\n"
- +"Did you mean to write &#x ?");
- else
- i = i * base + Character.digit( ch, base );
- case _ =>
- reportSyntaxError("character '"+ch+" not allowed in char ref\n");
- }
- nextch;
- }
- new String(Predef.Array(i.asInstanceOf[char]))
- }
-/** Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
- *
- * see [15]
- */
- /*[Duplicate]*/ def xComment: Tree = {
- val sb:StringBuffer = new StringBuffer();
- xToken('-');
- xToken('-');
- while (true) {
- if( ch=='-' && { sb.append( ch ); nextch; ch == '-' } ) {
- sb.setLength( sb.length() - 1 );
- nextch;
- xToken('>');
- return handle.comment( pos, sb.toString() );
- } else sb.append( ch );
- nextch;
- }
- throw new ApplicationError("this cannot happen");
- };
-
- /*[Duplicate]*/ def appendText(pos: int, ts:mutable.Buffer[Tree], txt:String):Unit = {
- if( !preserveWS )
- for( val t <- TextBuffer.fromString( txt ).toText ) {
- ts.append( handle.text( pos, t.text ) );
- }
- else
- ts.append( handle.text( pos, txt ));
- }
-
- /*[Duplicate]*/ def content: mutable.Buffer[Tree] = {
- var ts = new mutable.ArrayBuffer[Tree];
- var exit = false;
- while( !exit ) {
- if( xEmbeddedBlock ) {
- ts.append( xEmbeddedExpr );
- } else {
- tmppos = pos;
- ch match {
- case '<' => // another tag
- nextch;
- ch match {
- case '/' =>
- exit = true; // end tag
- case '!' =>
- nextch;
- if( '[' == ch ) // CDATA
- ts.append( xCharData );
- else // comment
- ts.append( xComment );
- case '?' => // PI
- nextch;
- ts.append( xProcInstr );
- case _ =>
- ts.append( element ); // child
- }
-
- case '{' =>
- if( xCheckEmbeddedBlock ) {
- ts.append(xEmbeddedExpr);
- } else {
- val str = new StringBuffer("{");
- str.append( xText );
- appendText(tmppos, ts, str.toString());
- }
- // postcond: xEmbeddedBlock == false!
- case '&' => // EntityRef or CharRef
- nextch;
- ch match {
- case '#' => // CharacterRef
- nextch;
- val theChar = handle.text( tmppos, xCharRef );
- xToken(';');
- ts.append( theChar );
- case _ => // EntityRef
- val n = xName ;
- xToken(';');
- ts.append( handle.entityRef( tmppos, n ) );
- }
- case _ => // text content
- appendText(tmppos, ts, xText);
- // here xEmbeddedBlock might be true
- }
- }
- }
- ts
- } /* end content */
-
- /** '<' element ::= xmlTag1 '>' { xmlExpr | '{' simpleExpr '}' } ETag
- * | xmlTag1 '/' '>'
- */
- /*[Duplicate]*/ def element: Tree = {
- val pos1 = pos;
- val Tuple2(qname, attrMap) = xTag;
- //Console.println("MarkupParser::element("+qname+","+attrMap+")");
- if (ch == '/') { // empty element
- xToken('/');
- xToken('>');
- handle.element( pos1, qname, attrMap, new mutable.ListBuffer[Tree] );
- }
- else { // handle content
- xToken('>');
- debugLastStartElement.push(Pair(pos1,qname));
- val ts = content;
- xEndTag( qname );
- debugLastStartElement.pop;
- handle.element( pos1, qname, attrMap, ts );
- }
- }
-
-
- /** Name ::= (Letter | '_' | ':') (NameChar)*
- *
- * see [5] of XML 1.0 specification
- */
- /*[Duplicate]*/ def xName: String = {
- if( xml.Parsing.isNameStart( ch ) ) {
- do {
- putChar( ch );
- nextch;
- } while( xml.Parsing.isNameChar( ch ) );
- val n = cbuf.toString().intern();
- cbuf.setLength( 0 );
- n
- } else {
- reportSyntaxError( "name expected" );
- new String();
- }
- }
-
-
- /** scan [S] '=' [S]*/
- /*[Duplicate]*/ def xEQ = { xSpaceOpt; xToken('='); xSpaceOpt }
-
- /** skip optional space S? */
- /*[Duplicate]*/ def xSpaceOpt = { while( xml.Parsing.isSpace( ch ) ) { nextch; }}
-
- /** scan [3] S ::= (#x20 | #x9 | #xD | #xA)+ */
- /*[Duplicate]*/ def xSpace = {
- if (xml.Parsing.isSpace(ch)) {
- nextch; xSpaceOpt
- }
- else {
- reportSyntaxError("whitespace expected");
- }
- }
-
-/** '<?' ProcInstr ::= Name [S ({Char} - ({Char}'>?' {Char})]'?>'
- *
- * see [15]
- */
- /*[Duplicate]*/ def xProcInstr: Tree = {
- val sb:StringBuffer = new StringBuffer();
- val n = xName;
- if( xml.Parsing.isSpace( ch ) ) {
- xSpace;
- while( true ) {
- if( ch=='?' && { sb.append( ch ); nextch; ch == '>' } ) {
- sb.setLength( sb.length() - 1 );
- nextch;
- return handle.procInstr(tmppos, n.toString(), sb.toString());
- } else
- sb.append( ch );
- nextch;
- }
- };
- xToken('?');
- xToken('>');
- return handle.procInstr(tmppos, n.toString(), sb.toString());
- }
-
- /** parse character data.
- * precondition: xEmbeddedBlock == false (we are not in a scala block)
- */
- /*[Duplicate]*/ def xText: String = {
- if( xEmbeddedBlock ) throw new ApplicationError("internal error: encountered embedded block"); // assert
-
- if( xCheckEmbeddedBlock )
- return ""
- else {
- var exit = false;
- while( !exit ) {
- putChar( ch );
- exit = { nextch; xCheckEmbeddedBlock }||( ch == '<' ) || ( ch == '&' );
- }
- val str = cbuf.toString();
- cbuf.setLength( 0 );
- str
- }
- }
- //override type Tree = handle.Tree;
- //override type Tree = handle.Tree;
-
- /** the XML tree builder */
- val gen = unit.global.treeGen ;
-
- final val PATTERN = true;
- final val EXPR = false;
-
- val enableEmbeddedExpressions: Boolean = true;
-
- //val cbuf = new StringBuffer();
-
- /** append Unicode character to name buffer*/
- //private def putChar(c: char) = cbuf.append( c );
-
- /** xLiteral = element { element }
- * @return Scala representation of this xml literal
- * precondition: s.xStartsXML == true
- */
- def xLiteral: Tree = try {
- init;
- handle.isPattern = false;
- val pos = s.pos;
- var tree = element;
- xSpaceOpt;
- // parse more XML ?
- if (ch == '<') {
- val ts = new mutable.ArrayBuffer[Tree]();
- ts.append( tree );
- while( ch == '<' ) {
- nextch;
- ts.append( element );
- xSpaceOpt;
- }
- tree = handle.makeXMLseq( pos, ts );
- }
- //Console.println("out of xLiteral, parsed:"+tree.toString());
- s.xSync2;
- tree
- }
- catch {
- case _:ArrayIndexOutOfBoundsException =>
- s.syntaxError(debugLastStartElement.top._1,
- "missing end tag in XML literal for <"
- +debugLastStartElement.top._2+">");
- Tree.Empty;
- }
-
- /** @see xmlPattern. resynchronizes after succesful parse
- * @return this xml pattern
- * precondition: s.xStartsXML == true
- */
- def xLiteralPattern:Tree = try {
- init;
- val oldMode = handle.isPattern;
- handle.isPattern = true;
- val pos = s.pos;
- var tree = xPattern; xSpaceOpt;
- if (ch == '<') {
- val ts = new myTreeList(); ts.append( tree );
- while (ch == '<' && lookahead != '-') {
- nextch;
- ts.append( xPattern );
- xSpaceOpt;
- }
- tree = handle.makeXMLseqPat( pos, ts.toArray() );
- }
- handle.isPattern = oldMode;
- //Console.println("out of xLiteralPattern, parsed:"+tree.toString());
- s.xSync2;
- tree
- }catch {
- case _:ArrayIndexOutOfBoundsException =>
- s.syntaxError(debugLastStartElement.top._1,
- "missing end tag in XML literal for <"
- +debugLastStartElement.top._2+">");
- Tree.Empty;
- }
-
- def xEmbeddedExpr:Tree = {
- sync;
- val b = p.expr(true,false);
- if(s.token != RBRACE)
- reportSyntaxError(" expected end of Scala block");
- init;
- //Console.println("[out of xScalaExpr s.ch = "+s.ch+" ch="+ch+"]");
- return b
- }
-
- /** xScalaPatterns ::= patterns
- */
- def xScalaPatterns: Array[Tree] = {
- sync;
- val b = p.patterns();
- if (s.token != RBRACE)
- reportSyntaxError(" expected end of Scala patterns");
- init;
- return b
- }
-
- //var ch: Char = _;
-
- /** this method assign the next character to ch and advances in input */
- def nextch: Unit = { s.xNext; ch = s.ch; pos = s.pos; }
-
- def lookahead = { s.xLookahead }
-
- def init: Unit = {
- ch = s.ch;
- pos = s.pos;
- //Console.println("\ninit! ch = "+ch);
- }
-
- /** parse attribute and add it to listmap
- * [41] Attributes ::= { S Name Eq AttValue }
- * AttValue ::= `'` { _ } `'`
- * | `"` { _ } `"`
- * | `{` scalablock `}`
- def xAttributes = {
- var aMap = new mutable.HashMap[String, AttribValue[Tree]];
- while (xml.Parsing.isNameStart(ch)) {
- val key = xName;
- xEQ;
- val delim = ch;
- val value: Tree = ch match {
- case '"' | '\'' =>
- val pos1 = pos;
- nextch;
- val tmp = xAttributeValue( delim );
- nextch;
- gen.mkStringLit( pos1, tmp )
- case '{' =>
- nextch;
- xEmbeddedExpr;
- case _ =>
- xSyntaxError( "' or \" delimited attribute value or '{' scala-expr '}' expected" );
- gen.mkStringLit( pos, "<syntax-error>" )
- };
- // well-formedness constraint: unique attribute names
- if( aMap.contains( key ))
- xSyntaxError( "attribute "+key+" may only be defined once" );
- aMap.update( key, AttribValue( value ));
- if(( ch != '/' )&&( ch != '>' ))
- xSpace;
- };
- aMap
- }
- */
-
-
- def reportSyntaxError(str: String) = {
- s.syntaxError("in XML literal: " + str);
- nextch;
- }
-
- def sync: Unit = {
- xEmbeddedBlock = false;
- s.xSync;
- }
-
- /** '<' xPattern ::= Name [S] { xmlPattern | '{' pattern3 '}' } ETag
- * | Name [S] '/' '>'
- */
- def xPattern:Tree = {
- //Console.println("xPattern");
- val pos1 = pos;
- val qname = xName;
- debugLastStartElement.push(Pair(pos1,qname));
- xSpaceOpt;
- if( ch == '/' ) { // empty tag
- nextch;
- xToken('>');
- return handle.makeXMLpat( pos1, qname, new mutable.ArrayBuffer[Tree]() );
- };
-
- // else: tag with content
- xToken('>');
- var ts = new mutable.ArrayBuffer[Tree];
- var exit = false;
- while (! exit) {
- val pos2 = pos;
- if( xEmbeddedBlock ) {
- ts ++ xScalaPatterns;
- } else
- ch match {
- case '<' => { // tag
- nextch;
- if( ch != '/' ) { //child
- ts.append( xPattern );
- } else {
- exit = true
- }
- }
- case '{' => // embedded Scala patterns
- while( ch == '{' ) {
- s.nextch();
- ts ++ xScalaPatterns;
- }
- // postcond: xEmbeddedBlock = false;
- if (xEmbeddedBlock) throw new ApplicationError(); // assert
- case _ => // teMaxt
- appendText( pos2, ts, xText );
- // here xEmbeddedBlock might be true;
- //if( xEmbeddedBlock ) throw new ApplicationError("after:"+text); // assert
- }
- }
- xEndTag(qname);
- debugLastStartElement.pop;
- handle.makeXMLpat(pos1, qname, ts);
- }
-
-} /* class MarkupParser */
-}
diff --git a/sources/scala/tools/scalac/ast/parser/Parser.scala b/sources/scala/tools/scalac/ast/parser/Parser.scala
deleted file mode 100644
index 08c4a59f90..0000000000
--- a/sources/scala/tools/scalac/ast/parser/Parser.scala
+++ /dev/null
@@ -1,2314 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import java.lang.{Integer, Long, Float, Double};
-import java.util.{Map, Stack};
-
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.symtab.Modifiers;
-import scalac.symtab._;
-import scalac._;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.NameTransformer;
-import scalac.util.TypeNames;
-
-import scala.Iterator;
-import scala.collection.immutable.ListMap;
-import scala.collection.mutable;
-import scala.collection.mutable.ListBuffer;
-import scala.tools.scalac.util.NewArray;
-import scala.tools.util.Position;
-
-
-package scala.tools.scalac.ast.parser {
-
-
-/** A recursive descent parser for the programming language Scala.
- *
- * @author Martin Odersky, Matthias Zenger, Burak Emir
- * @version 1.3
- */
-class Parser(unit: CompilationUnit) {
-
- import Tokens._;
- import scala.tools.scalac.ast.{TreeList => myTreeList}
-
- /** the lexical analyzer
- */
- val s = new Scanner(unit);
-
- /** the markup parser
- */
- val xmlp = new MarkupParser(unit, s, this, unit.global.xmlPreserveWS);
-
- /** the tree factory
- */
- val make: TreeFactory = unit.global.make;
-
- /** the tree generator
- */
- val gen: TreeGen = unit.global.treeGen;
-
- /** pattern checker and normalizer
- */
- val pN = new PatternNormalizer(unit);
-
- /** The current nesting depths of while and do loops.
- */
- var loopNestingDepth = 0;
-
- /** this is the general parse method
- */
- def parse(): Array[Tree] = {
- val ts = if (s.unit.console) templateStatSeq() else compilationUnit();
- accept(EOF);
- ts
- }
-
-/////// ERROR HANDLING ///////////////////////////////////////////////////////
-
- private def skip(): Unit = {
- //System.out.println("<skipping> " + s.token2string(s.token));//DEBUG
- var nparens = 0;
- var nbraces = 0;
- while (true) {
- s.token match {
- case EOF =>
- return;
- case SEMI =>
- if (nparens == 0 && nbraces == 0)
- return;
- case RPAREN =>
- nparens = nparens - 1;
- case RBRACE =>
- if (nbraces == 0) return;
- nbraces = nbraces - 1;
- case LPAREN =>
- nparens = nparens + 1;
- case LBRACE =>
- nbraces = nbraces + 1;
- case _ =>
- }
- s.nextToken();
- }
- }
-
- def syntaxError(msg: String, skipIt: boolean): Unit =
- syntaxError(s.pos, msg, skipIt);
-
- def syntaxError(pos: Int, msg: String, skipIt: boolean): Unit = {
- if (pos != s.errpos) {
- s.unit.error(pos, msg);
- s.errpos = pos;
- }
- if (skipIt) skip();
- }
-
- def accept(token: Int): Int = {
- val pos = s.pos;
- if (s.token != token) {
- val errpos = if ((s.pos >>> Position.COLUMN_BITS) >
- (s.lastpos >>> Position.COLUMN_BITS)) s.lastpos
- else s.pos;
- syntaxError(errpos, Tokens.token2string(token) + " expected but " +
- Tokens.token2string(s.token) + " found.", true);
- }
- if (s.token == token) s.nextToken();
- pos
- }
-
-/////// TOKEN CLASSES ////////////////////////////////////////////////////////
-
- def isModifier(): Boolean =
- (s.token == ABSTRACT)
- || (s.token == FINAL)
- || (s.token == SEALED)
- || (s.token == PRIVATE)
- || (s.token == PROTECTED)
- || (s.token == IMPLICIT)
- || (s.token == OVERRIDE);
-
- def isLocalModifier(): Boolean =
- (s.token == ABSTRACT)
- || (s.token == FINAL)
- || (s.token == SEALED);
-
- def isDefIntro(): Boolean = s.token match {
- case VAL | VAR | DEF | TYPE | OBJECT |
- CASEOBJECT | CLASS | CASECLASS | TRAIT =>
- true
- case _ =>
- false
- }
-
- def isDclIntro(): Boolean = s.token match {
- case VAL | VAR | DEF | TYPE =>
- true
- case _ =>
- false
- }
-
- def isExprIntro(): Boolean = s.token match {
- case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
- STRINGLIT | SYMBOLLIT | TRUE | FALSE | NULL | IDENTIFIER |
- THIS | SUPER | IF | FOR | NEW | USCORE | TRY | WHILE |
- DO | RETURN | THROW | LPAREN | LBRACE | XMLSTART =>
- true
- case _ =>
- false
- }
-
-/////// COMMENT AND ATTRIBUTE COLLECTION /////////////////////////////////////
-
- /** Stack of comments
- */
- protected val commentStack = new Stack();
-
- /** Join the comment associated with a definition
- *
- * @param trees
- * @return
- */
- def joinComment(trees: => Array[Tree]): Array[Tree] = {
- // push comment
- commentStack.push(if (s.docBuffer == null) null else s.docBuffer.toString());
- s.docBuffer = null;
- // parse
- val ts = trees;
- // pop comment
- val comment = commentStack.pop().asInstanceOf[String];
- if (comment != null)
- for (val i <- Iterator.range(0, ts.length)) {
- val t = ts(i);
- ts(i) = make.DocDef(t.pos, comment, t)
- }
- ts
- }
-
-/////// TREE CONSTRUCTION ////////////////////////////////////////////////////
-
- def fresh(): Name = unit.fresh.newName("x");
-
- /** Create a tree representing a packaging
- *
- * @param pos
- * @param pkg0
- * @param stats0
- * @return
- */
- def makePackaging(pos: Int, pkg0: Tree, stats0: Array[Tree]): Tree = {
- var pkg = pkg0;
- var stats = stats0;
- while (true) {
- val templ = make.Template(pos, Tree.EMPTY_ARRAY, stats);
- pkg match {
- case Tree$Select(qual, name) =>
- stats = NewArray.Tree(
- make.PackageDef(pos, make.Ident(pkg.pos, name), templ));
- pkg = qual;
- case _ =>
- return make.PackageDef(pos, pkg, templ);
- }
- }
- null//dummy
- }
-
- /** Create tree representing binary operation expression or pattern.
- *
- * @param isExpr
- * @param pos
- * @param left
- * @param op
- * @param right
- * @return
- */
- def makeBinop(isExpr: Boolean, pos: Int, left: Tree, op: Name, right: Tree): Tree =
- if (isExpr) {
- if (isLeftAssoc(op)) {
- make.Apply(
- pos,
- make.Select(pos, left, NameTransformer.encode(op)),
- NewArray.Tree(right));
- } else {
- val x: Name = fresh();
- make.Block(
- pos,
- NewArray.Tree(
- make.ValDef(pos, 0, x, Tree.Empty, left)),
- make.Apply(
- pos,
- make.Select(pos, right, NameTransformer.encode(op)),
- NewArray.Tree(make.Ident(left.pos, x))));
- }
- } else {
- make.Apply(
- pos,
- make.Ident(pos, NameTransformer.encode(op).toTypeName()),
- NewArray.Tree(left, right));
- }
-
-
- def scalaDot(pos: Int, name: Name): Tree =
- make.Select(pos, make.Ident(pos, Names.scala), name);
-
- def scalaRuntimeDot(pos: Int, name: Name): Tree =
- make.Select(pos, scalaDot(pos, Names.runtime), name);
-
- def ScalaRunTimeDot(pos: Int, name: Name): Tree =
- make.Select(pos, scalaRuntimeDot(pos, Names.ScalaRunTime), name);
-
- def scalaBooleanDot(pos: Int, name: Name): Tree =
- make.Select(pos, scalaDot(pos, Names.Boolean), name);
-
- def scalaAnyRefConstr(pos: Int): Tree =
- make.Apply(
- pos, scalaDot(pos, Names.AnyRef.toTypeName()), Tree.EMPTY_ARRAY);
-
- def scalaObjectConstr(pos: Int): Tree =
- make.Apply(
- pos, scalaDot(pos, Names.ScalaObject.toTypeName()), Tree.EMPTY_ARRAY);
-
- def caseClassConstr(pos: Int): Tree =
- make.Apply(
- pos, scalaDot(pos, Names.CaseClass.toTypeName()), Tree.EMPTY_ARRAY);
-
- /** Create tree for for-comprehension <for (enums) do body> or
- * <for (enums) yield body> where mapName and flatmapName are chosen
- * corresponding to whether this is a for-do or a for-yield.
- *
- * @param pos
- * @param enums
- * @param mapName
- * @param flatmapName
- * @param body
- * @return
- */
- def makeFor(pos: Int, enums: Array[Tree], mapName: Name,
- flatmapName: Name, body: Tree): Tree = {
-
- def makeFor1(pos: Int, name: Name, pat: Tree, rhs: Tree, body: Tree): Tree =
- make.Apply(
- pos, make.Select(pos, rhs, name),
- NewArray.Tree(makeForCont(pos, pat, body)));
-
- def makeForCont(pos: Int, pat: Tree, body: Tree): Tree = {
- pat match {
- case Tree$Ident(name1) if (name1.isVariable()) =>
- make.Function(
- pos,
- NewArray.ValDef(
- make.ValDef(
- pat.pos, Modifiers.PARAM, name1, Tree.Empty, Tree.Empty)),
- body);
- case _ =>
- make.Visitor(pos, NewArray.CaseDef(
- make.CaseDef(pos, pat, Tree.Empty, body)));
- }
- }
-
- enums(0) match {
- case Tree$PatDef(mods, pat, rhs) =>
- if (enums.length == 1) {
- makeFor1(pos, mapName, pat, rhs, body);
- } else {
- val newenums = new Array[Tree](enums.length - 1);
- enums(1) match {
- case Tree$PatDef(mods2, pat2, rhs2) =>
- System.arraycopy(enums, 1, newenums, 0, newenums.length);
- makeFor1(
- pos, flatmapName, pat, rhs,
- makeFor(enums(1).pos, newenums, mapName, flatmapName, body));
- case _ =>
- System.arraycopy(enums, 2, newenums, 1, newenums.length - 1);
- newenums(0) = make.PatDef(
- enums(0).pos, mods, pat,
- makeFor1(enums(1).pos, Names.filter, pat.duplicate(), rhs, enums(1)));
- makeFor(pos, newenums, mapName, flatmapName, body);
- }
- }
- }
- }
-
- /** ..
- *
- * @param pos
- * @param body
- * @param catcher
- * @param finalizer
- * @return
- */
- def makeTry(pos: Int, body: Tree, catcher: Tree, finalizer: Tree): Tree = {
- var t = body;
- if (catcher != Tree.Empty)
- t = make.Apply(
- pos,
- make.Select(
- pos,
- make.Apply(
- pos, ScalaRunTimeDot(pos, Names.Try), NewArray.Tree(t)),
- Names.Catch),
- NewArray.Tree(catcher));
- if (finalizer != Tree.Empty)
- t = make.Apply(
- pos,
- make.Select(
- pos,
- make.Apply(
- pos, ScalaRunTimeDot(pos, Names.Try), NewArray.Tree(t)),
- Names.Finally),
- NewArray.Tree(finalizer));
- t
- }
-
- /** Create tree for a while loop using a label/if construct, e.g.
- * "label(<args>)":
- * while (cond) if (cond) {
- * body ===> body; "goto label(<args>)"
- * }
- *
- * @param pos the source position
- * @param lname the label name
- * @param cond the tree representing the while condition
- * @param body the tree representing the while body
- * @return a label tree representing the while loop
- */
- def makeWhile(pos: Int, lname: Name, cond: Tree, body: Tree): Tree = {
- val continu = make.Apply(
- pos, make.Ident(pos, lname), Tree.EMPTY_ARRAY);
- val rhs = make.If(
- pos,
- cond,
- make.Block(body.pos, NewArray.Tree(body), continu),
- gen.mkUnitLit(pos));
- make.LabelDef(pos, lname, new Array[Tree$Ident](0), rhs);
- }
-
- /** ..
- *
- * @param pos
- * @param lname
- * @param body
- * @param cond
- * @return a label tree representing the do-while loop
- */
- def makeDoWhile(pos: Int, lname: Name, body: Tree, cond: Tree): Tree = {
- val continu = make.Apply(
- pos, make.Ident(pos, lname), Tree.EMPTY_ARRAY);
- val rhs = make.Block(
- body.pos,
- NewArray.Tree(
- body),
- make.If(
- cond.pos,
- cond,
- continu,
- gen.mkUnitLit(pos)));
- make.LabelDef(pos, lname, new Array[Tree$Ident](0), rhs)
- }
-
- /** Convert tree to formal parameter list
- *
- * @param t
- * @return a list of formal parameters
- */
- def convertToParams(t: Tree): Array[Tree$ValDef] = t match {
- case Tree$Function(params, Tree.Empty) =>
- params
- case Tree$Ident(_) | Tree$Typed(Tree$Ident(_), _) =>
- NewArray.ValDef(convertToParam(t));
- case Tree$Literal(AConstant.UNIT) => // !!!
- Tree.ValDef_EMPTY_ARRAY;
- case _ =>
- syntaxError(t.pos, "malformed formal parameter list", false);
- Tree.ValDef_EMPTY_ARRAY;
- }
-
- /** Convert list of trees to formal parameter list
- *
- * @param trees
- * @return
- */
- def convertToParams(trees: Array[Tree]): Array[Tree$ValDef] = {
- val res = new Array[Tree$ValDef](trees.length);
- for (val i <- Iterator.range(0, res.length))
- res(i) = convertToParam(trees(i));
- res;
- }
-
- /** Convert tree to formal parameter
- *
- * @param tree
- * @return
- */
- def convertToParam(tree: Tree): Tree$ValDef = tree match {
- case Tree$Ident(name) =>
- make.ValDef(
- tree.pos, Modifiers.PARAM, name, Tree.Empty, Tree.Empty)
- case Tree$Typed(Tree$Ident(name), tpe) =>
- make.ValDef(
- tree.pos, Modifiers.PARAM, name, tpe, Tree.Empty)
- case _ =>
- syntaxError(tree.pos, "not a legal formal parameter", false);
- val tpe = gen.mkType(tree.pos, Type.ErrorType);
- make.ValDef(
- tree.pos, Modifiers.PARAM, Names.ERROR, tpe, Tree.Empty)
- }
-
- /** Convert (qual)ident to type identifier
- *
- * @param tree
- * @return
- */
- def convertToTypeId(tree: Tree): Tree = tree match {
- case Tree$Ident(name) =>
- make.Ident(tree.pos, name.toTypeName())
- case Tree$Select(qual, name) =>
- make.Select(tree.pos, qual, name.toTypeName())
- case _ =>
- tree
- }
-
- /** Convert (qual)ident to constructor identifier
- *
- * @param tree
- * @return
- */
- def convertToConstr(tree: Tree): Tree = tree match {
- case Tree$Ident(name) =>
- make.Ident(tree.pos, name.toTypeName())
- case Tree$Select(qual, name) =>
- make.Select(tree.pos, qual, name.toTypeName())
- case _ =>
- Console.println("class instead " + tree.getClass());
- syntaxError(tree.pos, "class constructor expected", false);
- gen.mkType(tree.pos, Type.ErrorType)
- }
-
- /** Complete unapplied constructor with `()' arguments
- *
- * @param tree
- * @return
- */
- def applyConstr(tree: Tree): Tree = tree match {
- case Tree$Apply(_, _) =>
- tree
- case _ =>
- make.Apply(tree.pos, tree, Tree.EMPTY_ARRAY)
- }
-
- /** Make closure from tree
- *
- * @param pos
- * @param tree
- * @return
- */
- def makeClosure(pos: Int, tree: Tree): Tree = {
- val pname = fresh();
- def insertParam(tree: Tree): Tree = tree match {
- case Tree$Ident(name) =>
- make.Select(tree.pos, make.Ident(pos, pname), name)
- case Tree$Select(qual, name) =>
- make.Select(tree.pos, insertParam(qual), name)
- case Tree$Apply(fn, args) =>
- make.Apply(tree.pos, insertParam(fn), args)
- case Tree$TypeApply(fn, args) =>
- make.TypeApply(tree.pos, insertParam(fn), args)
- case _ =>
- syntaxError(pos, "cannot concert to closure", false);
- gen.mkZeroLit(s.pos)
- }
- make.Function(
- pos,
- NewArray.ValDef(
- make.ValDef(pos, Modifiers.PARAM, pname, Tree.Empty, Tree.Empty)),
- insertParam(tree))
- }
-
-/////// OPERAND/OPERATOR STACK ///////////////////////////////////////////////
-
- var operands = new Array[Tree](8);
- var positions = new Array[Int ](8);
- var operators = new Array[Name](8);
- var sp = 0;
-
- def precedence(operator: Name): Int =
- if (operator eq Names.ERROR) -1
- else {
- val first_ch = operator.charAt(0);
- if (((first_ch >= 'A') && (first_ch <= 'Z')) ||
- ((first_ch >= 'a') && (first_ch <= 'z')))
- 1
- else
- first_ch match {
- case '|' => 2
- case '^' => 3
- case '&' => 4
- case '<' | '>' => 5
- case '=' | '!' => 6
- case ':' => 7
- case '+' | '-' => 8;
- case '*' | '/' | '%' => 9;
- case _ => 10;
- }
- }
-
- def isLeftAssoc(operator: Name): Boolean =
- operator.length() > 0 && operator.charAt(operator.length() - 1) != ':';
-
- /** ..
- *
- * @param od
- * @param pos
- * @param op
- */
- def push(od: Tree, pos: Int, op: Name): Unit = {
- if (sp == operands.length) {
- val operands1 = new Array[Tree](sp * 2);
- System.arraycopy(operands, 0, operands1, 0, sp);
- operands = operands1;
- val positions1 = new Array[Int](sp * 2);
- System.arraycopy(positions, 0, positions1, 0, sp);
- positions = positions1;
- val operators1 = new Array[Name](sp * 2);
- System.arraycopy(operators, 0, operators1, 0, sp);
- operators = operators1;
- }
- operands(sp) = od;
- positions(sp) = pos;
- operators(sp) = op;
- sp = sp + 1;
- }
-
- /** ..
- *
- * @param isExpr
- * @param base
- * @param _top
- * @param prec
- * @param leftAssoc
- * @return
- */
- def reduceStack(isExpr: Boolean, base: Int, _top: Tree,
- prec: Int, leftAssoc: Boolean): Tree = {
- var top = _top;
- if (sp != base &&
- precedence(operators(sp-1)) == prec &&
- isLeftAssoc(operators(sp-1)) != leftAssoc) {
- syntaxError(
- positions(sp-1),
- "left- and right-associative operators with same precedence may not be mixed",
- false);
- }
- while (sp != base &&
- (prec < precedence(operators(sp-1)) ||
- (leftAssoc && prec == precedence(operators(sp-1))))) {
- sp = sp - 1;
- top = makeBinop(isExpr, positions(sp), operands(sp), operators(sp), top);
- }
- top
- }
-
-/////// IDENTIFIERS AND LITERALS /////////////////////////////////////////////
-
- final val MINUS = Name.fromString("-");
- final val PLUS = Name.fromString("+");
- final val BANG = Name.fromString("!");
- final val TILDE = Name.fromString("~");
- final val STAR = Name.fromString("*");
- final val BAR = Name.fromString("|");
- final val OPT = Name.fromString("?");
- final val LT = Name.fromString("<");
-
- def ident(): Name =
- if (s.token == IDENTIFIER) {
- val name = NameTransformer.encode(s.name);
- s.nextToken();
- name
- } else {
- accept(IDENTIFIER);
- Names.ERROR
- }
-
- /** StableRef ::= StableId
- * | [Ident `.'] this
- * SimpleType ::= StableRef [`.' type]
- *
- * @param thisOK
- * @param typeOK
- * @return
- */
- def stableRef(thisOK: Boolean, typeOK: Boolean): Tree = {
- var t: Tree = null;
- if (s.token == THIS) {
- t = make.This(s.skipToken(), TypeNames.EMPTY);
- if (!thisOK || s.token == DOT)
- t = selectors(accept(DOT), t, typeOK);
- } else if (s.token == SUPER) {
- t = make.Super(
- s.skipToken(), TypeNames.EMPTY, mixinQualifierOpt());
- t = make.Select(accept(DOT), t, ident());
- if (s.token == DOT)
- t = selectors(s.skipToken(), t, typeOK);
- } else {
- val i: Tree$Ident = make.Ident(s.pos, ident());
- t = i;
- if (s.token == DOT) {
- val pos = s.skipToken();
- if (s.token == THIS) {
- s.nextToken();
- t = make.This(i.pos, i.name.toTypeName());
- if (!thisOK || s.token == DOT)
- t = selectors(accept(DOT), t, typeOK);
- } else if (s.token == SUPER) {
- s.nextToken();
- t = make.Super(
- i.pos, i.name.toTypeName(), mixinQualifierOpt());
- t = make.Select(accept(DOT), t, ident());
- if (s.token == DOT)
- t = selectors(s.skipToken(), t, typeOK);
- } else {
- t = selectors(pos, t, typeOK);
- }
- }
- }
- t
- }
-
- def selectors(pos: Int, t: Tree, typeOK: Boolean): Tree =
- if (typeOK && s.token == TYPE) {
- s.nextToken();
- make.SingletonType(pos, t);
- } else {
- val t1 = make.Select(pos, t, ident());
- if (s.token == DOT) selectors(s.skipToken(), t1, typeOK);
- else t1
- }
-
- /** MixinQualifier ::= `[' Id `]'
- */
- def mixinQualifierOpt(): Name =
- if (s.token == LBRACKET) {
- s.nextToken();
- val name = ident().toTypeName();
- accept(RBRACKET);
- name
- } else {
- TypeNames.EMPTY
- }
-
- /** StableId ::= Id
- * | StableRef `.' Id
- * | [Id '.'] super [MixinQualifier] ` `.' Id
- */
- def stableId(): Tree =
- stableRef(false, false);
-
- /** QualId ::= Id {`.' Id}
- */
- def qualId(): Tree = {
- val id = make.Ident(s.pos, ident());
- if (s.token == DOT) selectors(s.skipToken(), id, false)
- else id
- }
-
- /** SimpleExpr ::= literal
- * | symbol [ArgumentExprs]
- * | null
- *
- * @param isPattern
- * @param isNegated
- * @return
- */
- def literal(isPattern: Boolean, isNegated: Boolean): Tree = {
- def litToTree() = s.token match {
- case CHARLIT =>
- gen.mkCharLit(s.pos, s.intVal.asInstanceOf[Char])
- case INTLIT =>
- gen.mkIntLit(s.pos, s.intVal(isNegated).asInstanceOf[Int])
- case LONGLIT =>
- gen.mkLongLit(s.pos, s.intVal(isNegated))
- case FLOATLIT =>
- gen.mkFloatLit(s.pos, s.floatVal(isNegated).asInstanceOf[float])
- case DOUBLELIT =>
- gen.mkDoubleLit(s.pos, s.floatVal(isNegated))
- case STRINGLIT | SYMBOLLIT =>
- gen.mkStringLit(s.pos, s.name.toString())
- case TRUE =>
- gen.mkBooleanLit(s.pos, true)
- case FALSE =>
- gen.mkBooleanLit(s.pos, false)
- case NULL =>
- gen.mkNullLit(s.pos)
- case _ =>
- syntaxError("illegal literal", true);
- gen.mkZeroLit(s.pos)
- }
-
- val isSymLit = s.token == SYMBOLLIT;
- val t = litToTree();
- s.nextToken();
- if (isSymLit) {
- val pos = s.pos;
- /*
- if (s.token == LPAREN || s.token == LBRACE)
- xmlp.mkXML( pos, isPattern, t, argumentExprs() ); // xml shorthand
- else { // Symbol("name") */
- var symT = scalaDot(pos, Names.Symbol);
- if (isPattern) { symT = convertToTypeId(symT) };
- make.Apply(pos, symT, Predef.Array[Tree](t))
- /*} */
- } else {
- t
- }
- }
-
-//////// TYPES ///////////////////////////////////////////////////////////////
-
- /** TypedOpt ::= [`:' Type]
- */
- def typedOpt(): Tree =
- if (s.token == COLON) {
- s.nextToken();
- typ()
- } else {
- Tree.Empty
- }
-
- /** SimpleTypedOpt ::= [`:' SimpleType]
- */
- def simpleTypedOpt(): Tree =
- if (s.token == COLON) {
- s.nextToken();
- simpleType()
- } else {
- Tree.Empty
- }
-
- /** Types ::= Type {`,' Type}
- */
- def types(): Array[Tree] = {
- val ts = new myTreeList();
- ts.append(typ());
- while (s.token == COMMA) {
- s.nextToken();
- ts.append(typ());
- }
- ts.toArray()
- }
-
- /** Type ::= Type1 '=>' Type
- * | '(' [Types] ')' '=>' Type
- * | Type1
- */
- def typ(): Tree = {
- var t: Tree = _;
- if (s.token == LPAREN) {
- s.nextToken();
- if (s.token == RPAREN) {
- s.nextToken();
- val pos = accept(ARROW);
- return make.FunType(pos, Tree.EMPTY_ARRAY, typ());
- } else {
- t = typ();
- if (s.token == COMMA) {
- s.nextToken();
- val ts = new myTreeList();
- ts.append(t);
- ts.append(types());
- accept(RPAREN);
- val pos = accept(ARROW);
- return make.FunType(pos, ts.toArray(), typ());
- } else {
- accept(RPAREN);
- }
- }
- } else {
- t = type1()
- }
- if (s.token == ARROW)
- make.FunType(s.skipToken(), NewArray.Tree(t), typ())
- else
- t
- }
-
- /** Type1 ::= SimpleType {'with' SimpleType} [Refinement]
- */
- def type1(): Tree = {
- val pos = s.pos;
- val t = simpleType();
- if (s.token == WITH || s.token == LBRACE) {
- val ts = new myTreeList();
- ts.append(t);
- while (s.token == WITH) {
- s.nextToken();
- ts.append(simpleType());
- }
- val rs = if (s.token == LBRACE) refinement() else Tree.EMPTY_ARRAY;
- make.CompoundType(pos, ts.toArray(), rs)
- } else {
- t
- }
- }
-
- /** SimpleType ::= SimpleType TypeArgs
- * | SimpleType `#' Id
- * | StableId
- * | StableRef `.' type
- * | `(' Type `)'
- */
- def simpleType(): Tree = {
- val pos = s.pos;
- var t: Tree =
- if (s.token == LPAREN) {
- s.nextToken();
- val t = typ();
- accept(RPAREN);
- t
- } else {
- convertToTypeId(stableRef(false, true));
- }
- while (true) {
- if (s.token == HASH)
- t = make.SelectFromType(s.skipToken(), t, ident().toTypeName());
- else if (s.token == LBRACKET)
- t = make.AppliedType(pos, t, typeArgs());
- else
- return t;
- }
- null; //dummy
- }
-
- /** TypeArgs ::= `[' Types `]'
- */
- def typeArgs(): Array[Tree] = {
- accept(LBRACKET);
- val ts = types();
- accept(RBRACKET);
- ts
- }
-
-//////// EXPRESSIONS ////////////////////////////////////////////////////////
-
- /** EqualsExpr ::= `=' Expr
- */
- def equalsExpr(): Tree = {
- accept(EQUALS);
- expr()
- }
-
- /** Exprs ::= Expr {`,' Expr}
- * | Expr `:' `_' `*'
- def exprs(): Array[Tree] = { val ts = new myTreeList();
- ts.append(expr(true, false));
- while (s.token == COMMA) {
- s.nextToken();
- ts.append(expr());
- }
- ts.toArray()
- }
- */
-
- /** Exprs ::= Expr {`,' Expr} [ `:' `_' `*' ]
- */
- def exprs(): Array[Tree] = {
- val ts = new myTreeList();
- ts.append(expr(true, false));
- while (s.token == COMMA) {
- s.nextToken();
- ts.append(expr(true, false));
- }
- ts.toArray()
- }
-
- /** Expr ::= Bindings `=>' Expr
- * | Expr1
- * ResultExpr ::= Bindings `=>' Block
- * | Expr1
- * Expr1 ::= (' Expr `)' Expr [[`;'] else Expr]
- * | try `{' block `}' [catch Expr] [finally Expr]
- * | while `(' Expr `)' Expr
- * | do Expr [`;'] while `(' Expr `)'
- * | for `(' Enumerators `)' (do | yield) Expr
- * | throw Expr
- * | return [Expr]
- * | [SimpleExpr `.'] Id `=' Expr
- * | SimpleExpr ArgumentExprs `=' Expr
- * | `.' SimpleExpr
- * | PostfixExpr [`:' Type1]
- * Bindings ::= Id [`:' Type1]
- * | `(' [Binding {`,' Binding}] `)'
- * Binding ::= Id [`:' Type]
- */
-
- def expr(): Tree =
- expr(false, false);
-
- def expr(isArgument: boolean, isInBlock: boolean): Tree = {
- if (s.token == IF) {
- val pos = s.skipToken();
- accept(LPAREN);
- val cond = expr();
- accept(RPAREN);
- val thenp = expr();
- val elsep =
- if (s.token == ELSE) { s.nextToken(); expr() }
- else Tree.Empty;
- make.If(pos, cond, thenp, elsep)
- } else if (s.token == TRY) {
- val pos = s.skipToken();
- accept(LBRACE);
- val body = block(pos);
- accept(RBRACE);
- val catcher =
- if (s.token == CATCH) { s.nextToken(); expr() }
- else Tree.Empty;
- val finalizer =
- if (s.token == FINALLY) { s.nextToken(); expr() }
- else Tree.Empty;
- makeTry(pos, body, catcher, finalizer)
- } else if (s.token == WHILE) {
- val lname = Name.fromString("label$" + loopNestingDepth);
- loopNestingDepth = loopNestingDepth + 1;
- val pos = s.skipToken();
- accept(LPAREN);
- val cond = expr();
- accept(RPAREN);
- val body = expr();
- loopNestingDepth = loopNestingDepth - 1;
- makeWhile(pos, lname, cond, body)
- } else if (s.token == DO) {
- val lname = Name.fromString("label$" + loopNestingDepth);
- loopNestingDepth = loopNestingDepth + 1;
- val pos = s.skipToken();
- val body = expr();
- if (s.token == SEMI) s.nextToken();
- accept(WHILE);
- accept(LPAREN);
- val cond = expr();
- accept(RPAREN);
- loopNestingDepth = loopNestingDepth - 1;
- makeDoWhile(pos, lname, body, cond)
- } else if (s.token == FOR) {
- s.nextToken();
- accept(LPAREN);
- val enums = enumerators();
- accept(RPAREN);
- if (s.token == YIELD)
- makeFor(s.skipToken(), enums, Names.map, Names.flatmap, expr())
- else
- makeFor(s.pos, enums, Names.foreach, Names.foreach, expr())
- } else if (s.token == RETURN) {
- val pos = s.skipToken();
- val e =
- if (isExprIntro()) expr()
- else gen.mkUnitLit(pos);
- make.Return(pos, e)
- } else if (s.token == THROW) {
- val pos = s.skipToken();
- make.Throw(pos, expr())
- } else if (s.token == DOT) {
- val pos = s.skipToken();
- if (s.token == IDENTIFIER)
- makeClosure(pos, simpleExpr())
- else {
- syntaxError("identifier expected", true);
- gen.mkZeroLit(pos);
- }
- } else {
- var t = postfixExpr();
- if (s.token == EQUALS) {
- t match {
- case Tree.Ident(_) | Tree.Select(_, _) | Tree.Apply(_, _) =>
- t = make.Assign(s.skipToken(), t, expr());
- case _ =>
- }
- } else if (s.token == COLON) {
- val pos = s.skipToken();
- if (isArgument && s.token == USCORE) {
- val pos1 = s.skipToken();
- if (s.token == IDENTIFIER && s.name == Names.STAR) {
- s.nextToken();
- /*
- if (s.token != RPAREN)
- syntaxError(s.pos, " escaping sequences only allowed for last argument", true);
- */
- t = make.Typed(
- pos, t, make.Ident(pos1, TypeNames.WILDCARD_STAR));
- } else {
- syntaxError(s.pos, "`*' expected", true);
- }
- } else {
- val tp = type1();
- t = make.Typed(pos, t, tp);
- }
- }
- if (s.token == ARROW) {
- val arrowpos = s.skipToken();
- t = make.Function(arrowpos, convertToParams(t),
- if (isInBlock) block(arrowpos) else expr());
- }
- t
- }
- }
-
- /** PostfixExpr ::= [`.'] InfixExpr [Id]
- * InfixExpr ::= PrefixExpr
- * | InfixExpr Id InfixExpr
- */
- def postfixExpr(): Tree = {
- val base = sp;
- var top = prefixExpr();
- while (s.token == IDENTIFIER) {
- top = reduceStack(
- true, base, top, precedence(s.name), isLeftAssoc(s.name));
- push(top, s.pos, s.name);
- ident();
- if (isExprIntro()) {
- top = prefixExpr();
- } else {
- sp = sp - 1;
- val pos = positions(sp);
- val postOp = operators(sp);
- top = reduceStack(true, base, operands(sp), 0, true);
- return make.Select(pos, top, NameTransformer.encode(postOp));
- }
- }
- reduceStack(true, base, top, 0, true)
- }
-
- /** PrefixExpr ::= [`-' | `+' | `~' | `!'] SimpleExpr
- */
- def prefixExpr(): Tree =
- if (s.token == IDENTIFIER && s.name == MINUS) {
- val name = ident();
- s.token match {
- case INTLIT | LONGLIT | FLOATLIT | DOUBLELIT =>
- return literal(false, true);
- case _ =>
- make.Select(s.pos, simpleExpr(), name);
- }
- } else if (s.token == IDENTIFIER &&
- (s.name == PLUS ||
- s.name == TILDE ||
- s.name == BANG)) {
- val name = ident();
- make.Select(s.pos, simpleExpr(), name);
- } else {
- simpleExpr()
- }
-
- /** SimpleExpr ::= literal
- * | xLiteral
- * | StableRef
- * | `(' [Expr] `)'
- * | BlockExpr
- * | new Template
- * | SimpleExpr `.' Id
- * | SimpleExpr TypeArgs
- * | SimpleExpr ArgumentExprs
- */
- def simpleExpr(): Tree = {
- var t: Tree = null;
- //Console.println("simpleExpr, s.lastch="+s.lastch+" token = "+token2string(s.token));
- s.token match {
- case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT | STRINGLIT |
- SYMBOLLIT | TRUE | FALSE | NULL =>
- t = literal(false, false);
- case XMLSTART =>
- t = xmlp.xLiteral;
- case IDENTIFIER | THIS | SUPER =>
- t = stableRef(true, false);
- case LPAREN =>
- val pos = s.skipToken();
- if (s.token == RPAREN) {
- s.nextToken();
- t = gen.mkUnitLit(pos);
- } else {
- t = expr();
- if (s.token == COMMA) {
- val commapos = s.skipToken();
- val ts = new myTreeList();
- ts.append(t);
- ts.append(exprs());
- accept(RPAREN);
- if (s.token == ARROW) {
- t = make.Function(
- pos, convertToParams(ts.toArray()), Tree.Empty);
- } else {
- syntaxError(commapos, "`)' expected", false);
- t = gen.mkZeroLit(pos)
- }
- } else {
- accept(RPAREN);
- }
- }
- case LBRACE =>
- t = blockExpr();
- case NEW =>
- val pos = s.skipToken();
- val templ = template();
- if (templ.parents.length == 1 && templ.body.length == 0) {
- t = make.New(pos, templ.parents(0));
- } else {
- // flags == SYNTHETIC and name = ANON indicate an anonymous class
- val flags = Modifiers.SYNTHETIC;
- val name = Names.ANON_CLASS_NAME.toTypeName();
- val cd: Tree = make.ClassDef(
- templ.pos,
- flags,
- name,
- Tree.AbsTypeDef_EMPTY_ARRAY,
- NewArray.ValDefArray(Tree.ValDef_EMPTY_ARRAY),
- Tree.Empty,
- templ);
- t = make.Block(
- pos, Predef.Array[Tree](cd), make.New(
- pos, make.Apply(pos, make.Ident(pos, name), Tree.EMPTY_ARRAY)));
- }
- case _ =>
- syntaxError("illegal start of expression", true);
- return gen.mkZeroLit(s.pos);
- }
- while (true) {
- s.token match {
- case DOT =>
- t = make.Select(s.skipToken(), t, ident());
- case LBRACKET =>
- t match {
- case Tree.Ident(_) | Tree.Select(_, _) =>
- t = make.TypeApply(s.pos, t, typeArgs());
- case _ =>
- return t;
- }
- case LPAREN | LBRACE =>
- t = make.Apply(s.pos, t, argumentExprs());
- case _ =>
- return t;
- }
- }
- null;//dummy
- }
-
- /** ArgumentExprs ::= `(' [Exprs] `)'
- * | BlockExpr
- */
- def argumentExprs(): Array[Tree] = {
- var ts = Tree.EMPTY_ARRAY;
- if (s.token == LBRACE) {
- ts = NewArray.Tree(blockExpr());
- } else {
- accept(LPAREN);
- if (s.token != RPAREN)
- ts = exprs();
- accept(RPAREN);
- }
- ts
- }
-
- /** BlockExpr ::= `{' CaseClause {CaseClause} `}'
- * | `{' Block `}'
- */
- def blockExpr(): Tree = {
- val pos = accept(LBRACE);
- val res =
- if (s.token == CASE) {
- val stats = new myTreeList();
- do {
- stats.append(caseClause());
- } while (s.token == CASE);
- make.Visitor(pos,
- stats.copyTo(new Array[Tree.CaseDef](stats.length())))
- } else {
- block(pos);
- }
- accept(RBRACE);
- res
- }
-
- /** Block ::= BlockStatSeq
- */
- def block(pos: Int): Tree = {
- block(pos, blockStatSeq(new myTreeList()));
- }
- private def block(pos: Int, stats: Array[Tree]): Tree = {
- if (stats.length == 0)
- gen.mkUnitLit(pos);
- else if (!stats(stats.length - 1).isTerm())
- make.Block(pos, stats, gen.mkUnitLit(pos));
- else if (stats.length == 1)
- return stats(0);
- else {
- val trees: Array[Tree] = new Array[Tree](stats.length - 1);
- System.arraycopy(stats, 0, trees, 0, trees.length);
- return make.Block(pos, trees, stats(stats.length - 1));
- }
- }
-
- /** caseClause : =>= case Pattern [if PostfixExpr] `=>' Block
- */
- def caseClause(): Tree = {
- val pos = accept(CASE);
- val pat = validPattern();
- val guard =
- if (s.token == IF) { s.nextToken(); postfixExpr() }
- else Tree.Empty;
- make.CaseDef(pos, pat, guard, block(accept(ARROW)))
- }
-
- /** Enumerators ::= Generator {`;' Enumerator}
- * Enumerator ::= Generator
- * | Expr
- */
- def enumerators(): Array[Tree] = {
- val enums = new myTreeList();
- enums.append(generator());
- while (s.token == SEMI) {
- s.nextToken();
- if (s.token == VAL) enums.append(generator());
- else enums.append(expr());
- }
- enums.toArray()
- }
-
- /** Generator ::= val Pattern1 `<-' Expr
- */
- def generator(): Tree = {
- val pos = accept(VAL);
- val pat = validPattern1();
- accept(LARROW);
- var rhs = expr();
- if (!TreeInfo.isVarPattern(pat))
- rhs = make.Apply(
- rhs.pos,
- make.Select(rhs.pos, rhs, Names.filter),
- NewArray.Tree(
- make.Visitor(
- rhs.pos,
- NewArray.CaseDef(
- make.CaseDef(
- rhs.pos, pat.duplicate(),
- Tree.Empty, gen.mkBooleanLit(s.pos, true)),
- make.CaseDef(
- rhs.pos, make.Ident(rhs.pos, Names.PATTERN_WILDCARD),
- Tree.Empty, gen.mkBooleanLit(s.pos, false))))));
- make.PatDef(pos, 0, pat, rhs)
- }
-
-//////// PATTERNS ////////////////////////////////////////////////////////////
-
- /** Pattern ( see pattern() ) which is checked for validity
- */
- def validPattern(): Tree = {
- val pos = s.pos;
- val pat = pattern();
- if (this.pN.check(pat)) { // reports syntax errors as side effect
- // normalize
- pN.wrapAlternative(pN.elimSequence(pN.flattenSequence(pat)))
- } else {
- make.Ident(pos, Names.PATTERN_WILDCARD)
- }
- }
-
- /** Pattern1 ( see pattern1() ) which is checked for validity
- */
- def validPattern1(): Tree = {
- val pos = s.pos;
- val pat = pattern1();
- if (this.pN.check(pat)) { // reports syntax errors as side effect
- pN.wrapAlternative(pN.elimSequence(pN.flattenSequence(pat)))
- } else {
- make.Ident(pos, Names.PATTERN_WILDCARD)
- }
- }
-
- /** Patterns ::= Pattern {`,' Pattern}
- */
- def patterns(): Array[Tree] = {
- val ts = new myTreeList();
- ts.append(pattern());
- while (s.token == COMMA) {
- s.nextToken();
- ts.append(pattern());
- }
- ts.toArray()
- }
-
- /** Pattern ::= Pattern1 { `|' Pattern1 }
- */
- def pattern(): Tree = {
- val pos = s.pos;
- val first = pattern1();
- if (s.token == IDENTIFIER && s.name == BAR) {
- val choices = new myTreeList();
- choices.append(first);
- while (s.token == IDENTIFIER && s.name == BAR) {
- s.nextToken();
- choices.append(pattern1());
- }
- val tarr = choices.toArray();
- val ts = pN.flattenAlternativeChildren(tarr);
- return pN.flattenAlternative(make.Alternative(pos, ts.toArray()));
- }
- first
- }
-
- /** Pattern1 ::= varid `:' Type1
- * | `_' `:' Type1
- * | Pattern2
- */
- def pattern1(): Tree = {
- val p = pattern2();
- if (s.token == COLON && TreeInfo.isVarPattern(p))
- make.Typed(s.skipToken(), p, type1())
- else p
- }
-
- /** Pattern2 ::= varid [ @ Pattern3 ]
- * | Pattern3
- */
- def pattern2(): Tree = {
- val p = pattern3();
- if (s.token == AT && TreeInfo.isVarPattern(p)) {
- p match {
- case Tree.Ident(name) =>
- if (name == Names.PATTERN_WILDCARD) return pattern3()
- case _ =>
- }
- make.Bind(s.skipToken(), p.asInstanceOf[Tree.Ident].name, pattern3());
- } else {
- p
- }
- }
-
- /* Pattern3 ::= SimplePattern [ '*' | '?' | '+' ]
- * | SimplePattern {Id SimplePattern} // op2 must not be empty
- */
- def pattern3(): Tree = {
- val base = sp;
- var top = simplePattern();
- if (s.token == IDENTIFIER) {
- if (s.name == STAR) { /* p* becomes z@( |(p,z)) */
- s.nextToken();
- val zname = fresh();
- val zvar = make.Ident(s.pos, zname);
- return make.Bind(
- s.pos, zname,
- pN.flattenAlternative(
- make.Alternative(s.pos, NewArray.Tree(
- make.Sequence(s.pos, Tree.EMPTY_ARRAY),
- pN.flattenSequence(make.Sequence(s.pos, NewArray.Tree(
- top, zvar)))))));
- } else if (s.name == PLUS) { /* p+ becomes z@(p,(z| )) */
- s.nextToken();
- val zname = fresh();
- val zvar = make.Ident(s.pos, zname);
- return make.Bind(
- s.pos, zname,
- pN.flattenSequence(make.Sequence(s.pos, NewArray.Tree(
- top,
- pN.flattenAlternative(make.Alternative(s.pos, NewArray.Tree(
- zvar, make.Sequence(s.pos, Tree.EMPTY_ARRAY))))))));
- } else if (s.name == OPT) { /* p? becomes (p| ) */
- s.nextToken();
- return pN.flattenAlternative(make.Alternative(s.pos, NewArray.Tree(
- top,
- make.Sequence(s.pos, Tree.EMPTY_ARRAY))));
- }
- }
- while ((s.token == IDENTIFIER) && (s.name != BAR)) {
- val tokn = s.name; // for error message
- top = reduceStack(
- false, base, top, precedence(s.name), isLeftAssoc(s.name));
- push(top, s.pos, s.name);
- ident();
- top = simplePattern();
- if (TreeInfo.isEmptySequence(top)) {
- syntaxError(top.pos, "2nd argument to binary op "+ s.name + " may not be empty sequence pattern", false);
- }
- }
- reduceStack(false, base, top, 0, true)
- }
-
- /** simplePattern ::= varid
- * | `_'
- * | literal
- * | `<' xLiteralPattern
- * | StableId [ `(' [Patterns] `)' ]
- * | `(' [Patterns] `)'
- * | (word: empty - nothing)
- */
- def simplePattern(): Tree = s.token match {
- case RPAREN | COMMA =>
- make.Sequence(s.pos, Tree.EMPTY_ARRAY) // ((nothing))
- case XMLSTART =>
- xmlp.xLiteralPattern
- case IDENTIFIER | THIS =>
- if (s.name == BAR) {
- make.Sequence(s.pos, Tree.EMPTY_ARRAY); // ((nothing))
- } else {
- var t = stableId();
- s.token match {
- case INTLIT | LONGLIT | FLOATLIT | DOUBLELIT =>
- t match {
- case Tree.Ident(name) if name == Names.MINUS =>
- return literal(true, true);
- case _ =>
- }
- case _ =>
- }
- while (s.token == LPAREN) {
- var ts = Tree.EMPTY_ARRAY;
- accept(LPAREN);
- if (s.token != RPAREN)
- ts = patterns();
- accept(RPAREN);
- t = make.Apply(s.pos, convertToTypeId(t), ts);
- }
- t
- }
- case USCORE =>
- make.Ident(s.skipToken(), Names.PATTERN_WILDCARD)
- case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
- STRINGLIT | SYMBOLLIT | TRUE | FALSE | NULL =>
- literal(true, false)
- case LPAREN =>
- val p = s.pos;
- s.nextToken();
- val ts = if (s.token == RPAREN) Tree.EMPTY_ARRAY else patterns();
- var t: Tree = null;
- if (ts.length == 1 && !ts(0).isInstanceOf[Tree.Alternative]) {
- t = ts(0);
- } else {
- t = pN.flattenSequence(make.Sequence(s.pos, ts));
- t = pN.elimSequence(t);
- }
- accept(RPAREN);
- t
- case _ =>
- syntaxError("illegal start of pattern", true);
- make.Ident(s.pos, Names.PATTERN_WILDCARD)
- }
-
-////////// MODIFIERS ////////////////////////////////////////////////////////////
-
- /** Modifiers ::= {Modifier}
- * Modifier ::= final
- * | private
- * | protected
- * | override
- * | abstract
- */
- def modifiers(): Int = {
-// pushComment();
- var mods = 0;
- while (true) {
- var mod = 0;
- s.token match {
- case ABSTRACT =>
- mod = Modifiers.ABSTRACT;
- case FINAL =>
- mod = Modifiers.FINAL;
- case SEALED =>
- mod = Modifiers.SEALED;
- case PRIVATE =>
- mod = Modifiers.PRIVATE;
- case IMPLICIT =>
- mod = 0;
- case PROTECTED =>
- mod = Modifiers.PROTECTED;
- case OVERRIDE =>
- mod = Modifiers.OVERRIDE;
- case _ =>
- return mods;
- }
- if ((mods & mod) != 0)
- syntaxError(s.pos, "repeated modifier", false);
- mods = mods | mod;
- s.nextToken();
- }
- 0 //dummy
- }
-
- /** LocalModifiers ::= {LocalModifier}
- * LocalModifier ::= final
- * | private
- */
- def localClassModifiers(): Int = {
- var mods = 0;
- while (true) {
- var mod = 0;
- s.token match {
- case ABSTRACT =>
- mod = Modifiers.ABSTRACT;
- case FINAL =>
- mod = Modifiers.FINAL;
- case SEALED =>
- mod = Modifiers.SEALED;
- case _ =>
- return mods;
- }
- if ((mods & mod) != 0)
- syntaxError(s.pos, "repeated modifier", false);
- mods = mods | mod;
- s.nextToken();
- }
- 0 //dummy
- }
-
-//////// PARAMETERS //////////////////////////////////////////////////////////
-
- // invariant: only only activation record of paramClauses on stack
- var paramClauses_buffer = new mutable.ArrayBuffer[Array[Tree.ValDef]]();
-
- /** ParamClauses ::= {ParamClause}
- */
- def paramClauses(): Array[Array[Tree.ValDef]] = { //pre: buffer empty
- while (s.token == LPAREN)
- paramClauses_buffer += paramClause(false);
-
- val res = new Array[Array[Tree.ValDef]](paramClauses_buffer.length);
- paramClauses_buffer.elements.copyToArray(res, 0);
- paramClauses_buffer.clear; //post: buffer empty
- res
- }
-
- /** ParamClauseOpt ::= [ParamClause]
- */
- def paramClauseOpt(ofPrimaryConstructor: boolean): Array[Array[Tree.ValDef]] =
- if (s.token == LPAREN) NewArray.ValDefArray(paramClause(ofPrimaryConstructor))
- else Tree.ValDef_EMPTY_ARRAY_ARRAY;
-
- /** ParamClause ::= `(' [Param {`,' Param}] `)'
- * ClassParamClause ::= `(' [ClassParam {`,' ClassParam}] `)'
- */
- def paramClause(ofPrimaryConstructor: boolean): Array[Tree.ValDef] = {
- val pos = accept(LPAREN);
- val params = new myTreeList();
- if (s.token != RPAREN) {
- params.append(param(ofPrimaryConstructor));
- while (s.token == COMMA) {
- s.nextToken();
- params.append(param(ofPrimaryConstructor));
- }
- }
- accept(RPAREN);
- params.copyTo(new Array[Tree.ValDef](params.length()))
- }
-
- /** Param ::= Id `:' ParamType
- * ParamType ::= Type | Type `*' | `=>' Type
- * ClassParam ::= [[modifiers] val] Param
- */
- def param(ofPrimaryConstructor: boolean): Tree.ValDef = {
- val pos = s.pos;
- var mods = if (ofPrimaryConstructor) modifiers() | Modifiers.PARAM else Modifiers.PARAM;
- if (ofPrimaryConstructor) {
- if (s.token == VAL) {
- s.nextToken(); mods = mods | Modifiers.PARAMACCESSOR;
- } else if (mods != Modifiers.PARAM) {
- accept(VAL);
- }
- }
- if (s.token == DEF) {
- mods = mods | Modifiers.DEF;
- //if (ofPrimaryConstructor)
- s.unit.warning(s.pos, "def-parameter syntax `def x: T' is deprecated \n" +
- "use `x: => T' instead");
- s.nextToken();
- }
- val name = ident();
- accept(COLON);
- var tp: Tree = null;
- if (s.token == ARROW) {
- mods = mods | Modifiers.DEF;
- s.nextToken();
- tp = typ();
- } else {
- tp = typ();
- if (s.token == IDENTIFIER && s.name == STAR) {
- s.nextToken();
- mods = mods | Modifiers.REPEATED;
- tp = make.AppliedType(
- tp.pos,
- scalaDot(tp.pos, Names.Seq.toTypeName()),
- NewArray.Tree(tp));
- }
- }
- make.ValDef(pos, mods, name, tp, Tree.Empty)
- }
-
- /** TypeParamClauseOpt ::= [`[' TypeParam {`,' TypeParam} `]']
- * FunTypeParamClauseOpt ::= [`[' FunTypeParam {`,' FunTypeParam} `]']
- */
- def typeParamClauseOpt(variant: boolean): Array[Tree.AbsTypeDef] = {
- val params = new myTreeList();
- if (s.token == LBRACKET) {
- s.nextToken();
- params.append(typeParam(variant));
- while (s.token == COMMA) {
- s.nextToken();
- params.append(typeParam(variant));
- }
- accept(RBRACKET);
- }
- params.copyTo(new Array[Tree.AbsTypeDef](params.length()))
- }
-
- /** TypeParam ::= [`+' | `-'] FunTypeParam
- * FunTypeParam ::= Id TypeBounds
- */
- def typeParam(variant: boolean): Tree = {
- var mods = Modifiers.PARAM;
- if (variant && s.token == IDENTIFIER) {
- if (s.name == PLUS) {
- s.nextToken();
- mods = mods | Modifiers.COVARIANT;
- } else if (s.name == MINUS) {
- s.nextToken();
- mods = mods | Modifiers.CONTRAVARIANT;
- }
- }
- typeBounds(s.pos, mods, ident())
- }
-
- /** TypeBounds ::= [`>:' Type] [`<:' Type | `<%' Type]
- */
- def typeBounds(pos: Int, _mods: Int, name: Name): Tree = {
- var mods = _mods;
- val lobound =
- if (s.token == SUPERTYPE) { s.nextToken(); typ() }
- else scalaDot(pos, Names.All.toTypeName());
- val hibound =
- if (s.token == SUBTYPE) {
- s.nextToken();
- typ()
- } else if ((mods & Modifiers.PARAM) != 0 && s.token == VIEWBOUND) {
- mods = mods | Modifiers.VIEWBOUND;
- s.nextToken();
- typ()
- } else
- scalaDot(pos, Names.Any.toTypeName());
- make.AbsTypeDef(pos, mods, name.toTypeName(), hibound, lobound)
- }
-
-//////// DEFS ////////////////////////////////////////////////////////////////
-
- /** Import ::= import ImportExpr {`,' ImportExpr}
- */
- def importClause(): Array[Tree] = {
- accept(IMPORT);
- val ts = new myTreeList();
- ts.append(importExpr());
- while (s.token == COMMA) {
- s.nextToken();
- ts.append(importExpr());
- }
- ts.toArray()
- }
-
- /** ImportRef ::= StableId `.' (Id | `_' | ImportSelectors)
- */
- def importExpr(): Tree = {
- var t: Tree = null;
- val startpos = s.pos;
- var pos = 0;
- if (s.token == THIS) {
- t = make.This(s.skipToken(), TypeNames.EMPTY);
- t = make.Select(accept(DOT), t, ident());
- pos = accept(DOT);
- } else {
- val i: Tree.Ident = make.Ident(s.pos, ident());
- pos = accept(DOT);
- if (s.token == THIS) {
- s.nextToken();
- t = make.This(i.pos, i.name.toTypeName());
- t = make.Select(accept(DOT), t, ident());
- pos = accept(DOT);
- } else {
- t = i;
- }
- }
- while (true) {
- if (s.token == USCORE) {
- s.nextToken();
- return make.Import(startpos, t, NewArray.Name(Names.IMPORT_WILDCARD));
- } else if (s.token == LBRACE) {
- return make.Import(startpos, t, importSelectors());
- } else {
- val name = ident();
- if (s.token == DOT) {
- t = make.Select(pos, t, name);
- pos = accept(DOT);
- } else {
- return make.Import(startpos, t, NewArray.Name(name, name));
- }
- }
- }
- null //dummy
- }
-
- /** ImportSelectors ::= `{' {ImportSelector `,'} (ImportSelector | `_') `}'
- */
- def importSelectors(): Array[Name] = {
- val names = new ListBuffer[Name]();
- accept(LBRACE);
- var isLast = importSelector(names);
- while (!isLast && s.token == COMMA) {
- s.nextToken();
- isLast = importSelector(names);
- }
- accept(RBRACE);
- names.copyToArray(new Array[Name](names.length), 0)
- }
-
- /** ImportSelector ::= Id [`=>' Id | `=>' `_']
- */
- def importSelector(names: ListBuffer[Name]): boolean =
- if (s.token == USCORE) {
- s.nextToken();
- names += Names.IMPORT_WILDCARD;
- true
- } else {
- val name = ident();
- names += name;
- if (s.token == ARROW) {
- s.nextToken();
- if (s.token == USCORE) {
- s.nextToken();
- names += Names.IMPORT_WILDCARD;
- } else {
- names += ident();
- }
- } else {
- names += name;
- }
- false
- }
-
- /** Def ::= val PatDef
- * | var VarDef
- * | def FunDef
- * | type TypeDef
- * | ClsDef
- * Dcl ::= val ValDcl
- * | var ValDcl
- * | def FunDcl
- * | type TypeDcl
- */
- def defOrDcl(mods: Int): Array[Tree] = {
- s.token match {
- case VAL =>
- patDefOrDcl(mods);
- case VAR =>
- varDefOrDcl(mods);
- case DEF =>
- funDefOrDcl(mods);
- case TYPE =>
- s.nextToken();
- val ts = new myTreeList();
- ts.append(typeDefOrDcl(mods));
- ts.toArray()
- case _ =>
- clsDef(mods)
- }
- }
-
- /** ClsDef ::= ([case] class | trait) ClassDef {`,' ClassDef}
- * | [case] object ObjectDef {`,' ObjectDef}
- */
- def clsDef(mods: Int): Array[Tree] = {
- s.token match {
- case TRAIT =>
- classDef(mods | Modifiers.TRAIT | Modifiers.ABSTRACT);
- case CLASS =>
- classDef(mods);
- case CASECLASS =>
- classDef(mods | Modifiers.CASE);
- case OBJECT =>
- objectDef(mods);
- case CASEOBJECT =>
- objectDef(mods | Modifiers.CASE);
- case _ =>
- syntaxError("illegal start of definition", true);
- Tree.EMPTY_ARRAY
- }
- }
-
- /** PatDef ::= Pattern2 [`:' Type] `=' Expr
- * ValDcl ::= Id `:' Type
- */
- def patDefOrDcl(mods: Int): Array[Tree] = {
- var lhs = new myTreeList();
- do {
- s.nextToken();
- val pat = pattern2();
- pN.check(pat); // bq: to catch `val y + = 3' bug #371
- lhs.append(pat);
- } while (s.token == COMMA);
- val tp = typedOpt();
- val rhs = if (tp == Tree.Empty || s.token == EQUALS) equalsExpr() else Tree.Empty;
- val ls = lhs.toArray();
- val ts = new myTreeList();
- var i = 0;
- if (rhs == Tree.Empty) {
- while (i < ls.length) {
- ls(i) match {
- case Tree.Ident(name) =>
- ts.append(
- make.ValDef(ls(i).pos, mods | Modifiers.DEFERRED, name, tp.duplicate(), Tree.Empty));
- case t =>
- syntaxError(t.pos, "cannot defer pattern definition", false);
- }
- i = i + 1;
- }
- } else {
- while (i < ls.length) {
- ls(i) match {
- case Tree.Ident(name) =>
- ts.append(
- make.ValDef(ls(i).pos, mods, name, tp.duplicate(), rhs.duplicate()));
- case t =>
- ts.append(
- make.PatDef(t.pos, mods, t, rhs.duplicate()));
- }
- i = i + 1;
- }
- }
- ts.toArray()
- }
-
- /** VarDef ::= Id [`:' Type] `=' Expr
- * | Id `:' Type `=' `_'
- * VarDcl ::= Id `:' Type
- */
- def varDefOrDcl(mods: Int): Array[Tree] = {
- var newmods = mods | Modifiers.MUTABLE;
- val names = new ListBuffer[Pair[Int, Name]];
- do {
- s.nextToken();
- names.append(Pair(s.pos, ident()));
- } while (s.token == COMMA);
- val tp = typedOpt();
- val rhs = if (tp == Tree.Empty || s.token == EQUALS) {
- accept(EQUALS);
- if (tp != Tree.Empty && s.token == USCORE) {
- s.nextToken();
- Tree.Empty
- } else
- expr();
- } else {
- newmods = newmods | Modifiers.DEFERRED;
- Tree.Empty;
- }
- val ts = new myTreeList();
- names foreach { case Pair(p, n) =>
- ts.append(
- make.ValDef(p, newmods, n, tp.duplicate(), rhs.duplicate()));
- }
- ts.toArray()
- }
-
- /** FunDef ::= Id [FunTypeParamClause] {ParamClauses} [`:' Type] `=' Expr
- * | this ParamClause `=' ConstrExpr
- * FunDcl ::= Id [FunTypeParamClause] {ParamClauses} `:' Type
- */
- def funDefOrDcl(mods: Int): Array[Tree] = {
- val ts = new myTreeList();
- s.nextToken();
- if (s.token == THIS) {
- val pos = s.pos;
- s.nextToken();
- val vparams = NewArray.ValDefArray(paramClause(false));
- accept(EQUALS);
- ts.append(
- make.DefDef(
- pos, mods, Names.CONSTRUCTOR,
- Tree.AbsTypeDef_EMPTY_ARRAY, vparams, Tree.Empty,
- constrExpr()));
- } else {
- var newmods = mods;
- val lhs = new ListBuffer[Tuple4[Int, Name, Array[Tree.AbsTypeDef], Array[Array[Tree.ValDef]]]];
- var loop = true;
- while (loop) {
- lhs.append(Tuple4(s.pos, ident(),
- typeParamClauseOpt(false),
- paramClauses()));
- if (s.token == COMMA)
- s.nextToken();
- else
- loop = false;
- }
- val restype = typedOpt();
- val rhs = if (restype == Tree.Empty || s.token == EQUALS) {
- equalsExpr();
- } else {
- newmods = newmods | Modifiers.DEFERRED;
- Tree.Empty;
- }
- lhs foreach { case Tuple4(p, n, tp, vp) =>
- ts.append(
- make.DefDef(p, newmods, n, tp, vp, restype.duplicate(),
- rhs.duplicate()));
- }
- }
- ts.toArray()
- }
-
- /** ConstrExpr ::= SelfInvocation
- * | `{' SelfInvocation {`;' BlockStat} `}'
- * SelfInvocation ::= this ArgumentExpr
- */
- def constrExpr(): Tree =
- if (s.token == LBRACE) {
- val pos = s.skipToken();
- val statlist = new myTreeList();
- statlist.append(selfInvocation());
- val stats =
- if (s.token == SEMI) { s.nextToken(); blockStatSeq(statlist) }
- else statlist.toArray();
- accept(RBRACE);
- block(pos, stats)
- } else {
- selfInvocation()
- }
-
- /** SelfInvocation ::= this ArgumentExprs
- */
- def selfInvocation(): Tree = {
- val pos = s.pos;
- accept(THIS);
- make.Apply(
- s.pos, make.Ident(pos, Names.CONSTRUCTOR), argumentExprs());
- }
-
- /** TypeDef ::= Id `=' Type
- * TypeDcl ::= Id TypeBounds
- */
- def typeDefOrDcl(mods: Int): Tree = {
- val pos = s.pos;
- val name = ident().toTypeName();
- s.token match {
- case LBRACKET =>
- val tparams = typeParamClauseOpt(true);
- accept(EQUALS);
- make.AliasTypeDef(pos, mods, name, tparams, typ())
- case EQUALS =>
- s.nextToken();
- make.AliasTypeDef(pos, mods, name, Tree.AbsTypeDef_EMPTY_ARRAY, typ())
- case SUPERTYPE | SUBTYPE | VIEWBOUND | SEMI | COMMA | RBRACE =>
- typeBounds(pos, mods | Modifiers.DEFERRED, name)
- case _ =>
- syntaxError("`=', `>:', or `<:' expected", true);
- Tree.Empty;
- }
- }
-
- /** ClassDef ::= Id [TypeParamClause] [ClassParamClause] [`:' SimpleType] ClassTemplate
- */
- def classDef(mods: Int): Array[Tree] = {
- val lhs = new ListBuffer[Tuple4[Int, Name, Array[Tree.AbsTypeDef], Array[Array[Tree.ValDef]]]];
- do {
- s.nextToken();
- lhs.append(Tuple4(s.pos,
- ident().toTypeName(),
- typeParamClauseOpt(true),
- paramClauseOpt(true)));
- } while (s.token == COMMA);
- val thistpe = simpleTypedOpt();
- val template = classTemplate((mods & Modifiers.CASE) != 0);
-
- val ts = new myTreeList();
- lhs foreach { case Tuple4(p, n, tp, vp) =>
- ts.append(
- make.ClassDef(p, mods, n, tp, vp,
- thistpe.duplicate(),
- template.duplicate().asInstanceOf[Tree.Template]));
- }
- ts.toArray()
- }
-
- /** ObjectDef ::= Id { , Id } [`:' SimpleType] ClassTemplate
- */
- def objectDef(mods: Int): Array[Tree] = {
- val lhs = new ListBuffer[Pair[Int, Name]];
- do {
- s.nextToken();
- lhs.append(Pair(s.pos, ident()));
- } while (s.token == COMMA);
- val thistpe = simpleTypedOpt();
- val template = classTemplate((mods & Modifiers.CASE) != 0);
- val ts = new myTreeList();
- lhs foreach { case Pair(p, n) =>
- ts.append(
- make.ModuleDef(
- p, mods, n, thistpe.duplicate(),
- template.duplicate().asInstanceOf[Tree.Template]));
- }
- ts.toArray()
- }
-
- /** ClassTemplate ::= ['extends' Constr] {'with' Constr} [TemplateBody]
- */
- def classTemplate(isCaseClass: Boolean): Tree.Template = {
- val pos = s.pos;
- val parents = new myTreeList();
- if (s.token == EXTENDS) {
- s.nextToken();
- parents.append(constr());
- } else {
- parents.append(scalaAnyRefConstr(pos));
- }
- parents.append(scalaObjectConstr(pos));
- if (isCaseClass) {
- parents.append(caseClassConstr(pos));
- }
- if (s.token == WITH) {
- s.nextToken();
- template(parents)
- } else if (s.token == LBRACE) {
- make.Template(pos, parents.toArray(), templateBody());
- } else {
- if (!(s.token == SEMI || s.token == COMMA || s.token == RBRACE))
- syntaxError("`extends' or `{' expected", true);
- make.Template(
- pos, parents.toArray(), Tree.EMPTY_ARRAY);
- }
- }
-
-////////// TEMPLATES ////////////////////////////////////////////////////////////
-
-
- /** Template ::= Constr {'with' Constr} [TemplateBody]
- */
- def template(): Tree.Template =
- template(new myTreeList());
-
- def template(parents: myTreeList): Tree.Template = {
- val pos = s.pos;
- parents.append(constr());
- while (s.token == WITH) {
- s.nextToken();
- parents.append(constr());
- }
- val stats = if (s.token == LBRACE) templateBody() else Tree.EMPTY_ARRAY;
- make.Template(pos, parents.toArray(), stats)
- }
-
- /** Constr ::= StableId [TypeArgs] [`(' [Exprs] `)']
- */
- def constr(): Tree = {
- var t: Tree = convertToConstr(stableId());
- if (s.token == LBRACKET)
- t = make.AppliedType(s.pos, t, typeArgs());
- if (s.token == LPAREN)
- t = make.Apply(s.pos, t, argumentExprs());
- applyConstr(t)
- }
-
- /** TemplateBody ::= `{' [TemplateStat {`;' TemplateStat}] `}'
- */
- def templateBody(): Array[Tree] = {
- accept(LBRACE);
- var body = templateStatSeq();
- if (body.length == 0)
- body = NewArray.Tree(Tree.Empty);
- accept(RBRACE);
- body
- }
-
- /** Refinement ::= `{' [RefineStat {`;' RefineStat}] `}'
- */
- def refinement(): Array[Tree] = {
- accept(LBRACE);
- val body = refineStatSeq();
- accept(RBRACE);
- body
- }
-
-/////// STATSEQS //////////////////////////////////////////////////////////////
-
- /** Packaging ::= package QualId `{' TopStatSeq `}'
- */
- def packaging(): Tree = {
- val pos = accept(PACKAGE);
- val pkg = qualId();
- accept(LBRACE);
- val stats = topStatSeq();
- accept(RBRACE);
- makePackaging(pos, pkg, stats);
- }
-
- /** TopStatSeq ::= [TopStat {`;' TopStat}]
- * TopStat ::= AttributeClauses Modifiers ClsDef
- * | Packaging
- * | Import
- * |
- */
- def topStatSeq(): Array[Tree] = {
- val stats = new myTreeList();
- while (s.token != RBRACE && s.token != EOF) {
- if (s.token == PACKAGE) {
- stats.append(packaging());
- } else if (s.token == IMPORT) {
- stats.append(importClause());
- } else if (s.token == CLASS ||
- s.token == CASECLASS ||
- s.token == TRAIT ||
- s.token == OBJECT ||
- s.token == CASEOBJECT ||
- s.token == LBRACKET ||
- isModifier()) {
- stats.append(
- joinAttributes(
- attributeClauses(),
- joinComment(clsDef(modifiers()))));
- } else if (s.token != SEMI) {
- syntaxError("illegal start of class or object definition", true);
- }
- if (s.token != RBRACE && s.token != EOF) accept(SEMI);
- }
- stats.toArray()
- }
-
- /** TemplateStatSeq ::= TemplateStat {`;' TemplateStat}
- * TemplateStat ::= Import
- * | AttributeClauses Modifiers Def
- * | AttributeClauses Modifiers Dcl
- * | Expr
- * |
- */
- def templateStatSeq(): Array[Tree] = {
- val stats = new myTreeList();
- while (s.token != RBRACE && s.token != EOF) {
- if (s.token == IMPORT) {
- stats.append(importClause());
- } else if (isExprIntro()) {
- stats.append(expr());
- } else if (isDefIntro() || isModifier() || s.token == LBRACKET) {
- stats.append(
- joinAttributes(
- attributeClauses(),
- joinComment(defOrDcl(modifiers()))))
- } else if (s.token != SEMI) {
- syntaxError("illegal start of definition", true);
- }
- if (s.token != RBRACE) accept(SEMI);
- }
- stats.toArray()
- }
-
- /** AttributeClauses ::= {AttributeClause}
- * AttributeClause ::= `[' Attribute {`,' Attribute} `]'
- * Attribute ::= Constr
- */
- def attributeClauses(): List[Tree] = {
- var attrs: List[Tree] = List();
- while (s.token == LBRACKET) {
- s.nextToken();
- attrs = constr() :: attrs;
- while (s.token == COMMA) {
- s.nextToken();
- attrs = constr() :: attrs;
- }
- accept(RBRACKET);
- }
- attrs
- }
- def joinAttributes(attrs: List[Tree], defs: Array[Tree]): Array[Tree] = attrs match {
- case List() =>
- defs
- case attr :: attrs1 =>
- var i = 0; while (i < defs.length) {
- defs(i) = make.Attributed(attr.pos, attr, defs(i));
- i = i + 1;
- }
- joinAttributes(attrs1, defs)
- }
-
- /** RefineStatSeq ::= RefineStat {`;' RefineStat}
- * RefineStat ::= Dcl
- * | type TypeDef
- * |
- */
- def refineStatSeq(): Array[Tree] = {
- val stats = new myTreeList();
- while (s.token != RBRACE && s.token != EOF) {
- if (isDclIntro()) {
- stats.append(joinComment(defOrDcl(0)));
- } else if (s.token != SEMI) {
- syntaxError("illegal start of declaration", true);
- }
- if (s.token != RBRACE) accept(SEMI);
- }
- stats.toArray()
- }
-
- /** BlockStatSeq ::= { BlockStat `;' } [Expr]
- * BlockStat ::= Import
- * | Def
- * | LocalModifiers ClsDef
- * | Expr
- * |
- */
- def blockStatSeq(stats: myTreeList): Array[Tree] = {
- while ((s.token != RBRACE) && (s.token != EOF) && (s.token != CASE)) {
- if (s.token == IMPORT) {
- stats.append(importClause());
- accept(SEMI);
- } else if (isExprIntro()) {
- stats.append(expr(false, true));
- if (s.token != RBRACE && s.token != CASE) accept(SEMI);
- } else if (isDefIntro()) {
- stats.append(joinComment(defOrDcl(0)));
- accept(SEMI);
- if (s.token == RBRACE || s.token == CASE) {
- stats.append(gen.mkUnitLit(s.pos));
- }
- } else if (isLocalModifier()) {
- stats.append(joinComment(clsDef(localClassModifiers())));
- accept(SEMI);
- if (s.token == RBRACE || s.token == CASE) {
- stats.append(gen.mkUnitLit(s.pos));
- }
- } else if (s.token == SEMI) {
- s.nextToken();
- } else {
- syntaxError("illegal start of statement", true);
- }
- }
- stats.toArray()
- }
-
- /** CompilationUnit ::= [ package QualId ( `;' | `{' TopStatSeq `}' ) ] TopStatSeq .
- */
- def compilationUnit(): Array[Tree] = {
- if (s.token == PACKAGE) {
- val pos = s.skipToken();
- val pkg = qualId();
- if (s.token == SEMI) {
- s.nextToken();
- NewArray.Tree(makePackaging(pos, pkg, topStatSeq()));
- } else {
- val stats = new myTreeList();
- accept(LBRACE);
- stats.append(makePackaging(pos, pkg, topStatSeq()));
- accept(RBRACE);
- stats.append(topStatSeq());
- stats.toArray()
- }
- } else {
- topStatSeq()
- }
- }
-
-} // class Parser
-
-}
diff --git a/sources/scala/tools/scalac/ast/parser/ParserPhase.scala b/sources/scala/tools/scalac/ast/parser/ParserPhase.scala
deleted file mode 100644
index 2885ea10bf..0000000000
--- a/sources/scala/tools/scalac/ast/parser/ParserPhase.scala
+++ /dev/null
@@ -1,24 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global}
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-
-package scala.tools.scalac.ast.parser {
-
-class ParserPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends Phase(global, descriptor) {
-
- override def apply(unit: CompilationUnit): Unit = {
- global.timer.start();
- unit.body = new Parser(unit).parse();
- global.timer.stop("parsed " + unit.source);
- }
-}
-}
diff --git a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala b/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala
deleted file mode 100644
index 18b07049b3..0000000000
--- a/sources/scala/tools/scalac/ast/parser/PatternNormalizer.scala
+++ /dev/null
@@ -1,607 +0,0 @@
-/* __ *\
-** ______________ _/ /___ ______ **
-** / ___/ ___/ __ `/ / __ `/ ___/ (c) 2002-2004, LAMP/EPFL **
-** (__ ) /__/ /_/ / / /_/ / /__ **
-** /____/\___/\__,_/_/\__,_/\___/ **
-** **
-** $Id$ **
-\* */
-
-import scalac.ast._;
-import scalac._;
-import scala.Iterator;
-import scala.tools.scalac.util.NewArray;
-import scala.collection.immutable.ListMap ;
-import scala.collection.mutable.Buffer;
-
-import java.util.HashMap;
-import scalac.util.Names;
-
-/*
-import scalac.CompilationUnit;
-import scalac.ast.*;
-import scalac.util.Name;
-import Tree.*;
-*/
-
-package scala.tools.scalac.ast.parser {
-
- import scala.tools.scalac.ast.{TreeList => myTreeList}
-
- /** contains algorithms for `checking' and `normalizing' patterns
- *
- * @author Burak Emir
- * @version 1.0
- */
-
- class PatternNormalizer( unit:CompilationUnit ) {
-
- val make = unit.global.make ;
-
- //
- ///////// CHECKING patterns for well-formedness ///////////////////////////////
- //
-
- var seqDepth:int = 0;
-
- /** checks whether TO DO TO DO TO DO
- * - @-recursion occurs only at the end just below a sequence
- * returns true if the tree is ok.
- * inSeq: flag, true if we are in a sequence '[' ... ']'
- * t: the tree to be checked
- */
- protected def check1( t:Tree , inAlt:boolean ):boolean = {
- t match {
-
- case Tree$Literal( _ ) => true;
-
- case Tree$Apply( _, args ) =>
- seqDepth = seqDepth + 1;
- val res = check1( args, inAlt );
- seqDepth = seqDepth - 1;
- res;
-
- case Tree$Sequence( trees ) => // this is a hack to disallow deep binding
- seqDepth = seqDepth + 1;
- val res = check1( trees, inAlt );
- seqDepth = seqDepth - 1;
- res;
-
- case Tree$Alternative( trees ) =>
- check1( trees, true );
-
- case Tree$Bind( vble, tree ) =>
- if(( inAlt )&&( vble.toString().lastIndexOf("$") == -1)) {
-
- unit.error( t.pos, "variable binding not allowed under alternative");
- false;
-
- } else if(( seqDepth > 2 )&&( vble.toString().lastIndexOf("$") == -1)) {
- unit.error( t.pos,
- "sorry, deep binding not implemented");
- return false;
- } else {
- this.boundVars.put( vble, false );
- /*
- boolean result = check( tree, inSeq );
- if(((Boolean) this.boundVars.get( t.symbol() ))
- .booleanValue()) { // occurs recursively
- // do something to RESTRICT recursion
- }
- */
- check1( tree, inAlt );
- }
- case Tree$Typed( _, _ ) => true
-
- case Tree$Ident( vble ) =>
- if (inAlt && vble.isVariable() && vble != Names.PATTERN_WILDCARD &&
- vble.lastIndexOf('$') == -1) {
- unit.error( t.pos, "variable not allowed under alternative");
- return false;
- } else if(( this.boundVars.containsKey( vble /*t.symbol()*/ ))
- &&( vble.toString().lastIndexOf("$") == -1)) {
- unit.error( t.pos, "recursive patterns not allowed");
- false
- //this.boundVars.put( t.symbol(), Boolean.TRUE ); //mark recursive
- //System.out.println( t.symbol() + "occurs recursively");
- }
- else true;
-
- case Tree$Select( _, _ ) => true;
-
- case _ => /* never happens */
- unit.error( t.pos, "unexpected tree" + t );
- false
- }
- }
-
- /** checkPat for every tree in array of trees, see below
- */
- protected def check1( trees:Array[Tree], inAlt:boolean ):boolean = {
- var res = true;
- var i:int = 0; while (( i < trees.length ) && res) {
- res = check1( trees( i ), inAlt );
- i = i + 1;
- }
- res
- }
-
- // if this map contains a symbol as a key, it is bound.
- // if this symbol is mapped to Boolean.True, it occurs recursively
- /*Name=>Boolean*/ var boundVars:HashMap = _;
-
- /** method
- */
- def check( pat:Tree ):boolean = {
- this.boundVars = new HashMap();
-
- if(TreeInfo.isSequenceValued( pat ))
- unit.error( pat.pos, "sequence pattern not allowed here");
-
- //reject top-level sequence patterns
- /*
- pat match {
- case Tree$Sequence( _ ) =>
- unit.error( pat.pos, "sequences not allowed here"); false;
-
- case Tree$Alternative( args ) =>
- var res = true;
- var i = 0; while( res && (i < args.length )) {
- args( i ) match {
- case Tree$Sequence( _ ) =>
- unit.error( args( i ).pos, "sequences not allowed here");
- res = false;
- case _ =>
- };
- i = i + 1
- }
-
- case Tree$Bind(_, x) =>
- if(TreeInfo.isSequenceValued( pat ))
- unit.error( pat.pos, "sequence pattern not allowed here");
- case _ =>
- }
- */
- // reject deep binding
- if( TreeInfo.isRegularPattern( pat ) )
- this.seqDepth = 0;
- else
- this.seqDepth = -32; // don't care about sequences. see above
- check1( pat, false );
- }
-
-
- //
- /////////////// NORMALIZING patterns /////////////////////////////////////////////////////////////
- //
-
- def isEmptySequence( tree:Tree ):boolean = {
- tree match {
- case Tree$Sequence( trees ) =>
- //return ((trees.length == 1)&&( trees[ 0 ] == Tree.Empty ));
- trees.length == 0;
- case _ =>
- false;
- }
- }
-
- def isSequence( tree:Tree ):boolean = {
- tree match {
- case Tree$Sequence( _ ) => true
- case _ => false;
- }
- }
-
- /** appends every non-empty tree in trees to ts
- */
- def appendNonEmpty( ts:myTreeList, trees:Array[Tree] ):unit = {
- var i = 0; while ( i < trees.length ) {
- if( !isEmptySequence( trees( i ) ) )
- ts.append( trees( i ) );
- i = i + 1
- }
- }
-
- /** appends tree to ts if it is non-empty, leaves ts unchanged.
- */
- def appendNonEmpty( ts:myTreeList, tree:Tree ) = {
- if ( !isEmptySequence(tree))
- ts.append( tree );
- }
-
- /** takes a (possibly empty) myTreeList and make a Sequence out of it
- */
- def treeListToSequence( pos:int , ts:myTreeList ):Tree = {
- make.Sequence( pos, ts.toArray() );
- }
-
-
- /** (1) nested `Alternative' nodes are flattened (( tree traversal with clique contraction ))
- * if all branches are empty, empty subsequence is returned.
- * variables x are replaced by bindings x @ _
- */
-
- // apply `flattenAlternative' to each tree in ts
- def flattenAlternatives( ts:Array[Tree] ):Array[Tree] = {
- val res = new Array[Tree]( ts.length );
- var i = 0; while( i < ts.length ) {
- res( i ) = flattenAlternative( ts( i ) );
- i = i + 1 ;
- }
- res;
- }
-
- // main algo for (1)
- def flattenAlternative( tree:Tree ):Tree = {
- tree match {
- case Tree$Alternative( choices:Array[Tree] ) =>
- val cs = new myTreeList();
- var i = 0; while( i < choices.length ) {
- val child = choices( i );
- child match {
- case Tree$Alternative( child_choices ) => // grab its flattened children
- cs.append( flattenAlternativeChildren( child_choices ) );
- case _ =>
- cs.append( child );
- }
- i = i + 1;
- }
- val newtrees = cs.toArray();
- newtrees.length match {
- case 1 => newtrees( 0 );
- case 0 => make.Sequence( tree.pos, Tree.EMPTY_ARRAY );
- case _ => make.Alternative( tree.pos, cs.toArray() );
- }
-
- // recursive call
- case Tree$Sequence( trees) =>
- make.Sequence( tree.pos, flattenAlternatives( trees ));
- case Tree$Bind( vble, body ) =>
- make.Bind( tree.pos, vble, flattenAlternative( body ));
- case _ =>
- tree; // no alternatives can occur
- }
- }
-
- // main algo for (1), precondition: choices are children of an Alternative node
- def flattenAlternativeChildren( choices:Array[Tree] ):myTreeList = {
- var allEmpty = true;
- val cs = new myTreeList();
- var j = 0; while( j < choices.length ) {
- val tree = flattenAlternative( choices( j ) ); // flatten child
- tree match {
- case Tree$Alternative( child_choices:Array[Tree] ) =>
- val tmp = cs.length();
- appendNonEmpty( cs, child_choices );
- if( cs.length() != tmp )
- allEmpty = false;
- case _ =>
- cs.append( tree );
- allEmpty = allEmpty && TreeInfo.isEmptySequence( tree );
- }
- j = j + 1;
- }
- if( allEmpty ) {
- cs.clear();
- cs.append(make.Sequence(choices( 0 ).pos, Tree.EMPTY_ARRAY));
- }
- cs
- }
-
- /** (2) nested `Sequence' nodes are flattened (( clique elimination ))
- * nested empty subsequences get deleted
- * for Apply nodes, sequence arguments are removed
- */
-
- // apply `flattenSequence' to each tree in trees
- def flattenSequences( trees:Array[Tree] ):Array[Tree] = {
- val res = new Array[Tree]( trees.length );
- var i = 0;while( i < trees.length ) {
- res( i ) = flattenSequence( trees( i ) );
- i = i + 1;
- }
- res
- }
- // main algo for (2)
- def flattenSequence( tree:Tree ):Tree = {
- tree match {
- case Tree$Apply( fn, trees:Array[Tree] ) =>
- var li:List[Tree] = Nil;
- var i = 0; while( i < trees.length ) {
- trees(i) match {
- case Tree$Sequence( trees2:Array[Tree] ) =>
- Iterator.fromArray( flattenSequenceChildren( trees2 ).toArray() ).foreach {
- x:Tree => li = x::li;
- }
- case z => li = z::li;
- }
- i = i + 1;
- }
- val newtrees:Array[Tree] = new Array[Tree]( li.length );
- i = 0;
- for( val nt <- li.reverse.elements ) {
- newtrees( i ) = nt;
- i = i + 1;
- }
- make.Apply( tree.pos, fn, newtrees )
- /*
- case Sequence( Tree[] trees ):
- trees = flattenSequences( trees );
- if(( trees.length == 1 )&&( isEmptySequence( trees[ 0 ] )))
- trees = Tree.EMPTY_ARRAY;
- return make.Sequence( tree.pos, trees );
- */
- case Tree$Sequence( trees:Array[Tree] ) =>
- val ts = new myTreeList();
- var i = 0; while( i < trees.length ) {
- val child = trees( i );
- child match {
- case Tree$Sequence( child_trees ) => // grab its flattened children
- ts.append( flattenSequenceChildren( child_trees ) );
- case _ =>
- ts.append( child );
- }
- i = i + 1;
- }
- /*
- System.out.print("ts = ");
- for(int jj = 0; jj<ts.length(); jj++) {
- System.out.print(ts.get( jj ).toString()+" ");
- }
- System.out.println();
- */
- val t = treeListToSequence( tree.pos, ts ) ;
- t
- case Tree$Alternative( choices ) =>
- make.Alternative( tree.pos, flattenSequences( choices ));
- case Tree$Bind( vble, body ) =>
- make.Bind( tree.pos, vble, flattenSequence( body ));
- case _ => tree;
- }
- }
-
- // main algo for (2), precondition: trees are children of a Sequence node
- def flattenSequenceChildren( trees:Array[Tree] ):myTreeList = {
- val ts = new myTreeList();
- var j = 0; while( j < trees.length ) {
- val tree = flattenSequence( trees( j ) );
- tree match {
- case Tree$Sequence( child_trees ) =>
- appendNonEmpty( ts, child_trees );
- case _ =>
- appendNonEmpty( ts, tree );
- }
- j = j + 1;
- }
- ts;
- }
-
-
- /** (3) in `Sequence':
- * children of direct successor nodes labelled `Sequence' are moved up
- * (( tree traversal, left-to-right traversal ))
- */
-
- /** applies `elimSequence' to each tree is ts
- */
- def elimSequences( ts:Array[Tree] ):Array[Tree] = {
- val res = new Array[Tree] ( ts.length );
- var i = 0; while( i < ts.length ) {
- res( i ) = elimSequence( ts( i ) );
- i = i + 1
- }
- res;
- }
-
- def elimSequence( tree:Tree ):Tree = {
- tree match {
- case Tree$Sequence( trees ) =>
- // might be empty ...
- val newtrees = mergeHedge( trees ).toArray();
- if(( newtrees.length == 1 )&&( isEmptySequence( newtrees( 0 ) )))
- make.Sequence( tree.pos, Tree.EMPTY_ARRAY );
- else
- make.Sequence( tree.pos, newtrees );
-
- // recurse
- //case Sequence( Array[Tree] trees ): // after normalization (2), Sequence is flat
- /*
- myTreeList ts = new myTreeList();
- for( int i = 0; i < trees.length; i++ ) {
- Tree t = trees[ i ];
- //if( t != Tree.Empty ) // forget empty subsequences
- ts.append( elimSequence( t )); // recurse
- }
- return treeListToSequence( tree.pos, ts );
- */
- //return make.Sequence( tree.pos, elimSequences( trees ));
- case Tree$Alternative( choices ) =>
- val result = make.Alternative( tree.pos, elimSequences( choices ) );
- flattenAlternative( result ); // apply
- case Tree$Bind( vble, body ) =>
- make.Bind( tree.pos, vble, elimSequence( body ));
- case _ =>
- tree; // nothing to do
- }
- }
-
- /** runs through an array of trees, merging adjacent `Sequence' nodes if possible
- * returns a (possibly empty) myTreeList
- * precondition: trees are children of a Sequence node
- */
- def mergeHedge( trees:Array[Tree] ):myTreeList = {
- val ts = new myTreeList();
- if( trees.length > 1 ) { // more than one child
- var left = trees( 0 );
- var right:Tree = null;;
- var merge:Tree = null;
- var i = 0; while( i < trees.length - 1 ) {
- right = trees( i + 1 );
- merge = mergeThem( left, right );
- if( merge != null ) {
- left = merge;
- } else {
- ts.append( left );
- left = right;
- }
- i = i + 1;
- }
- if( merge!= null ) {
- ts.append( merge );
- } else if( right != null ) {
- ts.append( right );
- }
- } else if ( trees.length == 1 ) {
- //if( trees[ 0 ] != Tree.Empty )
- ts.append( trees( 0 ) ); // append the single child
- }
- ts;
- }
-
- /** if either left or right are subsequences, returns a new subsequences node
- * with the children of both, where any occurences of Tree.Empty are removed
- * otherwise, returns null. "move concatenation to the top"
- */
- def mergeThem( left:Tree, right:Tree ):Tree = {
- left match {
- case Tree$Sequence( treesLeft ) => // left tree is subsequence
- val ts = new myTreeList();
- appendNonEmpty( ts, treesLeft );
- right match {
- case Tree$Sequence( treesRight ) => // subsequence
- appendNonEmpty( ts, treesRight );
- case _ => // atom
- ts.append( right );
- };
- treeListToSequence( left.pos, ts );
-
- case _ => // left tree is atom
- right match {
- case Tree$Sequence( treesRight ) =>
- val ts = new myTreeList();
- ts.append( left );
- appendNonEmpty( ts, treesRight ); // ...and right tree is subsequence
- treeListToSequence( left.pos, ts );
- case _ => // right tree is atom -- no merge
- null
- }
- }
- }
-
-
-
- /* (4) If `Alternative' at least one subsequence branch, then we wrap every atom that may
- * occur in a `Sequence' tree
- * (( tree traversal ))
- */
-
- /** applies `warpAlternative' to each tree is ts
- */
- def wrapAlternatives( trees:Array[Tree] ):Array[Tree] = {
- val newts = new Array[Tree]( trees.length );
- var i = 0; while( i < trees.length ) {
- newts( i ) = wrapAlternative( trees( i ) );
- i = i + 1;
- }
- newts;
- }
-
- /** main algo for (4)
- */
- def wrapAlternative( tree:Tree ):Tree = {
- tree match {
- case Tree$Alternative( choices ) =>
- make.Alternative( tree.pos, wrapAlternativeChildren( choices ));
- // recursive
- case Tree$Sequence( trees ) =>
- make.Sequence( tree.pos, wrapAlternatives( trees ));
- case Tree$Bind( vble, body ) =>
- make.Bind( tree.pos, vble, wrapAlternative( body ));
-
- case Tree$Ident( name ) =>
- /*
- System.out.println( "in case Ident, name" +name);
- if ( name != Name.fromString("_")
- && ( boundVars.get( tree.symbol() ) == null )) {
-
- System.out.println("TRANSF, name:"+name);
-
- return make.Bind( tree.pos,
- name,
- make.Ident( tree.pos,
- Name.fromString("_") ))
- .symbol( tree.symbol() )
- .type( tree.type );
- }
- */
- tree;
-
- case _ =>
- tree;
-
- }
- }
-
- /** algo for (4), precondition: choices are direct successors of an `Alternative' node
- */
- def wrapAlternativeChildren( choices:Array[Tree] ):Array[Tree] = {
- val newchoices = new Array[Tree]( choices.length );
-
- var i = 0;while( i < choices.length ) {
- newchoices( i ) = wrapAlternative( choices( i ) ); // recursive call
- i = i + 1;
- }
-
- if( hasSequenceBranch( newchoices )) {
- var i = 0; while( i < choices.length ) {
- newchoices( i ) = wrapElement( choices( i ) );
- i = i + 1;
- }
- }
- newchoices
- }
-
- /** returns true if at least one tree in etrees is a subsequence value
- */
- def hasSequenceBranch( trees:Array[Tree] ):boolean = {
- var isSubseq = false;
- var i = 0; while( i < trees.length && !isSubseq ) {
- isSubseq = isSequenceBranch( trees( i ) );
- i = i + 1;
- }
- isSubseq;
- }
-
- /* returns true if the argument is a subsequence value, i.e. if
- * is is labelled `Sequence' or a `Bind' or an `Alternative' with a `Sequence' node below
- * precondition: choices are in normal form w.r.t. to (4)
- */
- def isSequenceBranch( tree:Tree ):boolean = {
- tree match {
- case Tree$Sequence( _ ) =>
- true;
- case Tree$Alternative( trees:Array[Tree] )=> // normal form -> just check first child
- trees( 0 ) match {
- case Tree$Sequence( _ ) => true;
- case _ => false;
- }
- case Tree$Bind( _, body ) =>
- isSequenceBranch( body );
- case _ =>
- false;
- }
- }
-
- def wrapElement( tree:Tree ):Tree = {
- tree match {
- case Tree$Sequence(_) =>
- tree;
- case _ =>
- make.Sequence(tree.pos, {val t = new Array[Tree]( 1 );t(0) = tree; t } );
- }
- }
-
- } /*class PatternNormalizer */
-
-} /* package */
-
diff --git a/sources/scala/tools/scalac/ast/parser/Scanner.scala b/sources/scala/tools/scalac/ast/parser/Scanner.scala
deleted file mode 100644
index 09b4e45960..0000000000
--- a/sources/scala/tools/scalac/ast/parser/Scanner.scala
+++ /dev/null
@@ -1,998 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import scalac._;
-import scalac.util.{Name, Names};
-import scalac.util.SourceRepresentation;
-
-package scala.tools.scalac.ast.parser {
-
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-/** A scanner for the programming language Scala.
- *
- * @author Matthias Zenger, Martin Odersky, Burak Emir
- * @version 1.1
- */
-class Scanner(_unit: CompilationUnit) extends TokenData {
-
- import Tokens._;
- import java.lang.{Integer, Long, Float, Double}
-
- val unit = _unit;
-
- val cbuf = new StringBuffer();
-
- /** buffer for the documentation comment
- */
- var docBuffer: StringBuffer = null;
-
- /** add the given character to the documentation buffer
- */
- protected def addCharToDoc(ch: Char): unit =
- if (docBuffer != null) docBuffer.append(ch);
-
- /** layout & character constants
- */
- val tabinc = 8;
- val LF = SourceFile.LF;
- val FF = SourceFile.FF;
- val CR = SourceFile.CR;
- val SU = SourceFile.SU;
-
- /** we need one token lookahead
- */
- val next = new TokenData();
- val prev = new TokenData();
-
- /** the first character position after the previous token
- */
- var lastpos = 0;
-
- /** the last error position
- */
- var errpos = -1;
-
- /** the input buffer:
- var buf: Array[Char] = unit.source.getContent();
- var bp: Int = -1;
- */
-
- class SourceIterator(charArray: Array[Char]) extends Iterator[Char] {
- val buf: Array[Char] = charArray;
- var bp: Int = -1;
- /* inv: true if buf( bp ) is last of an odd number of ASCII '\' */
- var odd = false;
- var unicode1: Int = 0;
- var unicode2: Int = 0;
- def hasMore(i: Int, j: Int) = i + j < buf.length;
- def hasMore(j: Int) = bp + j < buf.length;
- def hasNext = hasMore(1);
-
- /**
- * Gets next char, handles unicode transform
- */
- def next: Char = {
- bp = bp + 1;
- val ch = buf(bp);
- odd = (ch == '\\') && !odd;
- if (odd && hasNext && 'u' == buf(bp + 1)) {
- val Pair(newch, offset) = nextUnicode(bp + 1);
- bp = bp + offset;
- ccol = ccol + offset;
- odd = false;
- newch
- } else {
- ch
- }
- }
- def raw: Char = { bp = bp + 1; buf(bp) }
-
- /** precondition: hasNext
- */
- def lookahead1 = {
- val ahead1 = buf( bp + 1 );
- if (ahead1 == '\\' && !odd && hasMore(2) && 'u' == buf(bp + 1)) {
- val Pair(newch, offset) = nextUnicode(bp + 1);
- unicode1 = offset;
- bp = bp + offset;
- newch;
- }
- else {
- unicode1 = 0;
- ahead1
- }
- }
-
- /** precondition: hasMore( 2 ) */
- def lookahead2 = {
- val j = bp + unicode1 + 1 + 1;
- val ahead2 = buf( j );
- val even1 = unicode1 > 0 || '\\' != buf(j - 1) || odd;
- if (ahead2 == '\\' && even1 && hasMore(j, 1) && 'u' == buf(j + 1)) {
- val Pair(newch, offset) = nextUnicode(j + 1);
- unicode2 = offset;
- newch;
- }
- else {
- ahead2
- }
- }
-
- /** precondition: hasMore( 3 ) */
- def lookahead3 = {
- val j = bp + unicode1 + 1 + unicode2 + 1 + 1;
- val ahead3 = buf( j );
- var even2 = unicode2 > 0 || '\\' != buf( j - 1 ) || '\\' == buf( j - 2 );
-
- if (ahead3 == '\\' && even2 && hasMore( j, 1 ) && 'u' == buf(j + 1)) {
- val Pair(newch, offset) = nextUnicode(j + 1);
- newch;
- } else {
- ahead3
- }
- }
-
- import SourceRepresentation.digit2int;
-
- /** returns unicode and offset of next character */
- def nextUnicode(p: Int): Pair[Char,Int] = {
- var j = p;
- while ( buf(j) == 'u' ) { j = j + 1 };
- if (j + 4 >= buf.length) syntaxError("incomplete unicode escape");
- def munch = {
- val i = digit2int( buf(j), 16 );
- if (i == -1) {
- syntaxError("error in unicode escape");
- };
- j = j + 1;
- i
- }
- var code:Int = munch;
- //Console.println("nextUnicode2, code =" + code);
- code = (code << 4) + munch;
- code = (code << 4) + munch;
- code = (code << 4) + munch;
- Pair(code.asInstanceOf[Char], j - p)
- }
-
- } /* class SourceIterator */
-
- /** the input iterator. Converts unicode characters as in Java spec (3.3)
- */
- var srcIterator:SourceIterator = new SourceIterator(unit.source.getContent());
-
- /** the current character
- */
- var ch: Char = _;
-
- /** the last character (needed by XMLSTART)
- */
- var lastch: Char = _;
-
- /** the line and column position of the current character
- */
- var cline: Int = 1;
- var ccol: Int = 0;
-
- /** a buffer for character and string literals
- */
- var lit = new Array[char](64);
-
-
- /** INIT: Construct a scanner from a file input stream.
- */
- token = EMPTY;
- nextch();
- Tokens; // initialize tokens
- nextToken();
-
- def nextch(): unit = {
- lastch = ch;
- ch = srcIterator.next;
- ccol = ccol + 1;
- //System.out.print("[" + ch + "]");//DEBUG
- }
-
- /** read next token and return last position
- */
- def skipToken(): Int = {
- val p = pos; nextToken(); p
- }
-
- def nextToken(): unit = {
- if (token == RBRACE) {
- val prevpos = pos;
- fetchToken();
- token match {
- case ELSE | EXTENDS | WITH | YIELD | CATCH | FINALLY |
- COMMA | SEMI | DOT | COLON | EQUALS | ARROW |
- LARROW | SUBTYPE | SUPERTYPE | HASH | AT |
- RPAREN | RBRACKET | RBRACE =>
- case _ =>
- if (token == EOF ||
- ((pos >>> Position.COLUMN_BITS) >
- (prevpos >>> Position.COLUMN_BITS))) {
- next.copyFrom(this);
- this.token = SEMI;
- this.pos = prevpos;
- }
- }
- } else {
- if (next.token == EMPTY) {
- fetchToken();
- } else {
- copyFrom(next);
- next.token = EMPTY
- }
- if (token == CASE) {
- prev.copyFrom(this);
- fetchToken();
- if (token == CLASS) {
- token = CASECLASS;
- } else if (token == OBJECT) {
- token = CASEOBJECT;
- } else {
- next.copyFrom(this);
- this.copyFrom(prev);
- }
- }
- else if (token == SEMI) {
- prev.copyFrom(this);
- fetchToken();
- if (token != ELSE) {
- next.copyFrom(this);
- this.copyFrom(prev);
- }
- }
- //Console.println("<" + token2string(token) + ":" + name + ">");//DEBUG
- }
- }
-
- /** read next token
- */
- private def fetchToken(): unit = {
- if (token == EOF) return;
- lastpos = Position.encode(cline, ccol);
- //var index = bp;
- while (true) {
- ch match {
- case ' ' =>
- nextch();
- case '\t' =>
- ccol = ((ccol - 1) / tabinc * tabinc) + tabinc;
- nextch();
- case CR =>
- cline = cline + 1;
- ccol = 0;
- nextch();
- if (ch == LF) {
- ccol = 0;
- nextch();
- }
- case LF | FF =>
- cline = cline + 1;
- ccol = 0;
- nextch();
- case _ =>
- pos = Position.encode(cline, ccol);
- //index = bp;
- ch match {
- case '\u21D2' =>
- nextch();
- token = ARROW;
- return;
- case 'A' | 'B' | 'C' | 'D' | 'E' |
- 'F' | 'G' | 'H' | 'I' | 'J' |
- 'K' | 'L' | 'M' | 'N' | 'O' |
- 'P' | 'Q' | 'R' | 'S' | 'T' |
- 'U' | 'V' | 'W' | 'X' | 'Y' |
- 'Z' | '$' | '_' |
- 'a' | 'b' | 'c' | 'd' | 'e' |
- 'f' | 'g' | 'h' | 'i' | 'j' |
- 'k' | 'l' | 'm' | 'n' | 'o' |
- 'p' | 'q' | 'r' | 's' | 't' |
- 'u' | 'v' | 'w' | 'x' | 'y' | // scala-mode: need to understand multi-line case patterns
- 'z' =>
- putChar(ch);
- nextch();
- getIdentRest; // scala-mode: wrong indent for multi-line case blocks
- return;
- case _ if (Character.isUnicodeIdentifierStart(ch)) =>
- putChar(ch);
- nextch();
- getIdentRest;
- return;
-
- case '<' => // is XMLSTART?
- var last = lastch;
- nextch();
- last match {
- case ' '|'\t'|'\n'|'{'|'('|'>' if xml.Parsing.isNameStart(ch) =>
- token = XMLSTART;
- case _ =>
- putChar('<');
- getOperatorRest;
- }
- return;
-
- case '~' | '!' | '@' | '#' | '%' |
- '^' | '*' | '+' | '-' | /* '<' | */
- '>' | '?' | ':' | '=' | '&' |
- '|' | '\\' =>
- putChar( ch );
- nextch();
- getOperatorRest; // XXX
- return;
- case '/' =>
- nextch();
- if (! skipComment()) {
- putChar('/');
- getOperatorRest;
- return;
- }
- case '0' =>
- putChar(ch);
- nextch();
- if (ch == 'x' || ch == 'X') {
- nextch();
- base = 16;
- getNumber;
- } else {
- base = 8;
- getNumber;
- }
- return; // scala-mode: return is a keyword
- case '1' | '2' | '3' | '4' |
- '5' | '6' | '7' | '8' | '9' =>
- base = 10;
- getNumber;
- return;
- case '`' => //" scala-mode: need to understand literals
- getStringLit('`');
- token = IDENTIFIER;
- return;
- case '\"' => //" scala-mode: need to understand literals
- getStringLit('\"');
- return;
- case '\'' =>
- nextch();
- ch match {
- case 'A' | 'B' | 'C' | 'D' | 'E' |
- 'F' | 'G' | 'H' | 'I' | 'J' |
- 'K' | 'L' | 'M' | 'N' | 'O' |
- 'P' | 'Q' | 'R' | 'S' | 'T' |
- 'U' | 'V' | 'W' | 'X' | 'Y' |
- 'Z' | '$' | '_' |
- 'a' | 'b' | 'c' | 'd' | 'e' |
- 'f' | 'g' | 'h' | 'i' | 'j' |
- 'k' | 'l' | 'm' | 'n' | 'o' |
- 'p' | 'q' | 'r' | 's' | 't' |
- 'u' | 'v' | 'w' | 'x' | 'y' |
- 'z' =>
- cbuf.setLength(0);
- putChar(ch);
- nextch();
- if (ch != '\'') {
- getIdentRest;
- token = SYMBOLLIT;
- return;
- }
- case _ if (Character.isUnicodeIdentifierStart(ch)) =>
- cbuf.setLength(0);
- putChar(ch);
- nextch();
- if (ch != '\'') {
- getIdentRest;
- token = SYMBOLLIT;
- return;
- }
- case _ =>
- getlitch();
- }
- if (ch == '\'') {
- nextch();
- token = CHARLIT;
- name = Name.fromString(cbuf.toString());
- cbuf.setLength(0);
- }
- else {
- syntaxError("unclosed character literal");
- }
- return;
- case '.' =>
- nextch();
- if (('0' <= ch) && (ch <= '9')) {
- putChar('.');
- getFraction;
- } else token = DOT;
- return;
- case ';' =>
- nextch(); token = SEMI;
- return;
- case ',' =>
- nextch(); token = COMMA;
- return;
- case '(' => //scala-mode: need to understand character quotes
- nextch(); token = LPAREN;
- return;
- case '{' =>
- nextch(); token = LBRACE;
- return;
- case ')' =>
- nextch(); token = RPAREN;
- return;
- case '}' =>
- nextch(); token = RBRACE;
- return;
- case '[' =>
- nextch(); token = LBRACKET;
- return;
- case ']' =>
- nextch(); token = RBRACKET;
- return;
- case SU =>
- if (! srcIterator.hasNext)
- token = EOF;
- else {
- syntaxError("illegal character");
- nextch();
- }
- return;
- case _ =>
- if (Character.isUnicodeIdentifierStart(ch)) {
- putChar(ch);
- nextch();
- getIdentRest;
- }
- else if (isSpecial(ch)) {
- putChar(ch);
- getOperatorRest;
- }
- else {
- syntaxError("illegal character");
- nextch();
- }
- return;
- }
- }
- }
- }
-
- private def skipComment(): Boolean = {
- if (ch == '/') {
- do {
- nextch();
- } while ((ch != CR) && (ch != LF) && (ch != SU));
- true
- }
- else if (ch == '*') {
- docBuffer = null;
- var openComments = 1;
- nextch();
- if (ch == '*') {
- docBuffer = new StringBuffer("/**");
- }
- while (openComments > 0) {
- do {
- do {
- if (ch == CR) {
- cline = cline + 1;
- ccol = 0;
- nextch(); addCharToDoc(ch);
- if (ch == LF) {
- ccol = 0;
- nextch(); addCharToDoc(ch);
- }
- } else if (ch == LF) {
- cline = cline + 1;
- ccol = 0;
- nextch(); addCharToDoc(ch);
- } else if (ch == '\t') {
- ccol = ((ccol - 1) / tabinc * tabinc) + tabinc;
- nextch(); addCharToDoc(ch);
- } else if (ch == '/') {
- nextch(); addCharToDoc(ch);
- if (ch == '*') {
- nextch(); addCharToDoc(ch);
- openComments = openComments + 1;
- }
- } else if ((ch != '*')&&(ch != SU)) {
- nextch(); addCharToDoc(ch);
- }
- } while ((ch != '*') && (ch != SU));
- while (ch == '*') {
- nextch(); addCharToDoc(ch);
- }
- } while (ch != '/' && ch != SU);
- if (ch == '/') nextch();
- else syntaxError("unclosed comment");
- openComments = openComments - 1;
- }
- lastch = ' ';
- true;
- } else {
- false
- }
- }
-
-// Identifiers ---------------------------------------------------------------
-
- def isIdentStart(c: char): boolean =
- ('A' <= c && c <= 'Z') ||
- ('a' <= c && c <= 'a') ||
- (c == '_') || (c == '$') ||
- Character.isUnicodeIdentifierStart(c);
-
- def isIdentPart(c: char) =
- isIdentStart(c) ||
- ('0' <= c && c <= '9') ||
- Character.isUnicodeIdentifierPart(c);
-
- def isSpecial(c: char) = {
- val chtp = Character.getType(c);
- chtp == Character.MATH_SYMBOL || chtp == Character.OTHER_SYMBOL;
- }
-
- private def getIdentRest: Unit = {
- while (true) {
- ch match {
- case 'A' | 'B' | 'C' | 'D' | 'E' |
- 'F' | 'G' | 'H' | 'I' | 'J' |
- 'K' | 'L' | 'M' | 'N' | 'O' |
- 'P' | 'Q' | 'R' | 'S' | 'T' |
- 'U' | 'V' | 'W' | 'X' | 'Y' |
- 'Z' | '$' |
- 'a' | 'b' | 'c' | 'd' | 'e' |
- 'f' | 'g' | 'h' | 'i' | 'j' |
- 'k' | 'l' | 'm' | 'n' | 'o' |
- 'p' | 'q' | 'r' | 's' | 't' |
- 'u' | 'v' | 'w' | 'x' | 'y' |
- 'z' |
- '0' | '1' | '2' | '3' | '4' |
- '5' | '6' | '7' | '8' | '9' =>
- putChar( ch );
- nextch();
- case '_' =>
- putChar(ch);
- nextch();
- getIdentOrOperatorRest;
- return;
- case SU =>
- // true == Character.isUnicodeIdentifierPart(SU)
- treatIdent;
- return;
-
- case _ if (Character.isUnicodeIdentifierPart(ch)) =>
- putChar(ch);
- nextch();
- case _ =>
- treatIdent;
- return;
- }
- }
- }
-
- private def getOperatorRest: unit = {
- while (true) {
- ch match {
- case '~' | '!' | '@' | '#' | '%' |
- '^' | '*' | '+' | '-' | '<' |
- '>' | '?' | ':' | '=' | '&' |
- '|' | '\\' =>
- putChar(ch);
- nextch();
- case '/' =>
- nextch();
- if (skipComment()) {
- treatIdent;
- return;
- } else {
- putChar( '/' );
- }
- case _ =>
- if (isSpecial(ch)) {
- putChar(ch);
- nextch();
- } else {
- treatIdent;
- return;
- }
- }
- }
- }
-
- private def getIdentOrOperatorRest: unit = {
- if (isIdentPart(ch))
- getIdentRest
- else ch match {
- case '~' | '!' | '@' | '#' | '%' |
- '^' | '*' | '+' | '-' | '<' |
- '>' | '?' | ':' | '=' | '&' |
- '|' | '\\' | '/' =>
- getOperatorRest;
- case _ =>
- if (isSpecial(ch)) {
- getOperatorRest;
- } else {
- treatIdent;
- }
- }
- }
-
- private def getStringLit(delimiter: Char): unit = {
- nextch();
- while (srcIterator.hasNext && ch != delimiter && ch != CR && ch != LF) {
- getlitch();
- }
- if (ch == delimiter) {
- token = STRINGLIT;
- name = Name.fromString( cbuf.toString() );
- cbuf.setLength(0);
- nextch();
- }
- else {
- syntaxError("unclosed string literal");
- name = Names.ERROR;
- }
- }
-
- def treatIdent = {
- name = Name.fromString( cbuf.toString() );
-/* not yet!
- if (name.length() > 1 && name.charAt(name.length() - 1) == '_')
- syntaxError("identifier may not end in a '_'");
-*/
- token = name2token(name);
- cbuf.setLength(0);
- }
-
- /** generate an error at the given position
- */
- def syntaxError(pos: Int, msg: String) = {
- unit.error(pos, msg);
- token = ERROR;
- errpos = pos;
- }
-
- /** generate an error at the current token position
- */
- def syntaxError(msg: String): unit = syntaxError(pos, msg);
-
- /** append Unicode character to "lit" buffer
- */
- private def putChar(ch: Char) = cbuf.append(ch);
- /*
- if (litlen == lit.length) {
- val newlit = new Array[char](lit.length * 2);
- System.arraycopy(lit, 0, newlit, 0, lit.length);
- lit = newlit;
- }
- lit(litlen) = c;
- litlen = litlen + 1;
- }*/
-
- /** return true iff next 6 characters are a valid unicode sequence:
- protected def isUnicode() =
- (bp + 6) < buf.length &&
- (buf(bp) == '\\') &&
- (buf(bp+1) == 'u') &&
- (SourceRepresentation.digit2int(buf(bp+2), 16) >= 0) &&
- (SourceRepresentation.digit2int(buf(bp+3), 16) >= 0) &&
- (SourceRepresentation.digit2int(buf(bp+4), 16) >= 0) &&
- (SourceRepresentation.digit2int(buf(bp+5), 16) >= 0);
- */
-
- /** precondition: isUnicode() == true
- protected def getUnicodeChar(): Char = {
- var i : Int = 0;
- var k = bp + 2;
- while( k < bp + 6 ) {
- i = 16 * i + SourceRepresentation.digit2int(buf(k), 16);
- k = k + 1;
- };
- i.asInstanceOf[char]
- }
-*/
- /** read next character in character or string literal:
- */
- protected def getlitch() =
- if (ch == '\\') {
- /*
- if (isUnicode()) {
- nextch();
- nextch();
- var code: int = 0;
- code = (code << 4) + SourceRepresentation.digit2int(ch, 16); nextch();
- code = (code << 4) + SourceRepresentation.digit2int(ch, 16); nextch();
- code = (code << 4) + SourceRepresentation.digit2int(ch, 16); nextch();
- code = (code << 4) + SourceRepresentation.digit2int(ch, 16); nextch();
- putChar(code.asInstanceOf[char]);
- } else {
- */
- nextch();
- if ('0' <= ch && ch <= '7') {
- val leadch: Char = ch;
- var oct: Int = SourceRepresentation.digit2int(ch, 8);
- nextch();
- if ('0' <= ch && ch <= '7') {
- oct = oct * 8 + SourceRepresentation.digit2int(ch, 8);
- nextch();
- if (leadch <= '3' && '0' <= ch && ch <= '7') {
- oct = oct * 8 + SourceRepresentation.digit2int(ch, 8);
- nextch();
- }
- }
- putChar(oct.asInstanceOf[Char]);
- } else if (ch != SU) {
- ch match {
- case 'b' => putChar('\b')
- case 't' => putChar('\t')
- case 'n' => putChar('\n')
- case 'f' => putChar('\f')
- case 'r' => putChar('\r')
- case '\"' => putChar('\"')
- case '\'' => putChar('\'')
- case '`' => putChar('`') /* tentative */
- case '\\' => putChar('\\')
- case _ =>
- syntaxError(Position.encode(cline, ccol) - 1, "invalid escape character");
- putChar(ch);
- }
- nextch();
- }
- /* } */
- }
- else {
- putChar(ch);
- nextch();
- }
-
- /** read fractional part of floating point number;
- */
- protected def getFraction = {
- while (SourceRepresentation.digit2int(ch, 10) >= 0) {
- putChar(ch);
- nextch();
- }
- token = DOUBLELIT;
- if ((ch == 'e') || (ch == 'E')) {
- putChar( ch );
- val c1 = srcIterator.lookahead1;
- val c2 = srcIterator.lookahead2;
- if ((c1 == '+') || (c1 == '-') && ('0' >= c2) || (c2 <= '9')) {
- nextch();
- putChar(ch);
- nextch();
- } else
- nextch();
- while (SourceRepresentation.digit2int(ch, 10) >= 0) {
- putChar(ch);
- nextch();
- }
- }
- if ((ch == 'd') || (ch == 'D')) {
- putChar( ch );
- nextch();
- } else if ((ch == 'f') || (ch == 'F')) {
- putChar(ch);
- token = FLOATLIT;
- nextch();
- }
- name = Name.fromString( cbuf.toString() );
- cbuf.setLength( 0 );
- }
-
- /** convert name, base to long value
- * base = the base of the number; one of 8, 10, 16.
- */
- def intVal(negated: boolean): long = {
- import SourceRepresentation.digit2int;
-
- if (token == CHARLIT && !negated) {
- if (name.length() > 0)
- name.charAt(0)
- else
- 0
- } else {
-
- var value: long = 0;
- val divider = if (base == 10) 1 else 2;
- val limit: long = if (token == LONGLIT) Long.MAX_VALUE else Integer.MAX_VALUE;
- var i = 0;
- val len = name.length();
- while (i < len) {
- val d = digit2int( name.charAt(i), base );
- if (d < 0) {
- syntaxError("malformed integer number");
- return 0;
- }
- if (value < 0 ||
- limit / (base / divider) < value ||
- limit - (d / divider) < value * (base / divider) &&
- !(negated && limit == value * base - 1 + d)) {
- syntaxError("integer number too large");
- return 0;
- }
- value = value * base + d;
- i = i + 1;
- }
- if (negated) -value else value
- }
- }
-
- def intVal: long = intVal(false);
-
- /** convert name, base to double value
- */
- def floatVal(negated: boolean): double = {
- val limit: double =
- if (token == DOUBLELIT) Double.MAX_VALUE else Float.MAX_VALUE;
- try {
- val value = Double.valueOf(name.toString()).doubleValue();
- if (value > limit)
- syntaxError("floating point number too large");
- if (negated) -value else value
- }
- catch {
- case _: NumberFormatException =>
- syntaxError("malformed floating point number");
- 0.0
- }
- }
-
- def floatVal: double = floatVal(false);
-
-
- /** see Java spec 3.10.2 */
- def exponentPart(c1: Char, c2: Char) =
- (c1 == 'e' || c1 == 'E') &&
- ((c2 >= '0' && c2 <= '9') || (c2 == '+' || c2 == '-')) ;
-
- /** see Java spec 3.10.2 */
- def floatTypeSuffix(c1: Char) =
- (c1 == 'f' || c1 == 'F' ||
- c1 == 'd' || c1 == 'D');
-
- /** read a number into name and set base
- */
- protected def getNumber:unit = {
- import SourceRepresentation.digit2int;
- while (digit2int(ch, if (base == 8) 10 else base) >= 0) {
- putChar( ch );
- nextch();
- }
- if (base <= 10 && ch == '.') { // '.' c1 c2
- val c1 = srcIterator.lookahead1;
- if (c1 >= '0' && c1 <= '9') {
- putChar(ch);
- nextch();
- getFraction;
- }
- else {
- val c2 = srcIterator.lookahead2;
- if (exponentPart(c1,c2)) {
- putChar(ch);// +
- getFraction;
- return;
- }
- if (isIdentStart(c1)&&isIdentPart(c2)) { // is select
- name = Name.fromString( cbuf.toString() );
- cbuf.setLength( 0 );
- token = INTLIT;
- return;
- }
- else {
- putChar(ch);
- nextch();
- getFraction;
- }
- }
- } else if (base <= 10 &&
- (ch == 'e' || ch == 'E' ||
- ch == 'f' || ch == 'F' ||
- ch == 'd' || ch == 'D')) {
- getFraction;
- }
- else {
- if (ch == 'l' || ch == 'L') {
- name = Name.fromString(cbuf.toString());
- cbuf.setLength(0);
- nextch();
- token = LONGLIT;
- } else {
- name = Name.fromString(cbuf.toString());
- cbuf.setLength(0);
- token = INTLIT;
- }
- }
- }
-
- // start XML tokenizing methods
- // prod. [i] refers to productions in http://www.w3.org/TR/REC-xml
-
- /** calls nextToken, starting the scanning of Scala tokens,
- * after XML tokens.
- */
- def xSync = {
- token = SEMI; // avoid getting SEMI from nextToken if last was RBRACE
- //nextch();
- nextToken();
- }
-
- def xSync2 = fetchToken();
-
- def xLookahead = srcIterator.lookahead1;
-
- /** read the next character. do not skip whitespace.
- * treat CR LF as single LF. update ccol and cline
- *
- * @todo: may XML contain SU, in CDATA sections ?
- */
- def xNext = {
- lastpos = pos;
- ch = srcIterator.raw; ccol = ccol + 1; // = nextch() without unicode
- ch match {
- case SU =>
- //syntaxError( lastpos, "missing end tag in XML literal" );
- token = EOF;
- case LF =>
- ccol = 0; cline = cline + 1;
- case CR =>
- if( LF == srcIterator.lookahead1 ) {
- srcIterator.raw; ccol = 0; cline = cline + 1;
- }
- case _ =>
- //Console.print(ch.asInstanceOf[Char]); // DEBUG
- }
- pos = Position.encode(cline, ccol);
- //Console.print(ch);
- }
-
- /* OBSOLETE
- final val LT = Name.fromString("<");
-
- def xStartsXML = {
- /* unit.global.xmlMarkup && */ ( token == IDENTIFIER ) &&( name == LT );
- /* || // support for proc instr, cdata, comment... ?
- {val s = name.toString();
- s.charAt(0) == '<' && (s.charAt(1)=='?' || s.charAt(1)=='!')}) */
- }
- */
- // end XML tokenizing
-
-
- override def toString() = token match {
- case IDENTIFIER =>
- "id(" + name + ")"
- case CHARLIT =>
- "char(" + intVal + ")"
- case INTLIT =>
- "int(" + intVal + ")"
- case LONGLIT =>
- "long(" + intVal + ")"
- case FLOATLIT =>
- "float(" + floatVal + ")"
- case DOUBLELIT =>
- "double(" + floatVal + ")"
- case STRINGLIT =>
- "string(" + name + ")"
- case SEMI =>
- ";"
- case COMMA =>
- ","
- case _ =>
- token2string(token)
- }
-
-}
-
-} // package
-
diff --git a/sources/scala/tools/scalac/ast/parser/SymbolicXMLBuilder.scala b/sources/scala/tools/scalac/ast/parser/SymbolicXMLBuilder.scala
deleted file mode 100644
index 8a76eeaa59..0000000000
--- a/sources/scala/tools/scalac/ast/parser/SymbolicXMLBuilder.scala
+++ /dev/null
@@ -1,673 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac._;
-import scalac.symtab.Modifiers;
-import scala.tools.util.Position;
-import java.lang.{Integer, Long, Float, Double};
-import scala.Iterator;
-import scala.tools.scalac.util.NewArray;
-import scala.collection.immutable.{ Map, ListMap };
-import scala.collection.mutable;
-import scala.xml.{Text,TextBuffer};
-import scalac.util.{ Name, Names, TypeNames } ;
-
-package scala.tools.scalac.ast.parser {
-
-/** this class builds instance of Tree that represent XML */
-class SymbolicXMLBuilder(make: TreeFactory, gen: TreeGen, p: Parser, preserveWS: Boolean ) {
-
- import scala.tools.scalac.ast.{TreeList => myTreeList}
-
- var isPattern:Boolean = _;
-
- val _ArrayBuffer = Name.fromString("ArrayBuffer");
- val _Attribute = Name.fromString("Attribute");
- val _MetaData = Name.fromString("MetaData");
- val _NamespaceBinding = Name.fromString("NamespaceBinding");
- val _NodeBuffer = Name.fromString("NodeBuffer");
- val _NoAttributes = Name.fromString("NoAttributes");
-
- val _Null = Name.fromString("Null");
-
- val _PrefixedAttribute = Name.fromString("PrefixedAttribute");
- val _UnprefixedAttribute = Name.fromString("UnprefixedAttribute");
- val _TreeMap = Name.fromString("TreeMap");
- val _Elem = Name.fromString("Elem");
- val _Seq = Name.fromString("Seq");
- val _String = Name.fromString("String");
- val _immutable = Name.fromString("immutable");
- val _mutable = Name.fromString("mutable");
- val _append = Name.fromString("append");
- val _plus = Name.fromString("$amp$plus");
- val _collection = Name.fromString("collection");
- val _toList = Name.fromString("toList");
- val _xml = Name.fromString("xml");
- val _Comment = Name.fromString("Comment");
- val _CharData = Name.fromString("CharData");
- val _Node = Name.fromString("Node");
- val _None = Name.fromString("None");
- val _Some = Name.fromString("Some");
- val _ProcInstr = Name.fromString("ProcInstr");
- val _Text = Name.fromString("Text");
- val _EntityRef = Name.fromString("EntityRef");
-
- // convenience methods
- private def _scala( pos: int, name: Name ) =
- make.Select( pos, make.Ident( pos, Names.scala ), name );
-
- private def _scala_Seq( pos: int ) =
- p.convertToTypeId( _scala( pos, _Seq ));
-
-
- private def _scala_None( pos: int ) =
- _scala( pos, _None ) ;
-
- private def _scala_Some(pos: int) =
- p.convertToConstr(_scala(pos, _Some));
-
-
- private def _string(pos: int) =
- p.convertToTypeId(make.Ident(pos, _String));
-
- private def _scala_xml(pos: int, name: Name) =
- make.Select( pos, _scala(pos, _xml), name );
-
- private def _scala_xml_MetaData(pos: int) =
- p.convertToTypeId(_scala_xml( pos, _MetaData ));
-
- private def _scala_xml_NamespaceBinding( pos: int ) =
- p.convertToTypeId(_scala_xml( pos, _NamespaceBinding ));
-
- private def _scala_xml_Null( pos: int ) =
- _scala_xml( pos, _Null );
-
- private def _scala_xml_PrefixedAttribute( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _PrefixedAttribute ));
-
- private def _scala_xml_UnprefixedAttribute( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _UnprefixedAttribute ));
-
- private def _scala_xml_Node( pos: int ) =
- _scala_xml( pos, _Node );
-
- private def _scala_xml_Node_NoAttributes( pos: int ) =
- make.Select( pos, _scala_xml( pos, _Node ), _NoAttributes );
-
- private def _scala_xml_NodeBuffer( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _NodeBuffer ));
-
- private def _scala_xml_EntityRef( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _EntityRef ));
-
- private def _scala_xml_Comment( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _Comment ));
-
- private def _scala_xml_CharData( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _CharData ));
-
- private def _scala_xml_ProcInstr( pos: int ) =
- p.convertToConstr( _scala_xml( pos, _ProcInstr ));
-
- private def _scala_xml_Text(pos: int) =
- _scala_xml( pos, _Text );
-
-
- private def _scala_collection(pos: int, name: Name) =
- make.Select( pos, _scala( pos, _collection ), name );
-
- private def _scala_collection_mutable(pos: int, name: Name) =
- make.Select(pos, _scala_collection(pos, _mutable ), name);
-
- private def _scala_collection_immutable(pos: int, name: Name) =
- make.Select(pos, _scala_collection(pos, _immutable), name);
-
- private def _scala_collection_mutable_ArrayBuffer(pos: int) =
- make.Apply( pos,
- make.AppliedType(pos,
- p.convertToConstr(
- _scala_collection_mutable(pos, _ArrayBuffer )),
- Predef.Array[Tree](
- convertToTypeId(
- _scala_xml_Node(pos) ))
- ),
- Tree.EMPTY_ARRAY );
-
- private def _scala_collection_immutable_TreeMap(pos: int) =
- make.Apply( pos,
- make.AppliedType(pos,
- p.convertToConstr(
- _scala_collection_immutable(pos, _TreeMap )),
- Predef.Array[Tree](
- _string( pos ),
- _string( pos )
- )
- ),
- Tree.EMPTY_ARRAY );
-
- private def _emptyMap(pos: Int) = {
- make.New( pos,_scala_collection_immutable_TreeMap( pos: int ));
- }
-
- private def _scala_Tuple2(pos: Int) =
- _scala( pos, Names.Tuple2 );
-
- private def _scala_xml_Elem(pos: Int) =
- _scala_xml( pos, _Elem );
-
- private def _scala_xml_Attribute(pos: Int) =
- _scala_xml( pos, _Attribute );
-
-
- private def bufferToArray(buf: mutable.Buffer[Tree]): Array[Tree] = {
- val arr = new Array[Tree]( buf.length );
- var i = 0;
- for (val x <- buf.elements) { arr(i) = x; i = i + 1; }
- arr;
- }
-
- /** convenience method */
- def convertToTypeId(t: Tree): Tree = t match {
- case Tree$Ident(name) =>
- make.Ident(t.pos, name.toTypeName())
- case Tree$Select(qual, name) =>
- make.Select(t.pos, qual, name.toTypeName())
- case _ =>
- t
- }
-
- // create scala xml tree
-
- /**
- * @arg namespace: a Tree of type defs.STRING_TYPE
- * @arg label: a Tree of type defs.STRING_TYPE
- * @todo map: a map of attributes !!!
- */
-
- protected def mkXML(pos: int, isPattern: boolean, pre: Tree, label: Tree, attrs: /*Array[*/Tree/*]*/ , scope:Tree, children: mutable.Buffer[Tree]): Tree = {
- if( isPattern ) {
- val ts = new mutable.ArrayBuffer[Tree]();
- ts.append( pre );
- ts.append( label );
- ts.append( new Tree$Ident( Names.PATTERN_WILDCARD ) ); // attributes?
- ts.append( new Tree$Ident( Names.PATTERN_WILDCARD ) ); // scope?
- convertToTextPat( children );
- ts ++ children;
- make.Apply(pos,
- convertToTypeId( _scala_xml_Elem( pos ) ),
- bufferToArray( ts ))
- } else {
- val ab = new scala.collection.mutable.ArrayBuffer[Tree]();
- ab + pre;
- ab + label;
- ab + attrs;
- ab + scope;
-
- /*
- if(( attrs.length ) == 0 )
- ab + _scala_xml_Node_NoAttributes( pos )
- else
- ab + make.Apply(pos,
- make.Select( pos,
- _scala_xml_Node_NoAttributes( pos ),
- Names.PERCENT ),
- attrs);
- */
- if(( children.length ) > 0 )
- ab + make.Typed(pos,
- makeXMLseq( pos, children ),
- make.Ident(pos, TypeNames.WILDCARD_STAR));
- val arr:Array[Tree] = new Array[Tree]( ab.length );
- ab.elements.copyToArray( arr, 0 );
- make.Apply( pos, _scala_xml_Elem( pos ), arr )
- }
- }
-
- final def entityRef( pos:int, n: String ) = {
- val constr = make.Apply( pos,
- _scala_xml_EntityRef( pos ),
- Predef.Array[Tree]( gen.mkStringLit( pos, n )));
-
- make.New( pos, constr );
- };
- // create scala.xml.Text here <: scala.xml.Node
- final def text( pos: int, txt:String ):Tree = {
- //makeText( pos, isPattern, gen.mkStringLit( pos, txt ));
- val txt1 = gen.mkStringLit( pos, txt );
- if( isPattern )
- makeTextPat( pos, txt1 );
- else
- makeText1( pos, txt1 );
- }
-
- // create scala.xml.Text here <: scala.xml.Node
-/*
- protected def makeText( pos: int, isPattern:Boolean, txt:Tree ):Tree = {
- if( isPattern )
- makeTextPat( pos, txt );
- else
- makeText1( pos, txt );
- }
-*/
- // create scala.xml.Text here <: scala.xml.Node
- def makeTextPat( pos: int, txt:Tree ):Tree = {
- return make.Apply(pos,
- p.convertToConstr( _scala_xml_Text( pos ) ),
- Predef.Array[Tree]( txt ));
- }
-
- def makeText1( pos: int, txt:Tree ):Tree = {
- val constr = make.Apply(pos,
- p.convertToConstr( _scala_xml_Text( pos )),
- Predef.Array[Tree]( txt ));
- make.New( pos, constr );
- }
-
- // code to create attribute
- /*
- scala.xml.Attribute(uri, "key", [value])
- */
-
- def makeAttribute( pos: int, ns:String, key:String, value:Tree ):Tree =
- make.Apply(pos,
- _scala_xml_Attribute(pos),
- Predef.Array[Tree] (
- make.Ident( pos, Name.fromString( ns )),
- gen.mkStringLit( pos, key ),
- value
- )
- );
-
- // create
- def comment( pos: int, text: String ):Tree =
- Comment( pos, gen.mkStringLit( pos, text ));
-
- // create
- def charData( pos: int, txt: String ):Tree =
- CharData( pos, gen.mkStringLit( pos, txt ));
-
- // create scala.xml.Text here <: scala.xml.Node
- def procInstr( pos: int, target: String, txt: String ):Tree =
- ProcInstr(pos,
- gen.mkStringLit( pos, target ),
- gen.mkStringLit( pos, txt ));
-
- def makeNone( pos: int ):Tree = _scala_None( pos );
-
- def makeSome( pos: int, txt:Tree ):Tree = {
- val constr = make.Apply( pos,
- _scala_Some( pos ),
- Predef.Array[Tree] ( txt ));
- make.New( pos, constr );
- }
-
- def makeNodeBuffer(pos: int): Tree = {
- val constr = make.Apply( pos,
- _scala_xml_NodeBuffer( pos ),
- Tree.EMPTY_ARRAY);
- make.New( pos, constr );
- }
-
- protected def CharData(pos: int, txt: Tree):Tree = {
- val constr = make.Apply( pos,
- _scala_xml_CharData( pos ),
- Predef.Array[Tree] ( txt ));
- make.New( pos, constr );
- }
-
- protected def Comment(pos: int, txt: Tree):Tree = {
- val constr = make.Apply( pos,
- _scala_xml_Comment( pos ),
- Predef.Array[Tree] ( txt ));
- make.New( pos, constr );
- }
-
- protected def ProcInstr(pos: int, target: Tree, txt: Tree): Tree = {
- val constr = make.Apply( pos,
- _scala_xml_ProcInstr( pos ),
- Predef.Array[Tree] ( target, txt ));
- make.New( pos, constr );
- }
-
- /** @todo: attributes */
- def makeXMLpat(pos: int, n: String, args: mutable.Buffer[Tree]): Tree =
- mkXML(pos,
- true,
- new Tree$Ident( Names.PATTERN_WILDCARD ):Tree,
- gen.mkStringLit( pos, n ):Tree,
- null, //Predef.Array[Tree](),
- null,
- args);
-
- protected def convertToTextPat(t: Tree): Tree = t match {
- case _:Tree$Literal => makeTextPat(t.pos, t);
- case _ => t
- }
-
- protected def convertToTextPat(buf: mutable.Buffer[Tree]): Unit = {
- var i = 0; while( i < buf.length ) {
- val t1 = buf( i );
- val t2 = convertToTextPat( t1 );
- if (!t1.eq(t2)) {
- buf.remove(i);
- buf.insert(i,t2);
- }
- i = i + 1;
- }
- }
-
- def isEmptyText(t:Tree) = t match {
- case Tree$Literal(atree.AConstant.STRING("")) => true;
- case _ => false;
- }
- def makeXMLseq( pos:int, args:mutable.Buffer[Tree] ) = {
- val ts = new TreeList();
- //val blocArr = new Array[Tree] ( 1 + args.length );
- //val constr = _scala_collection_mutable_ArrayBuffer( pos );
- var _buffer = makeNodeBuffer( pos );
- val n = p.fresh();
- val nIdent = make.Ident(pos, n);
- //blocArr( 0 )
- ts.append( make.ValDef(pos,
- 0, n, Tree.Empty,
- _buffer));
-
- val it = args.elements;
- while( it.hasNext ) {
- val t = it.next;
- val tpos = t.pos;
- if( !isEmptyText( t )) {
- _buffer = make.Apply( tpos,
- make.Select( tpos, _buffer, _plus ),
- Predef.Array[Tree]( t ));
- }
- }
-
- _buffer = make.Select( pos, _buffer, _toList );
-
- _buffer;
- }
-
- def makeXMLseqPat( pos:int, args:Array[Tree] ) = {
- make.Apply( pos, _scala_Seq( pos ), args );
- }
-
-
-
- /** returns Some(prefix) if pre:name, None otherwise */
- def getPrefix( name:String ):Option[String] = {
- val i = name.indexOf(':');
- if( i != -1 ) Some( name.substring(0, i) ) else None
- }
-
- /** splits */
- protected def qualifiedAttr( pos:Int, namespace:String, name:String ):Pair[String,String] = {
- getPrefix( name ) match {
- case Some( pref ) =>
- val newLabel = name.substring( pref.length()+1, name.length() );
- // if( newLabel.indexOf(':') != -1 ) syntaxError
- Pair( "namespace$"+pref, newLabel );
- case None =>
- Pair( namespace, name );
- }
- }
- protected def qualified( pos:Int, name:String ):Pair[String,String] =
- getPrefix( name ) match {
- case Some( pref ) =>
- val newLabel = name.substring( pref.length()+1, name.length() );
- // if( newLabel.indexOf(':') != -1 ) syntaxError
- Pair( "namespace$"+pref, newLabel );
- case None =>
- Pair( "namespace$default", name );
- }
-
- final val _md = Name.fromString("$md");
- final val _scope = Name.fromString("$scope");
- final val _tmpscope = Name.fromString("$tmpscope");
-
- /** makes an element */
- def element(pos: int, qname: String, attrMap: mutable.Map[String,Tree], args: mutable.Buffer[Tree]): Tree = {
- //Console.println("SymbolicXMLBuilder::element("+pos+","+qname+","+attrMap+","+args+")");
- var setNS = new mutable.HashMap[String, Tree];
-
- val tlist = new myTreeList();
- val tlist2 = new myTreeList();
-
- def handleNamespaceBinding(pre:String, uri:Tree): Unit = {
- val t = make.Assign(pos,
- make.Ident(pos, _tmpscope),
- make.New(pos,
- make.Apply(
- pos,
- p.convertToConstr(_scala_xml( pos, _NamespaceBinding )),
- Predef.Array[Tree](
- {if(pre==null)
- gen.mkNullLit(pos)
- else
- gen.mkStringLit(pos, pre)} ,
- uri,
- make.Ident(pos, _tmpscope)))
- )
- );
- tlist.append( t );
- //Console.println("SymbolicXMLBuilder::handleNamespaceBinding:");
- //Console.println(t.toString());
-
- }
-
- /* DEBUG */
- val attrIt = attrMap.keys;
- while( attrIt.hasNext ) {
- val z = attrIt.next;
- if( z.startsWith("xmlns") ) { // handle namespace
- val i = z.indexOf(':');
- if( i == -1 )
- handleNamespaceBinding(null, attrMap( z ));
- //setNS.update("default", attrMap( z ) );
- else {
- val zz = z.substring( i+1, z.length() );
- //setNS.update( zz, attrMap( z ) );
- handleNamespaceBinding(zz, attrMap( z ));
- }
- attrMap -= z;
- }
- }
-
- val moreNamespaces = (0 < tlist.length());
-
- /* */
- val i = qname.indexOf(':');
-
- var newlabel = qname;
- val pre = getPrefix(qname) match {
- case Some(p) =>
- newlabel = qname.substring(p.length()+1, qname.length());
- p;
- case None =>
- null
- }
- //val Pair( pre, newlabel ) = qualified( pos, label );
- //Console.println("SymbolicXMLBuilder::(489) "+pre);
-
- // make attributes
-
- def handlePrefixedAttribute(pre:String, key:String, value:Tree): Unit = {
- val t =
- make.Assign(pos,
- make.Ident(pos, _md),
- make.New(pos,
- make.Apply(pos,
- _scala_xml_PrefixedAttribute(pos),
- Predef.Array[Tree](
- gen.mkStringLit(pos,pre),
- gen.mkStringLit(pos,key),
- value,
- make.Ident(pos, _md)
- )
- )
- )
- );
- tlist2.append( t );
- // Console.println("SymbolicXMLBuilder::handlePrefixed :");
- // Console.println(t.toString());
- }
-
- def handleUnprefixedAttribute(key:String, value:Tree): Unit = {
- val t = make.Assign(pos,
- make.Ident(pos, _md),
- make.New(pos,
- make.Apply(pos,
- _scala_xml_UnprefixedAttribute(pos),
- Predef.Array[Tree](
- gen.mkStringLit(pos,key),
- value,
- make.Ident(pos, _md)
- )
- )
- )
- );
- tlist2.append(t);
- //Console.println("SymbolicXMLBuilder::handlePrefixed :");
- //Console.println(t.toString());
-
- }
-
- //var attr:Array[Tree] =
- // if( attrMap.isEmpty )
- // Tree.EMPTY_ARRAY ; //gen.mkNullLit(pos); //
- // else {
- // val attrs:Array[Tree] = new Array[Tree](attrMap.size);
- /* DEBUG */
- // var k = 0;
- var it = attrMap.elements;
- while (it.hasNext) {
- val ansk = it.next;
-
- getPrefix(ansk._1) match {
- case Some(pre) =>
- val key = ansk._1.substring(pre.length()+1, ansk._1.length());
- handlePrefixedAttribute(pre, key, ansk._2);
- case None =>
- handleUnprefixedAttribute(ansk._1, ansk._2);
- }
- //val Pair( ns, aname ) = qualifiedAttr( pos, namespace, ansk._1 );
- //attrs( k ) = makeAttribute( pos, ns, aname, ansk._2 );
- //k = k + 1;
- }
- /* */
- // attrs
-
- // }
-
- val moreAttributes = (0 < tlist2.length());
-
- val ts = new mutable.ArrayBuffer[Tree]();
-
- if (moreNamespaces) {
- ts + make.ValDef(pos,
- Modifiers.MUTABLE,
- _tmpscope,
- _scala_xml_NamespaceBinding(pos),
- make.Ident(pos, _scope));
- ts ++ tlist;
- }
-
- //Console.println("printing ts");
- //for(val t <- ts)
- // Console.println(t.toString());
-
- val ts2 = new mutable.ArrayBuffer[Tree]();
-
- if(moreNamespaces) {
- ts2 + make.ValDef(pos, 0, _scope, Tree.Empty, make.Ident(pos, _tmpscope));
- }
- if(moreAttributes) {
- ts2 + make.ValDef(pos,
- Modifiers.MUTABLE,
- _md,
- _scala_xml_MetaData(pos),
- _scala_xml_Null(pos));
- ts2 ++ tlist2;
- }
- //Console.println("printing ts2");
- //for(val t <- ts2)
- // Console.println(t.toString());
-
- val stms:Array[Tree] = new Array[Tree]( ts.length );
- ts.elements.copyToArray( stms, 0 );
-
- val stms2:Array[Tree] = new Array[Tree]( ts2.length );
- ts2.elements.copyToArray( stms2, 0 );
-
- val makeSymbolicPrefix = {
- if (null == pre)
- gen.mkNullLit(pos)
- else
- gen.mkStringLit(pos,pre)
- }
-
- val makeSymbolicAttrs = {
- if (moreAttributes)
- make.Ident(pos, _md) //attr:Array[Tree],
- else
- _scala_xml_Null(pos)
- }
-
- var t = mkXML(pos,
- false,
- makeSymbolicPrefix,
- gen.mkStringLit(pos, newlabel):Tree,
- makeSymbolicAttrs,
- make.Ident(pos, _scope),
- args);
- /*
- Console.println("printing _pre");
- Console.println({if(null == pre) "null" else pre.toString()});
- Console.println("printing newlabel");
- Console.println(newlabel.toString());
- Console.println("printing _scope");
- Console.println(_scope.toString());
- Console.println("printing t");
- Console.println(t.toString());
- */
-
- if (0 < stms2.length) {
- t = make.Block(pos, stms2, t);
- }
- ;
- if (0 < stms.length) {
- t = make.Block(pos, stms, t);
- }
- ;
- //Console.println("SymbolicXMLBuilder::element returns :");
- //Console.println(res.toString());
-
- t
- /* DEBUG
- if (! setNS.isEmpty) {
- val nsStms = new Array[Tree](setNS.size);
- var i = 0;
- for (val Pair(ns:String, uri:Tree) <- setNS.toList) {
- nsStms( i ) = setNamespacePrefix(pos, ns, uri );
- i = i + 1;
- }
- make.Block( pos, nsStms, t )
- } else {
- t
- } */
-
- }
-
- def setNamespacePrefix(pos:Int, pref:String, uri:Tree) =
- make.ValDef(pos, 0, Name.fromString("namespace$"+pref), Tree.Empty, uri);
-
-}
-
-} // package
diff --git a/sources/scala/tools/scalac/ast/parser/TokenData.scala b/sources/scala/tools/scalac/ast/parser/TokenData.scala
deleted file mode 100644
index 43f11e18de..0000000000
--- a/sources/scala/tools/scalac/ast/parser/TokenData.scala
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-import scalac.util.Name;
-
-package scala.tools.scalac.ast.parser {
-
-/** A class for representing a token's data.
- *
- * @author Matthias Zenger
- * @version 1.0
- */
-class TokenData {
-
- import Tokens._;
-
- /** the next token
- */
- var token: int = EMPTY;
-
- /** the token's position. pos = line << Position.LINESHIFT + col
- */
- var pos: int = 0;
-
- /** the name of an identifier or token
- */
- var name: Name = null;
-
- /** the base of a number
- */
- var base: int = 0;
-
- def copyFrom(td: TokenData) = {
- this.token = td.token;
- this.pos = td.pos;
- this.name = td.name;
- this.base = td.base;
- }
-}
-}
diff --git a/sources/scala/tools/scalac/ast/parser/Tokens.scala b/sources/scala/tools/scalac/ast/parser/Tokens.scala
deleted file mode 100644
index a01f093c94..0000000000
--- a/sources/scala/tools/scalac/ast/parser/Tokens.scala
+++ /dev/null
@@ -1,240 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-import scalac.util.Name;
-
-package scala.tools.scalac.ast.parser {
-
-object Tokens {
-
- /** The token names */
- private var tokenName = new Array[Name](128);
- private var numToken = 0;
-
- /** Keyword array; maps from name indices to tokens */
- private var key: Array[byte] = _;
- private var maxKey = 0;
-
- /** special tokens */
- val EMPTY = -3;
- val UNDEF = -2;
- val ERROR = -1;
- val EOF = 0;
-
- /** literals */
- val CHARLIT = 1;
- val INTLIT = 2;
- val LONGLIT = 3;
- val FLOATLIT = 4;
- val DOUBLELIT = 5;
- val STRINGLIT = 6;
- val SYMBOLLIT = 7;
-
- /** identifier */
- val IDENTIFIER = 10;
-
- /** keywords */
- val IF = 20;
- val FOR = 21;
- val ELSE = 22;
- val THIS = 23;
- val NULL = 24;
- val NEW = 25;
- val WITH = 26;
- val SUPER = 27;
- val CASE = 28;
- val CASECLASS = 29;
- val CASEOBJECT = 30;
- val VAL = 31;
- val ABSTRACT = 32;
- val FINAL = 33;
- val PRIVATE = 34;
- val PROTECTED = 35;
- val OVERRIDE = 36;
- val VAR = 37;
- val DEF = 38;
- val TYPE = 39;
- val EXTENDS = 40;
- val TRUE = 41;
- val FALSE = 42;
- val OBJECT = 43;
- val CLASS = 44;
- val IMPLICIT = 45;
-
- val IMPORT = 46;
- val PACKAGE = 47;
- val YIELD = 48;
- val DO = 49;
- val TRAIT = 50;
- val SEALED = 51;
- val THROW = 52;
- val TRY = 53;
- val CATCH = 54;
- val FINALLY = 55;
- val WHILE = 56;
- val RETURN = 57;
-
- /** special symbols */
- val COMMA = 61;
- val SEMI = 62;
- val DOT = 63;
- val USCORE = 64;
- val COLON = 65;
- val EQUALS = 66;
- val LARROW = 67;
- val ARROW = 68;
- val SUBTYPE = 69;
- val SUPERTYPE = 70;
- val HASH = 71;
- val AT = 72;
- val VIEWBOUND = 73;
-
- /** parenthesis */
- val LPAREN = 90;
- val RPAREN = 91;
- val LBRACKET = 92;
- val RBRACKET = 93;
- val LBRACE = 94;
- val RBRACE = 95;
-
- /** XML mode */
- val XMLSTART = 96;
-
- /** Returns true if argument corresponds to a keyword. */
- def isKeyword(str: String) = Name.fromString(str).index <= maxKey;
-
- /** Returns the token corresponding to given name. */
- def name2token(name: Name): int =
- if (name.index <= maxKey) key(name.index) else IDENTIFIER;
-
- /** Returns the string representation of given token. */
- def token2string(token: int): String = token match {
- case IDENTIFIER =>
- "identifier"/* + \""+name+"\""*/
- case CHARLIT =>
- "character literal"
- case INTLIT =>
- "integer literal"
- case LONGLIT =>
- "long literal"
- case FLOATLIT =>
- "float literal"
- case DOUBLELIT =>
- "double literal"
- case STRINGLIT =>
- "string literal"
- case SYMBOLLIT =>
- "symbol literal"
- case LPAREN =>
- "'('"
- case RPAREN =>
- "')'"
- case LBRACE =>
- "'{'"
- case RBRACE =>
- "'}'"
- case LBRACKET =>
- "'['"
- case RBRACKET =>
- "']'"
- case EOF =>
- "eof"
- case ERROR =>
- "something"
- case SEMI =>
- "';'"
- case COMMA =>
- "','"
- case CASECLASS =>
- "case class"
- case CASEOBJECT =>
- "case object"
- case XMLSTART =>
- "$XML<"
- case _ =>
- try {
- "'" + tokenName(token).toString() + "'"
- } catch {
- case _: ArrayIndexOutOfBoundsException =>
- "'<" + token + ">'"
- case _: NullPointerException =>
- "'<(" + token + ")>'"
- }
- }
-
- // Enter keywords
- enterKeyword("abstract", ABSTRACT);
- enterKeyword("case", CASE);
- enterKeyword("class", CLASS);
- enterKeyword("catch", CATCH);
- enterKeyword("def", DEF);
- enterKeyword("do", DO);
- enterKeyword("else", ELSE);
- enterKeyword("extends", EXTENDS);
- enterKeyword("false", FALSE);
- enterKeyword("final", FINAL);
- enterKeyword("finally", FINALLY);
- enterKeyword("for", FOR);
- enterKeyword("if", IF);
- enterKeyword("implicit", IMPLICIT);
- enterKeyword("import", IMPORT);
- enterKeyword("new", NEW);
- enterKeyword("null", NULL);
- enterKeyword("object", OBJECT);
- enterKeyword("override", OVERRIDE);
- enterKeyword("package", PACKAGE);
- enterKeyword("private", PRIVATE);
- enterKeyword("protected", PROTECTED);
- enterKeyword("return", RETURN);
- enterKeyword("sealed", SEALED);
- enterKeyword("super", SUPER);
- enterKeyword("this", THIS);
- enterKeyword("throw", THROW);
- enterKeyword("trait", TRAIT);
- enterKeyword("true", TRUE);
- enterKeyword("try", TRY);
- enterKeyword("type", TYPE);
- enterKeyword("val", VAL);
- enterKeyword("var", VAR);
- enterKeyword("with", WITH);
- enterKeyword("while", WHILE);
- enterKeyword("yield", YIELD);
- enterKeyword(".", DOT);
- enterKeyword("_", USCORE);
- enterKeyword(":", COLON);
- enterKeyword("=", EQUALS);
- enterKeyword("=>", ARROW);
- enterKeyword("<-", LARROW);
- enterKeyword("<:", SUBTYPE);
- enterKeyword(">:", SUPERTYPE);
- enterKeyword("<%", VIEWBOUND);
- enterKeyword("#", HASH);
- enterKeyword("@", AT);
-
- // Build keyword array
- key = new Array[byte](maxKey+1);
- for (val i <- Iterator.range(0, maxKey))
- key(i) = IDENTIFIER;
- for (val j <- Iterator.range(0, numToken))
- if (tokenName(j) != null) key(tokenName(j).index) = j.asInstanceOf[byte];
-
- private def enterKeyword(s: String, tokenId: int) = {
- while (tokenId > tokenName.length) {
- val newTokName = new Array[Name](tokenName.length * 2);
- System.arraycopy(tokenName, 0, newTokName, 0, newTokName.length);
- tokenName = newTokName;
- }
- val n = Name.fromString(s);
- tokenName(tokenId) = n;
- if (n.index > maxKey) maxKey = n.index;
- if (tokenId >= numToken) numToken = tokenId + 1;
- }
-
-}
-
-}
diff --git a/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala b/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala
deleted file mode 100644
index fd63b075c6..0000000000
--- a/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala
+++ /dev/null
@@ -1,171 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import scalac.CompilationUnit;
-import scalac.symtab._;
-import scalac.ast.Tree;
-import scalac.{Global => scalac_Global, Phase};
-
-package scala.tools.scalac.ast.printer {
-
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.lang.Math;
-import java.util.HashMap;
-
-/**
- * HTML pretty printer for Scala abstract syntax trees.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-
-class HTMLTreePrinter(global0: scalac_Global, out0: PrintWriter)
- extends TextTreePrinter(global0, out0)
-{
- protected var outSectionLevel = 1;
- protected var started = false;
-
- override def begin(): Unit = {
- assert(!started);
-
- super.begin();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<html>");
- out.println("<head>");
- out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">");
- out.println("<link rel=\"stylesheet\" href=\"scala.css\" type=\"text/css\">");
- out.println("<title>Scala tree</title>");
- out.println("</head>");
- out.println("<body>");
-
- started = true;
- }
-
- override def end(): Unit = {
- assert(started);
-
- out.println("</body>");
- out.println("</html>");
- super.end();
-
- started = false;
- }
-
- override def beginSection(level: Int, title: String) = {
- outSectionLevel = Math.min(level, 4);
- beginSection1(outSectionLevel, title);
- }
-
- protected def beginSection1(level: Int, title: String): Unit = {
- if (level == 1)
- out.println("<hr/>");
- val tag: String = "h" + level;
- startTag(tag);
- print(Simple(title));
- endTag(tag);
- }
-
- protected def startTag(tag: String): Unit = {
- out.print('<'); out.print(tag); out.print('>');
- }
-
- protected def startTag(tag: String, attr1: String, val1: String): Unit = {
- out.print('<');
- out.print(tag);
- out.print(' ');
- out.print(attr1);
- out.print("=\"");
- out.print(val1);
- out.print("\">");
- }
-
- protected def endTag(tag: String): Unit = {
- out.print("</"); out.print(tag); out.print(">");
- }
-
- protected def startSpan(cls: String): Unit = {
- startTag("span", "class", cls);
- }
-
- protected def endSpan(): Unit = {
- endTag("span");
- }
-
- override protected def printString(str: String): Unit = {
- for (val i <- Iterator.range(0, str.length())) {
- val c = str.charAt(i);
- val entity: String = c match {
- case '<' => "lt";
- case '>' => "gt";
- case '&' => "amp";
- case _ => null
- }
- if (entity != null) {
- out.print('&');
- out.print(entity);
- out.print(';');
- } else {
- out.print(c);
- }
- }
- }
-
- protected val symAnchors = new HashMap/*<Symbol,Integer>*/();
-
- protected def symbolAnchor(sym: Symbol, usage: SymbolUsage): String = {
- var anchorId = symAnchors.get(sym).asInstanceOf[Integer];
- if (anchorId == null) {
- anchorId = new Integer(symAnchors.size());
- symAnchors.put(sym, anchorId);
- }
- if (usage == Definition)
- return anchorId.toString();
- else
- return "#" + anchorId.toString();
- }
-
- override protected def print(text: Text): Unit = text match {
- case Keyword(name) =>
- startSpan("kw");
- printString(name);
- endSpan();
- case Literal(str) =>
- startSpan("lit");
- printString(str);
- endSpan();
- case Identifier(symbol, name, usage) =>
- val defined = (usage == Definition);
- if (defined) startSpan("idDef");
- if (symbol != null) {
- val attr = if (defined) "name" else "href";
- startTag("a", attr, symbolAnchor(symbol, usage));
- if (usage == Use)
- printString(symbol.simpleName().toString());
- else
- printString(symbol.name.toString());
- endTag("a");
- } else
- printString(name.toString());
- if (defined) endSpan();
- case _ =>
- super.print(text);
- }
-
- override def printUnitHeader(unit: CompilationUnit): Unit = {
- beginSection1(outSectionLevel + 1, unit.source.toString());
- startTag("pre");
- }
-
- override def printUnitFooter(unit: CompilationUnit): Unit = {
- endTag("pre");
- }
-}
-}
diff --git a/sources/scala/tools/scalac/ast/printer/SwingPrinter.scala b/sources/scala/tools/scalac/ast/printer/SwingPrinter.scala
deleted file mode 100644
index 57cb7ee2db..0000000000
--- a/sources/scala/tools/scalac/ast/printer/SwingPrinter.scala
+++ /dev/null
@@ -1,264 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-
-import scalac.CompilationUnit;
-import scalac.symtab._;
-import scalac.ast.Tree;
-import scalac.ast.printer._;
-
-import scalac.{Global => scalac_Global, Phase};
-import scalac.CompilationUnit;
-import scalac.util.Name;
-import scalac.util.TypeNames;
-
-import scala.concurrent._;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.HashMap;
-
-import javax.swing.tree._;
-import javax.swing.event.TreeModelListener;
-import javax.swing._;
-
-import java.awt.{List => awtList, _};
-import java.awt.event._;
-
-package scala.tools.scalac.ast.printer {
-
-/**
- * Java Swing pretty printer for Scala abstract syntax trees.
- *
- * @author Iulian Dragos
- * @version 0.2
- */
-class SwingTreePrinter(global0: scalac_Global) extends TreePrinter {
- val global = global0;
-
- def begin() = ();
- def end() = ();
- def flush() = ();
-
-
- /** print the whole program */
- def print(units: Array[CompilationUnit]): Unit = {
- val phase: Phase = global.currentPhase;
-
- val tm = new ASTTreeModel();
-
- for (val i <- Iterator.range(0, units.length))
- tm.addUnit(units(i));
-
- val frame = new WindowFrame();
- frame.setTreeModel(tm);
-
- val lock = new Lock();
- frame.createFrame(lock);
-
- // wait for the frame to be closed
- lock.acquire;
- }
-
- def print(tree: Tree): Unit = ();
-
-}
-
-/** Tree model for abstract syntax trees */
-class ASTTreeModel extends TreeModel {
- var listeners: List[TreeModelListener] = Nil;
- var units: List[CompilationUnit] = Nil;
-
- def addUnit(c: CompilationUnit): Unit = units = c :: units;
-
- /** Add a listener to this tree */
- def addTreeModelListener(l : TreeModelListener): Unit = listeners = l :: listeners;
-
- /** Return the index'th child of parent */
- def getChild(parent: Any, index: Int): AnyRef = {
- packChildren(parent).drop(index).head;
- }
-
- /** Return the number of children this 'parent' has */
- def getChildCount(parent: Any): Int =
- packChildren(parent).length;
-
- /** Return the index of the given child */
- def getIndexOfChild(parent: Any, child: Any): Int =
- packChildren(parent).dropWhile(c => c != child).length;
-
- /** Return the root node */
- def getRoot(): AnyRef = units;
-
- /** Test whether the given node is a leaf */
- def isLeaf(node: Any): Boolean = packChildren(node).length == 0;
-
- def removeTreeModelListener(l: TreeModelListener): Unit =
- listeners remove (x => x == l);
-
- /** we ignore this message for now */
- def valueForPathChanged(path: TreePath, newValue: Any) = ();
-
- /** Return a list of objects for the current node. We have to
- * take care of the "top" of the tree, which is not made of case
- * classes of Tree. Therefore, instanceOf is used to differentatiate
- * between "true" tree nodes, and "logical" ones (CompilationUnit and
- * Program).
- *
- * @todo A type-safe version of this. However, new case classes of Tree
- * cannot be derived in Scala because of "final" method getType of
- * Tree, which overlaps with scala runtime types.
- */
- def packChildren(t: Any): List[AnyRef] =
- if (t.isInstanceOf[CompilationUnit]) {
- val cu = t.asInstanceOf[CompilationUnit];
- List.fromArray(cu.body)
- } else if (t.isInstanceOf[Tree])
- TreeInfo.packTreeChildren(t.asInstanceOf[Tree]);
- else if (t.isInstanceOf[List[CompilationUnit]])
- t.asInstanceOf[List[CompilationUnit]];
- else
- Nil;
-
-}
-
-
-/** a window that can host the Tree widget and provide methods for
- * displaying information */
-class WindowFrame {
- val frame = new JFrame("Scala AST");
- val topPane = new JPanel(new BorderLayout());
- val topRightPane = new JPanel(new BorderLayout());
- val bottomPane = new JPanel(new BorderLayout());
- var splitPane: JSplitPane = _;
- var treeModel: TreeModel = _;
-
- val textArea: JTextArea = new JTextArea(20, 50);
- val infoPanel = new InfoPanel();
-
-
- /** Create a frame that displays the AST.
- *
- * @param lock The lock is used in order to stop the compilation thread
- * until the user is done with the tree inspection. Swing creates its
- * own threads when the frame is packed, and therefore execution
- * would continue. However, this is not what we want, as the tree and
- * especially symbols/types would change while the window is visible.
- */
- def createFrame(lock: Lock): Unit = {
- lock.acquire; // keep the lock until the user closes the window
-
- frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-
- frame.addWindowListener(new WindowAdapter() {
- /** Release the lock, so compilation may resume after the window is closed. */
- override def windowClosed(e: WindowEvent): Unit = lock.release;
- });
-
- val tree = new JTree(treeModel) {
- /** Return the string for a tree node. */
- override def convertValueToText(value: Any, sel: Boolean,
- exp: Boolean, leaf: Boolean,
- row: Int, hasFocus: Boolean) = {
- if (value.isInstanceOf[List[CompilationUnit]])
- "Program"
- else if (value.isInstanceOf[CompilationUnit])
- "CompilationUnit"
- else {
- val Pair(cls, name) = TreeInfo.treeName(value.asInstanceOf[Tree]);
- if (name != TreeInfo.NO_NAME)
- cls + "[" + name.toString() + "]";
- else
- cls;
- }
- }
- }
-
- tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
- def valueChanged(e: javax.swing.event.TreeSelectionEvent): Unit = {
- textArea.setText(e.getPath().getLastPathComponent().toString());
- infoPanel.update(e.getPath().getLastPathComponent());
- }
- });
-
- val topSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, topPane, topRightPane);
- topPane.add(new JScrollPane(tree), BorderLayout.CENTER);
-
- topRightPane.add(new JScrollPane(infoPanel), BorderLayout.CENTER);
-
- bottomPane.add(new JScrollPane(textArea), BorderLayout.CENTER);
- textArea.setFont(new Font("monospaced", Font.PLAIN, 14));
- textArea.setEditable(false);
-
- splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topSplitPane, bottomPane);
- frame.getContentPane().add(splitPane);
- frame.pack();
- frame.setVisible(true);
- }
-
- def setTreeModel(tm: TreeModel): Unit = treeModel = tm;
-}
-
-/** Pannel that shows some information about the selected
- * tree node (like symbol, type, etc) */
-class InfoPanel extends JPanel() {
- val symbolLine = Box.createHorizontalBox();
- val symbolAttLine = Box.createHorizontalBox();
- val symbolTypeLine = Box.createHorizontalBox();
- val treeTypeLine = Box.createHorizontalBox();
-
- val symLabel = new JLabel("");
- val attLabel = new JLabel("");
- val stypeLabel = new JLabel("");
- val ttypeLabel = new JLabel("");
-
- setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
-
- symbolLine.add(new JLabel("Symbol: "));
- symbolLine.add(symLabel);
- symbolLine.add(Box.createHorizontalGlue());
-
- symbolAttLine.add(new JLabel("Symbol attributes: "));
- symbolAttLine.add(attLabel);
- symbolAttLine.add(Box.createHorizontalGlue());
-
- symbolTypeLine.add(new JLabel("Symbol type: "));
- symbolTypeLine.add(stypeLabel);
- symbolTypeLine.add(Box.createHorizontalGlue());
-
- treeTypeLine.add(new JLabel("Tree type: "));
- treeTypeLine.add(ttypeLabel);
- treeTypeLine.add(Box.createHorizontalGlue());
-
- add(symbolLine);
- add(symbolAttLine);
- add(symbolTypeLine);
- add(treeTypeLine);
-
- def update(v: AnyRef): Unit =
- if (v.isInstanceOf[Tree]) {
- val t = v.asInstanceOf[Tree];
-
- symLabel.setText(TreeInfo.symbolText(t));
- stypeLabel.setText(TreeInfo.symbolTypeText(t));
- attLabel.setText(TreeInfo.symbolAttributes(t));
- ttypeLabel.setText(t.getType().toString());
- } else
- reset;
-
- def reset: Unit = {
- symLabel.setText("");
- stypeLabel.setText("");
- ttypeLabel.setText("");
- attLabel.setText("");
- }
-}
-
-} // package
-
diff --git a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala
deleted file mode 100644
index fc6b66e559..0000000000
--- a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala
+++ /dev/null
@@ -1,1055 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-import scalac.CompilationUnit;
-import scalac.{Global => scalac_Global, Phase};
-import scalac.ast._;
-import scalac.ast.printer._;
-import scalac.symtab._;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.TypeNames;
-
-package scala.tools.scalac.ast.printer {
-
-/**
- * Text pretty printer for Scala abstract syntax trees.
- *
- * @author Michel Schinz, Matthias Zenger
- * @version 1.0
- */
-class TextTreePrinter(global0: scalac_Global, out0: PrintWriter)
- extends TreePrinter
-{
- //##########################################################################
- // Public Fields
-
- val global: scalac_Global = global0;
- val out: PrintWriter = out0;
-
- //##########################################################################
- // Protected Fields
-
- protected var indentMargin = 0;
- protected val INDENT_STEP = 2;
- protected var INDENT_STRING = " ";
- protected val MAX_INDENT = INDENT_STRING.length();
-
- //##########################################################################
- // Public Methods - TreePrinter interface
-
- def begin(): Unit = ();
- def end(): Unit = flush();
- def flush(): Unit = out.flush();
-
- def print(units: Array[CompilationUnit]): Unit = printUnits(units);
- def print(tree: Tree): Unit = printTree(tree);
-
- //##########################################################################
-
- def beginSection(level: Int, title: String) = {
- out.println("[[" + title + "]]");
- flush();
- }
-
- protected def indent() = {
- indentMargin = indentMargin + Math.min(MAX_INDENT, INDENT_STEP);
- }
-
- protected def undent() = {
- indentMargin = indentMargin - Math.max(0, INDENT_STEP);
- }
-
- protected def print(str: String): Unit = {
- out.print(str);
- }
-
- protected def printString(str: String) = {
- out.print(str);
- }
-
- protected def printNewLine() = {
- out.println();
- while (indentMargin > INDENT_STRING.length()) {
- INDENT_STRING = INDENT_STRING + INDENT_STRING;
- }
- if (indentMargin > 0)
- out.write(INDENT_STRING, 0, indentMargin);
- }
-
- abstract class Text;
- case object None extends Text;
- case object Space extends Text;
- case object Newline extends Text;
- case class Simple(str: String) extends Text;
- case class Literal(str: String) extends Text;
- case class Keyword(name: String) extends Text;
- case class Identifier(symbol: Symbol, name: Name, usage: SymbolUsage)
- extends Text;
- case class Sequence(elements: List[Text]) extends Text;
-
- abstract class SymbolUsage;
- case object Definition extends SymbolUsage;
- case object Use extends SymbolUsage;
-
- protected def print(text: Text): Unit = text match {
- case None => ;
- case Space => printString(" ")
- case Newline => printNewLine()
- case Simple(str) => printString(str)
- case Literal(str) => printString(str)
- case Keyword(name) => printString(name)
- case Identifier(sym, name, usage) =>
-
- if (sym != null) {
- if (usage == Use)
- printString(sym.simpleName().toString());
- else
- printString(sym.name.toString());
- if (global.uniqid)
- printUniqueIdOf(sym)
- } else {
- printString(name.toString());
- }
- case Sequence(elements) => print(elements)
- }
-
- protected def print(texts: List[Text]): Unit =
- for (val text <- texts) print(text);
-
- protected final val KW_ABSTRACT = Keyword("abstract");
- protected final val KW_CASE = Keyword("case");
- protected final val KW_CLASS = Keyword("class");
- protected final val KW_DEF = Keyword("def");
- protected final val KW_DO = Keyword("do");
- protected final val KW_ELSE = Keyword("else");
- protected final val KW_EXTENDS = Keyword("extends");
- protected final val KW_FINAL = Keyword("final");
- protected final val KW_FOR = Keyword("for");
- protected final val KW_IF = Keyword("if");
- protected final val KW_IMPLICIT = Keyword("implicit");
- protected final val KW_IMPORT = Keyword("import");
- protected final val KW_INTERFACE = Keyword("interface");
- protected final val KW_MATCH = Keyword("match");
- protected final val KW_NEW = Keyword("new");
- protected final val KW_NULL = Keyword("null");
- protected final val KW_OBJECT = Keyword("object");
- protected final val KW_OUTER = Keyword("outer");
- protected final val KW_OVERRIDE = Keyword("override");
- protected final val KW_PACKAGE = Keyword("package");
- protected final val KW_PRIVATE = Keyword("private");
- protected final val KW_PROTECTED = Keyword("protected");
- protected final val KW_RETURN = Keyword("return");
- protected final val KW_SEALED = Keyword("sealed");
- protected final val KW_STATIC = Keyword("static");
- protected final val KW_SUPER = Keyword("super");
- protected final val KW_THIS = Keyword("this");
- protected final val KW_TYPE = Keyword("type");
- protected final val KW_VAL = Keyword("val");
- protected final val KW_VAR = Keyword("var");
- protected final val KW_WITH = Keyword("with");
- protected final val KW_YIELD = Keyword("yield");
-
- protected final val TXT_ERROR = Simple("<error>");
- protected final val TXT_UNKNOWN = Simple("<unknown>");
- protected final val TXT_NULL = Simple("<null>");
- protected final val TXT_OBJECT_COMMENT = Simple("/*object*/ ");
- protected final val TXT_EMPTY = Simple("<empty>");
- protected final val TXT_TEMPLATE = Simple("<template>");
-
- protected final val TXT_QUOTE = Simple("\"");
- protected final val TXT_PLUS = Simple("+");
- protected final val TXT_COLON = Simple(":");
- protected final val TXT_SEMICOLON = Simple(";");
- protected final val TXT_DOT = Simple(".");
- protected final val TXT_COMMA = Simple(",");
- protected final val TXT_EQUAL = Simple("=");
- protected final val TXT_SUPERTYPE = Simple(">:");
- protected final val TXT_SUBTYPE = Simple("<:");
- protected final val TXT_VIEWBOUND = Simple("<%");
- protected final val TXT_HASH = Simple("#");
- protected final val TXT_RIGHT_ARROW = Simple("=>");
- protected final val TXT_LEFT_PAREN = Simple("(");
- protected final val TXT_RIGHT_PAREN = Simple(")");
- protected final val TXT_LEFT_BRACE = Simple("{");
- protected final val TXT_RIGHT_BRACE = Simple("}");
- protected final val TXT_LEFT_BRACKET = Simple("[");
- protected final val TXT_RIGHT_BRACKET = Simple("]");
- protected final val TXT_BAR = Simple("|");
- protected final val TXT_AT = Simple("@");
-
- protected final val TXT_WITH_SP =
- Sequence(List(Space, KW_WITH, Space));
- protected final val TXT_BLOCK_BEGIN =
- Sequence(List(TXT_LEFT_BRACE, Newline));
- protected final val TXT_BLOCK_END =
- Sequence(List(Newline, TXT_RIGHT_BRACE));
- protected final val TXT_BLOCK_SEP =
- Sequence(List(TXT_SEMICOLON, Newline));
- protected final val TXT_COMMA_SP =
- Sequence(List(TXT_COMMA, Space));
- protected final val TXT_ELSE_NL =
- Sequence(List(KW_ELSE, Newline));
- protected final val TXT_BAR_SP =
- Sequence(List(Space, TXT_BAR, Space));
-
- //##########################################################################
- // Public Methods - Printing Units
-
- def printUnits(units: Array[CompilationUnit]): Unit = {
- val phase: Phase = global.currentPhase;
- beginSection(1, "syntax trees at " + phase + " (after " + phase.prev + ")");
- for (val i <- Iterator.range(0, units.length))
- printUnit(units(i));
- }
-
- def printUnit(unit: CompilationUnit): Unit = {
- printUnitHeader(unit);
- if (unit.body != null) {
- for (val i <- Iterator.range(0, unit.body.length)) {
- print(unit.body(i));
- print(TXT_BLOCK_SEP);
- }
- } else {
- print(TXT_NULL);
- }
- printUnitFooter(unit);
- flush();
- }
-
- def printUnitHeader(unit: CompilationUnit): Unit =
- print(Simple("// Scala source: " + unit.source + "\n"));
-
- def printUnitFooter(unit: CompilationUnit): Unit =
- print(Newline);
-
- //##########################################################################
- // Public Methods - Printing trees
-
- def printTree(tree: Tree): Unit = {
- val symbol = tree.symbol();
- val attributed = symbol != null && (
- !tree.definesSymbol()
- || global.currentPhase.id > global.PHASE.ANALYZER.id()
- || symbol.isInitialized());
- if (attributed) printATree(tree, symbol) else printSTree(tree);
- if (global.printtypes && tree.isTerm()) printTypeOf(tree);
- }
-
- def printTypeOf(tree: Tree): Unit = {
- val tpe = tree.`type`;
- if (tpe != Type.NoType) {
- print(TXT_LEFT_BRACE);
- if (tpe != null) printType(tpe) else print(TXT_NULL);
- print(TXT_RIGHT_BRACE);
- }
- }
-
- def printATree(tree: Tree, symbol: Symbol): Unit = tree match {
- case Tree.ClassDef(_, _, _, _, _, impl) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- print(if (symbol.isInterface()) KW_INTERFACE else KW_CLASS);
- print(Space);
- printSymbol(symbol, Definition);
- printAParams(symbol.primaryConstructor().info());
- if (symbol.thisSym() != symbol)
- { print(TXT_COLON); print(Space); printType(symbol.typeOfThis()); }
- printTemplate(symbol, impl);
-
- case Tree.ModuleDef(_, _, _, impl) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- print(KW_OBJECT);
- print(Space);
- printSymbol(symbol, Definition);
- val clasz = symbol.moduleClass();
- if (clasz.thisSym() != clasz)
- { print(TXT_COLON); print(Space); printType(clasz.typeOfThis()); }
- printTemplate(clasz, impl);
-
- case Tree.ValDef(_, _, _, rhs) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- if (symbol.isModule()) print(TXT_OBJECT_COMMENT);
- print(if (symbol.isVariable()) KW_VAR else KW_VAL);
- print(Space);
- printSymbol(symbol, Definition);
- print(TXT_COLON);
- print(Space);
- printType(symbol.info());
- if (rhs != Tree.Empty || !symbol.isDeferred()) {
- print(Space); print(TXT_EQUAL); print(Space);
- if (rhs == Tree.Empty) print("_"); else print(rhs);
- }
-
- case Tree.DefDef(_, _, _, _, _, rhs) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- print(KW_DEF);
- print(Space);
- if (symbol.isConstructor()) print(KW_THIS);
- else printSymbol(symbol, Definition);
- printAParams(symbol.info());
- if (!symbol.isConstructor()) {
- print(TXT_COLON);
- print(Space);
- printType(symbol.info().resultType());
- }
- printOpt(TXT_EQUAL, rhs, true);
-
- case Tree.AbsTypeDef(_, _, _, _) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- print(KW_TYPE);
- print(Space);
- printSymbol(symbol, Definition);
- printABoundsOf(symbol);
-
- case Tree.AliasTypeDef(_, _, _, _) =>
- printAttributes(symbol);
- printAModifiers(symbol);
- print(KW_TYPE);
- print(Space);
- printSymbol(symbol, Definition);
- printATypeParams(symbol.typeParams());
- print(Space);
- print(TXT_EQUAL);
- print(Space);
- printType(symbol.info());
-
- case Tree.Template(_, _) =>
- print(TXT_TEMPLATE);
- printTemplate(symbol.owner(), tree.asInstanceOf[Tree.Template]);
-
- case Tree.LabelDef(_, params, rhs) =>
- printSymbol(symbol, Definition);
- printArray(params.asInstanceOf[Array[Tree]], TXT_LEFT_PAREN, TXT_RIGHT_PAREN, TXT_COMMA_SP);
- print(rhs);
-
- case Tree.Bind(_, rhs) =>
- printSymbol(symbol, Definition);
- print(Space);
- print(TXT_AT);
- print(Space);
- print(rhs);
-
- case Tree.Return(expr) =>
- print(KW_RETURN);
- printString("/*");
- printSymbol(symbol, Use);
- printString("*/");
- print(Space);
- print(expr);
-
- case Tree.Create(qualifier, targs) =>
- if (qualifier != Tree.Empty) {
- print(qualifier);
- print(TXT_DOT);
- }
- printSymbol(symbol, Use);
- if (targs.length != 0 || !global.debug)
- printArray(targs, TXT_LEFT_BRACKET, TXT_RIGHT_BRACKET, TXT_COMMA_SP);
-
- case Tree.Super(_, mixin) =>
- printSymbol(symbol, Use);
- print(TXT_DOT);
- print(KW_SUPER);
- if (mixin != TypeNames.EMPTY) {
- print(TXT_LEFT_PAREN);
- print(mixin.toString());
- print(TXT_RIGHT_PAREN);
- }
-
- case Tree.This(_) =>
- printSymbol(symbol, Use);
- print(TXT_DOT);
- print(KW_THIS);
-
- case Tree.Select(qualifier, _) =>
- if (!symbol.owner().isRoot() && !global.debug) {
- print(qualifier);
- print(TXT_DOT);
- }
- printSymbol(symbol, Use);
-
- case Tree.Ident(_) =>
- printSymbol(symbol, Use);
-
- case Tree.SelectFromType(qualifier, _) =>
- print(qualifier);
- print(Space); print(TXT_HASH); print(Space);
- printSymbol(symbol, Use);
-
- case _ =>
- printSTree(tree);
- }
-
- def printSTree(tree: Tree): Unit = tree match {
- case Tree.Empty =>
- print(TXT_EMPTY);
-
- case Tree.Attributed(attr, definition) =>
- print(TXT_LEFT_BRACKET);
- print(attr);
- print(TXT_RIGHT_BRACKET);
- printNewLine();
- print(definition);
-
- case Tree.DocDef(comment, definition) =>
- print(comment);
- printNewLine();
- print(definition);
-
- case Tree.ClassDef(mods, name, tparams, vparams, tpe, impl) =>
- printSModifiers(mods);
- print(if ((mods & Modifiers.INTERFACE) != 0) KW_INTERFACE else KW_CLASS);
- print(Space);
- printName(tree, name, Definition);
- printSTypeParams(tparams);
- printSValueParams(vparams);
- printOpt(TXT_COLON, tpe, false);
- printTemplate(tree.symbol(), impl);
-
- case Tree.PackageDef(packaged, impl) =>
- print(KW_PACKAGE);
- print(Space);
- print(packaged);
- printTemplate(null, impl);
-
- case Tree.ModuleDef(mods, name, tpe, impl) =>
- printSModifiers(mods);
- print(KW_OBJECT);
- print(Space);
- printName(tree, name, Definition);
- printOpt(TXT_COLON, tpe, false);
- printTemplate(null, impl);
-
- case Tree.ValDef(mods, name, tpe, rhs) =>
- printSModifiers(mods);
- if ((mods & Modifiers.MODUL) != 0) print(TXT_OBJECT_COMMENT);
- print(if ((mods & Modifiers.MUTABLE) != 0) KW_VAR else KW_VAL);
- print(Space);
- printName(tree, name, Definition);
- printOpt(TXT_COLON, tpe, false);
- if ((mods & Modifiers.DEFERRED) == 0) {
- print(Space); print(TXT_EQUAL); print(Space);
- if (rhs == Tree.Empty) print("_");
- else print(rhs);
- }
-
- case Tree.PatDef(mods, pat, rhs) =>
- printSModifiers(mods);
- print(KW_VAL);
- print(Space);
- print(pat);
- printOpt(TXT_EQUAL, rhs, true);
-
- case Tree.DefDef(mods, name, tparams, vparams, tpe, rhs) =>
- printSModifiers(mods);
- print(KW_DEF);
- print(Space);
- if (name.isTypeName()) print(KW_THIS);
- else printName(tree, name, Definition);
- printSTypeParams(tparams);
- printSValueParams(vparams);
- printOpt(TXT_COLON, tpe, false);
- printOpt(TXT_EQUAL, rhs, true);
-
- case Tree.AbsTypeDef(mods, name, rhs, lobound) =>
- printSModifiers(mods);
- print(KW_TYPE);
- print(Space);
- printName(tree, name, Definition);
- printSBounds(lobound, rhs, mods);
-
- case Tree.AliasTypeDef(mods, name, tparams, rhs) =>
- printSModifiers(mods);
- print(KW_TYPE);
- print(Space);
- printName(tree, name, Definition);
- printSTypeParams(tparams);
- printOpt(TXT_EQUAL, rhs, true);
-
- case Tree.Import(expr, selectors) =>
- print(KW_IMPORT);
- print(Space);
- print(expr);
- print(TXT_DOT);
- print(TXT_LEFT_BRACE);
- var i = 0;
- while (i < selectors.length) {
- if (i > 0) print(TXT_COMMA_SP);
- print(selectors(i).toString());
- if (i + 1 < selectors.length && selectors(i) != selectors(i+1)) {
- print(TXT_RIGHT_ARROW);
- print(selectors(i+1).toString());
- }
- i = i + 2;
- }
- print(TXT_RIGHT_BRACE);
-
- case Tree.Template(_, _) =>
- val local = tree.symbol();
- val clasz = if (local != null) local.owner() else null;
- print(TXT_TEMPLATE);
- printTemplate(local, tree.asInstanceOf[Tree.Template]);
-
- case Tree.CaseDef(pat, guard, body) =>
- print(KW_CASE);
- print(Space);
- print(pat);
- printOpt(KW_IF, guard, true);
- print(Space);
- print(TXT_RIGHT_ARROW);
- print(Space);
- print(body);
-
- case Tree.LabelDef(name, params, rhs) =>
- printName(tree, name, Definition);
- printArray(params.asInstanceOf[Array[Tree]], TXT_LEFT_PAREN, TXT_RIGHT_PAREN, TXT_COMMA_SP);
- print(rhs);
-
- case Tree.Block(stats, value) =>
- printArray(stats, TXT_BLOCK_BEGIN, TXT_SEMICOLON, TXT_BLOCK_SEP);
- indent();
- printNewLine();
- print(value);
- undent();
- print(TXT_BLOCK_END);
-
- case Tree.Sequence(trees) =>
- printArray(trees, TXT_LEFT_BRACKET, TXT_RIGHT_BRACKET, TXT_COMMA_SP);
-
- case Tree.Alternative(trees) =>
- printArray(trees, TXT_LEFT_PAREN, TXT_RIGHT_PAREN, TXT_BAR_SP);
-
- case Tree.Bind(name, t) =>
- printName(tree, name, Definition);
- print(Space);
- print(TXT_AT);
- print(Space);
- print( t );
-
- case Tree.Visitor(cases) =>
- printArray(cases.asInstanceOf[Array[Tree]], TXT_BLOCK_BEGIN, TXT_BLOCK_END, Newline);
-
- case Tree.Function(vparams, body) =>
- print(TXT_LEFT_PAREN);
- printSValueParams(vparams);
- print(Space);
- print(TXT_RIGHT_ARROW);
- print(Space);
- print(body);
- print(TXT_RIGHT_PAREN);
-
- case Tree.Assign(lhs, rhs) =>
- print(lhs);
- print(Space);
- print(TXT_EQUAL);
- print(Space);
- print(rhs);
-
- case Tree.If(cond, thenp, elsep) =>
- print(KW_IF);
- print(Space);
- print(TXT_LEFT_PAREN);
- print(cond);
- print(TXT_RIGHT_PAREN);
- indent(); print(Newline);
- print(thenp);
- undent(); print(Newline);
- indent(); printOpt(TXT_ELSE_NL, elsep, false); undent();
-
- case Tree.Switch(expr, tags, bodies, defaultBody) =>
- print("<switch>");
- print(Space);
- print(TXT_LEFT_PAREN);
- print(expr);
- print(TXT_RIGHT_PAREN);
- print(Space);
- indent();
- print(TXT_BLOCK_BEGIN);
- for (val i <- Iterator.range(0, tags.length)) {
- print(KW_CASE);
- print(Space);
- print("" + tags(i));
- print(Space);
- print(TXT_RIGHT_ARROW);
- print(Space);
- print(bodies(i));
- print(Newline);
- }
- print("<default> => ");
- print(defaultBody);
- undent();
- print(TXT_BLOCK_END);
-
- case Tree.Return(expr) =>
- print(KW_RETURN);
- print(Space);
- print(expr);
-
- case Tree.New(init) =>
- print(KW_NEW);
- print(Space);
- print(init);
-
- case Tree.Typed(expr, tpe) =>
- print(TXT_LEFT_PAREN);
- print(expr);
- print(TXT_RIGHT_PAREN);
- print(Space);
- print(TXT_COLON);
- print(Space);
- print(tpe);
-
- case Tree.TypeApply(fun, targs) =>
- print(fun);
- printArray(targs, TXT_LEFT_BRACKET, TXT_RIGHT_BRACKET, TXT_COMMA_SP);
-
- case Tree.Apply(fun, vargs) =>
- if (fun.isInstanceOf[Tree.TypeTerm]) {
- val result = fun.`type`.resultType();
- print(Type.appliedType(result, Type.EMPTY_ARRAY).toString());
- }
- else
- print(fun);
- printArray(vargs, TXT_LEFT_PAREN, TXT_RIGHT_PAREN, TXT_COMMA_SP);
-
- case Tree.Super(qualifier, mixin) =>
- if (qualifier != TypeNames.EMPTY) {
- printName(tree, qualifier, Use);
- print(TXT_DOT);
- }
- print(KW_SUPER);
- if (mixin != TypeNames.EMPTY) {
- print(TXT_LEFT_PAREN);
- print(mixin.toString());
- print(TXT_RIGHT_PAREN);
- }
-
- case Tree.This(name) =>
- if (name != TypeNames.EMPTY) {
- printName(tree, name, Use);
- print(TXT_DOT);
- }
- print(KW_THIS);
-
- case Tree.Select(qualifier, name) =>
- if (global.debug || qualifier.symbol() == null || !qualifier.symbol().isRoot()) {
- print(qualifier);
- print(TXT_DOT);
- }
- printName(tree, name, Use);
-
- case Tree.Ident(name) =>
- printName(tree, name, Use);
-
- case Tree.Literal(obj) =>
- print(Literal(obj.toString()));
-
- case Tree.TypeTerm() =>
- printType(tree.`type`);
-
- case Tree.SingletonType(ref) =>
- print(ref);
- print(TXT_DOT); print(KW_TYPE);
-
- case Tree.SelectFromType(qualifier, selector) =>
- print(qualifier);
- print(Space); print(TXT_HASH); print(Space);
- printName(tree, selector, Use);
-
- case Tree.FunType(argtpes, restpe) =>
- printArray(argtpes, TXT_LEFT_PAREN, TXT_RIGHT_PAREN, TXT_COMMA_SP);
- print(TXT_RIGHT_ARROW);
- print(restpe);
-
- case Tree.CompoundType(baseTypes, refinements) =>
- printArray(baseTypes, None, None, TXT_WITH_SP);
- printArray(refinements, TXT_BLOCK_BEGIN, TXT_BLOCK_END, Newline);
-
- case Tree.AppliedType(tpe, args) =>
- print(tpe);
- indent();
- print(TXT_LEFT_BRACKET);
- for (val i <- Iterator.range(0, args.length)) {
- if (i > 0) print(TXT_COMMA_SP);
- print(args(i));
- }
- undent();
- print(TXT_RIGHT_BRACKET);
-
- case _ =>
- print(TXT_UNKNOWN);
- }
-
- //##########################################################################
- // Public Methods - Printing symbols and names
-
- /** Print symbol. */
- def printSymbol(symbol: Symbol, usage: SymbolUsage): Unit =
- print(Identifier(symbol, symbol.name, usage));
-
- /** Print unique identifier of symbol */
- def printUniqueIdOf(symbol: Symbol): Unit = {
- print(TXT_HASH);
- printString(String.valueOf(symbol.id));
- }
-
- /** Print name. */
- def printName(name: Name, usage: SymbolUsage): Unit =
- print(Identifier(null, name, usage));
-
- /** Print name. */
- def printName(tree: Tree, name: Name, usage: SymbolUsage): Unit =
- if (tree.symbol() != null) printSymbol(tree.symbol(), usage)
- else printName(name, usage);
-
- //##########################################################################
- // Public Methods - Printing modifiers
-
- /** Print syntactic modifiers. */
- def printSModifiers(flags: Int): Unit = {
- if ((flags & Modifiers.ABSTRACT) != 0) {
- print(KW_ABSTRACT);
- print(Space);
- }
- if ((flags & Modifiers.FINAL) != 0) {
- print(KW_FINAL);
- print(Space);
- }
- if ((flags & Modifiers.SEALED) != 0) {
- print(KW_SEALED);
- print(Space);
- }
- if ((flags & Modifiers.PRIVATE) != 0) {
- print(KW_PRIVATE);
- print(Space);
- }
- if ((flags & Modifiers.PROTECTED) != 0) {
- print(KW_PROTECTED);
- print(Space);
- }
- if ((flags & Modifiers.OVERRIDE) != 0) {
- print(KW_OVERRIDE);
- print(Space);
- }
- if ((flags & Modifiers.CASE) != 0) {
- print(KW_CASE);
- print(Space);
- }
- if ((flags & Modifiers.DEF) != 0) {
- print(KW_DEF);
- print(Space);
- }
- }
-
- /** Print attributed modifiers. */
- def printAModifiers(symbol: Symbol): Unit = {
- if (symbol.isAbstractClass()) {
- print(KW_ABSTRACT);
- print(Space);
- }
- if (symbol.isFinal()) {
- print(KW_FINAL);
- print(Space);
- }
- if (symbol.isSealed()) {
- print(KW_SEALED);
- print(Space);
- }
- if (symbol.isPrivate()) {
- print(KW_PRIVATE);
- print(Space);
- }
- if (symbol.isProtected()) {
- print(KW_PROTECTED);
- print(Space);
- }
- if (symbol.isOverride()) {
- print(KW_OVERRIDE);
- print(Space);
- }
- if (symbol.isCaseClass()) {
- print(KW_CASE);
- print(Space);
- }
- if (symbol.isDefParameter()) {
- print(KW_DEF);
- print(Space);
- }
- }
-
- def printAttributes(symbol: Symbol): Unit = {
- val attrs = global.getAttributes(symbol);
- if (attrs != null) {
- print(attrs.toString());
- print(Newline);
- }
- }
-
- //##########################################################################
- // Public Methods - Printing templates
-
- /** Print template. */
- def printTemplate(clasz: Symbol, template: Tree.Template): Unit = {
- val local = template.symbol();
- val constructors = if (clasz == null) null else clasz.allConstructors();
- val primary = if (clasz == null) null else clasz.primaryConstructor();
- val parents = template.parents;
- val body = template.body;
- val types = new ArrayList();
- // collect type members
- if (clasz != null) {
- if (global.currentPhase.id > global.PHASE.ADDACCESSORS.id()) {
- val i = clasz.members().iterator();
- while (i.hasNext()) {
- val member = i.next();
- if (member.isTypeAlias() || member.isAbstractType())
- types.add(member);
- }
- }
- }
- // print parents
- if (parents.length > 0) {
- print(Space);
- print(KW_EXTENDS);
- print(Space);
- printArray(parents, None, None, TXT_WITH_SP);
- }
- // print local
- if (global.uniqid && (local != null || constructors != null)) {
- print(Space);
- printString("/*");
- if (constructors != null) {
- printString("constructors");
- printUniqueIdOf(constructors);
- printString(",primary");
- printUniqueIdOf(primary);
- }
- if (local != null) {
- if (constructors != null) printString(",");
- printString("local");
- printUniqueIdOf(local);
- }
- printString("*/");
- }
- // print body
- if (body.length > 0 || types.size() > 0) {
- print(Space);
- indent();
- print(TXT_BLOCK_BEGIN);
- if (types.size() > 0) {
- val printer =
- new SymbolTablePrinter(INDENT_STRING.substring(0, indentMargin));
- printer.indent();
- var i: Int = 0;
- while (i < types.size()) {
- if (i > 0) printer.line();
- val type0 = types.get(i).asInstanceOf[Symbol];
- printer.printSignature(type0).print(';');
- i = i + 1;
- }
- printer.undent();
- print(printer.toString().substring(indentMargin));
- print(Newline);
- }
- var i: Int = 0;
- while (i < body.length) {
- if (i > 0) print(TXT_BLOCK_SEP);
- print(body(i));
- i = i + 1;
- }
- undent();
- print(TXT_BLOCK_END);
- }
- }
-
- //##########################################################################
- // Public Methods - Printing parameters
-
- /** Print attributed parameter lists. */
- def printAParams(tpe: Type): Unit = tpe match {
- case Type.PolyType(params, result) =>
- printATypeParams(params);
- printAParams(result);
- case Type.MethodType(params, result) =>
- printAValueParams(params);
- printAParams(result);
- case _ =>
- }
-
- /** Print attributed type parameter list. */
- def printATypeParams(tparams: Array[Symbol]): Unit =
- if (tparams.length > 0 && !global.debug) {
- print(TXT_LEFT_BRACKET);
- for (val i <- Iterator.range(0, tparams.length)) {
- if (i > 0) print(TXT_COMMA_SP);
- printATypeParam(tparams(i));
- }
- print(TXT_RIGHT_BRACKET);
- }
-
- /** Print attributed type parameter. */
- def printATypeParam(tparam: Symbol): Unit = {
- printAModifiers(tparam);
- printSymbol(tparam, Definition);
- printABoundsOf(tparam);
- }
-
- /** Print attributed value parameter list. */
- def printAValueParams(vparams: Array[Symbol]): Unit = {
- print(TXT_LEFT_PAREN);
- for (val i <- Iterator.range(0, vparams.length)) {
- if (i > 0) print(TXT_COMMA_SP);
- printAValueParam(vparams(i));
- }
- print(TXT_RIGHT_PAREN);
- }
-
- /** Print attributed value parameter. */
- def printAValueParam(vparam: Symbol): Unit = {
- printAModifiers(vparam);
- if (vparam.hasParamAccessorFlag()) {
- print(KW_VAL); print(Space);
- }
- printSymbol(vparam, Definition);
- print(TXT_COLON);
- print(Space);
- printType(vparam.info());
- }
-
- /** Print syntactic type parameter list. */
- def printSTypeParams(tparams: Array[Tree.AbsTypeDef]): Unit =
- if (tparams.length > 0) {
- print(TXT_LEFT_BRACKET);
- for (val i <- Iterator.range(0, tparams.length)) {
- if (i > 0) print(TXT_COMMA_SP);
- printSTypeParam(tparams(i));
- }
- print(TXT_RIGHT_BRACKET);
- }
-
- /** Print syntactic type parameter. */
- def printSTypeParam(tparam: Tree.AbsTypeDef): Unit = {
- printSModifiers(tparam.mods);
- printName(tparam, tparam.name, Definition); // !!!
- printSBounds(tparam.lobound, tparam.rhs, tparam.mods);
- }
-
- /** Print syntactic value parameter lists. */
- def printSValueParams(vparamss: Array[Array[Tree.ValDef]]): Unit =
- for (val i <- Iterator.range(0, vparamss.length))
- printSValueParams(vparamss(i));
-
- /** Print syntactic value parameter list. */
- def printSValueParams(vparams: Array[Tree.ValDef]): Unit = {
- print(TXT_LEFT_PAREN);
- for (val i <- Iterator.range(0, vparams.length)) {
- if (i > 0) print(TXT_COMMA_SP);
- printSValueParam(vparams(i));
- }
- print(TXT_RIGHT_PAREN);
- }
-
- /** Print syntactic value parameter. */
- def printSValueParam(vparam: Tree.ValDef): Unit = {
- printSModifiers(vparam.mods);
- if ((vparam.mods & Modifiers.PARAMACCESSOR) != 0) {
- print(KW_VAL); print(Space);
- }
- printName(vparam, vparam.name, Definition); // !!!
- printOpt(TXT_COLON, vparam.tpe, false);
- }
-
- //##########################################################################
- // Public Methods - Printing types and bounds
-
- /** Print attributed type. */
- def printType(tp: Type): Unit = {
- print(tp.toString());
- }
-
- /** Print attributed bound. */
- def printABound(kind: Text, bound: Type, default: Symbol): Unit = {
- if (bound.symbol() != default && !global.debug) {
- print(Space);
- print(kind);
- print(Space);
- printType(bound);
- }
- }
-
- /** Print attributed lower bound. */
- def printALoBound(lobound: Type): Unit =
- printABound(TXT_SUPERTYPE, lobound, global.definitions.ALL_CLASS);
-
- /** Print attributed view bound. */
- def printAVuBound(vubound: Type): Unit =
- printABound(TXT_VIEWBOUND, vubound, global.definitions.ANY_CLASS);
-
- /** Print attributed higher bound. */
- def printAHiBound(hibound: Type): Unit =
- printABound(TXT_SUBTYPE, hibound, global.definitions.ANY_CLASS);
-
- /** Print attributed bounds of symbol. */
- def printABoundsOf(symbol: Symbol): Unit = {
- printALoBound(symbol.loBound());
- if (symbol.isViewBounded()) printAVuBound(symbol.vuBound());
- printAHiBound(symbol.info());
- }
-
- /** Print syntactic bounds. */
- def printSBounds(lobound: Tree, hibound: Tree, mods: Int): Unit = {
- if (lobound.getType() != null)
- printALoBound(lobound.getType());
- else if (!"scala.All".equals(lobound.toString()) && !global.debug)
- printOpt(TXT_SUPERTYPE, lobound, true);
- val isViewBounded = (mods & Modifiers.VIEWBOUND) != 0;
- if (hibound.getType() != null)
- if (isViewBounded)
- printAVuBound(hibound.getType());
- else
- printAHiBound(hibound.getType());
- else if (!"scala.Any".equals(hibound.toString()) && !global.debug)
- printOpt(if (isViewBounded) TXT_VIEWBOUND else TXT_SUBTYPE,hibound,true);
- }
-
- //##########################################################################
- // Public Methods - Helper methods
-
- def printArray(trees: Array[Tree], open: Text, close: Text, sep: Text):Unit={
- indent();
- print(open);
- for (val i <- Iterator.range(0, trees.length)) {
- if (i > 0) print(sep);
- print(trees(i));
- }
- undent();
- print(close);
- }
-
- def printOpt(prefix: Text, tree: Tree, spaceBefore: boolean): Unit =
- if (tree != Tree.Empty) {
- if (spaceBefore)
- print(Space);
- print(prefix);
- print(Space);
- print(tree);
- }
-
- //##########################################################################
-}
-}
diff --git a/sources/scala/tools/scalac/ast/printer/TreeInfo.scala b/sources/scala/tools/scalac/ast/printer/TreeInfo.scala
deleted file mode 100644
index e83ef5535c..0000000000
--- a/sources/scala/tools/scalac/ast/printer/TreeInfo.scala
+++ /dev/null
@@ -1,419 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-import scalac.CompilationUnit;
-import scalac.symtab._;
-import scalac.ast.Tree;
-
-import scalac.{Global => scalac_Global, Phase};
-import scalac.CompilationUnit;
-import scalac.util.Name;
-import scalac.util.TypeNames;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.lang.Math;
-import java.util.HashMap;
-
-import javax.swing.tree._;
-import javax.swing.event.TreeModelListener;
-import javax.swing._;
-
-import java.awt.BorderLayout;
-
-package scala.tools.scalac.ast.printer {
-
-
-/** Computes different information about a tree node. It
- is used as central place to do all pattern matching against
- Tree.
-*/
-object TreeInfo {
- val NO_NAME = Name.fromString("");
-
- /** Return the case class name and the Name, if the node defines one */
- def treeName(t: Tree): Pair[String, Name] = t match {
- case Tree.Attributed(attribute, definition) =>
- Pair("Attributed", NO_NAME);
-
- case Tree.DocDef(comment, definition) =>
- Pair("DocDef", NO_NAME);
-
- case Tree.ClassDef(mods, name, tparams, vparams, tpe, impl) =>
- Pair("ClassDef", name);
-
- case Tree.PackageDef(packaged, impl) =>
- Pair("PackageDef", NO_NAME);
-
- case Tree.ModuleDef(mods, name, tpe, impl) =>
- Pair("ModuleDef", name);
-
- case Tree.ValDef(mods, name, tpe, rhs) =>
- Pair("ValDef", name);
-
- case Tree.PatDef(mods, pat, rhs) =>
- Pair("PatDef", NO_NAME);
-
- case Tree.DefDef(mods, name, tparams, vparams, tpe, rhs) =>
- Pair("DefDef", name);
-
- case Tree.AbsTypeDef(mods, name, rhs, lobound) =>
- Pair("AbsTypeDef", name);
-
- case Tree.AliasTypeDef(mods, name, tparams, rhs) =>
- Pair("AliasTypeDef", name);
-
- case Tree.Import(expr, selectors) =>
- Pair("Import", Name.fromString(selectors.toString()));
-
- case Tree.CaseDef(pat, guard, body) =>
- Pair("CaseDef", NO_NAME);
-
- case Tree.Template(parents, body) =>
- Pair("Template", NO_NAME);
-
- case Tree.LabelDef(name, params, rhs) =>
- Pair("LabelDef", name);
-
- case Tree.Block(stats, expr) =>
- Pair("Block", NO_NAME);
-
- case Tree.Sequence(trees) =>
- Pair("Sequence", NO_NAME);
-
- case Tree.Alternative(trees) =>
- Pair("Alternative", NO_NAME);
-
- case Tree.Bind(name, rhs) =>
- Pair("Bind", name);
-
- case Tree.Visitor(cases) =>
- Pair("Visitor", NO_NAME);
-
- case Tree.Function(vparams, body) =>
- Pair("Function", NO_NAME);
-
- case Tree.Assign(lhs, rhs) =>
- Pair("Assign", NO_NAME);
-
- case Tree.If(cond, thenp, elsep) =>
- Pair("If", NO_NAME);
-
- case Tree.Switch(test, tags, bodies, otherwise) =>
- Pair("Switch", NO_NAME);
-
- case Tree.Return(expr) =>
- Pair("Return", NO_NAME);
-
- case Tree.Throw(expr) =>
- Pair("Throw", NO_NAME);
-
- case Tree.New(init) =>
- Pair("New", NO_NAME);
-
- case Tree.Create(qualifier, targs) =>
- Pair("Create", NO_NAME);
-
- case Tree.Typed(expr, tpe) =>
- Pair("Typed", NO_NAME);
-
- case Tree.TypeApply(fun, args) =>
- Pair("TypeApply", NO_NAME);
-
- case Tree.Apply(fun, args) =>
- Pair("Apply", NO_NAME);
-
- case Tree.Super(qualif, mixin) =>
- Pair("Super", Name.fromString(qualif.toString() + ", mixin: " + mixin.toString()));
-
- case Tree.This(qualifier) =>
- Pair("This", qualifier);
-
- case Tree.Select(qualifier, selector) =>
- Pair("Select", selector);
-
- case Tree.Ident(name) =>
- Pair("Ident", name);
-
- case Tree.Literal(value) =>
- Pair("Literal", NO_NAME);
-
- case Tree.TypeTerm() =>
- Pair("TypeTerm", NO_NAME);
-
- case Tree.SingletonType(ref) =>
- Pair("SingletonType", NO_NAME);
-
- case Tree.SelectFromType(qualifier, selector) =>
- Pair("SelectFromType", selector);
-
- case Tree.FunType(argtpes, restpe) =>
- Pair("FunType", NO_NAME);
-
- case Tree.CompoundType(parents, refinements) =>
- Pair("CompoundType", NO_NAME);
-
- case Tree.AppliedType(tpe, args) =>
- Pair("AppliedType", NO_NAME);
-
- case Tree.Try(block, catcher, finalizer) =>
- Pair("Try", NO_NAME);
-
- case Tree.Empty =>
- Pair("Empty", NO_NAME);
- }
-
- /** Generate a list that contains all the elements of an Array of Array */
- def flattenArrays[a <: AnyRef](as: Array[Array[a]]): List[a] = {
- def flattenArrays0[a <: AnyRef](as: Array[Array[a]], i: Int): List[a] =
- if (as.length - i == 0)
- Nil;
- else if (as.length - i == 1)
- List.fromArray(as(i));
- else
- List.fromArray(as(i)) ::: flattenArrays0(as, i + 1);
-
- flattenArrays0(as, 0);
- }
-
- /** Return a list of children for the given tree node */
- def packTreeChildren(t: Tree): List[Tree] = t match {
- case Tree.Attributed(attribute, definition) =>
- List(attribute, definition);
-
- case Tree.DocDef(comment, definition) =>
- List(definition);
-
- case Tree.ClassDef(mods, name, tparams, vparams, tpe, impl) => {
- var children: List[Tree] = List();
- children = List.fromArray(tparams) ::: children;
- children = flattenArrays(vparams) ::: children;
- tpe :: impl :: children
- }
-
- case Tree.PackageDef(packaged, impl) =>
- List(packaged, impl);
-
- case Tree.ModuleDef(mods, name, tpe, impl) =>
- List(tpe, impl);
-
- case Tree.ValDef(mods, name, tpe, rhs) =>
- List(tpe, rhs);
-
- case Tree.PatDef(mods, pat, rhs) =>
- List(pat, rhs);
-
- case Tree.DefDef(mods, name, tparams, vparams, tpe, rhs) => {
- var children: List[Tree] = List();
- children = List.fromArray(tparams) ::: children;
- children = flattenArrays(vparams) ::: children;
- tpe :: rhs :: children
- }
-
- case Tree.AbsTypeDef(mods, name, rhs, lobound) =>
- List(rhs, lobound);
-
- case Tree.AliasTypeDef(mods, name, tparams, rhs) => {
- var children: List[Tree] = List();
- children = List.fromArray(tparams) ::: children;
- rhs :: children
- }
-
- case Tree.Import(expr, selectors) => {
- var children: List[Tree] = List(expr);
- children
- }
-
- case Tree.CaseDef(pat, guard, body) =>
- List(pat, guard, body);
-
- case Tree.Template(parents, body) =>
- List.fromArray(parents) ::: List.fromArray(body);
-
- case Tree.LabelDef(name, params, rhs) =>
- List.fromArray(params) ::: List(rhs);
-
- case Tree.Block(stats, expr) =>
- List.fromArray(stats) ::: List(expr);
-
- case Tree.Sequence(trees) =>
- List.fromArray(trees);
-
- case Tree.Alternative(trees) =>
- List.fromArray(trees);
-
- case Tree.Bind(name, rhs) =>
- List(rhs);
-
- case Tree.Visitor(cases) =>
- List.fromArray(cases);
-
- case Tree.Function(vparams, body) =>
- List.fromArray(vparams) ::: List(body);
-
- case Tree.Assign(lhs, rhs) =>
- List(lhs, rhs);
-
- case Tree.If(cond, thenp, elsep) =>
- List(cond, thenp, elsep);
-
- case Tree.Switch(test, tags, bodies, otherwise) =>
- test :: List.fromArray(bodies) ::: List(otherwise);
-
- case Tree.Return(expr) =>
- List(expr);
-
- case Tree.Throw(expr) =>
- List(expr);
-
- case Tree.New(init) =>
- List(init);
-
- case Tree.Create(qualif, targs) =>
- List(qualif) ::: List.fromArray(targs);
-
- case Tree.Typed(expr, tpe) =>
- List(expr, tpe);
-
- case Tree.TypeApply(fun, args) =>
- List(fun) ::: List.fromArray(args);
-
- case Tree.Apply(fun, args) =>
- List(fun) ::: List.fromArray(args);
-
- case Tree.Super(qualif, mixin) =>
- Nil;
-
- case Tree.This(qualif) =>
- Nil
-
- case Tree.Select(qualif, selector) =>
- List(qualif);
-
- case Tree.Ident(name) =>
- Nil;
-
- case Tree.Literal(value) =>
- Nil;
-
- case Tree.TypeTerm() =>
- Nil;
-
- case Tree.SingletonType(ref) =>
- List(ref);
-
- case Tree.SelectFromType(qualif, selector) =>
- List(qualif);
-
- case Tree.FunType(argtpes, restpe) =>
- List.fromArray(argtpes) ::: List(restpe);
-
- case Tree.CompoundType(parents, refinements) =>
- List.fromArray(parents) ::: List.fromArray(refinements);
-
- case Tree.AppliedType(tpe, args) =>
- tpe :: List.fromArray(args);
-
- case Tree.Try(block, catcher, finalizer) =>
- List(block, catcher, finalizer);
-
- case Tree.Empty =>
- Nil;
- }
-
- /** Return a textual representation of this t's symbol */
- def symbolText(t: Tree): String = {
- var prefix = "";
-
- if (t.hasSymbol())
- prefix = "[has] ";
- if (t.definesSymbol())
- prefix = "[defines] ";
-
- prefix + t.symbol()
- }
-
- /** Return t's symbol type */
- def symbolTypeText(t: Tree): String = {
- val s = t.symbol();
- if (s != null)
-// s.`type`().toString();
- TypePrinter.apply(s.getType());
- else
- "";
- }
-
- /** Return a textual representation of (some of) the symbol's
- * attributes */
- def symbolAttributes(t: Tree): String = {
- val s = t.symbol();
- var att = "";
-
- if (s != null) {
- if (s.isType())
- att = att + "type ";
- if (s.isFinal())
- att = att + "final ";
- if (s.isSynthetic())
- att = att + "synth ";
- if (s.isExternal())
- att = att + "external ";
-
- att
- }
- else "";
- }
-}
-
- object TypePrinter {
- def apply(t: Type): String = t match {
- case Type.ThisType(s) => "ThisType(" + s.name + ")\n";
- case Type.SingleType(pre, s) => "SingleType(" + apply(pre) + ", " + s.name + ")\n";
- case Type.ConstantType(base, value) => "ConstantType(" + apply(base) + ", " + value + ")\n";
- case Type.TypeRef(pre, s, args) => "TypeRef(" + apply(pre) + ", " + s.name + ", " + apply(args) + ")\n)";
- case Type.CompoundType(parts, members) => "CompoundType(" + apply(parts) + ", [members])\n";
- case Type.MethodType(vparams, result) => "MethodType( (" + apply(vparams) + "), " + apply(result) + ")\n";
- case Type.PolyType(tparams, result) => "PolyType( (" + apply(tparams) + "), " + apply(result) + ")\n";
- case Type.OverloadedType(alts, alttypes) => "OverloadedType()";
- case Type.LazyType() => "LazyType()\n";
- case Type.TypeVar(orig, constr) => "TypeVar()";
- case Type.UnboxedType(tag) => "UnboxedType(" + tag + ");\n";
- case Type.UnboxedArrayType(tag) => "UnboxedArrayType(" + tag + ")\n";
- case _ => "<unknown case>[" + t + "]";
- }
-
- def apply(ts: Array[Type]): String = {
- var s: StringBuffer = new StringBuffer();
- var i: Int = 0;
-
- while (i < ts.length) {
- s.append(apply(ts(i)));
- if (i != ts.length - 1)
- s.append(", ");
- i = i + 1;
- }
- s.toString();
- }
-
- def apply(ts: Array[Symbol]): String = {
- var s: StringBuffer = new StringBuffer();
- var i: Int = 0;
-
- while (i < ts.length) {
- s.append(apply(ts(i).getType()));
- if (i != ts.length - 1)
- s.append(", ");
- i = i + 1;
- }
- s.toString();
- }
-
- }
-
-
-} // package
diff --git a/sources/scala/tools/scalac/backend/GenJVMFromICode.scala b/sources/scala/tools/scalac/backend/GenJVMFromICode.scala
deleted file mode 100644
index 3ad109b379..0000000000
--- a/sources/scala/tools/scalac/backend/GenJVMFromICode.scala
+++ /dev/null
@@ -1,758 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.symtab._;
-import scalac.{Global => scalac_Global};
-import scalac.atree._;
-import scalac.CompilationUnit;
-import scalac.util.Debug;
-import scala.tools.scalac.icode._;
-import ch.epfl.lamp.fjbg._;
-import scala.collection.mutable.HashMap;
-
-import java.util.StringTokenizer;
-import java.io.File;
-
-package scala.tools.scalac.backend {
-
-object GenJVMFromICode {
- def translate(global: scalac_Global, units: Array[CompilationUnit]): Unit = {
- val translator = new GenJVMFromICode(global);
- var i = 0;
- while (i < units.length) { translator.translate(units(i)); i = i + 1; }
- }
-}
-
-/* This class implements the backend which create
- * Java Virtual Machine's bytecode with
- * The Intermediate Code of the compiler */
-class GenJVMFromICode(global: scalac_Global) {
-
- // ##################################################
- // Private fields - Utils
-
- private val defs = global.definitions;
-
- private val fjbgContext = new FJBGContext();
-
- private val typer = defs.atyper;
-
- // ##################################################
- // Private fields - Data
- private var currentSrcFileName: String = null;
-
- private val clasz = new HashMap[Symbol, JVMClass];
-
- private val nameMap = new HashMap[Symbol, String];
-
- private val typeMap = new HashMap[Symbol, JType];
-
- // ##################################################
- // Constructor code
- initTypeMap;
-
- // ##################################################
- // Public methods
-
- /* This method generates byte code for a single unit */
- def translate(unit: CompilationUnit) = {
- global.log("Jvm.translate() called");
- currentSrcFileName = unit.source.toString();
- // 1. ##### Generate the structure
- val classes_it = Iterator.fromArray(unit.repository.classes());
- classes_it.foreach(genClass(null));
- dumpStructure;
- // 2. ##### Generate the code & Save the classes
- var pairs_it = clasz.elements;
- pairs_it.foreach ((p: Pair[Symbol, JVMClass]) => {
- val sym = p._1;
- val jvmClass = p._2;
- val methods_it = jvmClass.methods.values;
- global.log("Jvm.translate: translating class "+sym);
- methods_it.foreach ((m: JVMMethod) => if(!m.aMethod.isAbstract()) genCode(m));
- });
- pairs_it = clasz.elements;
- pairs_it.foreach ((p: Pair[Symbol, JVMClass]) => {
- val sym = p._1;
- val jvmClass = p._2;
- val fileName = javaFileName(javaName(sym));
- global.log("Jvm.translate: writing class "+sym);
- jvmClass.jClass.writeTo(fileName);
- });
- global.operation("Generation of "+currentSrcFileName+" succeded.");
-
- currentSrcFileName = null;
- }
-
- // ##################################################
- // Private methods - Generate code
-
- /* Generate a class */
- private def genClass (parent: JVMClass)(aClass: AClass) : unit = {
- // 1. ##### Create JClass object
- val sym : Symbol = aClass.symbol();
- val thisClassName : String = javaName(sym);
- val flags : int = JAccessFlags.ACC_SUPER | // The way it has to be
- (if (aClass.isPublic()) JAccessFlags.ACC_PUBLIC else 0) |
- (if (aClass.isPrivate()) JAccessFlags.ACC_PRIVATE else 0) |
- (if (aClass.isProtected()) JAccessFlags.ACC_PROTECTED else 0) |
- (if (aClass.isFinal()) JAccessFlags.ACC_FINAL else 0) |
- (if (aClass.isAbstract()) JAccessFlags.ACC_ABSTRACT else 0) |
- (if (aClass.isInterface()) JAccessFlags.ACC_INTERFACE else 0);
-
- global.log("genClass: parents(): ");
- val prnt_it = Iterator.fromArray(aClass.parents()); // debug
- prnt_it.foreach((t: Type) => {global.log(" "+t.toString())}); // debug
-
- val baseTps = Iterator.fromArray(aClass.parents());
- assert (baseTps.hasNext, "Jvm::genClass: Invalid number of parents. "+Debug.show(sym));
-
- var superClassName : String = null;
-
- val firstParent : Type = aClass.parents()(0);
-
- if (aClass.isInterface()) {
- if (firstParent.isSameAs(defs.ANY_TYPE())) {
- baseTps.drop(1);
- }
- superClassName = JAVA_LANG_OBJECT;
- } else {
- superClassName = javaName(baseTps.next.symbol());
- }
-
- var interfaceNames_l : List[String] = Nil;
-
- baseTps.foreach((aParentType : Type) =>
- interfaceNames_l = javaName(aParentType.symbol())::interfaceNames_l);
- val interfaceNames_a = new Array[String](interfaceNames_l.length);
- interfaceNames_l.reverse.copyToArray(interfaceNames_a,0);
-
- val jclass : JClass = fjbgContext.JClass(flags,
- thisClassName,
- superClassName,
- interfaceNames_a,
- currentSrcFileName);
-
- // 2. ##### Visits the class
-
- val jvmClass = new JVMClass(parent);
- clasz += aClass.symbol() -> jvmClass;
- jvmClass.jClass = jclass;
- //classFields = new HashMap[Symbol, JField]();
-
- // 2.1 ##### Access the inner classes
- val classes_it = Iterator.fromArray(aClass.classes());
- classes_it.foreach(genClass(jvmClass));
-
- // 2.2. ##### Add fields of the class
- val fields_it = Iterator.fromArray(aClass.fields());
- fields_it.foreach(genField(jvmClass));
-
- // 2.3 ##### Setup the stucture, records methods
- val methods_it = Iterator.fromArray(aClass.methods());
- global.log(" number of methods: "+aClass.methods().length); // Debug
- methods_it.foreach(genMethod(jvmClass));
- }
-
- /* Add a field to a class */
- private def genField(jvmClass : JVMClass)(aField : AField) : unit = {
- val flags = (if (aField.isPublic()) JAccessFlags.ACC_PUBLIC else 0) |
- (if (aField.isPrivate()) JAccessFlags.ACC_PRIVATE else 0) |
- (if (aField.isProtected()) JAccessFlags.ACC_PROTECTED else 0) |
- (if (aField.isStatic()) JAccessFlags.ACC_STATIC else 0) |
- (if (aField.isFinal()) JAccessFlags.ACC_FINAL else 0) |
- (if (aField.isVolatile()) JAccessFlags.ACC_VOLATILE else 0) |
- (if (aField.isTransient()) JAccessFlags.ACC_TRANSIENT else 0);
- jvmClass.fields += aField.symbol() ->
- jvmClass.jClass.addNewField(flags,
- aField.symbol().name.toString(),
- typeStoJ(aField.symbol().info()));
- }
-
- /* Generate a method */
- private def genMethod(jvmClass: JVMClass)(aMethod: AMethod): unit = {
- // 1. ##### Create JMethod object
-
- val flags = (if (aMethod.isPublic()) JAccessFlags.ACC_PUBLIC else 0) |
- (if (aMethod.isPrivate()) JAccessFlags.ACC_PRIVATE else 0) |
- (if (aMethod.isProtected()) JAccessFlags.ACC_PROTECTED else 0) |
- (if (aMethod.isStatic()) JAccessFlags.ACC_STATIC else 0) |
- (if (aMethod.isFinal()) JAccessFlags.ACC_FINAL else 0) |
- (if (aMethod.isNative()) JAccessFlags.ACC_NATIVE else 0) |
- (if (aMethod.isAbstract()) JAccessFlags.ACC_ABSTRACT else 0) |
- (if (aMethod.isStrictFP()) JAccessFlags.ACC_STRICT else 0);
-
- var argTypes_l : List[JType] = Nil;
- var argNames_l : List[String] = Nil;
-
- val vparams_it = Iterator.fromArray(aMethod.vparams());
- vparams_it.foreach((sym: Symbol) => {
- argTypes_l = typeStoJ(sym.info())::argTypes_l;
- argNames_l = sym.name.toString()::argNames_l;
- });
-
- val argTypes_a = new Array[JType](argTypes_l.length);
- val argNames_a = new Array[String](argNames_l.length);
- argTypes_l.reverse.copyToArray(argTypes_a,0);
- argNames_l.reverse.copyToArray(argNames_a,0);
- val jMethod : JMethod = jvmClass.jClass.addNewMethod(flags,
- aMethod.symbol().name.toString(),
- typeStoJ(aMethod.result()),
- argTypes_a,
- argNames_a);
-
-
- // 2. ##### Visits the method items
-
- val jvmMethod = new JVMMethod(aMethod, jvmClass);
- jvmClass.methods += aMethod.symbol() -> jvmMethod;
- jvmMethod.jMethod = jMethod;
-
- var index : int = 1;
- vparams_it.foreach((sym: Symbol) => {
- jvmMethod.args += sym -> index;
- index = index + 1;
- });
-
- if (! jvmMethod.aMethod.isAbstract()) {
- jvmMethod.jCode = jMethod.getCode().asInstanceOf[JExtendedCode];
-
-
-
- // 2.1 ##### Generate labels for the basic blocks
-
- jvmMethod.aMethod.icode.asInstanceOf[ICode].icTraverse((bb : IBasicBlock) => {
- val blockLabel : JCode$Label = jvmMethod.jCode.newLabel();
- jvmMethod.labels += bb -> blockLabel;
- });
- }
- }
-
- /* Translate code */
- private def genCode(jvmMethod : JVMMethod) = {
- val icode : ICode = jvmMethod.aMethod.icode.asInstanceOf[ICode];
- var stack : ICTypeStack = new ICTypeStack();
- val jCode = jvmMethod.jCode;
-
- // * IMPORTANT NOTICE *
- // Here we assume the icTraverse method uses *preorder*
- // I.e. The next translated block will be successor of the currently emmited block
- // It avoids to put the goto instruction since the successor is not already emmited
- // In the case of a CJUMP ICInstruction, the preorder ensures the next traversed block
- // will be the failure block.
- icode.icTraverseFeedBack((bb: IBasicBlock, hm: HashMap[IBasicBlock, boolean]) => {
- val blockLabel = jvmMethod.labels.apply(bb);
- blockLabel.anchorToNext();
- bb.bbTraverse((ic : ICInstruction) => stack = emitICInstruction(jvmMethod, stack)(ic));
-
- bb.getLastInstruction match {
- case CJUMP(_,failure,_) =>
- if (hm(failure))
- jCode.emitGOTO(jvmMethod.labels(failure));
- case CZJUMP(_,failure,_) =>
- if (hm(failure))
- jCode.emitGOTO(jvmMethod.labels(failure));
- case JUMP(where) =>
- if (hm(where))
- jCode.emitGOTO(jvmMethod.labels(where));
- case _ =>
- ;
- }
- });
- }
-
- /* Translate an ICInstruction into a JVM instruction */
- private def emitICInstruction(jvmMethod: JVMMethod, stack: ICTypeStack)(instruction: ICInstruction) : ICTypeStack = {
- val jcode = jvmMethod.jCode;
- instruction match {
- case THIS(_) =>
- jcode.emitALOAD_0();
-
-
- case CONSTANT(AConstant$BOOLEAN(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$BYTE(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$SHORT(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$CHAR(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$INT(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$LONG(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$FLOAT(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$DOUBLE(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant$STRING(v)) =>
- jcode.emitPUSH(v);
- case CONSTANT(AConstant.NULL) =>
- jcode.emitACONST_NULL();
- case CONSTANT(AConstant.UNIT) =>
- ; //throw(Debug.abort("Illegal constant type: UNIT"));
- // Here, we dissable the error message until the unboxed types
- // are introduced.
- case CONSTANT(AConstant.ZERO) =>
- throw(Debug.abort("Illegal constant type: ZERO"));
-
- case LOAD_ARRAY_ITEM() => {
- val elementType = typer.getArrayElementType(stack.tail.head);
- jcode.emitALOAD(typeStoJ(elementType));
- }
-
- case LOAD_LOCAL(local, false) =>
- jcode.emitLOAD(jvmMethod.locals.apply(local));
-
- case LOAD_LOCAL(local, true) =>
- jcode.emitLOAD(jvmMethod.args(local), typeStoJ(local.getType()));
-
- case LOAD_FIELD(field, static) => {
- val className = javaName(field.owner());
- val fieldName = field.name.toString();
- if (static)
- jcode.emitGETSTATIC(className, fieldName, typeStoJ(field.getType()));
- else
- jcode.emitGETFIELD(className, fieldName, typeStoJ(field.getType()));
- }
-
- case STORE_ARRAY_ITEM() =>
- jcode.emitASTORE(typeStoJ(stack.head));
-
- case STORE_LOCAL(local, false) => {
- val jLocal : JLocalVariable =
- if (jvmMethod.locals.contains(local))
- jvmMethod.locals.apply(local);
- else {
- val newLocal = jvmMethod.jMethod.addNewLocalVariable(typeStoJ(local.getType()), local.name.toString());
- jvmMethod.locals += local -> newLocal;
- newLocal;
- }
- jcode.emitSTORE(jLocal);
- }
-
- case STORE_FIELD(field, static) => {
- val className = javaName(field.owner());
- val fieldName = field.name.toString();
- if (static)
- jcode.emitPUTSTATIC(className, fieldName, typeStoJ(field.getType()));
- else
- jcode.emitPUTFIELD(className, fieldName, typeStoJ(field.getType()));
- }
-
- case CALL_PRIMITIVE(APrimitive$Negation(ATypeKind.I4)) => jcode.emitINEG();
- case CALL_PRIMITIVE(APrimitive$Negation(ATypeKind.I8)) => jcode.emitLNEG();
- case CALL_PRIMITIVE(APrimitive$Negation(ATypeKind.R4)) => jcode.emitFNEG();
- case CALL_PRIMITIVE(APrimitive$Negation(ATypeKind.R8)) => jcode.emitDNEG();
-
- case CALL_PRIMITIVE(APrimitive$Test(op, typ, false)) => {
- // !!! Not all type cases are handeled here
- // !!! TODO
-
- val condTag = condAtoJ(op);
- val thenLabel : JCode$Label = jvmMethod.jCode.newLabel();
- val contLabel : JCode$Label = jvmMethod.jCode.newLabel();
-
- typ match {
- case ATypeKind.REF => jcode.emitIF_ACMP(condTag, thenLabel);
- case ATypeKind.I4 => jcode.emitIF_ICMP(condTag, thenLabel);
- case _ => throw(Debug.abort("Unexpected type for the Test primitive.")); // !!!
- }
- jcode.emitPUSH(false);
- jcode.emitGOTO(contLabel);
- thenLabel.anchorToNext();
- jcode.emitPUSH(true);
- contLabel.anchorToNext();
- }
-
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMPL, ATypeKind.R4)) => jcode.emitFCMPL();
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMPG, ATypeKind.R4)) => jcode.emitFCMPG();
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMP, ATypeKind.R4)) => jcode.emitFCMPG(); // Default is 1
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMPL, ATypeKind.R8)) => jcode.emitDCMPL();
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMPG, ATypeKind.R8)) => jcode.emitDCMPG();
- case CALL_PRIMITIVE(APrimitive$Comparison(AComparisonOp.CMP, ATypeKind.R8)) => jcode.emitDCMPG(); // Default is 1
-
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.ADD, ATypeKind.I4)) => jcode.emitIADD();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.ADD, ATypeKind.I8)) => jcode.emitLADD();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.ADD, ATypeKind.R4)) => jcode.emitFADD();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.ADD, ATypeKind.R8)) => jcode.emitDADD();
-
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.SUB, ATypeKind.I4)) => jcode.emitISUB();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.SUB, ATypeKind.I8)) => jcode.emitLSUB();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.SUB, ATypeKind.R4)) => jcode.emitFSUB();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.SUB, ATypeKind.R8)) => jcode.emitDSUB();
-
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.MUL, ATypeKind.I4)) => jcode.emitIMUL();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.MUL, ATypeKind.I8)) => jcode.emitLMUL();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.MUL, ATypeKind.R4)) => jcode.emitFMUL();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.MUL, ATypeKind.R8)) => jcode.emitDMUL();
-
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.DIV, ATypeKind.I4)) => jcode.emitIDIV();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.DIV, ATypeKind.I8)) => jcode.emitLDIV();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.DIV, ATypeKind.R4)) => jcode.emitFDIV();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.DIV, ATypeKind.R8)) => jcode.emitDDIV();
-
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.REM, ATypeKind.I4)) => jcode.emitIREM();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.REM, ATypeKind.I8)) => jcode.emitLREM();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.REM, ATypeKind.R4)) => jcode.emitFREM();
- case CALL_PRIMITIVE(APrimitive$Arithmetic(AArithmeticOp.REM, ATypeKind.R8)) => jcode.emitDREM();
-
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.AND, ATypeKind.I4)) => jcode.emitIAND();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.AND, ATypeKind.BOOL)) => jcode.emitIAND();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.AND, ATypeKind.I8)) => jcode.emitLAND();
-
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.OR, ATypeKind.I4)) => jcode.emitIOR();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.OR, ATypeKind.BOOL)) => jcode.emitIOR();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.OR, ATypeKind.I8)) => jcode.emitLOR();
-
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.XOR, ATypeKind.I4)) => jcode.emitIXOR();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.XOR, ATypeKind.BOOL)) => jcode.emitIXOR();
- case CALL_PRIMITIVE(APrimitive$Logical(ALogicalOp.XOR, ATypeKind.I8)) => jcode.emitLXOR();
-
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.LSL, ATypeKind.I4)) => jcode.emitISHL();
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.LSL, ATypeKind.I8)) => jcode.emitLSHL();
-
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.ASR, ATypeKind.I4)) => jcode.emitISHR();
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.ASR, ATypeKind.I8)) => jcode.emitLSHR();
-
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.LSR, ATypeKind.I4)) => jcode.emitIUSHR();
- case CALL_PRIMITIVE(APrimitive$Shift(AShiftOp.LSR, ATypeKind.I8)) => jcode.emitLUSHR();
-
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.I8)) => jcode.emitI2L();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.R4)) => jcode.emitI2F();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.R8)) => jcode.emitI2D();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I8, ATypeKind.I4)) => jcode.emitL2I();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I8, ATypeKind.R4)) => jcode.emitL2F();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I8, ATypeKind.R8)) => jcode.emitL2D();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R4, ATypeKind.I4)) => jcode.emitF2I();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R4, ATypeKind.I8)) => jcode.emitF2L();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R4, ATypeKind.R8)) => jcode.emitF2D();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R8, ATypeKind.I4)) => jcode.emitD2I();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R8, ATypeKind.I8)) => jcode.emitD2L();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.R8, ATypeKind.R4)) => jcode.emitD2F();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.I1)) => jcode.emitI2B();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.U2)) => jcode.emitI2C();
- case CALL_PRIMITIVE(APrimitive$Conversion(ATypeKind.I4, ATypeKind.I2)) => jcode.emitI2S();
-
- case CALL_PRIMITIVE(APrimitive$ArrayLength(_)) => jcode.emitARRAYLENGTH();
-
- //case CALL_PRIMITIVE(APrimitive$StringConcat(ATypeKind.REF,ATypeKind.REF)) =>
- // !!! TODO !!!
-
- case CALL_METHOD(method, style) => {
- var calledMethod : JMethod = null;
- val clasz_it = clasz.values;
- var aJvmClass : JVMClass = null;
- // Is the method a method of the current unit ?
- while (clasz_it.hasNext && calledMethod == null) {
- aJvmClass = clasz_it.next;
- if (aJvmClass.methods.contains(method))
- calledMethod = aJvmClass.methods.apply(method).jMethod;
- }
- if (calledMethod != null)
- jcode.emitINVOKE(calledMethod);
- else {
- // normal case
- val methodName = method.name.toString();
- val className = javaName(method.owner());
- val methodType = typeStoJ(method.info()).asInstanceOf[JMethodType];
- style match {
- case AInvokeStyle.Dynamic =>
- if (method.owner().isInterface())
- jcode.emitINVOKEINTERFACE(className, methodName, methodType);
- else
- jcode.emitINVOKEVIRTUAL(className, methodName, methodType);
- case AInvokeStyle.StaticInstance =>
- jcode.emitINVOKESPECIAL(className, methodName, methodType);
- case AInvokeStyle.StaticClass =>
- jcode.emitINVOKESTATIC(className, methodName, methodType);
- }
- }
- }
-
- case NEW(clasz) =>
- jcode.emitNEW(javaName(clasz));
-
- case CREATE_ARRAY(element) =>
- jcode.emitNEWARRAY(typeStoJ(element));
-
- case IS_INSTANCE(typ) =>
- jcode.emitINSTANCEOF(typeStoJ(typ).asInstanceOf[JReferenceType]);
-
- case CHECK_CAST(typ) =>
- jcode.emitCHECKCAST(typeStoJ(typ).asInstanceOf[JReferenceType]);
-
- case SWITCH(tags,blocks) => {
- val casesTags : List[Array[int]] = List.fromArray(tags,0,tags.length);
- val casesLabels = blocks.take(blocks.length-1);
- val defaultBranch = jvmMethod.labels(blocks.last);
-
- val tagsAndLabels = casesTags.zip(casesLabels);
- var keys_l : List[int] = Nil;
- var branches_l : List[JCode$Label] = Nil;
-
- tagsAndLabels.foreach ((p: Pair[Array[Int], IBasicBlock]) => {
- val tags = p._1;
- val label = jvmMethod.labels(p._2);
- val tag_it = Iterator.fromArray(tags);
- tag_it.foreach((tag: int) => {
- keys_l = tag::keys_l;
- branches_l = label::branches_l;
- });
- });
-
- val keys_a = new Array[int](keys_l.length);
- val branches_a = new Array[JCode$Label](branches_l.length);
- keys_l.copyToArray(keys_a,0);
- branches_l.copyToArray(branches_a,0);
-
- jcode.emitSWITCH(keys_a, branches_a, defaultBranch, 0.65);
- }
-
- case JUMP(basicBlock) =>
- ; // goto instructions are generated by the genCode method.
-
- case CJUMP(success, failure, cond) => {
- // !!! Type cases are missing
- // TODO (same as CALL_PRIMITIVE(Test))
- val condTag : int = condAtoJ(cond);
- val typ = typeStoJ(stack.head);
- if (typ.getTag() == JType.T_REFERENCE)
- jcode.emitIF_ACMP(condTag, jvmMethod.labels(success));
- else if (typ.getTag() == JType.T_INT)
- jcode.emitIF_ICMP(condTag, jvmMethod.labels(success));
-
- }
-
- case CZJUMP(success, failure, cond) => {
- val condTag = condAtoJ(cond);
- jcode.emitIF(condTag, jvmMethod.labels.apply(success));
- jcode.emitGOTO(jvmMethod.labels.apply(failure));
- }
-
- case RETURN() => {
- if (stack.isEmpty)
- jcode.emitRETURN(JType.VOID);
- else
- jcode.emitRETURN(typeStoJ(stack.head));
- }
-
- case THROW() => jcode.emitATHROW;
-
- case DROP(typ) => {
- val jtyp = typeStoJ(typ);
- val jtypTag : int = jtyp.getTag();
- if (jtyp.isObjectType() ||
- jtyp.isReferenceType() ||
- jtyp.isArrayType())
- jcode.emitPOP();
- else
- jtypTag match { // cf. VM spec 3.11.1
- case JType.T_BOOLEAN => jcode.emitPOP();
- case JType.T_CHAR => jcode.emitPOP();
- case JType.T_BYTE => jcode.emitPOP();
- case JType.T_SHORT => jcode.emitPOP();
- case JType.T_INT => jcode.emitPOP();
- case JType.T_FLOAT => jcode.emitPOP();
- case JType.T_REFERENCE => jcode.emitPOP();
- case JType.T_ADDRESS => jcode.emitPOP();
- case JType.T_LONG => jcode.emitPOP2();
- case JType.T_DOUBLE => jcode.emitPOP2();
- }
- }
-
- case DUP(typ) => {
- val jtyp = typeStoJ(typ);
- val jtypTag : int = jtyp.getTag();
- if (jtyp.isObjectType() ||
- jtyp.isReferenceType() ||
- jtyp.isArrayType())
- jcode.emitDUP();
- else
- jtypTag match { // cf. VM spec 3.11.1
- case JType.T_BOOLEAN => jcode.emitDUP();
- case JType.T_CHAR => jcode.emitDUP();
- case JType.T_BYTE => jcode.emitDUP();
- case JType.T_SHORT => jcode.emitDUP();
- case JType.T_INT => jcode.emitDUP();
- case JType.T_FLOAT => jcode.emitDUP();
- case JType.T_REFERENCE => jcode.emitDUP();
- case JType.T_ADDRESS => jcode.emitDUP();
- case JType.T_LONG => jcode.emitDUP2();
- case JType.T_DOUBLE => jcode.emitDUP2();
- }
- }
-
- case MONITOR_ENTER() => jcode.emitMONITORENTER();
-
- case MONITOR_EXIT() => jcode.emitMONITOREXIT();
-
- case _ => throw(Debug.abort("Invalid ICInstruction for the JVMBackend", instruction));
- }
- return stack.eval(instruction);
- }
-
- /* Translate an ATree Test operation to the FJBG type */
- private def condAtoJ(cond : ATestOp) : int = cond match {
- case ATestOp.EQ => JExtendedCode.COND_EQ;
- case ATestOp.NE => JExtendedCode.COND_NE;
- case ATestOp.GE => JExtendedCode.COND_GE;
- case ATestOp.LT => JExtendedCode.COND_LT;
- case ATestOp.LE => JExtendedCode.COND_LE;
- case ATestOp.GT => JExtendedCode.COND_GT;
- }
-
- // ##################################################
- // Private methods - Debugging
-
- private def dumpStructure = {
- Debug.log("### Dumping structure ###");
- val sym_it = clasz.keys;
- sym_it.foreach((sym: Symbol) => {
- val jvmClass = clasz.apply(sym);
- Debug.log ("Classfile: ", sym);
- Debug.log ("/fileds:");
- val fields_it = jvmClass.fields.keys;
- fields_it.foreach((f: Symbol) => {
- Debug.log(" ", f);
- });
- Debug.log ("/methods:");
- val methods_it = jvmClass.methods.keys;
- methods_it.foreach((m: Symbol) => {
- Debug.log(" ", m);
- });
- });
- Debug.log("#########################");
- }
-
- //##################################################
- // Private methods & fields
- // translated from GenJVM - M. Schinz
-
- private val JAVA_LANG_OBJECT = "java.lang.Object";
-
- private def initTypeMap = {
- typeMap += defs.ANY_CLASS -> JObjectType.JAVA_LANG_OBJECT;
- typeMap += defs.ANYREF_CLASS -> JObjectType.JAVA_LANG_OBJECT;
- }
-
- /**
- * Return a Java-compatible version of the name of the given
- * symbol. The returned name is mangled and includes the names of
- * the owners.
- */
- private def javaName(sym: Symbol) =
- nameMap.get(sym) match {
- case Some(name) => name;
- case None => {
- val name = global.primitives.getJREClassName(sym);
- nameMap += sym -> name;
- name;
- }
- }
-
- /**
- * Return the name of the file in which to store the given class.
- */
- private def javaFileName(className : String) = {
- val tokens = new StringTokenizer(className, " ");
- var file = new File(global.outpath);
- while (tokens.hasMoreElements()) {
- file = new File(file, tokens.nextToken());
- }
- file.getPath()+".class";
- }
-
- /**
- * Return the Java type corresponding to the given Scala type.
- */
- private def typeStoJ(tp: Type) : JType = tp match {
- case Type$TypeRef(_, sym, _) =>
- typeMap.get(sym) match {
- case Some(jTp) => jTp
- case None => {
- val jTp = new JObjectType(javaName(sym));
- typeMap += sym -> jTp;
- jTp;
- }
- }
- case Type$UnboxedType(TypeTags.BYTE) => JType.BYTE;
- case Type$UnboxedType(TypeTags.CHAR) => JType.CHAR;
- case Type$UnboxedType(TypeTags.SHORT) => JType.SHORT;
- case Type$UnboxedType(TypeTags.INT) => JType.INT;
- case Type$UnboxedType(TypeTags.LONG) => JType.LONG;
- case Type$UnboxedType(TypeTags.FLOAT) => JType.FLOAT;
- case Type$UnboxedType(TypeTags.DOUBLE) => JType.DOUBLE;
- case Type$UnboxedType(TypeTags.BOOLEAN) => JType.BOOLEAN;
- case Type$UnboxedType(TypeTags.UNIT) => JType.VOID;
- case Type$UnboxedType(TypeTags.STRING) => JObjectType.JAVA_LANG_STRING;
- case Type$UnboxedArrayType(elementType) => new JArrayType(typeStoJ(elementType));
-
- case Type$MethodType(vparams: Array[Symbol], result: Type) => {
- val argTypes_a = new Array[JType](vparams.length);
- val vparams_it = Iterator.fromArray(vparams);
- //val argTypes_it = vparams_it.map((s: Symbol) => typeStoJ(s.info()));
- var argTypes_l : List[JType] = Nil;
- vparams_it.foreach((s: Symbol) => argTypes_l = typeStoJ(s.info())::argTypes_l);
- argTypes_l.reverse.copyToArray(argTypes_a,0);
- new JMethodType(typeStoJ(result), argTypes_a);
- }
-
- case _ =>
- throw Debug.abort("invalid type", tp);
- }
-}
-
-
-//##################################################
-// Data structures
-
- /* This class represents a Class Context */
-class JVMClass(theParent: JVMClass) {
-
- /* Methods of the class */
- val methods = new HashMap[Symbol, JVMMethod];
-
- /* Fields of the class */
- val fields = new HashMap[Symbol, JField];
-
- /* The JClass object corresponding of this class */
- var jClass : JClass = null;
-
- /* The inner classes of the class */
- var innerClasses : HashMap[Symbol, JVMClass] = null;
-
- /* The parent class of the class */
- val parent : JVMClass = theParent
-}
-
- /* This class represents a Method context */
-class JVMMethod(theAMethod : AMethod, theOwner : JVMClass){
-
- /* The ATree object representing this method */
- val aMethod : AMethod = theAMethod;
-
- /* The FJBG's object representing this method */
- var jMethod : JMethod = null;
-
- /* The locals variables of the method */
- val locals = new HashMap[Symbol, JLocalVariable];
-
- /* The arguments of the method */
- val args = new HashMap[Symbol, int];
-
- /* The JVM code of the method */
- var jCode : JExtendedCode = null;
-
- /* The owner class of the method */
- val owner : JVMClass = theOwner;
-
- /* The labels of the IBasicBlock's composing the ICode */
- val labels = new HashMap[IBasicBlock, JCode$Label];
-}
- }
diff --git a/sources/scala/tools/scalac/icode/IBasicBlock.scala b/sources/scala/tools/scalac/icode/IBasicBlock.scala
deleted file mode 100644
index 6eb073468f..0000000000
--- a/sources/scala/tools/scalac/icode/IBasicBlock.scala
+++ /dev/null
@@ -1,143 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-
-// $Id$
-
-import scalac.symtab._;
-import scalac.atree._;
-
-package scala.tools.scalac.icode {
-
-
-
-
-/** This class represents a basic block */
-class IBasicBlock (theLabel: int) {
-
- //##################################################
- // Public fields
-
- /* The type stack at the begining of the block */
- var initialStack : ICTypeStack = null;
-
- /* The label of the block */
- val label = theLabel;
-
- /* The substitute variables of the block
- * in the case of a recursive method */
- var substituteVars : List[Symbol] = null;
-
- /* The stack at the end of the block */
- var endStack : ICTypeStack = null;
-
-
-
- /* The successors of this block */
- //var successors : List[IBasicBlock] = Nil;
-
- /* Is the block closed*/
- //var isClosedBlock : boolean = false;
-
- //##################################################
- // Private fields
-
- /* ICode instructions */
- private var instructions : List[ICInstruction] = Nil;
-
- private var lastInstruction : ICInstruction = null;
-
- private var closed : boolean = false;
-
- //##################################################
- // Public methods
-
- /* Compute an hashCode for the block */
- override def hashCode() = label;
-
- /* Apply a function to all the instructions of the block*/
- def bbTraverse(f: ICInstruction => unit) =
- instructions.reverse.foreach(f);
-
-
- /* Initialize the stack of the block, must be done before evaluing
- * the type stack */
- def initStack(stack : ICTypeStack) = {
- if (initialStack == null) {
- initialStack = stack;
- endStack = null;
- }
- }
-
- /* Add a new instruction at the end of the block */
- def emit(instr: ICInstruction) = {
- assert (!closed, "IBasicBlock closed.");
- instructions = instr::instructions;
- lastInstruction = instr;
- }
-
- /* Compute the type stack of the block */
- def typeBlock = {
- assert(initialStack != null, "Stack not initialized");
- endStack = initialStack;
- bbTraverse((ic : ICInstruction) => endStack = endStack.eval(ic));
- }
-
- /* Add a successor to the block */
- //def addSuccessor(s: IBasicBlock) =
- // if (!successors.contains(s))
- // successors = s::successors;
-
- /* Add a list of successors to the block */
- //def addSuccessors(ss: List[IBasicBlock]) =
- // ss.reverse.foreach(addSuccessor);
-
- /* Close the block */
- def close = {
- //successors; // assertion
- closed = true;
- }
-
- def isClosedBlock = closed;
-
- def getLastInstruction = lastInstruction;
-
- def successors : List[IBasicBlock] = // here order will count
- lastInstruction match {
- case JUMP (where) => List(where);
- case CJUMP(success, failure, _) => failure::success::Nil;
- case CZJUMP(success, failure, _) => failure::success::Nil;
- case SWITCH(_,labels) => labels;
- case _ => {
- assert ((lastInstruction.isInstanceOf[RETURN]), "The last instruction is not a control flow instruction");
- Nil;
- }
- }
-
-
- //##################################################
- // Public methods - printing (used for debbuging)
- // Instead of it, rather use a printer
- def print() : unit = print(System.out);
-
- def print(out: java.io.PrintStream) : unit = {
- out.println("block #"+label+" :");
- instructions.reverse.foreach(
- (i: ICInstruction) => out.println(" "+i));
- out.print("Successors: ");
- successors.foreach((x: IBasicBlock) => out.print(" "+x.label.toString()));
- out.println();
- }
-
- // ##################################################
- // Private methods
-
- // none.
-
-}
-
-}
-
diff --git a/sources/scala/tools/scalac/icode/ICInstruction.scala b/sources/scala/tools/scalac/icode/ICInstruction.scala
deleted file mode 100644
index db1ed3c180..0000000000
--- a/sources/scala/tools/scalac/icode/ICInstruction.scala
+++ /dev/null
@@ -1,358 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-
-// $Id$
-
-
-import scalac.symtab._;
-
-import scalac.atree._;
-
-package scala.tools.scalac.icode {
-
-
-
-
-/** This class represents an instruction of intermediate code */
-abstract class ICInstruction {
-
- /** This abstract method returns the number of used elements on the stack */
- def consumed : int = 0; // !!!
-
- /** This abstract method returns the number of produced elements on the stack */
- def produced : int = 0; // !!!
-
- /** This method returns the difference of size of the stack when the instruction is used */
- def difference = produced-consumed;
-}
-
-//##################################################
-// Instruction cases
-
-/** This class represents a THIS instruction
- * Stack: ...
- * ->: ...:ref
- */
-case class THIS(clasz: Symbol) extends ICInstruction {
- /** Returns a string representation of this constant */
- override def toString(): String = "THIS";
-
- override def consumed = 0;
- override def produced = 1;
-}
-
-/** This class retpresents a CONSTANT instruction
- * Stack: ...
- * ->: ...:constant
- */
-case class CONSTANT(constant: AConstant) extends ICInstruction{
- /** Returns a string representation of this constant */
- override def toString(): String = "CONSTANT ("+constant.toString()+")";
-
- override def consumed = 0;
- override def produced = 1;
-}
-
-/** This class represents a LOAD_ARRAY_ITEM instruction
- * Stack: ...:array[a](Ref):index(Int)
- * ->: ...:element(a)
- */
-case class LOAD_ARRAY_ITEM() extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "LOAD_ARRAY_ITEM";
-
- override def consumed = 2;
- override def produced = 1;
-}
-
-/** This class represents a LOAD_LOCAL instruction
- * Stack: ...
- * ->: ...:value
- */
-case class LOAD_LOCAL(local: Symbol, isArgument: boolean) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "LOAD_LOCAL "+local.toString(); //+isArgument?" (argument)":"";
-
- override def consumed = 0;
- override def produced = 1;
-}
-
-/** This class represents a LOAD_FIELD instruction
- * Stack: ...:ref
- * ->: ...:value
- */
-case class LOAD_FIELD(field: Symbol, isStatic: boolean) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "LOAD_FIELD "+field.toString(); //+isStatic?" (static)":"";
-
- override def consumed = 1;
- override def produced = 1;
-}
-
-/** This class represents a STORE_ARRAY_ITEM instruction
- * Stack: ...:array[a](Ref):index(Int):value(a)
- * ->: ...
- */
-case class STORE_ARRAY_ITEM() extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "STORE_ARRAY_ITEM";
-
- override def consumed = 3;
- override def produced = 0;
-}
-
-/** This class represents a STORE_LOCAL instruction
- * Stack: ...:value
- * ->: ...
- */
-case class STORE_LOCAL(local: Symbol, isArgument: boolean) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "STORE_LOCAL "+local.toString(); //+isArgument?" (argument)":"";
-
- override def consumed = 1;
- override def produced = 0;
-}
-
-/** This class represents a STORE_FIELD instruction
- * Stack: ...:ref:value
- * ->: ...
- */
-case class STORE_FIELD(field: Symbol, isStatic: boolean) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "STORE_FIELD "+field.toString(); //+isStatic?" (static)":"";
-
- override def consumed = 2;
- override def produced = 0;
-}
-
-/** This class represents a CALL_PRIMITIVE instruction
- * Stack: ...:arg1:arg2:...:argn
- * ->: ...:result
- */
-case class CALL_PRIMITIVE(primitive: APrimitive) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CALL "+primitive.toString();
-
- override def consumed = primitive match {
- case (APrimitive$Negation(_)) => 1;
- case (APrimitive$Test(_,_,true)) => 1;
- case (APrimitive$Test(_,_,false)) => 2;
- case (APrimitive$Comparison(_,_)) => 2;
- case (APrimitive$Arithmetic(_,_)) => 2;
- case (APrimitive$Logical(_,_)) => 2;
- case (APrimitive$Shift(_,_)) => 2;
- case (APrimitive$Conversion(_,_)) => 1;
- case (APrimitive$ArrayLength(_)) => 1;
- case (APrimitive$StringConcat(_,_)) => 2;
- }
- override def produced = 1;
-}
-
-/** This class represents a CALL_METHOD instruction
- * STYLE: dynamic / static(StaticInstance)
- * Stack: ...:ref:arg1:arg2:...:argn
- * ->: ...:result
- *
- * STYLE: new - unused by jvm
- * Stack: ...:arg1:arg2:...:argn
- * ->: ...:ref
- *
- * STYLE: static(StaticClass)
- * Stack: ...:arg1:arg2:...:argn
- * ->: ...:result
- *
- */
-case class CALL_METHOD(method: Symbol, style: AInvokeStyle) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CALL_METHOD "+method.toString()+" ("+style.toString()+")";
-
- override def consumed = {
- var result = method.getType().valueParams().length;
- result = result + (style match
- {case(AInvokeStyle.Dynamic) => 1
- case(AInvokeStyle.StaticInstance) => 1
- case(_) => 0 });
- result;
- }
- override def produced = 1;
-}
-
-/** This class represents a NEW instruction
- * Stack: ...:
- * ->: ...:ref
- */
- case class NEW(clasz: Symbol) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String = "NEW "+clasz.toString();
-
- override def consumed = 0;
- override def produced = 1;
- }
-
-
- /** This class represents a CREATE_ARRAY instruction
- * Stack: ...:size(int)
- * ->: ...:arrayref
- */
-case class CREATE_ARRAY(element: Type) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CREATE_ARRAY "+element.toString();
-
- override def consumed = 1;
- override def produced = 1;
-}
-
- /** This class represents a IS_INSTANCE instruction
- * Stack: ...:ref
- * ->: ...:result(boolean)
- */
-case class IS_INSTANCE(typ: Type) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="IS_INSTANCE "+typ.toString();
-
- override def consumed = 1;
- override def produced = 1;
-}
-
-/** This class represents a CHECK_CAST instruction
- * Stack: ...:ref(oldtype)
- * ->: ...:ref(typ <=: oldtype)
- */
-case class CHECK_CAST(typ: Type) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CHECK_CAST "+typ.toString();
-
- override def consumed = 1;
- override def produced = 1;
-}
-
-/** This class represents a SWITCH instruction
- * Stack: ...:index(int)
- * ->: ...:
- */
-case class SWITCH(tags: Array[Array[int]], labels: List[IBasicBlock]) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="SWITCH ...";
-
- override def consumed = 1;
- override def produced = 0;
-}
-
-/** This class represents a JUMP instruction
- * Stack: ...
- * ->: ...
- */
-case class JUMP(where: IBasicBlock) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="JUMP "+where.label;
-
- override def consumed = 0;
- override def produced = 0;
-}
-
-/** This class represents a CJUMP instruction
- * It compares the two values on the stack with the 'cond' test operator
- * Stack: ...:value1:value2
- * ->: ...
- */
-case class CJUMP(successBlock: IBasicBlock, failureBlock: IBasicBlock, cond: ATestOp) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CJUMP "+cond.toString()+" ? "+successBlock.label+" : "+failureBlock.label;
-
- override def consumed = 2;
- override def produced = 0;
-}
-
-/** This class represents a CZJUMP instruction
- * It compares the one value on the stack and zero with the 'cond' test operator
- * Stack: ...:value:
- * ->: ...
- */
-case class CZJUMP(successBlock: IBasicBlock, failureBlock: IBasicBlock, cond: ATestOp) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="CZJUMP "+cond.toString()+" ? "+successBlock.label+" : "+failureBlock.label;
-
- override def consumed = 1;
- override def produced = 0;
-}
-
-
-/** This class represents a RETURN instruction
- * Stack: ...
- * ->: ...
- */
-case class RETURN() extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="RETURN";
-
- override def consumed = 0;
- override def produced = 0;
-}
-
-/** This class represents a THROW instruction
- * Stack: ...:Throwable(Ref)
- * ->: ...:
- */
-case class THROW() extends ICInstruction {
-/** Returns a string representation of this instruction */
- override def toString(): String ="THROW";
-
- override def consumed = 1;
- override def produced = 0;
-}
-
-/** This class represents a DROP instruction
- * Stack: ...:something
- * ->: ...
- */
-case class DROP (typ: Type) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="DROP "+typ.toString();
-
- override def consumed = 1;
- override def produced = 0;
-}
-
- /** This class represents a DUP instruction
- * Stack: ...:something
- * ->: ...:something:something
- */
- case class DUP (typ: Type) extends ICInstruction {
- /** Returns a string representation of this instruction */
- override def toString(): String ="DUP";
-
- override def consumed = 1;
- override def produced = 2;
- }
-
- /** This class represents a MONITOR_ENTER instruction
- * Stack: ...:object(ref)
- * ->: ...:
- */
- case class MONITOR_ENTER() extends ICInstruction {
-
- /** Returns a string representation of this instruction */
- override def toString(): String ="MONITOR_ENTER";
-
- override def consumed = 1;
- override def produced = 0;
- }
-
- /** This class represents a MONITOR_EXIT instruction
- * Stack: ...:object(ref)
- * ->: ...:
- */
- case class MONITOR_EXIT() extends ICInstruction {
-
- /** Returns a string representation of this instruction */
- override def toString(): String ="MONITOR_EXIT";
-
- override def consumed = 1;
- override def produced = 0;
- }
-
-}
diff --git a/sources/scala/tools/scalac/icode/ICTypeStack.scala b/sources/scala/tools/scalac/icode/ICTypeStack.scala
deleted file mode 100644
index c7b2110190..0000000000
--- a/sources/scala/tools/scalac/icode/ICTypeStack.scala
+++ /dev/null
@@ -1,147 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.atree._;
-import scalac.symtab._;
-import scalac.{Global => scalac_Global};
-
-package scala.tools.scalac.icode {
-
-
-
-/* This class simulates the type of the opperand
- * stack of the ICode. */
-class ICTypeStack() {
-
- // ##################################################
- // Private fields
- private var stack : List[Type] = Nil;
-
- private val global = scalac_Global.instance;
-
- private val definitions = global.definitions;
-
- private val typer = definitions.atyper; // !!! Using atree typer !
-
- // ##################################################
- // Private constructor
-
- private def this(stack : List[Type]) = {
- this();
- this.stack = stack;
- }
-
- // ##################################################
- // Public method
-
- /* This methods simulate the effect of an ICInstruction
- * on the stack. It returns the new stack */
- def eval(instr: ICInstruction) : ICTypeStack = {
- global.log(instr.toString());
- if (stack.length < instr.consumed) {
- global.log("Invalid instruction :"+instr+" for stack "+toString());
- this;
- } else {
- val result = new ICTypeStack(erase(production(instr)):::stack.drop(instr.consumed)); /// !!! Opt
- global.log("\t-> "+result.toString());
- result;
- }
- }
-
- // ##################################################
- // Public methods - Operation on the stack
-
- /* Push a new type */
- def push(t: Type) = stack = t::stack;
-
- /* Returns the topmost type of the stack */
- def head = stack.head;
-
- /* Returns the stack without the topmost element */
- def tail = stack.tail;
-
- /* Is the stack empty ? */
- def isEmpty = stack.isEmpty;
-
- // ##################################################
- // Private methods
-
- /* Compute what type(s) the instruction produce on the stack */
- private def production(instr: ICInstruction) : List[Type] = instr match {
- case THIS(clasz) => clasz.thisType()::Nil;
-
- case CONSTANT(aConstant) => typer.computeType(aConstant)::Nil;
-
- case LOAD_ARRAY_ITEM() => typer.getArrayElementType(stack.tail.head)::Nil;
-
- case LOAD_LOCAL(local, _) => local.getType()::Nil;
-
- case LOAD_FIELD(field, _) => stack.head.memberStabilizedType(field)::Nil; // ??
-
- case STORE_ARRAY_ITEM() => Nil;
-
- case STORE_LOCAL(_,_) => Nil;
-
- case STORE_FIELD(_,_) => Nil;
-
- case CALL_PRIMITIVE(p) => typer.computeType(p)::Nil;
-
- case CALL_METHOD(method, style) => style match {
- //case AInvokeStyle.Dynamic => stack.head.memberStabilizedType(method)::Nil; // ???
- //case AInvokeStyle.Dynamic => stack.drop(method.getType().valueParams().length).head.resultType()::Nil;
- case AInvokeStyle.New => method.owner().thisType()::Nil;
-
- case _ => method.resultType()::Nil; // Valable pour Dynamic
- //case _ => method.owner().thisType().memberStabilizedType(method)::Nil; // ???
- }
- case NEW(clasz) => clasz.getType()::Nil;
-
- case CREATE_ARRAY(element) => definitions.array_TYPE(element)::Nil;
-
- case IS_INSTANCE(_) => definitions.boolean_TYPE()::Nil;
-
- case CHECK_CAST(typ) => typ::Nil;
-
- case SWITCH(_,_) => Nil;
-
- case JUMP(_) => Nil;
-
- case CJUMP(_,_,_) => Nil;
-
- case CZJUMP(_,_,_) => Nil;
-
- case RETURN() => Nil;
-
- case THROW() => Nil;
-
- case DROP(_) => Nil;
-
- case DUP(_) => stack.head::stack.head::Nil;
-
- case MONITOR_ENTER() => Nil;
-
- case MONITOR_EXIT() => Nil;
- }
-
- /* This method kill all the produced *Unit* elements */
- // !!! Hack
- private def erase(production : List[Type]) = production.filter((t: Type) => t match {
- case Type$UnboxedType(TypeTags.UNIT) => false;
- case _ => true
- });
-
- /* This method returns a String representation of the stack */
- // !!! POUAH SALE !
- override def toString() = {
- var ret : String = "";
- stack.foreach((t: Type) => ret=(t.toString()+"::")+ret);
- ret;
-
- }
-}
-}
diff --git a/sources/scala/tools/scalac/icode/ICode.scala b/sources/scala/tools/scalac/icode/ICode.scala
deleted file mode 100644
index 514c15e0e5..0000000000
--- a/sources/scala/tools/scalac/icode/ICode.scala
+++ /dev/null
@@ -1,492 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global}
-
-import scala.collection.mutable.HashMap;
-import scala.collection.mutable.HashSet;
-
-import scalac.symtab._;
-import scalac.atree._;
-import scalac.util.Debug;
-
-package scala.tools.scalac.icode {
-
-
-
-/** This class represents the intermediate code of a method*/
-class ICode(label: String, global: scalac_Global) {
-
- //##################################################
- // Public fields
-
- /* The set of all blocks */
- val blocks: HashSet[IBasicBlock] = new HashSet;
-
- /* The start block of the method */
- var startBlock : IBasicBlock = null;
-
- /* The stack produced by this method */
- var producedStack : ICTypeStack = null;
-
- //##################################################
- // Private fields
- private var currentLabel : int = 0;
-
- private var aTreeLabels : HashMap[Symbol, IBasicBlock] = new HashMap;
-
- //##################################################
- // Constructor code
-
- startBlock = newBlock;
- startBlock.initStack(new ICTypeStack);
-
- //##################################################
- // Public methods
-
- /** This method produce the intermediate code for
- * the given ATree */
- def generate(acode : ACode) = {
- val ctx = gen(acode, new GenContext(startBlock, null));
-
- ctx.emit(RETURN()); // ??? RETURN instruction rather come from ATree
- genTypeStack;
-
- producedStack = ctx.currentBlock.endStack;
- }
-
- def icTraverse(f: IBasicBlock => unit) = icTraverseFeedBack((bb: IBasicBlock, hm: HashMap[IBasicBlock, boolean]) => f(bb));
-
- /* This method applies the given function to all the block */
- def icTraverseFeedBack(f: (IBasicBlock, HashMap[IBasicBlock, boolean]) => unit) = {
- // ?? Define order (actually preorder)
- val visited : HashMap[IBasicBlock, boolean] = new HashMap;
- visited ++= blocks.elements.map(x => Pair(x, false));
-
- var blockToVisit : List[IBasicBlock] = startBlock::Nil;
-
- while (blockToVisit != Nil) {
- blockToVisit match {
- case b::xs => {
- if (!visited(b)) {
- f(b, visited);
- blockToVisit = b.successors:::xs;
- visited += b -> true;
- } else
- blockToVisit = xs;
- }
- }
- }
- }
-
-
- /** This methods returns a string representation of the ICode */
- override def toString() : String = "ICode '"+label+"'"; //
-
- //##################################################
- // Public method - printing (for debug use)
-
- /** This method print the code */
- def print() : unit = print(System.out);
-
- def print(out: java.io.PrintStream) : unit = {
- icTraverse((bb: IBasicBlock) => {
- out.println("Block #"+bb.label);
- out.println("Substituable variables : ");
- if (bb.substituteVars != null)
- bb.substituteVars.foreach(out.print);
- else
- out.println(" {Empty} ");
- out.println("Instructions:");
- bb.bbTraverse((ici: ICInstruction) =>
- out.println(" "+ici.toString()));
- out.print ("Successors: ");
- bb.successors.foreach((bb: IBasicBlock) => out.print(bb.label+", "));
- out.println (""); // ?? Del
- out.println ();
- });
- }
-
-
- def logType = {
- global.log ("// Typing "+toString());
- this.icTraverse((bb: IBasicBlock) => {
- global.log ("Typing block #"+bb.label);
- var typer = new ICTypeStack;
- bb.bbTraverse((ic: ICInstruction) => {
- typer = typer.eval(ic);
- global.log(ic.toString()+" -> "+typer.toString());
- });
-
- });
- }
-
- //##################################################
- // Private methods
-
- /* Compute a unique new label */
- private def nextLabel = {
- currentLabel = currentLabel + 1;
- currentLabel;
- }
-
- /* This method :
- * 1/ create a new block
- * 2/ add the new block to the set
- * 3/ return the new block
- */
- private def newBlock : IBasicBlock = {
- val block = new IBasicBlock(nextLabel);
- blocks += block;
- block;
- }
-
- /* Generate the code from a given ATree */
- private def gen(aCode: ACode, ctx: GenContext) : GenContext =
- aCode match {
- case ACode.Void => {
- global.log ("ICodeGenerator::emit: Void node found");
- ctx;
- }
-
- case ACode$This(clasz) =>
- ctx.emit(THIS(clasz));
-
- case ACode$Constant(c) =>
- ctx.emit(CONSTANT(c));
-
- case ACode$Load(ALocation$Module(_)) => {
- global.log ("ICodeGenerator::emit: Load(Module) node found");
- ctx;
- }
-
- case ACode$Load(ALocation$Field(obj, field ,isStatic)) => {
- var ctx1 = gen(obj, ctx);
- ctx.emit(LOAD_FIELD(field, isStatic));
- }
-
- case ACode$Load(ALocation$Local(local,isArgument)) =>
- ctx.emit(LOAD_LOCAL(local, isArgument));
-
- case ACode$Load(ALocation$ArrayItem(array, index)) => {
- var ctx1 = gen(array, ctx);
- ctx1 = gen(index, ctx1);
- ctx1.emit(LOAD_ARRAY_ITEM());
- }
-
- case ACode$Store(ALocation$Module(_),_) => {
- global.log ("ICodeGenerator::emit: Store(Module(_)) node found");
- ctx;
- }
-
- case ACode$Store(ALocation$Field(obj, field, isStatic), value) => {
- var ctx1 = gen(obj, ctx);
- ctx1 = gen(value, ctx1);
- ctx1.emit(STORE_FIELD(field, isStatic));
- }
-
- case ACode$Store(ALocation$Local(local, isArgument), value) => {
- val ctx1 = gen(value, ctx);
- ctx1.emit(STORE_LOCAL(local, isArgument));
- }
-
- case ACode$Store(ALocation$ArrayItem(array, index), value) => {
- var ctx1 = gen(array, ctx);
- ctx1 = gen(index, ctx1);
- ctx1 = gen(value, ctx1);
- ctx1.emit(STORE_ARRAY_ITEM());
- }
-
- case ACode$Apply(AFunction$Method(_,sym,AInvokeStyle.New),_,vargs) => {
- val vargs_it = Iterator.fromArray(vargs);
- // !!! Depend the backend in use
- ctx.emit(NEW(sym.owner()));
- ctx.emit(DUP(sym.owner().getType()));
- var ctx1 = ctx;
- vargs_it.foreach((varg: ACode) => ctx1 = gen(varg, ctx1));
- ctx1.emit(CALL_METHOD(sym,AInvokeStyle.StaticInstance));
- }
-
- case ACode$Apply(AFunction$Method(obj,sym,style),_,vargs) => {
- val vargs_it = Iterator.fromArray(vargs);
- var ctx1 = ctx;
- style match {
- case AInvokeStyle.StaticClass =>
- ; // NOP
- case _ =>
- ctx1 = gen(obj, ctx1);
- }
- vargs_it.foreach((varg: ACode) => ctx1 = gen(varg, ctx1));
- ctx1.emit(CALL_METHOD(sym,style));
- }
-
- case ACode$Apply(AFunction$Primitive(p),_,vargs) => {
- val vargs_it = Iterator.fromArray(vargs);
- var ctx1 = ctx;
-
- vargs_it.foreach((varg: ACode) => ctx1 = gen(varg, ctx1));
- ctx1.emit(CALL_PRIMITIVE(p));
- }
-
- case ACode$Apply(AFunction$NewArray(element),_,vargs) => {
- var ctx1 = gen(vargs(0), ctx); // The size is given as first argument
- ctx1.emit(CREATE_ARRAY(element));
- }
-
- case ACode$IsAs(value,typ,false) => {
- var ctx1 = gen(value, ctx);
- ctx1.emit(IS_INSTANCE(typ));
- }
-
- case ACode$IsAs(value,typ,true) => {
- var ctx1 = gen(value, ctx);
- ctx1.emit(CHECK_CAST(typ));
- }
-
- case ACode$If(test, success, failure) => {
- genAlt(test, success, failure, ctx, newBlock);
- }
-
- case ACode$Switch(test,tags,bodies) => {
-
- val switchBodies = List.fromArray(bodies, 0, bodies.length);
- var switchBlocks: List[IBasicBlock] = Nil;
- for (val i : ACode <- switchBodies) switchBlocks = newBlock::switchBlocks;
- val switchPairs = switchBodies.zip(switchBlocks);
-
- val nextBlock = newBlock;
-
- var ctx1 = gen(test, ctx);
- ctx1.emit(SWITCH(tags, switchBlocks));
- //ctx1.currentBlock.addSuccessors(switchBlocks);
-
- switchPairs.foreach((p: Pair[ACode, IBasicBlock]) => {
- val code = p._1;
- val block = p._2;
-
- val ctx2 = gen(code, new GenContext(block, nextBlock));
- ctx2.closeBlock;
- });
-
- ctx1.changeBlock(nextBlock);
- }
-
- case ACode$Synchronized(lock, value) => {
- var ctx1 = gen(lock, ctx);
- ctx1.emit(MONITOR_ENTER());
- ctx1 = gen(value,ctx);
- ctx1 = gen(lock, ctx);
- ctx1.emit(MONITOR_EXIT());
- }
-
- case ACode$Block(_,statements,value) => {
- val statements_it = Iterator.fromArray(statements);
- var ctx1 = ctx;
- statements_it.foreach((st: ACode) => ctx1 = gen(st, ctx1));
- ctx1 = gen(value, ctx1);
- ctx1;
- }
-
- case ACode$Label(label, locals, value) => {
- global.log("Add new label: "+label);
-
- val loopBlock = newBlock;
- var ctx1 = ctx.changeBlock(loopBlock);
- ctx.nextBlock = loopBlock;
- ctx.closeBlock;
-
- aTreeLabels += label -> loopBlock;
-
- loopBlock.substituteVars = List.fromIterator(Iterator.fromArray(locals));
- gen(value, ctx1);
- }
-
- case ACode$Goto(label,vargs) => {
-
- val vargs_it = Iterator.fromArray(vargs);
- global.log("Current label mapping: "+aTreeLabels.keys.foreach((s: Symbol) => global.log(s.toString())));
- global.log("Looking for sym: "+label);
- val gotoBlock = aTreeLabels(label);
- var ctx1 = ctx;
-
- // Stack-> :
- vargs_it.foreach((varg: ACode) => ctx1 = gen(varg, ctx1));
-
- // Stack-> :varg0:varg1:...:vargn
- // We should have the same number of varg that substitute vars
-
- gotoBlock.substituteVars.reverse.foreach(
- (varg: Symbol) => ctx1.emit(STORE_LOCAL(varg, false)) // ?? false
- );
- ctx1.nextBlock = gotoBlock;
- ctx1.closeBlock;
-
- ctx1;
- }
-
- case ACode$Return(_,value) => {
- var ctx1 = gen(value, ctx);
- ctx1.emit(RETURN());
- }
- case ACode$Throw(value) => {
- var ctx1 = gen(value, ctx);
- ctx1.emit(THROW());
- }
-
- case ACode$Drop(value, typ) => {
- var ctx1 = gen(value, ctx);
- //global.log("Type de Drop: "+typ+" = unboxed:"+typ.unbox() );
- if (! typ.isSameAs(global.definitions.void_TYPE()))
- typ.unbox() match { // !!! Hack
- case Type$UnboxedType(TypeTags.UNIT) =>
- global.log("it matches UNIT !"); // debug ; // NOP
- case _ =>
- ctx1.emit(DROP(typ));
- }
- else
- global.log("it matches SCALAC_UNIT :-(");
- ctx1;
- }
- }
-
- /* This method genrates an alternative. In the case of an if instruction
- * It looks at the kind of alternatives and creates new basic blocks
- *
- * @param nextBlock : represents the block where alternatives meet again*/
- private def genAlt (cond : ACode, success: ACode, failure: ACode, ctx: GenContext, nextBlock: IBasicBlock) : GenContext = {
- val successBlock = success match {
- case ACode.Void => nextBlock;
-
- case ACode$If(test, innerSuccess, innerFailure) => {
- val ctx1 = new GenContext(newBlock, null);
- val ctx2 = genAlt(test, innerSuccess, innerFailure, ctx1, nextBlock);
- //ctx2.closeBlock; // or close when CJUMP is emitted
- ctx1.currentBlock;
- }
-
- case _ => {
- val ctx1 = new GenContext(newBlock, nextBlock);
- val ctx2 = gen(success, ctx1);
- ctx2.closeBlock;
- ctx1.currentBlock;
- }
- }
-
- val failureBlock = failure match {
- case ACode.Void => nextBlock;
-
- case ACode$If(test, innerSuccess, innerFailure) => {
- val ctx1 = new GenContext(newBlock, null);
- val ctx2 = genAlt(test, innerSuccess, innerFailure, ctx1, nextBlock);
- //ctx2.closeBlock; // or close when CJUMP is emitted
- ctx1.currentBlock;
- }
-
- case _ => {
- val ctx1 = new GenContext(newBlock, nextBlock);
- val ctx2 = gen(failure, ctx1);
- ctx2.closeBlock;
- ctx1.currentBlock;
- }
- }
-
- var ctx1 = genCond(cond, successBlock, failureBlock, ctx);
- ctx1.changeBlock(nextBlock);
- }
-
- /* This methods generate the test and the jump instruction */
- private def genCond(cond: ACode, successBlock: IBasicBlock, failureBlock: IBasicBlock, ctx: GenContext) : GenContext= {
- var ctx1 = ctx;
- cond match {
- case ACode$Apply(AFunction$Primitive(APrimitive$Test(op,_,zero)),_, vargs) => {
- ctx1 = gen(vargs(0),ctx1);
- if (zero)
- ctx1.emit(CZJUMP(successBlock, failureBlock, op));
- else {
- ctx1 = gen(vargs(1), ctx1);
- ctx1.emit(CJUMP(successBlock, failureBlock, op));
- }
- //ctx1.currentBlock.addSuccessors(failureBlock::successBlock::Nil);
- }
-
- case ACode$Apply(AFunction$Primitive(APrimitive$Negation(_)),_,vargs) =>
- ctx1 = genCond(vargs(0), failureBlock, successBlock, ctx1);
- // ??? Test with TestOp opposite ?
- case _ => {
- ctx1 = gen(cond, ctx1);
- //ctx1.emit(CONSTANT(AConstant.INT(1)));
- // We have a boolean value
- ctx1.emit(CZJUMP(successBlock, failureBlock, ATestOp.NE));
- //ctx1.currentBlock.addSuccessors(failureBlock::successBlock::Nil);
- }
- }
- ctx1;
- }
-
- /* This method generate the type stacks of all the blocks
- * of this method.*/
- private def genTypeStack = {
- icTraverse((bb: IBasicBlock) => {
- global.log("// Typing block #"+bb.label);
- global.log("\t-> "+bb.endStack);
- bb.typeBlock;
- // !!! Here we must test if all the meeting blocks have the
- // !!! same stack.
- bb.successors.foreach((suc: IBasicBlock) => suc.initStack(bb.endStack));
- });
- }
-
-}
-
- /* This class represents the context of generating icode */
- class GenContext(current: IBasicBlock, next: IBasicBlock) {
-
- // ##################################################
- // Public fields
-
- /* The block in which we add instructions */
- val currentBlock = current;
-
- /* The block were we jump at the end of the current block
- * It can be the *null* value */
- var nextBlock = next;
-
- // ##################################################
- // Constructor code
-
- assert(current != null, "No current block");
-
- // ##################################################
- // Public methods
-
- /* append an instruction at the end of the current block */
- def emit(instr: ICInstruction) : GenContext = {
- currentBlock.emit(instr);
- this;
- }
-
- /* Split the current block. The next block is still the same */
- def changeBlock(bb: IBasicBlock) = {
- new GenContext(bb, next);
- }
-
- /* Close the current block. If there's a known next block
- * It append a jump instruction to the block.
- * This method do something only the first time it's called */
- def closeBlock = {
- if (!currentBlock.isClosedBlock) {
- if (nextBlock != null) {
- emit(JUMP(nextBlock));
- //currentBlock.addSuccessor(nextBlock);
- }
- currentBlock.close;
- }
- }
- }
-
-} // package
diff --git a/sources/scala/tools/scalac/icode/ICodePhase.scala b/sources/scala/tools/scalac/icode/ICodePhase.scala
deleted file mode 100644
index d0408b5544..0000000000
--- a/sources/scala/tools/scalac/icode/ICodePhase.scala
+++ /dev/null
@@ -1,67 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.symtab._;
-import scalac.transformer.{ICodePhase => scalac_ICodePhase}
-import scalac.{Global => scalac_Global}
-import scalac.CompilationUnit;
-import scalac.PhaseDescriptor;
-import scalac.Phase;
-import scalac.atree._;
-
-import ch.epfl.lamp.util.CodePrinter;
-
-package scala.tools.scalac.icode {
-
-
-
-
-/** This class represents the ICode phase. This phase use the ATrees
- * that represents the code with some primitives backends-like
- * and convert them in a inline form: The ICode (for intermediate
- * code). The ICode will be produced in the icode variable
- * of all AMethod objects. */
-class ICodePhase(global: scalac_Global, descriptor: PhaseDescriptor) extends scalac_ICodePhase (global, descriptor) {
-
- // ##################################################
- // Public methods
-
- /** Applies this phase to the given compilation unit. */
- override def apply(unit: CompilationUnit): Unit = translate(unit);
-
- /** Prints the given compilation units. */
- override def print(units: Array[CompilationUnit], printer: CodePrinter):Unit=
- new ICodePrinter(global, printer).printUnits(units);
-
- // ##################################################
- // Private methods
-
- /** This method translates a single unit, it traverses all methods and
- * generates ICode for each of them */
- private def translate(u: CompilationUnit) : unit = {
- def genClass(c: AClass) : unit = {
- val nestedClasses_it = Iterator.fromArray(c.classes());
- nestedClasses_it.foreach(genClass);
- val methods_it = Iterator.fromArray(c.methods());
- methods_it.foreach((m: AMethod) => {
- val label : String = m.symbol().name.toString();
-
- val ic : ICode = new ICode(label, global);
- ic.generate(m.code());
-
- // save the produced ICode
- m.icode = ic;
-
- });
- }
- val classes_it = Iterator.fromArray(u.repository.classes());
- classes_it.foreach(genClass);
- }
-
-}
-}
diff --git a/sources/scala/tools/scalac/icode/ICodePrinter.scala b/sources/scala/tools/scalac/icode/ICodePrinter.scala
deleted file mode 100644
index 81bac0a996..0000000000
--- a/sources/scala/tools/scalac/icode/ICodePrinter.scala
+++ /dev/null
@@ -1,71 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import ch.epfl.lamp.util.CodePrinter;
-
-import scalac.CompilationUnit;
-import scalac.{Global => scalac_Global}
-
-package scala.tools.scalac.icode {
-
-/** This class implements a Printer for the ICode. */
-class ICodePrinter(global0: scalac_Global, printer0: CodePrinter) {
-
- //##########################################################################
- // Public Fields
-
- val global: scalac_Global = global0;
- val printer: CodePrinter = printer0;
-
- //##########################################################################
- // Public Methods
-
- /** Prints the ICode of the given units. */
- def printUnits(units: Array[CompilationUnit]): Unit = {
- val phase = global.currentPhase;
- printer.println("[[ICode at "+phase+" (after "+phase.prev+")]]");
- Iterator.fromArray(units).foreach(printUnit);
- }
-
- /** Prints the ICode of the given unit. */
- def printUnit(unit: CompilationUnit): Unit = {
- printer.println ("// Scala source: "+unit.source);
- val classes_it = Iterator.fromArray(unit.repository.classes());
- classes_it.foreach(c => {
- printer.println ("");
- printer.println ("// ICode for class <"+c.symbol().name+">");
- val methods_it = Iterator.fromArray(c.methods());
- methods_it.foreach(m => {
- val icode : ICode = m.icode.asInstanceOf[ICode];
- printer.println ("// ::"+m.symbol().name);
- icode.icTraverse((bb: IBasicBlock) => {
- printer.println("Block #"+bb.label);
- printer.println("Initial stack -> "+bb.initialStack);
- printer.println("Substituable variables : ");
- if (bb.substituteVars != null)
- bb.substituteVars.foreach(s => printer.print(s.name.toString()));
- else
- printer.println(" {Empty} ");
- printer.println("Instructions:");
- printer.indent();
- bb.bbTraverse((ici: ICInstruction) =>
- printer.println(ici.toString()));
- printer.undent();
- printer.println("End stack -> "+bb.endStack);
- printer.print ("Successors: ");
- bb.successors.foreach((bb: IBasicBlock) => printer.print(bb.label+", "));
- printer.println (""); // ?? Del
- printer.println ();
- });
- });
- });
- }
-
- //##########################################################################
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/TransMatch.scala b/sources/scala/tools/scalac/transformer/TransMatch.scala
deleted file mode 100644
index 509e922e32..0000000000
--- a/sources/scala/tools/scalac/transformer/TransMatch.scala
+++ /dev/null
@@ -1,401 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import java.io._;
-import java.util.HashMap;
-import scalac.{Global => scalac_Global};
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.util._; // Names
-
-import scalac.transformer.{ OwnerTransformer => scalac_transformer_OwnerTransformer };
-
-
-//import scalac.transformer.matching.PatternMatcher ;
-//import scalac.transformer.matching.AlgebraicMatcher ;
-
-/** A transformer for expanding match expressions into
- * flat sequences of .is and .as method calls
- *
- * @author Matthias Zenger, Burak Emir
- * @version 1.1
- */
-package scala.tools.scalac.transformer {
-
- import matching.PatternMatcher ;
- import matching.PartialMatcher ;
-//import matching.FullRegularTranslator ;
-
-class TransMatch( global:scalac_Global )
- extends scalac_transformer_OwnerTransformer( global ) {
-
- import Tree._ ;
-
- var cunit:CompilationUnit = null;
-
-
- //def debugLog(s:String) = {
- //if(currentOwner.toString().indexOf("fetchToken") != -1) {
- //Console.println(s);
- //}
- //}
-
- override def apply( cunit:CompilationUnit ):unit = {
- this.cunit = cunit;
- super.apply( cunit );
- }
-
- def isRegular(ps:Array[Tree]):Boolean = {
- var res = false;
- val pats = scala.Iterator.fromArray( ps );
- while (!res && pats.hasNext )
- res = isRegular( pats.next );
- res
- }
-
- def isRegular(pat:Tree):Boolean = pat match {
- //case Alternative(_) => true
- case Alternative(trees) =>
- isRegular(trees)
- case Bind( n, pat1 ) =>
- TreeInfo.isNameOfStarPattern( n )
- || TreeInfo.isEmptySequence( pat1 )
- || isRegular( pat1 )
- case Ident(n) => false
- case Sequence( trees ) =>
- ( trees.length == 0 ) || isRegular( trees );
- case Apply( fn, trees ) =>
- isRegular( trees ) &&
- !((trees.length == 1) && TreeInfo.isEmptySequence( trees( 0 )))
- case Literal(_) => false;
- case Select(_,_) => false;
- case Typed(_,_) => false;
- case _ => error("in TransMatch.isRegular phase: unknown node"+pat.getClass());
- }
-
- def nilVariables( pat:Tree ) = {
- var res:List[Symbol] = Nil;
- def getNilVars1( ps:Array[Tree] ):scala.Unit = {
- val z:Seq[Tree] = ps; z.elements.foreach( x => getNilVars( x ));
- }
- def getNilVars( p:Tree ):scala.Unit = p match {
- case Alternative( _ ) => /* no bind allowed! */
- case Bind( _, pat ) =>
- getNilVars(pat);
- if( TreeInfo.isEmptySequence( pat ) )
- res = p.symbol() :: res;
- case Ident(_) =>
- case Sequence( trees ) => getNilVars1( trees )
- case Apply( _, args ) => getNilVars1( args )
- case Literal(_) =>
- case Select(_,_) =>
- case Typed(_,_) =>
- case _ => error("in TransMatch.nilVariables: unknown node"+pat.getClass());
- }
- getNilVars( pat );
- res
- }
-
- // 2do: remove binds from pattern
- def handleNilVariables( cse: CaseDef ): Unit = {
- val nilvars = nilVariables(cse.pat);
- if( !nilvars.isEmpty ) {
- val newBody = new Array[Tree]( nilvars.length );
- var j=0;
- for( val v <- nilvars.elements ) {
- val n = gen.mkNil( cse.pos );
- newBody( j ) = gen.ValDef( v, n );
- j = j + 1;
- }
- cse.body = gen.mkBlock( newBody, cse.body );
- }
- }
-
-
- /** removes alternative notes by unfolding them, adding casedefs,
- * and duplication righthand sides
- *
- * @pre cases are all nonregular
- */
- def removeAlterns(cases: Array[CaseDef]) = {
-
- //debugLog("removeAlterns called![ currentOwner = "+currentOwner+" [");
- // var jjj = 0; while (jjj<cases.length) {
- // debugLog(cases(jjj).toString());
- // jjj = jjj + 1;
- //}
- //debugLog("]");
-
- def lst2arr(l:List[Tree]):Array[Tree] = {
- val res = new Array[Tree](l.length);
- val it = l.elements; var i = 0; while(it.hasNext) {
- res(i) = it.next;
- i = i + 1;
- }
- res
- }
- def select(j:int, expanded:Array[List[Tree]]): List[List[Tree]] = {
- if( j == expanded.length )
- List(scala.Nil);
- else {
- val rest:List[List[Tree]] = select(j+1, expanded);
- //expanded(j) map { x:Tree => rest map { xs:List[Tree] => x :: xs }}
- for(val t <- expanded(j);
- val zs <- rest)
- yield t :: zs;
- }
- }
-
- def newCloner() = {
- val sc = new SymbolCloner();
- sc.owners.put(currentOwner,currentOwner);
-
- new GenTreeCloner(global, Type.IdMap, sc) {
-
- override def getSymbolFor(tree:Tree): Symbol = {
- //Console.println("getSymbolFor "+tree.getClass());
- tree match {
- case Bind(_,_) =>
- val symbol = cloner.cloneSymbol(tree.symbol());
-
- //System.out.println("TreeCloner: Bind"+symbol);
- //System.out.println("TreeCloner: Bind - old owner "+tree.symbol().owner());
- //System.out.println("TreeCloner: Bind - new owner "+symbol.owner());
- //Console.println("in TreeCloner: type = "+symbol.getType());
- symbol.setType(transform(symbol.getType()));
- //Console.println("in TreeCloner: type (post) = "+symbol.getType());
- //System.out.println("done TreeCloner: Bind"+symbol);
- return symbol;
-
- case _ : ClassDef =>
-
- throw new ApplicationError("sorry, cannot compile this correctly in this scala version. Move your classes, fundefs etc out of the pattern body, please, and wait for nsc.");
- case _ : DefDef =>
- throw new ApplicationError("sorry, cannot compile this correctly in this scala version. Move your classes, fundefs etc out of the pattern body, please, and wait for nsc.");
- // tree.symbol();
-
- case Ident(_) if tree.symbol() == global.definitions.PATTERN_WILDCARD =>
- tree.symbol()
-
- case _ =>
- super.getSymbolFor(tree);
- }
-
- }
- }
- }
-
- def remove(pat:Tree): List[Tree] = {
- //Console.println("remove("+pat+"), currentOwner = "+currentOwner);
- val res = pat match {
- case Alternative( branches ) => // no bind allowed!
- val z: Seq[Tree] = branches;
- List.flatten(z.toList.map( remove ));
- case b @ Bind( n, pat ) =>
- //Console.println("remove-Bind sym-owner: "+b.symbol().owner());
- remove(pat) match {
- case List(r) if (r eq pat) =>
- List(b);
- case zs =>
- //Console.println("remove-Bind sym: "+b.symbol());
- //Console.println("remove-Bind sym-type: "+b.symbol().getType());
- //Console.println("rb-(case zs)"+zs);
- zs map { x => //Console.println(b.symbol());
- val r = new ExtBind(b.symbol(),x);
- r.setType(b.getType());
- //Console.println("rrrrr ="+ r.getType());
- r
- };
- }
- case Sequence( trees ) =>
- val expanded = new Array[List[Tree]](trees.length);
- var i = 0; while( i < trees.length) {
- expanded(i) = remove(trees(i));
- i = i + 1;
- }
- select(0, expanded) map { x:List[Tree] =>
- //Console.println("remove:Sequence, type = "+pat.getType());
- val res = Sequence(lst2arr(x)).setType(pat.getType());
- //Console.println("remove:Sequence RETURNS "+res);
- res
- }
-
- case Apply( fn, trees ) =>
- val expanded = new Array[List[Tree]](trees.length);
- var i = 0; while( i < trees.length) {
- expanded(i) = remove(trees(i));
- i = i + 1;
- }
-
- select(0, expanded) map { x => new Apply(fn, lst2arr(x))
- .setType(pat.getType()) }
-
- case Ident(_) => List(pat);
- case Literal(_) => List(pat);
- case Select(_,_) => List(pat);
- case Typed(_,_) =>
- List(pat);
- case _ => error("in TransMatch.nilVariables: unknown node"+pat.getClass());
-
-
- }
- //Console.println("end remove("+pat+")");
- res
- }
- val zs:Seq[CaseDef] = cases;
- val ncases: List[List[Tree]] = zs.toList map {
- x => x match {
- case CaseDef(pat,guard,body) =>
-
- //debugLog("removeAlterns - ("+x+")");
- remove(pat) match {
- case List(p) => List(x);
- case pats =>
- //debugLog("removal yields patterns (before trans) in "+cunit);
- //debugLog( pats.mkString("","\n","") );
- pats map {
- npat =>
- val tc = newCloner();
- //Console.println("start cloning! casedef in "+cunit);
- val res = tc.transform(new CaseDef(npat,
- guard.duplicate(),
- body.duplicate()));
- /*Console.println(sc.owners);*/res}
- }
- }
- }
-
- lst2arr(List.flatten(ncases));
- }
-
- //val bsf = new scala.util.automaton.BerrySethi[ matching.PatternTest ]( pe );
-
- def transform( root:Tree, cases:Array[CaseDef], restpe:Type ):Tree = {
-
- if( global.newMatch ) {
- //val fm = new FullRegularTranslator( global );
- //val gram = fm.MakeGrammar( scala.Iterator.fromArray( cases ) );
- //Console.println("writing out the grammar to /tmp/encodedGrammar.bin");
- ////val f = new FileOutputStream(new File("/tmp/encodedGrammar.bin"));
- ////f.write( gram.encode );
- ////f.close();
- //// val gram = Predef.decode( Predef.Array[] );
- //Console.println( gram.encode);
-
- throw new ApplicationError("not impl.");
- };
-
- var containsReg = false;
- var i = 0;
- while (i < cases.length) {
- if(isRegular(cases( i ).pat)) {
- containsReg = true;
- handleNilVariables(cases( i ));
- }
- i = i+1;
- }
- //Console.println("TransMatch: ");
- //for(val ci <- cases) Console.println(ci);
- if( containsReg ) {
- //Console.println("TransMatch: isRegular!");
- /*
- val pe = new matching.PatternExp(global.definitions); // TEST
- var j = 0;
- val pat = new Array[pe.RegExp](cases.length);
- while( j < cases.length) {
- pat(j) = pe.fromTree(cases(j).pat);
- j = j + 1;
- } // TEST
- */
- //debugLog("containsReg!");
- val am = new matching.AlgebraicMatcher( cunit );
- val matcher = new PartialMatcher( currentOwner, root, restpe );
- am.construct( matcher, cases.asInstanceOf[ Array[Tree] ] );
- matcher.tree
- } else {
- //Console.println("TransMatch: NOT regular");
- val pm = new matching.PatternMatcher( cunit );
- pm.initialize(root, currentOwner, restpe, true );
- try{
-
- val ncases = removeAlterns(cases);
- //if(ncases.length > cases.length) {
- // debugLog("did some removal!");
- // var kk = 0; while (kk<ncases.length) {
- // debugLog(ncases(kk).toString());
- // kk = kk + 1;
- // }
- //} else
- //else debugLog("did NOT do removal!");
-
- pm.construct( ncases.asInstanceOf[Array[Tree]] );
- } catch {
- case e:Throwable =>
- e.printStackTrace();
- Console.print("failed on pats "+scala.Iterator.fromArray(cases).toList.mkString("","\n","")+", message\n"+e.getMessage());
- Console.print(" unit "+cunit);
- Console.println(" with exception:"+e.getMessage());
- //e.printStackTrace();
- System.exit(-1); //Debug.abort()
- }
- if (global.log()) {
- global.log("internal pattern matching structure");
- pm.print();
- }
- pm.toTree();
- }
- }
- /** evil hack. OwnerTransformer should have this function */
- def transform1(ts:Array[CaseDef]):Array[CaseDef] = {
- var i = 0;
- while( i < ts.length ) {
- val t = transform(ts( i ));
- if (t != ts( i )) {
- val res = new Array[CaseDef](ts.length);
- System.arraycopy(ts, 0, res, 0, i);
- res( i ) = t.asInstanceOf[CaseDef];
- i = i + 1;
- while(i < ts.length) {
- res( i ) = transform(ts( i )).asInstanceOf[CaseDef];
- i = i + 1
- };
- return res;
- };
- i = i + 1;
- }
- return ts;
- }
-
- override def transform( tree: Tree ):Tree = {
- if (tree == null)
- return null;
- else
- tree match {
- case Apply(Select( receiver, Names._match ), args) =>
- if ((args != null) && (args.length == 1))
- args( 0 ) match {
- case Visitor( cases ) =>
- return transform(transform(receiver), transform1(cases), tree.getType());
- }
- return tree;
-
- case Apply(TypeApply(Select( receiver, Names._match ), targs), args) =>
- if ((args != null) && (args.length == 1))
- args( 0 ) match {
- case Visitor( cases ) =>
- return transform(transform(receiver), transform1(cases), tree.getType());
- }
- return tree;
- case _ =>
- super.transform(tree);
- }
- }
-}
-
-}
diff --git a/sources/scala/tools/scalac/transformer/TransMatchPhase.scala b/sources/scala/tools/scalac/transformer/TransMatchPhase.scala
deleted file mode 100644
index 23dad47306..0000000000
--- a/sources/scala/tools/scalac/transformer/TransMatchPhase.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global}
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-
-package scala.tools.scalac.transformer {
-
-class TransMatchPhase(global:scalac_Global, descriptor:PhaseDescriptor )
- extends Phase(global, descriptor) {
-
- /** Applies this phase to the given compilation unit. */
- override def apply(unit: CompilationUnit): Unit =
- new TransMatch(global).apply(unit);
-
- }
-}
-
-
diff --git a/sources/scala/tools/scalac/transformer/UnCurry.scala b/sources/scala/tools/scalac/transformer/UnCurry.scala
deleted file mode 100644
index 243f534da9..0000000000
--- a/sources/scala/tools/scalac/transformer/UnCurry.scala
+++ /dev/null
@@ -1,406 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{CompilationUnit, ApplicationError};
-import scalac.{Global => scalac_Global};
-import scalac.util._;
-import scalac.ast._;
-import scalac.symtab._;
-import Tree._;
-import scalac.transformer.OwnerTransformer;
-
-package scala.tools.scalac.transformer {
-
-import scalac.util.NewArray;
-/*<export>*/
-/** - uncurry all symbol and tree types (@see UnCurryPhase)
- * - for every curried parameter list: (ps_1) ... (ps_n) ==> (ps_1, ..., ps_n)
- * - for every curried application: f(args_1)...(args_n) ==> f(args_1, ..., args_n)
- * - for every type application: f[Ts] ==> f[Ts]() unless followed by parameters
- * - for every use of a parameterless function: f ==> f() and q.f ==> q.f()
- * - for every def-parameter: def x: T ==> x: () => T
- * - for every use of a def-parameter: x ==> x.apply()
- * - for every argument to a def parameter `def x: T':
- * if argument is not a reference to a def parameter:
- * convert argument `e' to (expansion of) `() => e'
- * - for every argument list that corresponds to a repeated parameter
- * (a_1, ..., a_n) => (Sequence(a_1, ..., a_n))
- * - for every argument list that is an escaped sequence
- * (a_1:_*) => (a_1)
- */
-/*</export>*/
-class UnCurry(global: scalac_Global, descr: UnCurryPhase) extends OwnerTransformer(global) {
-
- import Modifiers._;
-
- private var unit: CompilationUnit = _;
- private var inPattern: boolean = false;
- private var inArray: boolean = false;
-
- override def apply(unit: CompilationUnit): unit = {
- this.unit = unit;
- super.apply(unit);
- }
-
- /** (ps_1) ... (ps_n) => (ps_1, ..., ps_n)
- */
- private def uncurry(params: Array[Array[ValDef]]): Array[Array[ValDef]] = {
- var n = 0;
- { var i = 0; while (i < params.length) {
- n = n + params(i).length;
- i = i + 1
- }}
- val ps = new Array[ValDef](n);
- var j = 0;
- var i = 0; while (i < params.length) {
- System.arraycopy(params(i), 0, ps, j, params(i).length);
- j = j + params(i).length;
- i = i + 1
- }
- NewArray.ValDefArray(ps)
- }
-
- /** tree of non-method type T ==> same tree with method type ()T
- */
- private def asMethod(tree: Tree): Tree = tree.getType() match {
- case Type$MethodType(_, _) =>
- tree
- case _ =>
- tree.setType(
- new Type.MethodType(Symbol.EMPTY_ARRAY, tree.getType().widen()))
- }
-
- /** apply parameterless functions and def parameters
- */
- private def applyDef(tree: Tree): Tree = {
- assert(tree.symbol() != null, tree);
- tree.symbol().getType() match {
- case Type$PolyType(tparams, restp) =>
- if (tparams.length > 0 || (restp.isInstanceOf[Type$MethodType])) tree
- else gen.Apply(asMethod(tree), Tree.EMPTY_ARRAY)
- case _ =>
- if (tree.symbol().isDefParameter()) {
- tree.setType(global.definitions.FUNCTION_TYPE(
- Type.EMPTY_ARRAY, tree.getType().widen()));
- gen.Apply(gen.Select(tree, global.definitions.FUNCTION_APPLY(0)));
- } else tree
- }
- }
-
- /** - uncurry all symbol and tree types (@see UnCurryPhase)
- * - for every curried parameter list: (ps_1) ... (ps_n) ==> (ps_1, ..., ps_n)
- * - for every curried application: f(args_1)...(args_n) ==> f(args_1, ..., args_n)
- * - for every type application: f[Ts] ==> f[Ts]() unless followed by parameters
- * - for every use of a parameterless function: f ==> f() and q.f ==> q.f()
- * - for every def-parameter: def x: T ==> x: () => T
- * - for every use of a def-parameter: x ==> x.apply()
- * - for every argument to a def parameter `def x: T':
- * if argument is not a reference to a def parameter =>
- * convert argument `e' to (expansion of) `() => e'
- * - for every argument list that corresponds to a repeated parameter
- * (a_1, ..., a_n) => (Sequence(a_1, ..., a_n))
- */
- override def transform(tree: Tree): Tree = {
- var prevtype: Type = tree.getType();
- if (prevtype != null) {
- if (prevtype.isInstanceOf[Type$OverloadedType]) {
- assert(tree.symbol() != null);
- prevtype = tree.symbol().removeInheritedOverloaded(prevtype);
- }
- tree.setType(descr.uncurry(prevtype));
- }
- tree match {
- case Tree$ClassDef(_, _, tparams, vparams, tpe, impl) =>
- val clazz: Symbol = tree.symbol();
- val elems = clazz.members().elements();
- var i = 0; while (i < elems.length) {
- checkNoDoubleDef(clazz, elems(i));
- i = i + 1
- }
- copy.ClassDef(
- tree, clazz, tparams,
- uncurry(transform(vparams, clazz)),
- tpe,
- transform(impl, clazz));
-
- case Tree$DefDef(_, _, tparams, vparams, tpe, rhs) =>
- val sym: Symbol = tree.symbol();
- if (descr.isUnaccessedConstant(sym)) gen.mkUnitLit(tree.pos)
- else {
- val rhs1: Tree = transform(rhs, sym);
- copy.DefDef(
- tree, sym, tparams, uncurry(transform(vparams, sym)), tpe, rhs1)
- }
-
- case Tree$ValDef(_, _, tpe, rhs) =>
- val sym: Symbol = tree.symbol();
- if (descr.isUnaccessedConstant(sym)) gen.mkUnitLit(tree.pos)
- else if (sym.isDefParameter()) {
- val newtype: Type = global.definitions.FUNCTION_TYPE(Type.EMPTY_ARRAY, tpe.getType());
- val tpe1: Tree = gen.mkType(tpe.pos, newtype);
- copy.ValDef(tree, tpe1, rhs).setType(newtype)
- } else
- super.transform(tree)
-
- case Tree$TypeApply(fn, args) =>
- val tree1: Tree = asMethod(super.transform(tree));
- gen.Apply(tree1, new Array[Tree](0))
-
- case Tree$Apply(fn, args) =>
- // f(x)(y) ==> f(x, y)
- // argument to parameterless function e => ( => e)
- val ftype: Type = fn.getType();
- val fn1: Tree = transform(fn);
- val myInArray: boolean =
- TreeInfo.methSymbol(fn1) == global.definitions.PREDEF_ARRAY();
- val old = inArray;
- inArray = myInArray; // a hack to communicate with toSequence.
- val args1 = transformArgs(tree.pos, args, ftype);
- inArray = old;
- if (myInArray) {
- args1(0).getType().baseType(global.definitions.ARRAY_CLASS) match {
- case Type.NoType =>
- copy.Apply(tree,fn, Predef.Array[Tree]{args1(0)});
- case _ => fn1 match {
- case Tree$Apply(TypeApply(Select(fn2, _), targs), _) =>
- return gen.mkBlock(args1(0).pos, fn2, args1(0))
- case _ =>
- assert(false, "dead")
- }
- }
- }
- if (TreeInfo.methSymbol(fn1) == global.definitions.ANY_MATCH && !(args1(0).isInstanceOf[Tree.Visitor])) {
- TreeInfo.methPart(fn1) match {
- case Tree$Select(qual, name) =>
- assert(name == Names._match);
- gen.postfixApply(qual, args1(0), currentOwner)
- case _ =>
- throw new ApplicationError("illegal prefix for match: " + tree);
- }
- } else {
- fn1 match {
- case Tree$Apply(fn2, args2) =>
- val newargs = new Array[Tree](args1.length + args2.length);
- System.arraycopy(args2, 0, newargs, 0, args2.length);
- System.arraycopy(args1, 0, newargs, args2.length, args1.length);
- copy.Apply(tree, fn2, newargs);
- case _ =>
- copy.Apply(tree, fn1, args1);
- }
- }
-
- case Tree$Select(_, _) =>
- applyDef(super.transform(tree))
-
- case Tree$Ident(name) =>
- if (name == TypeNames.WILDCARD_STAR) {
- unit.error(tree.pos, " argument does not correspond to `*'-parameter");
- tree
- } else if (tree.symbol() == global.definitions.PATTERN_WILDCARD) {
- tree
- } else {
- applyDef(super.transform(tree))
- }
-
- case Tree$CaseDef(pat, guard, body) =>
- inPattern = true;
- val pat1: Tree = transform( pat );
- inPattern = false;
- val guard1: Tree = transform( guard );
- val body1: Tree = transform( body );
- copy.CaseDef(tree, pat1, guard1, body1)
-
- case _ =>
- super.transform(tree)
- }
- }
-
- /** Transform arguments `args' to method with type `methtype'.
- */
- private def transformArgs(pos: int, args: Array[Tree], methtype: Type): Array[Tree] = {
- methtype match {
- case Type$MethodType(params, _) =>
- val args0 =
- if (params.length > 0 && (params(params.length-1).flags & REPEATED) != 0)
- toSequence(pos, params, args)
- else args;
- var args1 = args0;
- var i = 0; while (i < args0.length) {
- val arg: Tree = args0(i);
- val arg1: Tree = transformArg(arg, params(i));
- if (arg1 != arg && args1 == args0) {
- args1 = new Array[Tree](args0.length);
- System.arraycopy(args0, 0, args1, 0, i);
- }
- args1(i) = arg1;
- i = i + 1
- }
- args1;
- case Type$PolyType(_, restp) =>
- transformArgs(pos, args, restp)
- case _ =>
- if (args.length == 0) args; // could be arguments of nullary case pattern
- else throw new ApplicationError(methtype);
- }
- }
-
- /** converts `a_1,...,a_n' to Seq(a_1,...,a_n)
- * if a_n is an escaped sequence x:_*, takes care of escaping
- *
- * precondition: params[params.length-1].flags & REPEATED != 0
- */
- private def toSequence(pos: int, params: Array[Symbol], args: Array[Tree]): Array[Tree] = {
- val result = new Array[Tree](params.length);
- System.arraycopy(args, 0, result, 0, params.length - 1);
- assert(args.length != params.length
- || !(args(params.length-1).isInstanceOf[Tree.Sequence])
- || TreeInfo.isSequenceValued(args(params.length-1)));
- if (args.length == params.length) {
- args(params.length-1) match {
- case Tree$Typed(arg, Ident(TypeNames.WILDCARD_STAR)) => // seq:_* escape
- result(params.length-1) = arg;
- return result;
- case _ =>
- }
- }
- var args1 = args;
- if (params.length != 1) {
- args1 = new Array[Tree](args.length - (params.length - 1));
- System.arraycopy(args, params.length - 1, args1, 0, args1.length);
- }
- val theType: Type = params(params.length-1).getType();
- result(params.length-1) =
- if (inPattern)
- make.Sequence(pos, args1).setType(theType)
- else if (inArray)
- gen.mkNewArray(pos, theType.typeArgs()(0), args1, currentOwner)
- else
- gen.mkNewList(pos, theType.typeArgs()(0), args1);
- result
- }
-
- /** for every argument to a def parameter `def x: T':
- * if argument is not a reference to a def parameter =>
- * convert argument `e' to (expansion of) `() => e'
- */
- private def transformArg(arg: Tree, formal: Symbol): Tree =
- if ((formal.flags & DEF) == 0)
- transform(arg)
- else {
- val sym: Symbol = arg.symbol();
- if (sym == null || (sym.flags & DEF) == 0)
- transform(
- gen.mkUnitFunction(arg, descr.uncurry(arg.getType().widen()),
- currentOwner, true))
- else {
- val arg1: Tree = transform(arg);
- arg1 match {
- case Tree$Apply(Select(qual, name), args1) =>
- assert(name == Names.apply && args1.length == 0);
- qual
- case _ =>
- System.err.println(arg1);//debug
- throw new ApplicationError();
- }
- }
- }
-
-// Double Definition Checking -----------------------------------------------
-
- private def checkNoDoubleDef(clazz: Symbol, sym: Symbol): unit = {
-
- def checkNoDoubleDef(sym1: Symbol, sym2: Symbol, type1: Type, type2: Type): unit = {
-
- def conflictError(phase: String): unit = {
- if (sym1.owner() == clazz && sym2.owner() == clazz)
- unit.error(sym2.pos,
- "Double declaration:\n" +
- sym1 + ": " + type1 + " and\n" +
- sym2 + ": " + type2 + " have same types after " + phase);
- else if (sym1.owner() == clazz)
- unit.error(sym1.pos,
- "Accidental override:\n" +
- sym1 + ": " + type1 + " has same type after " + phase + " as\n" +
- sym2 + ": " + type2 + " which is inherited from " + sym2.owner());
- else if (sym2.owner() == clazz)
- unit.error(sym2.pos,
- "Accidental override:\n" +
- sym2 + ": " + type2 + " has same type after " + phase + " as\n" +
- sym1 + ": " + type1 + " which is inherited from " + sym1.owner());
- else
- unit.error(clazz.pos,
- "Inheritance conflict: inherited members\n" +
- sym1 + ": " + type1 + sym1.locationString() + " and\n" +
- sym2 + ": " + type2 + sym2.locationString() + " have same types after " + phase);
- }
-
- val newtype1: Type = descr.uncurry(type1);
- val newtype2: Type = descr.uncurry(type2);
- if (sym1.owner() != sym2.owner() &&
- (newtype1.overrides(newtype2) || newtype2.overrides(newtype1)))
- conflictError("uncurry")
- else if (erasureConflict(newtype1, newtype2))
- conflictError("erasure")
- }
-
- sym.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- var i = 0; while (i < alttypes.length) {
- var j = i + 1; while (j < alttypes.length) {
- checkNoDoubleDef(alts(i), alts(j), alttypes(i), alttypes(j));
- j = j + 1
- }
- i = i + 1
- }
- case _ =>
- }
- }
-
- private def erasureConflict(type1: Type, type2: Type): boolean = type1 match {
- case Type$PolyType(_, restype1) =>
- erasureConflict(restype1, type2)
-
- case Type$MethodType(params1, restype1) =>
- type2 match {
- case Type$PolyType(_, restype2) =>
- erasureConflict(type1, restype2)
-
- case Type$MethodType(params2, restype2) =>
- if (params1.length != params2.length) return false;
- var i = 0; while (i < params1.length) {
- if (!params1(i).nextInfo().erasure().isSameAs(
- params2(i).nextInfo().erasure())) return false;
- i = i + 1
- }
- restype1.erasure().isSameAs(restype2.erasure())
-
- case _ =>
- false
- }
-
- case _ =>
- type2 match {
- case Type$PolyType(_, _) | Type$MethodType(_, _) =>
- erasureConflict(type2, type1);
- case _ =>
- true
- }
- }
-
- override def transform(templ: Tree$Template, sym: Symbol): Tree$Template =
- super.transform(templ, sym);
-
- override def transform(tree: Tree, sym: Symbol): Tree =
- super.transform(tree, sym);
-
- override def transform(trees: Array[Array[Tree$ValDef]], sym: Symbol): Array[Array[Tree$ValDef]] =
- super.transform(trees, sym);
-
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala b/sources/scala/tools/scalac/transformer/UnCurryPhase.scala
deleted file mode 100644
index 00843bb542..0000000000
--- a/sources/scala/tools/scalac/transformer/UnCurryPhase.scala
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global, _};
-import scalac.symtab._;
-
-package scala.tools.scalac.transformer {
-
-import scalac.util.NewArray;
-
-class UnCurryPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends Phase(global, descriptor) {
-
- import Modifiers._;
-
- /** Applies this phase to the given compilation unit. */
- override def apply(unit: CompilationUnit): Unit =
- new UnCurry(global, this).apply(unit);
-
- /** - return symbol's transformed type,
- * - if symbol is a def parameter with transformed type T, return () => T
- */
- override def transformInfo(sym: Symbol, tp0: Type): Type = {
- val tp1 = uncurry(tp0);
- if (sym.isDefParameter()) global.definitions.FUNCTION_TYPE(Type.EMPTY_ARRAY, tp1);
- else tp1
- }
-
- /** - (ps_1)...(ps_n)T ==> (ps_1,...,ps_n)T
- */
- def uncurry(tp: Type): Type = tp match {
- case Type$MethodType(params, tp1) =>
- uncurry(tp1) match {
- case Type$MethodType(params1, tp2) =>
- val newparams = new Array[Symbol](params.length + params1.length);
- System.arraycopy(params, 0, newparams, 0, params.length);
- System.arraycopy(params1, 0, newparams, params.length, params1.length);
- new Type.MethodType(newparams, tp2);
- case newtp1 =>
- if (newtp1 == tp1) tp;
- else new Type.MethodType(params, newtp1);
- }
- case Type$PolyType(tparams, tp1) =>
- uncurry(tp1) match {
- case newtp1 @ Type$MethodType(_, _) =>
- if (newtp1 == tp1) tp
- else new Type.PolyType(tparams, newtp1)
- case newtp1 =>
- val newtp2 = Type.MethodType(Symbol.EMPTY_ARRAY, newtp1);
- if (tparams.length == 0) newtp2;
- else Type.PolyType(tparams, newtp2)
- }
- case Type$OverloadedType(_, _) =>
- new Type$Map() {
- override def apply(t: Type) = uncurry(t)
- }.map(tp);
- case Type$ConstantType(base, _) =>
- base
- case Type$CompoundType(parents, scope) =>
- val symbol = tp.symbol();
- // todo: why not remove all inherited alternatives here?
- if (!symbol.isClass() || symbol.isCompoundSym()) tp
- else {
- val clone = new Scope();
- val it = scope.iterator();
- while (it.hasNext()) {
- val member = it.next();
- if (!isUnaccessedConstant(member) &&
- (!member.isCaseFactory() || member.isModule()))
- clone.enterOrOverload(member);
- }
- Type.compoundType(parents, clone, symbol)
- }
- case _ =>
- tp
- }
-
- def isUnaccessedConstant(symbol: Symbol): boolean =
- symbol.isTerm() &&
- (symbol.flags & ACCESSED) == 0 &&
- (symbol.getType() match {
- case Type$PolyType(params, Type$ConstantType(_, _)) =>
- params.length == 0
- case Type$ConstantType(_, _) =>
- true
- case _ =>
- false
- });
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/AlgebraicMatcher.scala b/sources/scala/tools/scalac/transformer/matching/AlgebraicMatcher.scala
deleted file mode 100644
index 4764e14fca..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/AlgebraicMatcher.scala
+++ /dev/null
@@ -1,189 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import java.io._;
-import java.util._;
-
-import scalac.{Global => scalac_Global};
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.util._; // Names
-
-import scala.tools.scalac.util.NewArray;
-import scalac.transformer.{ OwnerTransformer => scalac_transformer_OwnerTransformer };
-
-//import scalac.transformer.matching.PatternNode ;
-//import scalac.transformer.matching.SequenceMatcher ;
-//import PatternNode._ ;
-
-package scala.tools.scalac.transformer.matching {
-
- /** Matthias' algebraic pattern matcher, with some things factored out,
- * then translated to scala
- * @author Matthias Zenger, Burak Emir
- */
- class AlgebraicMatcher(unit: CompilationUnit) extends PatternMatcher(unit) {
-
-/*
-import scalac.*;
-import scalac.ast.*;
-import scalac.atree.AConstant;
-import scalac.symtab.*;
-
-import Tree.*;
-
-import scalac.util.Name ;
-import scalac.util.Names ;
-
-import java.util.Vector ;
-import java.util.Iterator ;
-*/
-
- var _m:PartialMatcher = _;
-
- this.delegateSequenceMatching = true;
- this.optimize = false;
-
- /** constructs an algebraic pattern matcher from cases
- */
- def construct(m: PartialMatcher, cases:Array[Tree]): Unit = {
- construct(m, cases, true);
- }
-
- /** constructs an algebraic pattern matcher from cases
- */
- def construct(m: PartialMatcher, cases: Array[Tree], doBinding: Boolean): Unit = {
- this._m = m;
- super.initialize( _m.selector, _m.owner, _m.resultType, doBinding );
- var i = 0; while (i < cases.length) {
- enter(cases(i)); //(CaseDef) cases[i], i);
- i = i + 1;
- }
- if (unit.global.log()) {
- unit.global.log("internal pattern matching structure");
- print();
- }
- _m.tree = toTree();
- }
-
-
- /** initializes this AlgebraicMatcher, see Matcher.initialize
- void initialize() {}
- */
- /*
- def isStarApply(tree: Tree.Apply): Boolean = {
- val params:Array[Symbol] = tree.fun.getType().valueParams();
- //System.err.println( tree.fun.type.resultType().symbol() );
- (tree.args.length == 1)
- && (tree.getType().symbol().flags & Modifiers.CASE) != 0
- && params.length > 0
- && (params(params.length-1).flags & Modifiers.REPEATED) != 0;
- }
-*/
-//////////// generator methods
-
- override def toTree(): Tree = {
- val ts = NewArray.Tree (
- gen.ValDef(root.symbol(), _m.selector),
- gen.ValDef(resultVar,
- gen.mkDefaultValue(_m.pos, resultVar.info()) ));
- val res = gen.If( super.toTree(root.and),
- gen.Ident( _m.pos, resultVar ),
- cf.ThrowMatchError( _m.pos, _m.resultType ));
- /*
- gen.If(
- _m.pos,
- toTree(root.and),
- gen.Ident( _m.pos, resultVar ),
- cf.ThrowMatchError( _m.resultType ));
- */
- gen.mkBlock(_m.pos, ts, res);
- }
-
- protected override def toTree(node: PatternNode, selector: Tree): Tree = {
- //System.err.println("AM.toTree called"+node);
- if (node == null)
- gen.mkBooleanLit(_m.pos, false);
- else node match {
- case SeqContainerPat( _, _ ) =>
- callSequenceMatcher( node,
- selector );
- case _ =>
- super.toTree( node, selector );
- }
- }
-
- /** collects all sequence patterns and returns the default
- */
- def collectSeqPats(node1: PatternNode, seqPatNodes: Vector, bodies: Vector): PatternNode = {
- var node = node1;
- var defaultNode: PatternNode = null;
- var exit = false;
- do {
- if( node == null )
- exit=true;//defaultNode = node; // break
- else
- node match {
- case SeqContainerPat( _, _ ) =>
- seqPatNodes.add( node );
- bodies.add( super.toTree( node.and ) );
- node = node.or;
- exit//defaultNode = node; // break;
-
- case _ =>
- defaultNode = node;
- }
- } while (!exit && (null == defaultNode)) ;
-
- defaultNode;
- }
-
- def callSequenceMatcher(node: PatternNode, selector: Tree): Tree = {
-
- //Console.println("calling sequent matcher for"+node);
- /* ???????????????????????? necessary to test whether is a Seq?
- gen.If(selector.pos, maybe cf.And( cf.Is(selector, seqpat.type()) )???)
- */
-
- // translate the _.and subtree of this SeqContainerPat
-
- val seqPatNodes = new Vector();
- val bodies = new Vector();
-
- var defaultNode = collectSeqPats(node, seqPatNodes, bodies);
-
- val defaultCase = toTree(defaultNode, selector);
-
- val wordRec = new SequenceMatcher(unit);
-
- val m = new PartialMatcher(_m.owner, selector, defs.boolean_TYPE());
-
- val pats = new Array[Tree](seqPatNodes.size());
- val body = new Array[Tree](seqPatNodes.size());
-
- val tmp = bodies.toArray();
- var j = 0;
- val it = seqPatNodes.iterator();
- while (it.hasNext()) {
- pats(j) = it.next().asInstanceOf[SeqContainerPat].seqpat;
- body(j) = tmp(j).asInstanceOf[Tree];
- j = j + 1;
- }
- //Tree defaultTree = toTree(node.or, selector); // cdef.body ;
-
- wordRec.construct(m, pats, body, defaultCase, doBinding);
-
- //_m.defs.addAll(m.defs);
-
- m.tree;
- }
-
- }
-
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/Autom2Scala.scala b/sources/scala/tools/scalac/transformer/matching/Autom2Scala.scala
deleted file mode 100644
index eac38280ae..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/Autom2Scala.scala
+++ /dev/null
@@ -1,207 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global};
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.util._; // Names
-
-import scalac.transformer.{ OwnerTransformer
- => scalac_transformer_OwnerTransformer };
-
-import Tree._;
-
-import java.util._ ;
-
-import scala.tools.util.Position;
-
-package scala.tools.scalac.transformer.matching {
-
- /** @param owner owner of the pattern matching expression
- */
- class Autom2Scala(val dfa: DetWordAutom, val elementType: Type, val owner: Symbol, val cf: CodeFactory) extends PatternTool(cf.unit) {
-
- protected var optimize = true;
-
- final val FAIL = -1;
-
- /** symbol of the matcher DefDef or Label */
- var funSym:Symbol = _;
-
- /** symbol of the iterator ( scala.SequenceIterator ) */
- var iterSym: Symbol = _;
-
- /** symbol of the switching result ( scala.Int ) */
- var resultSym: Symbol = _;
-
- /** symbol of the state variable ( scala.Int ) */
- var stateSym: Symbol = _;
-
- /** symbol of variable holding current label */
- var curSym: Symbol = _;
-
- /** symbol of boolean variable that indicates we have not reached end of sequence */
- var hasnSym: Symbol = _;
-
- val am = new AlgebraicMatcher( cf.unit );
-
- var pos: Int = Position.FIRSTPOS;
-
- def funRetType(): Type = {
- funSym.getType() match {
- case Type.MethodType( _, retType )=>
- retType;
- case _ => throw new RuntimeException();
- }
- }
-
- def callFun(args: Array[Tree]): Tree = {
- gen.mkApply_V(gen.Ident(pos, funSym), args);
- }
-
- // overridden in RightTracerInScala
- def loadCurrentElem(body: Tree): Tree = {
- gen.mkBlock( Predef.Array[Tree] (
- cf.gen.ValDef(this.hasnSym,
- cf._hasNext( _iter() ) ),
- cf.gen.ValDef(this.curSym,
- gen.If(gen.Ident( pos, hasnSym ),
- cf._next( _iter() ),
- gen.mkDefaultValue(cf.pos,curSym.getType())))
- ),
- body );
- }
-
- /** bug ?? */
- def currentElem() = { gen.Ident( cf.pos, curSym ).setType( curSym.getType() ); }
-
- def currentMatches(label: Label): Tree = {
- label match {
- case TreeLabel( pat ) =>
- _cur_match( pat );
- case SimpleLabel(lit: Tree.Literal) =>
- cf.Equals( currentElem(), lit );
- case _ => // cannot happen
- throw new ApplicationError("expected either algebraic or simple label:"+label);
- }
- }
-
- //
- // translation of automata to scala code
- //
-
-
- /** `[switchResult]' */
- def _swres(): Tree = { gen.Ident( pos, resultSym );}
-
- /** `<state>' param */
- def _state(): Tree = { gen.Ident( pos, stateSym ); }
-
- /** `<iterator>' param */
- def _iter(): Tree = { gen.Ident( pos, iterSym ); }
-
- /** simple optimization: if we are in a sink state, stop traversing sequence
- */
- def stateWrap(i: Int): Tree = {
- if( dfa.isSink( i ))
- run_finished( i ); // state won't change! optimization
- else
- gen.If( cf.Negate( gen.Ident( pos, hasnSym )),
- run_finished( i ),
- code_state_NEW( i ));
- }
-
- /** body of the matcherDefFun
- */
- def code_body_NEW(): Tree = {
- val tags = new Array[Int](dfa.nstates());
- val bodies = new Array[Tree](dfa.nstates());
- var i = 0; while (i < dfa.nstates()) {
- tags( i ) = i;
- bodies( i ) = stateWrap( i );
- i = i + 1;
- }
- //if( optimize )
- loadCurrentElem( gen.Switch( _state(),
- tags,
- bodies,
- code_error(), // cannot happen
- funRetType()));
- /*
- Tree res = code_error();
- for( int i = dfa.nstates-2; i>= 0; i-- )
- res = gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, i )),
- bodies[ i ] ,
- res );
-
- return loadCurrentElem( res );
- */
- }
-
- /* calling the (AlgebraicMatcher)PatternMatcher here */
- def _cur_match(pat: Tree): Tree = {
- val m = new PartialMatcher( this.funSym, /* owner*/
- currentElem(), /* root */
- cf.defs.boolean_TYPE() /* restype */);
-
- am.construct( m, Predef.Array[Tree] (
- cf.gen.CaseDef( pat,
- gen.mkBooleanLit( pat.pos, true )),
- cf.gen.CaseDef( cf.gen.Ident(pat.pos, cf.defs.PATTERN_WILDCARD),
- gen.mkBooleanLit( pat.pos, false )) ),
- false);
- am.toTree();
- }
-
- // @todo should be abstract
- def code_delta( i:Int, label: Label): Tree = {
- throw new RuntimeException();
- }
-
- /** some error happened which is due to bug in translation/automaton
- */
- final def code_error(): Tree = {
- cf.ThrowMatchError( pos, funRetType() );
- }
-
- def code_fail(): Tree = {
- gen.mkIntLit(Position.FIRSTPOS, FAIL );
- }
-
- /** code for the return value of the automaton translation
- */
- def run_finished(state: Int): Tree = {
- if( dfa.isFinal( state ))
- gen.mkIntLit(Position.FIRSTPOS, dfa.finals.get( new Integer( state ) ).asInstanceOf[Integer].intValue() );
- else
- gen.mkIntLit( Position.FIRSTPOS, FAIL );
- }
-
- def code_state_NEW(i: Int): Tree = {
- var stateBody = code_delta( i, DefaultLabel() );
- if( stateBody == null )
- stateBody = code_fail();
- val trans = dfa.deltaq( i );
-
- val labs = dfa.labels().iterator();
- while(labs.hasNext()) {
- val label = labs.next();
- val next = trans.get( label ).asInstanceOf[Integer];
- val action = code_delta( i, label.asInstanceOf[Label] );
- if( action != null ) {
- /*assert*/ //stateBody != null : "stateBody is null";
- stateBody = gen.If( currentMatches(label.asInstanceOf[Label] ),
- action,
- stateBody);
- }
- }
- stateBody;
- }
- }
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/BerrySethi.scala b/sources/scala/tools/scalac/transformer/matching/BerrySethi.scala
deleted file mode 100644
index d0515adab9..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/BerrySethi.scala
+++ /dev/null
@@ -1,669 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-import scalac.CompilationUnit;
-import scalac.ApplicationError;
-import scalac.ast.Tree;
-import scalac.ast.TreeInfo;
-import scalac.util.Name;
-import Tree._;
-
-import java.util._;
-
-//import scala.compiler.printer.XMLAutomPrinter;
-
-/** a Berry-Sethi style construction for nfas.
- * this class plays is the "Builder" for the "Director" class WordRecognizer.
- */
-package scala.tools.scalac.transformer.matching {
-
-class BerrySethi(val unit: CompilationUnit ) {
-
- def isStar(n: Name): boolean = {
- TreeInfo.isNameOfStarPattern(n);
- }
- /*
-
- String s = n.toString();
- return (s.indexOf("$") != -1)
- &&(!s.startsWith("nest"));
- }
- */
-
- var labels: HashSet = _;
-
- var pos: int = _;
- // maps a literal pattern to an Integer ( the position )
- // is not *really* needed (postfix order determines position!)
- var posMap: HashMap = _; // pos: Patterns -> Positions
- // don't let this fool you, only labelAt is a real, surjective mapping
- var labelAt: HashMap= _; // chi: Positions -> Obj
-
- var globalFirst: TreeSet= _;
-
- // results which hold all info for the NondetWordAutomaton
-
- var follow: HashMap= _; // follow: Positions -> Set[Positions]
-
-
- // Unit test ?
- def nullable(pat: Tree): Boolean = {
- //System.out.print("<nullable>");
- //DEBUG.print( pat );
- //System.out.println("</nullable>");
- pat match {
- case Apply(_, _) =>
- return false;
-
- case Sequence( trees ) =>
- return (trees.length == 0) || nullable(trees);
- //case Subsequence(Tree[] trees):
- //return
- case Bind(n, t) =>
- /*
- if (isStar(n)) // generated for star/plus(?)
- return true;
- */
- return nullable( t );
- case Alternative(choices) =>
- var result = false;
- var i = 0;
- while(i < choices.length && !result) {
- result = result || nullable(choices(i));
- i = i + 1
- }
- return result;
- case _ =>
- return false;
- }
- }
-
-
- /** returns true if a Sequence pattern matches the empty sequence
- * @param pat the sequence pattern.
- */
- def nullableSequence(pat: Tree): Boolean = {
- pat match {
- case Sequence(pats) =>
- return nullable(pats);
- }
- return false;
- }
-
- /** returns true if a sequence of patterns (usually children of a
- * sequence or subsequence node) is nullable.
- * @param pats the sequence of patterns
- */
- def nullable(pats: Array[Tree]): Boolean = {
- var result = true;
- var i = 0;
- while(i < pats.length && result){
- result = result && nullable( pats( i ) );
- i = i + 1
- }
- return result;
- }
-
- /** computes first( alpha ) where alpha is a word regexp
- */
-
- def compFirst( pat:Tree ): TreeSet = {
- //System.out.print("<compFirst>");
- //DEBUG.print( pat );
- //System.out.println("</compFirst>");
- pat match {
- case Sequence( trees ) =>
- return compFirst( trees );
- case Typed(_,_) | Select(_,_) | Apply(_, _) =>
- val tmp = new TreeSet();
- tmp.add( posMap.get( pat ).asInstanceOf[Integer]); // singleton set
- return tmp;
-
- case Literal( _ ) =>
- val tmp = new TreeSet();
- tmp.add( posMap.get( pat ).asInstanceOf[Integer]); // singleton set
- return tmp;
- //case Subsequence( Tree[] trees ) =>
- //return compFirst( trees );
- case Alternative( trees ) =>
- val tmp = new TreeSet();
- var i = 0;
- while(i < trees.length) {
- tmp.addAll( compFirst( trees( i ) ));
- i = i + 1
- }
- return tmp;
-
- case Bind(_, tree) =>
- return compFirst(tree);
-
- case Ident( name ) =>
- //if (name != Name.fromString("_"))
- // throw new ApplicationError("unexpected pattern");
- val tmp = new TreeSet();
- tmp.add( posMap.get( pat ).asInstanceOf[Integer]); // singleton set
- return tmp;
-
- case _ =>
- throw new ApplicationError("unexpected pattern");
- }
- }
-
-
-
- /** computes last( alpha ) where alpha is a word regexp
- */
- def compLast(pat: Tree): TreeSet = {
- //System.out.print("<last>");
- //DEBUG.print( pat );
- //System.out.println("</compLast>");
- pat match {
- case Sequence( _ ) | Apply(_, _) =>
- val tmp = new TreeSet();
- tmp.add(posMap.get( pat ).asInstanceOf[Integer]); // singleton set
- return tmp;
-
- case Literal( _ ) =>
- val tmp = new TreeSet();
- tmp.add( posMap.get( pat ).asInstanceOf[Integer]); // singleton set
- return tmp;
-
- case Alternative( trees ) =>
- val tmp = new TreeSet();
- var i = 0;
- while(i < trees.length) {
- tmp.addAll( compLast( trees ));
- i = i + 1
- }
- return tmp;
-
- case Bind( _, tree ) =>
- return compLast( tree );
-
- case _ =>
- throw new ApplicationError("unexpected pattern");
- }
- }
-
-
- /** computes first(w) where w=alpha_1...alpha_n are successors of a
- * sequence node
- */
- def compFirst( pats:Array[Tree] ): TreeSet = {
- if( pats.length == 0 )
- return new TreeSet();
-
- var i = 0;
- var tmp = pats( i );
- val result = compFirst( tmp );
- i = i + 1;
- while( nullable(tmp) && (i < pats.length )) {
- tmp = pats( i );
- result.addAll( compFirst( tmp ));
- i = i + 1;
- }
- return result;
- }
-
- // Unit test ?
-
- /** computes last(w) where w are successors of a sequence node
- */
- def compLast(pats: Array[Tree]): TreeSet = {
- /*
- System.out.print("<last>");
- for( int k = 0; k<pats.length; k++) {
- DEBUG.print( pats[k] );
- System.out.print(" ");
- }
- System.out.println();
- */
- if( pats.length == 0 )
- return new TreeSet();
-
- var i = pats.length - 1;
- var tmp = pats( i );
- val result = compLast( tmp );
- i = i - 1;
- while( nullable(tmp) && (i >= 0 )) {
- tmp = pats( i );
- result.addAll( compLast( tmp ));
- i = i + 1;
- }
- return result;
- }
-
- // starts from the right-to-left
- // precondition: pos is final
- // pats are successor patterns of a Sequence node
- // returns first-set (== follow set of initial state)
- def compFollow(pats: Array[Tree]): TreeSet = {
- var first:TreeSet = null;
- this.recVars = new HashMap();
- var fol = new TreeSet();
- if( pats.length > 0 ) {//non-empty expr
- var i = pats.length;
- fol.add( new Integer( pos )); // don't modify pos !
- do {
- i = i - 1;
- first = compFollow1( fol, pats( i ) );
- if( nullable( pats( i ) ))
- fol.addAll( first );
- else
- fol = first;
- //System.out.println("in compFollow: first"+first);
- //System.out.println("in compFollow: fol"+fol);
-
- } while( i > 0 );
- }
- this.follow.put(new Integer( 0 ), fol);
- return fol;
- }
-
- var recVars: HashMap = _;
-
- /** returns the first set of an expression, setting the follow set along
- * the way
- */
- def compFollow1( fol1:TreeSet , pat:Tree ): TreeSet = {
- var fol = fol1;
- //System.out.println("compFollow1("+fol+","+pat+")");
- pat match {
- case Sequence( trees ) =>
- var first: TreeSet = null;
- var i = trees.length;
- if( i > 0 ) { // is nonempty
- do {
- i = i - 1;
- first = compFollow1(fol, trees( i ));
- if( nullable( trees( i ) ))
- fol.addAll( first );
- else
- fol = first;
- } while( i > 0 ) ;
- }
- if( null == first ) first = new TreeSet();
- return first;
-
- case Alternative( choices ) =>
- val first = new TreeSet();
- var i = choices.length - 1;
- while(i >= 0) {
- first.addAll( compFollow1( fol, choices( i ) ));
- i = i - 1;
- }
- return first;
-
- case Bind( n, t ) => // == can also be star
-
- val first = compFirst( t );
- //System.out.print("BIND" + first);
- recVars.put( pat.symbol(), first );
-
- // if( appearsRightmost( n, t ))
- // follow = oldfollw + ownfirst
- if( isStar( n ) )
- fol.addAll( first ); // an iterated pattern
-
- // continue to compute follow sets with adjusted fol
- return compFollow1( fol, t );
-
- case Ident( n ) =>
- if ((pat.symbol() != null )
- && pat.symbol().isPrimaryConstructor()) {
- // same as Apply
- val pos = this.posMap.get( pat ).asInstanceOf[Integer];
- val tset = fol.clone().asInstanceOf[TreeSet];
- this.follow.put( pos, tset );
- val first = new TreeSet();
- first.add( pos );
- return first;
- }
-
- if ( recVars.keySet().contains( pat.symbol() )) { // grammar
- val first = recVars.get( pat.symbol() ).asInstanceOf[TreeSet];
- val follow = fol.clone().asInstanceOf[TreeSet];
- first.addAll( follow );
- //recVars.put//this.follow.put( pat.symbol(), follow );
- return first;
- }
-
- // --- --- only happens when called from BindingBerrySethi
- // [... x ...] changed to [... x@_ ...]
-
- // non-generated, non-recursive variable should not appear,
- // so this is a wildcard pattern _
-
- val pos = this.posMap.get( pat ).asInstanceOf[Integer];
- val tset = fol.clone().asInstanceOf[TreeSet];
- this.follow.put( pos, tset );
- val first = new TreeSet();
- first.add( pos );
- //System.out.println("Ident("+n+",...) first:"+first);
- //System.out.println("Ident("+n+",...) follow:"+tset);
- return first;
-
- case Apply(_, _) | Literal( _ ) | Typed(_,_) | Select(_,_) =>
- val pos = this.posMap.get( pat ).asInstanceOf[Integer];
- val tset = fol.clone().asInstanceOf[TreeSet];
- this.follow.put( pos, tset );
- val first = new TreeSet();
- first.add( pos );
- return first;
-
- case _ =>
- throw new ApplicationError("unexpected pattern: "+pat.getClass());
- }
- }
-
- /** called at the leaves of the regexp
- */
- def seenLabel( pat:Tree , i:Integer , label:Label ): Unit = {
- this.posMap.put( pat, i );
- this.labelAt.put( i, label );
- if( label != DefaultLabel() ) {
- /*
- if( this.labels.contains( label ) ) {
- switch(label) {
- case TreeLabel(Apply(_, Tree[] args)) =>
- if( args.length > 0 ) {
- unit.warning(pat.pos, "if this pattern in nondeterminism, it will not compile correctly");
- }
- }
- }
- */
- this.labels.add( label );
- }
-
- }
-
- /** overriden in BindingBerrySethi
- */
- def seenLabel( pat:Tree , label:Label ): Unit = {
- seenLabel( pat, new Integer( {pos = pos + 1; pos} ), label );
- }
-
- /** returns "Sethi-length" of a pattern, creating the set of position
- * along the way
- */
-
- var activeBinders:Vector = _;
-
- // todo: replace global variable pos with acc
- def traverse( pat:Tree ): Unit = {
- pat match {
-
- // (is tree automaton stuff, more than Berry-Sethi)
- case Apply( _, _ ) | Typed( _, _ )| Select( _, _ ) =>
- val label = new TreeLabel( pat );
- seenLabel( pat, label ) ;
- return ;
-
- case p @ Literal( _ ) =>
- val label = new SimpleLabel( p );
- seenLabel( pat, label ) ;
-
- return ;
-
- case Sequence( trees ) =>
- var i = 0;
- while(i < trees.length) {
- traverse( trees( i ) );
- i = i + 1
- }
- return ;
-
- case Alternative( trees ) =>
- var i = 0;
- while(i < trees.length) {
- traverse( trees( i ) );
- i = i + 1
- }
- return ;
-
- case Bind( name, body) =>
- recVars.put( pat.symbol(), java.lang.Boolean.TRUE );
- if( !isStar( name ) ) {
- activeBinders.add( pat.symbol() );
- traverse( body );
- activeBinders.remove( pat.symbol() );
- }
- else
- traverse( body );
- return ;
-
- case Ident(name) =>
- if ((pat.symbol() != null )
- && pat.symbol().isPrimaryConstructor()) {
- // same as Apply
- val label = new TreeLabel( pat );
- seenLabel( pat, label ) ;
-
- return ;
- }
-
-
- if( null != recVars.get( pat.symbol() ) ) {
- return ;
- }
- // _ and variable x ( == x @ _ )
- val label = DefaultLabel();
- seenLabel( pat, label );
-
- return ;
-
- }
- }
-
-
- var finals: TreeMap = _; // final states
-
- //TreeSet initialsRev; // final states
-
- var deltaq:Array[HashMap] = _; // delta
-
-
-
- var defaultq: Array[Vector] = _; // default transitions
-
-
- //HashMap deltaqRev[]; // delta of Rev
- //Vector defaultqRev[]; // default transitions of Rev
-
-
- def makeTransition(srcI:Integer, destI:Integer, label: Label): Unit = {
- var src = srcI.intValue() ;
- var dest = destI.intValue() ;
- var arrows: Vector = _; //, revArrows;
- //Label revLabel = new Pair( srcI, label );
- label match {
- case DefaultLabel() =>
- arrows = defaultq( src );
- //revArrows = defaultqRev[ dest ];
- case _ =>
- arrows = deltaq( src ).get( label ).asInstanceOf[Vector];
- if( arrows == null )
- deltaq( src ).put( label,
- {arrows = new Vector(); arrows} );
- /*
- revArrows = (Vector) deltaqRev[ dest ].get( revLabel );
- if( revArrows == null )
- deltaqRev[ dest ].put( revLabel,
- revArrows = new Vector() );
- */
- }
- arrows.add( destI );
- //revArrows.add( srcI );
- }
-
-
- var initials: TreeSet = _;
- //NondetWordAutom revNfa ;
-
- def initialize( subexpr:Array[Tree] ): Unit = {
- this.posMap = new HashMap();
- this.labelAt = new HashMap();
-
-
- this.follow = new HashMap();
- this.labels = new HashSet();
- this.recVars = new HashMap();
- this.pos = 0;
- // determine "Sethi-length" of the regexp
- activeBinders = new Vector();
- var i = 0;
- while(i < subexpr.length ) {
- traverse( subexpr( i ));
- //assert ( activeBinders.isEmpty() )
- i = i + 1;
- }
-
- this.initials = new TreeSet();
- initials.add( new Integer( 0 ));
-
- }
-
- def initializeAutom(): Unit = {
-
- finals = new TreeMap(); // final states
- deltaq = new Array[HashMap]( pos ); // delta
- defaultq = new Array[Vector]( pos ); // default transitions
-
- var j = 0;
- while(j < pos) {
- deltaq( j ) = new HashMap();
- defaultq( j ) = new Vector();
- j = j + 1;
- }
- }
-
- def collectTransitions(): Unit = { // make transitions
- var j = 0;
- while(j < pos) {
- val q = new Integer( j );
-
- //System.out.print( "--q="+q );
- //System.out.println(" labelAt:"+labelAt.get( q ));
-
- val fol = this.follow.get( q ).asInstanceOf[TreeSet];
- //assert fol != null;
- val it = fol.iterator();
- while(it.hasNext()) {
- val p = it.next().asInstanceOf[Integer];
- //System.out.println( "-- -- p="+p );
- if( p.intValue() == pos ) {
- finals.put( q, finalTag );
- } else {
- makeTransition( new Integer(j), p,
- labelAt.get( p ).asInstanceOf[Label]);
- }
- }
- j = j + 1
- }
- }
-
- var finalTag: Integer = _;
-
- def automatonFrom(pat: Tree , finalTag: Integer): NondetWordAutom = {
-
- this.finalTag = finalTag;
-
- //System.out.println( "enter automatonFrom("+pat+","+finalTag+")"); // UNIT TEST
- //System.out.println( pat );
- //System.out.println( nullableSequence( pat )); // UNIT TEST
- pat match {
- case Sequence( subexpr ) =>
- initialize( subexpr );
-
-
- // (1) compute first
-
- //globalFirst = compFirst( subexpr );
- //System.out.println(globalFirst);
-
- // (2) compute follow;
- pos = pos + 1;
- //Set ignore = compFollow( subexpr );
- //System.out.println(ignore);
- //System.exit(0);
- //assert (ignore.equals( globalFirst ));
-
- globalFirst = compFollow( subexpr );
-
- //System.out.print("someFirst:");debugPrint(someFirst);
-
- // construct the automaton's explicit representation
-
- initializeAutom();
-
-
- // defaultqRev = new Vector[pos]; // default transitions
-
- collectTransitions();
-
- if (nullable(subexpr)) // initial state is final
- finals.put(new Integer(0), finalTag);
-
- //TreeSet initials = new TreeSet();
- //initials.add(new Integer(0));
-
- val result =
- new NondetWordAutom(pos, // = nstates
- labels,
- initials,
- finals,
- deltaq,
- defaultq,
- null/*(Object) qbinders*/);
-
- /*
- System.out.println("inBerrySethi");
- XMLAutomPrinter pr = new XMLAutomPrinter( System.out );
- pr.begin();
- pr.print(result);
- pr.print(revNfa);
- pr.end();
- System.out.println("initialsRev = "+initialsRev);
- System.out.println("outBerrySethi");
- */
- //System.exit(0);
- //result.print();
- return result;
- }
-
- throw new ApplicationError("expected a sequence pattern");
- }
-
- def print1(): Unit = {
- Console.println("after sethi-style processing");
- Console.println("#positions:" + pos);
- Console.println("posMap:");
-
- var it = this.posMap.keySet().iterator();
- while(it.hasNext()) {
- val t = it.next().asInstanceOf[Tree];
- t match {
- case Literal( _ ) =>
- Console.print( "(" + t.toString() + " -> ");
- val s2 = (posMap.get(t).asInstanceOf[Integer]).toString();
- Console.print( s2 +") ");
- }
- }
- Console.println("\nfollow: ");
- var j = 1;
- while(j < pos ) {
- val fol = this.follow.get(new Integer(j)).asInstanceOf[TreeSet];
- Console.print("("+j+" -> "+fol.toString()+") ");
- //debugPrint( fol );
- Console.println;
- j = j + 1;
- }
-
- }
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/BindingBerrySethi.scala b/sources/scala/tools/scalac/transformer/matching/BindingBerrySethi.scala
deleted file mode 100644
index b3e0cdb716..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/BindingBerrySethi.scala
+++ /dev/null
@@ -1,177 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-import scalac.CompilationUnit;
-import scalac.Global ;
-import scalac.ApplicationError ;
-import scalac.ast.Tree ;
-import scalac.util.Name ;
-import scalac.util.Names ;
-import Tree._ ;
-
-import java.util._ ;
-
-//import scala.compiler.printer.XMLTreePrinter ;
-//import scala.compiler.printer.XMLAutomPrinter ;
-
-package scala.tools.scalac.transformer.matching {
-/** a Berry-Sethi style construction for nfas.
- * this class plays is the "Builder" for the "Director" class
- * WordRecognizer.
- */
-
-class BindingBerrySethi(unit:CompilationUnit) extends BerrySethi(unit) {
-
- // variables
-
- var deltaqRev : Array[HashMap] = _; // delta of Rev
- var defaultqRev: Array[Vector] = _; // default transitions of Rev
- var qbinders : Array[Vector] = _; // transitions <-> variables
- var revnfa : NondetWordAutom = _ ;
- var varAt : HashMap = _; // chi: Positions -> Vars (Symbol)
-
- override def makeTransition(srcI: Integer, destI: Integer, label: Label): Unit = {
- val src = srcI.intValue() ;
- val dest = destI.intValue() ;
- var arrows: Vector = _;
- var revArrows: Vector = _;
- val revLabel = new LPair(srcI, label);
- label match {
- case DefaultLabel() =>
- arrows = defaultq(src);
- revArrows = defaultqRev(dest);
-
- case _ =>
- arrows = deltaq(src).get(label).asInstanceOf[Vector];
- if (arrows == null)
- deltaq(src).put(label,
- {arrows = new Vector(); arrows} );
- revArrows = deltaqRev(dest).get(revLabel).asInstanceOf[Vector];
- if (revArrows == null)
- deltaqRev(dest).put(revLabel, {revArrows = new Vector(); revArrows} );
- }
- arrows.add(destI);
- revArrows.add(srcI);
- }
-
- override def seenLabel(pat: Tree, label: Label): Unit = {
- var i = new Integer({pos = pos + 1; pos} );
- seenLabel( pat, i, label );
- pat match {
- case Apply(_, _) | Literal( _ ) | Select(_, _) | Typed(_,_) =>
- this.varAt.put( i, activeBinders.clone() ); // below @ ?
-
- case Ident( name ) =>
- //assert ( pat.symbol() == Global.instance.definitions.PATTERN_WILDCARD )||( name.toString().indexOf("$") > -1 ) : "found variable label "+name;
-
- val binders = activeBinders.clone().asInstanceOf[Vector];
- /*
- if( pat.symbol() != Global.instance.definitions.PATTERN_WILDCARD) {
- binders.add( pat.symbol() );
- }
- */
- this.varAt.put( i, binders );
- }
- }
-
- override def initialize( pats:Array[Tree] ): Unit = {
- this.varAt = new HashMap(); // Xperiment
- super.initialize( pats );
- }
-
- override def initializeAutom(): Unit = {
- super.initializeAutom();
- deltaqRev = new Array[HashMap](pos); // deltaRev
- defaultqRev = new Array[Vector](pos); // default transitions
- qbinders = new Array[Vector](pos); // transitions <-> variables
-
- var j = 0;
- while (j < pos) {
- deltaqRev(j) = new HashMap();
- defaultqRev(j) = new Vector();
- qbinders(j) = varAt.get(new Integer(j)).asInstanceOf[Vector];
- j = j + 1;
- }
- varAt.clear(); // clean up
- }
-
-
- override def automatonFrom(pat: Tree, finalTag: Integer): NondetWordAutom = {
- this.finalTag = finalTag ;
- //System.out.println("enter automatonFrom("+ pat +")");
- pat match {
- case Sequence(subexpr) =>
-
- initialize(subexpr);
-
- // (1) compute first + follow;
- pos = pos + 1;
-
- globalFirst = compFollow( subexpr );
-
-
-
- initializeAutom(); // explicit representation
-
- collectTransitions();
-
- val result =
- new NondetWordAutom(pos, // = nstates
- labels,
- initials,
- finals,
- deltaq,
- defaultq,
- qbinders);
-
- result.leftTrans = true;
-
- val revInitials = new TreeSet(finals.keySet());
- /*
- pos++; // adding a state
- HashSet deltaqRev2[] = new HashSet[ deltaqRev.length + 1];
- HashSet defaultqRev2[] = new HashSet[ deltaqRev.length + 1];
- HashSet qbinders[] = new HashSet[ deltaqRev.length + 1];
- for (Iterator it = finals.keySet().iterator(); it.hasNext(); ) {
-
- }
- */
- val revFinals = new TreeMap();
- var it = initials.iterator();
- while(it.hasNext()) {
- revFinals.put(it.next(), finalTag);
- }
- revnfa = new NondetWordAutom(pos,
- labels,
- revInitials,
- revFinals,
- deltaqRev,
- defaultqRev,
- qbinders);
-
- revnfa.rightTrans = true;
-
- /*
- System.out.println("inBerrySethi");
- XMLAutomPrinter pr = new XMLAutomPrinter(System.out);
- pr.begin();
- pr.print(result);
- pr.print(revnfa);
- pr.end();
- System.out.println("initialsRev = " + initialsRev);
- System.out.println("outBerrySethi");
- */
- //System.exit(0);
- return result; //print();
- }
- }
-
-}
-
-}
-
diff --git a/sources/scala/tools/scalac/transformer/matching/CaseEnv.scala b/sources/scala/tools/scalac/transformer/matching/CaseEnv.scala
deleted file mode 100644
index 2d3a283dac..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/CaseEnv.scala
+++ /dev/null
@@ -1,73 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import scalac._;
-import scalac.ast._;
-import scalac.util._;
-import scalac.symtab._;
-import Tree.ValDef;
-
-package scala.tools.scalac.transformer.matching {
-
-/** the environment for a body of a case
- * @param owner the owner of the variables created here
- */
-class CaseEnv(val owner:Symbol, unit:CompilationUnit) {
-
- private var boundVars:scala.Array[ValDef] = new Array[ValDef](4);
- private var numVars = 0;
-
- /** substitutes a symbol on the right hand side of a ValDef
- */
- def substitute(oldSym: Symbol, newInit: Tree): Unit = {
- var i = 0; while( i < numVars) {
- if( boundVars(i).rhs.symbol() == oldSym ) {
- boundVars(i).rhs = newInit;
- return;
- }
- i = i + 1;
- }
- }
-
- def newBoundVar(sym:Symbol, tpe: Type, init:Tree ): Unit = {
- sym.setOwner( owner ); // FIXME should be corrected earlier
- if (numVars == boundVars.length) {
- val newVars = new Array[ValDef](numVars * 2);
- System.arraycopy(boundVars, 0, newVars, 0, numVars);
- this.boundVars = newVars;
- }
- sym.setType(tpe);
- this.boundVars(numVars) = unit.global.treeGen.ValDef(sym, init.duplicate());
- numVars = numVars + 1;
- }
-
- def getBoundVars(): Array[ValDef] = {
- val newVars = new Array[ValDef](numVars);
- System.arraycopy(boundVars, 0, newVars, 0, numVars);
- return newVars;
- }
-
- override def equals(obj: Any): Boolean = {
- if (!(obj.isInstanceOf[CaseEnv]))
- return false;
- val env = obj.asInstanceOf[CaseEnv];
- if (env.numVars != numVars)
- return false;
- var i = 0; while(i < numVars) {
- if ((boundVars(i).name != env.boundVars(i).name) ||
- !boundVars(i).tpe.getType().isSameAs(env.boundVars(i).tpe.getType()) ||
- (boundVars(i).rhs != env.boundVars(i).rhs))
- return false;
- i = i + 1;
- }
- return true;
- }
-
-} // class CaseEnv
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/CodeFactory.scala b/sources/scala/tools/scalac/transformer/matching/CodeFactory.scala
deleted file mode 100644
index 70df601f3a..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/CodeFactory.scala
+++ /dev/null
@@ -1,287 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import scala.tools.util.Position;
-
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant._;
-import scalac.util._;
-import scalac.symtab._;
-//import PatternNode._;
-import Tree._;
-package scala.tools.scalac.transformer.matching {
-
-class CodeFactory(val unit: CompilationUnit, pos1: Int) extends PatternTool(unit) {
-
- var pos = pos1;
-
- // --------- these are new
-
- /** a faked switch statement
- */
- def Switch(condition: Array[Tree], body: Array[Tree], defaultBody: Tree): Tree = {
- //assert condition != null:"cond is null";
- //assert body != null:"body is null";
- //assert defaultBody != null:"defaultBody is null";
- var result = defaultBody;
-
- var i = condition.length-1;
- while (i >= 0) {
- result = gen.If(condition(i), body(i), result);
- i = i - 1
- }
-
- return result ;
- }
-
- /** returns `List[ Tuple2[ scala.Int, <elemType> ] ]' */
- def SeqTraceType( elemType: Type ): Type = {
- defs.LIST_TYPE(pairType(defs.int_TYPE(), elemType));
- }
-
- /** returns `Iterator[ elemType ]' */
- def _seqIterType( elemType: Type ): Type = {
- defs.ITERATOR_TYPE(elemType);
- }
-
- /** returns `<seqObj.elements>' */
- def newIterator( seqObj:Tree , elemType:Type ): Tree = {
- gen.mkApply__(gen.Select(seqObj, defs.ITERABLE_ELEMENTS()));
- }
-
- /** returns code `<seqObj>.elements'
- * the parameter needs to have type attribute `Sequence[<elemType>]'
- */
- def newIterator( seqObj:Tree ): Tree = {
- newIterator( seqObj, getElemType_Sequence( seqObj.getType() ));
- }
-
- // EXPERIMENTAL
- def newRef(init: Tree): Tree = {
- //System.out.println( "hello:"+refSym().type() );
- gen.New( gen.mkApplyTV( gen.mkPrimaryConstructorGlobalRef( pos, defs.REF_CLASS),
- Predef.Array[Type] ( init.getType() ),
- Predef.Array[Tree] ( init ) ));
- }
-
- /** returns A for T <: Sequence[ A ]
- */
- def getElemType_Sequence( tpe: Type): Type = {
- //System.err.println("getElemType_Sequence("+tpe.widen()+")");
- val tpe1 = tpe.widen().baseType( defs.SEQ_CLASS );
-
- if( tpe1 == Type.NoType )
- throw new ApplicationError("arg "+tpe+" not subtype of Seq[ A ]");
-
- return tpe1.typeArgs()( 0 );
- }
-
- /** returns A for T <: Iterator[ A ]
- */
- def getElemType_Iterator( tpe: Type ): Type = {
- //System.err.println("getElemType_Iterator("+tpe+")");
-
- val tpe1 = tpe.widen().baseType( defs.ITERATOR_CLASS );
-
- tpe1 match {
- case Type.TypeRef(_,_,args) =>
- return args( 0 );
- case _ =>
- throw new ApplicationError("arg "+tpe+" not subtype of Iterator[ A ]");
- }
-
- }
-
- /** `it.next()'
- */
- def _next( iter: Tree ): Tree = {
- gen.mkApply__(gen.Select(iter, defs.ITERATOR_NEXT()));
- }
-
- /** `it.hasNext()'
- */
- def _hasNext( iter: Tree ): Tree = {
- gen.mkApply__(gen.Select(iter, defs.ITERATOR_HASNEXT()));
- }
-
- /** `!it.hasCur()'
- */
- def _not_hasNext( iter:Tree ): Tree = {
- gen.mkApply__(gen.Select(_hasNext(iter), defs.BOOLEAN_NOT()));
- }
-
- /** `trace.isEmpty'
- */
- def isEmpty( iter: Tree ): Tree = {
- gen.mkApply__(gen.Select(iter, defs.LIST_ISEMPTY()));
- }
-
- def SeqTrace_headElem( arg: Tree ): Tree = { // REMOVE SeqTrace
- val t = gen.mkApply__(gen.Select(arg, defs.LIST_HEAD()));
- gen.mkApply__(gen.Select(t, defs.TUPLE_FIELD(2, 2)));
- }
-
- def SeqTrace_headState( arg: Tree ): Tree = { // REMOVE SeqTrace
- val t = gen.mkApply__(gen.Select(arg, defs.LIST_HEAD()));
- gen.mkApply__(gen.Select(t, defs.TUPLE_FIELD(2, 1)));
-
- }
-
- def SeqTrace_tail( arg: Tree ): Tree = { // REMOVE SeqTrace
- gen.mkApply__(gen.Select(arg, defs.LIST_TAIL()));
- }
-
- /** `<seqlist>.head()'
- */
- def SeqList_head( arg: Tree ): Tree = {
- gen.mkApply__(gen.Select(arg, defs.LIST_HEAD()));
- }
-
- def Negate(tree: Tree): Tree = {
- tree match {
- case Literal(BOOLEAN(value))=>
- gen.mkBooleanLit(tree.pos, !value);
- case _ =>
- gen.mkApply__(gen.Select(tree, defs.BOOLEAN_NOT()));
- }
- }
-
- /*protected*/ def And(left: Tree, right: Tree): Tree = {
- left match {
- case Literal(BOOLEAN(value)) =>
- return if(value) right else left;
- case _ =>
- }
- right match {
- case Literal(BOOLEAN(value)) =>
- if (value) return left;
- case _ =>
- }
- gen.mkApply_V(gen.Select(left, defs.BOOLEAN_AND()), Predef.Array[Tree](right));
- }
-
- /*protected*/ def Or(left: Tree, right: Tree): Tree = {
- left match {
- case Literal(BOOLEAN(value))=>
- return if(value) left else right;
- case _ =>
- }
- right match {
- case Literal(BOOLEAN(value)) =>
- if (!value) return left;
- case _ =>
- }
- gen.mkApply_V(gen.Select(left, defs.BOOLEAN_OR()), Predef.Array[Tree](right));
- }
-
- // used by Equals
- private def getCoerceToInt(left: Type): Symbol = {
- val sym = left.lookupNonPrivate(Names.coerce);
- //assert sym != Symbol.NONE : Debug.show(left);
- val syms = sym.alternativeSymbols();
- var i = 0; while( i < syms.length) {
- syms(i).info() match {
- case Type.MethodType(vparams, restpe) =>
- if (vparams.length == 0 && restpe.isSameAs(defs.INT_TYPE()))
- return syms(i);
- case _ =>
- }
- i = i + 1;
- }
- //assert false : Debug.show(left);
- throw new ApplicationError(left);
- }
-
- // used by Equals
- private def getEqEq(left: Type, right: Type): Symbol = {
- val sym = left.lookupNonPrivate(Names.EQEQ);
- //assert sym != Symbol.NONE
- // : Debug.show(left) + "::" + Debug.show(left.members());
- var fun: Symbol = null;
- var ftype:Type = defs.ANY_TYPE();
- val syms = sym.alternativeSymbols();
- var i = 0; while(i < syms.length) {
- val vparams = syms(i).valueParams();
- if (vparams.length == 1) {
- val vptype = vparams(0).info();
- if (right.isSubType(vptype) && vptype.isSubType(ftype)) {
- fun = syms(i);
- ftype = vptype;
- }
- }
- i = i + 1
- }
- //assert fun != null : Debug.show(sym.info());
- fun;
- }
-
- /*protected*/ def Equals(left1:Tree , right1:Tree ): Tree = {
- var left = left1;
- var right = right1;
- val ltype = left.getType().widen();
- var rtype = right.getType().widen();
- if (ltype.isSameAs(rtype)
- && (ltype.isSameAs(defs.CHAR_TYPE())
- || ltype.isSameAs(defs.BYTE_TYPE())
- || ltype.isSameAs(defs.SHORT_TYPE())))
- {
- right = gen.mkApply__(gen.Select(right, getCoerceToInt(rtype)));
- rtype = defs.INT_TYPE();
- }
- val eqsym = getEqEq(ltype, rtype);
- gen.mkApply_V(gen.Select(left, eqsym), Predef.Array[Tree](right));
- }
-
- /*protected*/ def ThrowMatchError(pos: Int, tpe: Type ): Tree = {
- gen.mkApplyTV(
- gen.mkGlobalRef(pos, defs.MATCHERROR_FAIL()),
- Predef.Array[Tree](gen.mkType(pos, tpe)),
- Predef.Array[Tree](
- gen.mkStringLit(pos, unit.toString()),
- gen.mkIntLit(pos, Position.line(pos))
- ));
- }
-
- def ThrowMatchError(pos:int , tpe:Type , tree:Tree ): Tree = {
- gen.mkApplyTV(
- gen.mkGlobalRef(pos, defs.MATCHERROR_REPORT()),
- Predef.Array[Tree](gen.mkType(pos, tpe)),
- Predef.Array[Tree](
- gen.mkStringLit(pos, unit.toString()),
- gen.mkIntLit(pos, Position.line(pos)),
- tree
- ));
- }
-
- def Error(pos: Int, tpe: Type): Tree = {
- gen.mkApplyTV(
- gen.mkGlobalRef(pos, defs.MATCHERROR_FAIL()),
- Predef.Array[Tree](gen.mkType(pos, tpe)),
- Predef.Array[Tree](
- gen.mkStringLit(pos, unit.toString()),
- gen.mkIntLit(pos, Position.line(pos))
- ));
- }
-
-
- def pairType(left: Type, right: Type): Type = {
- defs.TUPLE_TYPE(Predef.Array[Type] ( left, right ) );
- }
-
- def newPair(left: Tree, right: Tree): Tree = {
- gen.New(
- gen.mkApplyTV(
- gen.mkPrimaryConstructorGlobalRef( pos, defs.TUPLE_CLASS(2)),
- Predef.Array[Type] ( left.getType(), right.getType() ),
- Predef.Array[Tree] ( left, right )));
- }
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/DetWordAutom.scala b/sources/scala/tools/scalac/transformer/matching/DetWordAutom.scala
deleted file mode 100644
index ef2c61f7e6..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/DetWordAutom.scala
+++ /dev/null
@@ -1,890 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import scalac.ast.Tree ;
-import Tree._ ;
-
-import java.util._ ;
-
-import scalac.ApplicationError ;
-
-package scala.tools.scalac.transformer.matching {
-
-class DetWordAutom {
-
- /** determinization -- standard algorithm considering only
- * reachable states
- */
- def this(nfa: NondetWordAutom) = {
- this();
- //Console.println("DWA:this(.)");
- //Console.println(nfa.nstates);
- //nfa.print();
- determinize( nfa );
- //Console.println(_nstates);
- }
-
- //final static Integer FINTAG = new Integer(0);
-
- /** number of states */
- var _nstates:int =0;
-
- /** the 'alphabet' */
- var _labels:HashSet = _;
-
- /** the set of final states, here as a TreeMap */
- /*protected*/ var finals:TreeMap = _;
-
- /** dfa: HashMap trans: Object -> Integer
- * nfa: HashMap trans: Object -> Vector [ Integer ]
- *
- * nfa: Integer ->(Object -> Vector [ Int ])
- * [q] |->( a |-> { q' | (q,a,q') in \deltaright } )
- *
- * dfa: Integer ->(Object -> Int)
- * [q] |->( a |-> q' | \deltaright(q,a) = q' } )
- */
-
- var _deltaq: Array[HashMap] = _;
-
- var _defaultq: Array[Integer] = _; // this gives the default transitions
-
- //protected HashMap deltaq[];
-
- // --- accessor methods
-
- /** returns number of states
- */
- def nstates(): Int = _nstates;
-
- /** returns the labels
- */
- def labels(): HashSet = _labels;
-
- /** returns the transitions
- */
- def deltaq( state:int ): HashMap = _deltaq( state );
-
- /** returns the transitions
- */
- def deltaq( state:Integer ): HashMap = _deltaq( state.intValue() );
-
-
- /** for a set of nfa states (that must exist), returns its transitions
- */
- def deltaq(nset: TreeSet): HashMap =
- deltaq( indexMap.get( nset ).asInstanceOf[Integer] );
-
- /** for a set of nfa states (that must exist), returns its transitions
- */
- def defaultq( nset:TreeSet ): Integer =
- defaultq( indexMap.get( nset ).asInstanceOf[Integer] );
-
- /** returns the transitions
- */
- def defaultq( state: int ): Integer =
- _defaultq( state );
-
- /** returns the transitions
- */
- def defaultq( state: Integer ): Integer =
- _defaultq( state.intValue() );
-
- /** returns true if the state is final
- */
- def isFinal(state: int): boolean =
- ((finals != null)
- && (finals.get( new Integer( state )) != null));
-
- /** returns true if the state is final
- */
- def isFinal(state: Integer): boolean = {
- return ((finals != null) && finals.containsKey( state ));
- }
-
- /** returns true if the state is final
- */
- def finalTag( state:Integer ): Integer = {
- return finals.get( state ).asInstanceOf[Integer];
- }
-
-
- def finalTag( state: int ): Integer = {
- return finals.get( new Integer (state )).asInstanceOf[Integer];
- }
-
- /** returns true if the set of states contains at least one final state
- */
- def containsFinal( Q: TreeSet ): boolean = {
- val it = Q.iterator();
- while(it.hasNext()) {
- if( isFinal(it.next().asInstanceOf[Integer]))
- return true;
- }
- return false;
- }
-
-
- /** returns true if there are no finite states
- */
- def isEmpty(): boolean = {
- return finals.isEmpty();
- }
-
- // END stuff from FiniteAutom
-
- final val FIRST: int = 0;
- final val LAST: int = FIRST + 1;
-
- //static final int WHICH_LONGEST_MATCH = FIRST ;
- final val WHICH_LONGEST_MATCH:int = LAST ;
-
- // inherited from FiniteAutom:
-
- // int nstates; // number of states
- // HashSet labels;// the alphabet
- // TreeMap finals;
-
- // HashMap deltaq[];
- //Integer defaultq[];
-
-
- // TEMPORARY VAR used only during determinization and debug printing
- // Q -> (Label -> Q )
- var delta: HashMap = _;
- // Q -> Integer;
- var indexMap: HashMap = _;
-
- // Integer -> Q
- var invIndexMap: HashMap = _;
-
- // only not null if this is a right-transducer
- var qbinders: Array[Vector] = _;
-
- final val NODEFAULT: Integer = new Integer( -1 );
-
- def isSink( i:int ): boolean = {
- return ( _deltaq( i ).keySet().isEmpty()
- && (_defaultq != null )
- && (_defaultq( i ).intValue() == i) );
- }
-
- def hasDefault( i:int ): boolean = {
- return _defaultq( i ) != NODEFAULT;
- }
-
- def determinize( nfa: NondetWordAutom ): Unit = {
- //Console.println("DetWordAutom:determinize");
- //System.out.println("nfa:");nfa.print();
- var states:TreeSet = _; // temp: Set[Set[Integer]]
- var deftrans:HashMap = _; // Set[Integer] -> Int
-
- var trans: HashMap = _; // always points to a mapping ( Label -> Q )
- var ix = 0; // state index
-
- this._labels = nfa.labels;
- ////System.out.println("Labels: "+labels);
- this.delta = new HashMap();
- //this.dead = -1;
-
- states = new TreeSet( new StateSetComparator() );
- deftrans = new HashMap();
- // temporarily: Map[Set[Integer]] later: Map[Integer]
- this.finals = new TreeMap( new StateSetComparator() );
- this.invIndexMap = new HashMap();
- this.indexMap = new HashMap();
-
- // new initial state (singleton set { q0 } by construction)
- val q0 = new TreeSet();
- q0.addAll( nfa.initials ); /*new Integer( 0 )); */
- states.add( q0 );
-
- val empty = new TreeSet();
- deftrans.put( q0, empty );
- states.add( empty );
- deftrans.put( empty, empty );
-
- val rest = new Stack();
- if( nfa.isFinal( 0 ) )
- this.finals.put( q0, nfa.finalTag( 0 ) );
-
- //Console.println("...beginning");
-
- rest.push( empty );
- rest.push( q0 );
- //Console.println("...beginning 2" );
- while( !rest.empty() ) {
- //Console.println("...beginning 3" );
- val P1 = rest.pop().asInstanceOf[TreeSet];
-
- //System.out.println("states:"+ states);
- //System.out.println("P1:"+ P1);
-
- invIndexMap.put( new Integer( ix ), P1 );
- indexMap.put( P1, new Integer( ix ));
- ix = ix + 1;
- delta.put( P1, {trans = new HashMap(); trans});
-
- //Console.println("...beginning 4" );
- // labelled transitions
- val it = _labels.iterator();
- //Console.println("it = "+it );
- //Console.println(it.hasNext());
-
- while( it.hasNext() ) {
- //Console.println("...beginning 5" );
- //Console.flush;
- val label = it.next();
- //Console.print( "Label: " + label +" ");
- // Qdest will contain all states reachable via `label'
- // from some nfa state in P1;
- val Qdest = nfa.getSide( P1, label );
- //Console.println("Qdest:"+Qdest);
- if( !states.contains( Qdest ) ) {
- states.add( Qdest );
- ////System.out.print(" (added)" );
- rest.push( Qdest );
- ////System.out.print(" (pushed)");
-
- //Console.println("nfa.containsFinal("+Qdest+") =="+nfa.containsFinal( Qdest ));
-
- if( nfa.containsFinal( Qdest ) )
- this.finals.put( Qdest, nfa.finalTag( Qdest ));
- ////System.out.print(" (added final)");
-
- }
- ////System.out.println(".Qdest");
-
- trans.put( label, Qdest );
- // //System.out.println( "Qdest: " + Qdest);
- //Console.println("Y marks");
- }
-
- // default transitions
-
- val defTarget: TreeSet = nfa.defaultq( P1 ).asInstanceOf[TreeSet];
- //System.out.println("defTarget:"+defTarget);
- deftrans.put( P1, defTarget );
-
- //Console.println("X marks 0");
-
- if( !states.contains( defTarget ) ) {
- //Console.println("X marks 1");
-
- states.add( defTarget );
- rest.push( defTarget );
- //Console.println("nfa.containsFinal("+defTarget+")"+nfa.containsFinal( defTarget ));
- if( nfa.containsFinal( defTarget ) )
- this.finals.put( defTarget, nfa.finalTag( defTarget ));
- }
-
- //Console.println("X marks");
- }
-
- //Console.println("...continuing");
-
- // <DEBUG>
- //printBefore( states, deftrans );
-
- // </DEBUG> do not call printBefore after this point
- // //System.out.println("indexMap: "+indexMap);
-
- this._nstates = states.size();
- _deltaq = new Array[HashMap]( _nstates );
- _defaultq = new Array[Integer]( _nstates );
-
- // we replace Set[Set[Integer]] by its index and clean up
-
- val jt = states.iterator();
- while(jt.hasNext()) {
- val state = jt.next().asInstanceOf[TreeSet];
- val state_x = indexMap.get( state ).asInstanceOf[Integer];
-
- val defTarget = deftrans.get( state ).asInstanceOf[TreeSet];
- var defTarget_x: Integer = _;
- if( null != defTarget) {
- defTarget_x = indexMap.get( defTarget ).asInstanceOf[Integer];
- ////System.out.println("deftarget" + defTarget);
- } else
- defTarget_x = NODEFAULT;
-
- ////System.out.print(state.toString() + " --> " + state_x);
- //System.out.println(" deftarget " + defTarget + " --> "+defTarget_x);
-
- trans = delta.get( state ).asInstanceOf[HashMap];
- val newTrans = new HashMap();
- val labs = _labels.iterator();
- while(labs.hasNext()) {
- val label = labs.next();
- val target = trans.get( label ).asInstanceOf[TreeSet];
- var target_x: Integer = _;
- if( null != target ) {
- // //System.out.println("target :"+target);
- target_x = indexMap.get( target ).asInstanceOf[Integer];
-
- if( target_x.intValue() != defTarget_x.intValue() ) {
- // replace target by target_x
- // (use type-unawareness)
- newTrans.put( label, target_x );
- }
- trans.remove( label );
- }
-
- }
- _deltaq( state_x.intValue() ) = newTrans;
- _defaultq( state_x.intValue() ) = defTarget_x;
-
- delta.remove( state );
- deftrans.remove( state );
-
- }
- //Console.println("determinize::: finals"+finals);
- val oldfin: TreeMap = finals;
- this.finals = new TreeMap();
- var kt = oldfin.keySet().iterator();
- while(kt.hasNext()) {
- val state = kt.next().asInstanceOf[TreeSet];
- val state_x = indexMap.get( state ).asInstanceOf[Integer];;
- this.finals.put( state_x, oldfin.get( state ) ); // conserve tags
- }
-
- // clean up, delete temporary stuff
- /*
- // we cannot clean up, indexmap is needed later
- for( Iterator it = states.iterator(); it.hasNext(); ) {
- ((TreeSet) it.next()).clear();
- }
- */
- states.clear();
-
- //Console.println("...done");
- //minimize();
- }
-
-
-
- def isDead(state: Int): Boolean = {
- return state == _nstates - 1; // by construction
- }
-
- def isDead(state: Integer): Boolean = {
- return state.intValue() == _nstates - 1; // by construction
- }
-
-
- /** returns target of the transition from state i with label label.
- * null if no such transition exists.
- */
- def delta(i: Int, label: Label): Integer = {
- var target:Integer =_;
- label match {
- case DefaultLabel() =>
- if (! hasDefault(i))
- return null;
- return _defaultq( i ).asInstanceOf[Integer] ;
- case SimpleLabel( _ ) | TreeLabel( _ ) =>
- return _deltaq( i ).get( label ).asInstanceOf[Integer] ;
- /*case LPair( Integer state, Label lab ):
- return state;
- */
- case _ =>
- throw new ApplicationError("whut's this: label="+label+", class "+label.getClass());
- }
- }
-
- def delta(i: Integer, label: Label): Integer =
- delta(i.intValue(), label);
-
- /** should maybe in nfa, not here
- */
- /*static */
- protected def smallestFinal( nfa: NondetWordAutom, states:TreeSet ): Integer = {
-
- var min = Integer.MAX_VALUE ;
- val it = states.iterator();
- while (it.hasNext()) {
- val state = it.next().asInstanceOf[Integer];
- if( nfa.isFinal( state ) && (state.intValue() < min ))
- min = state.intValue();
- }
- if (min == Integer.MAX_VALUE)
- throw new ApplicationError("I expected a final set of states");
- return new Integer( min );
- }
-
- protected def allSetsThatContain( ndstate: Integer ): Vector = {
- val v = new Vector();
- val it = indexMap.keySet().iterator();
- while(it.hasNext()) {
- val ndstateSet = it.next().asInstanceOf[TreeSet];
- if( ndstateSet.contains( ndstate ))
- v.add( ndstateSet );
- }
- return v;
- }
-
-
- protected def filterItOutQuoi( dLeft: DetWordAutom, npTarget: Npair,lab:LPair , nsrc:TreeMap ):Unit = {
- val theLabel = lab.lab;
- val ntarget = lab.state;
-
- // e.g.[2,(3),4] --> 7
- val dstate = dLeft.indexMap.get( npTarget.nset ).asInstanceOf[Integer];
-
- // eg. 3 -> [3] [2,3]
- val targets:Vector = dLeft.allSetsThatContain( ntarget );
-
- ////System.out.println( targets+", of these " ) ;
-
- // filter out those source states which arrive here...
- val su = targets.iterator();
- while(su.hasNext()) {
- val nset = su.next().asInstanceOf[TreeSet];
- val ddelta = dLeft.deltaq( nset ).asInstanceOf[HashMap];
-
- // ... at THIS dstate
- if(ddelta.get( theLabel ).asInstanceOf[Integer] == dstate ) {
-
- val np1 = new Npair( ntarget, nset );
-
- ////System.out.print( np1.toString( dLeft.indexMap ));
-
- if( WHICH_LONGEST_MATCH == FIRST )
- addTransitionFLM( nsrc, np1 );
- else
- addTransitionLLM( nsrc, np1 );
- }
-
- }
- }
-
- /** all default transitions from sets that contain nq to npTarget
- */
- protected def filterItOutQuoiDefault( dLeft: DetWordAutom ,npTarget:Npair , nq:Integer , nsrc:TreeMap ): Unit = {
-
-
- ////System.out.println( "npTarget = " + npTarget ) ;
-
- val allSources = dLeft.allSetsThatContain( npTarget.nstate );
- val it = allSources.iterator();
- while(it.hasNext()) {
-
- // e.g.[2,(3),4] --> 7
- //Integer dstate = (Integer) dLeft.indexMap.get( npTarget.nset );
-
- val dstate = dLeft.indexMap.get( it.next() ).asInstanceOf[Integer];
-
- //System.out.println( "dstate = " + dstate ) ;
-
- //assert dstate != null;
-
- // eg. 3 -> [3] [2,3]
- val targets = dLeft.allSetsThatContain( nq );
-
- //System.out.println( "targets: " + targets ) ;
-
- // filter out those source states which arrive here...
- val su = targets.iterator();
- while(su.hasNext()) {
- val nset = su.next().asInstanceOf[TreeSet];
- val ddef = dLeft.defaultq( nset );
-
- //System.out.println( "ddef ="+ddef );
-
- // ... at THIS dstate
- if( ddef == dstate ) {
-
- val np1 = new Npair( nq, nset );
-
- // print target
- //System.out.print( np1.toString( dLeft.indexMap ));
-
- if( WHICH_LONGEST_MATCH == FIRST )
- addTransitionFLM( nsrc, np1 );
- else
- addTransitionLLM( nsrc, np1 );
-
- }
-
- }
- }
- }
-
- /** this implements the first longest match policy
- */
- protected def addTransitionFLM( nsrc:TreeMap , np:Npair ): Unit= {
- val np2 = nsrc.get( np.nset ).asInstanceOf[Npair ];
-
- // (policy) first longest match
- if(( np2 == null )
- ||( np2.nstate.intValue() > np.nstate.intValue())) {
- nsrc.put( np.nset, np );
- }
-
- }
-
- /** this implements the last longest match policy (!)
- */
- protected def addTransitionLLM(nsrc: TreeMap, np: Npair ): Unit = {
- val np2 = nsrc.get( np.nset ).asInstanceOf[Npair];
-
- // (policy) first longest match
- if(( np2 == null )
- ||( np2.nstate.intValue() < np.nstate.intValue())) {
- nsrc.put( np.nset, np );
- }
-
- }
-
-
- /** build a deterministic right to left transducer from the args
- */
- def this(right: NondetWordAutom, left:NondetWordAutom, dLeft: DetWordAutom ) = {
- this();
-
- /* System.out.println("DetWordAutom.<init>(nfa,nfa,dfa)");
- System.out.println("nfa-left:");left.print();
- System.out.println("nfa-right:");right.print();
- System.out.println("dLeft:"+dLeft.print());
- System.out.println("dLeft.finals"+dLeft.finals);
- */
- this.indexMap = dLeft.indexMap;
- this.invIndexMap = dLeft.invIndexMap;
- // fix indexMap
- /* // unnecessary
- TreeSet q0 = new TreeSet();
- q0.add( new Integer( 0 ));
- indexMap.put( q0, new Integer( 0 ));
- //System.out.println("check out the indexMap!" + indexMap);
- */
-
- val visited_n = new TreeSet( new NpairComparator() );
- val rest = new Stack();
-
- // right is "nearly deterministic"
- // we can follow reverse traces paths by using dLeft.indexMap
-
- // start with right.initials, left.final, dLeft.final
- val it = dLeft.finals.keySet().iterator();
- while(it.hasNext()) {
- val fstate = it.next().asInstanceOf[Integer];
- val nfstate = invIndexMap.get( fstate ).asInstanceOf[TreeSet];
- //System.out.print( "final state:"+fstate);
- //System.out.print( " correspond to set of states:"+ nfstate );
-
- val min_ndstate: Integer = smallestFinal( left, nfstate );
-
- val npair:Npair = new Npair( min_ndstate, nfstate );
-
- //System.out.println( " smallest final of these: "+ min_ndstate );
-
-
- //System.out.println( "push final nfa state "+npair.toString( dLeft.indexMap ));
-
- if( !visited_n.contains( npair )) {
- visited_n.add( npair );
- rest.push( npair );
- }
- }
-
- val ratLab = new HashMap(); // maps nset to label,HashMap
- val ratDelta = new HashMap(); // maps nset to Vector[ NP ]targets
-
- val ratDefault = new HashMap(); // maps nset to NP (one target)
-
- var ix = 1;
- val ix_initial = rest.clone().asInstanceOf[Stack];
- var ix_final = new TreeSet( new NpairComparator() );;
-
- val newIndexMap = new TreeMap( new NpairComparator() );
-
- while( !rest.isEmpty() ) {
-
- val npair = rest.pop().asInstanceOf[Npair];
- newIndexMap.put( npair, new Integer(ix));
-
- ratDelta.put( npair, new Vector() );
-
- if( npair.nset.contains( new Integer( 0 )) ) {
- ix_final.add( npair );
- }
- ix = ix + 1;
-
- //System.out.println(" popped "+npair.toString( dLeft.indexMap ));
-
- ////System.out.print(" binders: ");
- ////System.out.print( right.qbinders[ npair.nstate.intValue() ] );
-
- val delta = right.deltaq( npair.nstate );
-
- ////System.out.print(" we could have arrived : ");
- //search the delta for target invIndexMap
-
- val labelToNset = new HashMap();
- val labelToFrom = new HashMap();
-
- // maps nsets to the active nstates
- var nsrc = new TreeMap( new StateSetComparator() );
-
- // berry-sethi construction assures that
- // there is only one label for outgoing transitions
- var theLabel:Label = null;
-
- // collect all transition possible in the DFA
- val jt = delta.keySet().iterator();
- while(jt.hasNext()) {
- val lab = jt.next().asInstanceOf[LPair];
-
- // lab.state is the target in the NFA
-
- if( null == theLabel ) {
- ratLab.put( npair, lab.lab );
- ////System.out.print(" with \""+lab.lab+"\" ");
- }
- theLabel = lab.lab ;
-
- ////System.out.print("\nfrom n" + lab.state +" ... ");
-
- // these are too many, filter out those that exist in DFA
-
- filterItOutQuoi( dLeft, npair, lab, nsrc );
-
- }
-
-
- ////System.out.println( "---" );
-
- ////System.out.println("all sources: ");
-
- // !! first longest match
- val ut = nsrc.keySet().iterator();
- while(ut.hasNext()) {
- val nset = ut.next().asInstanceOf[TreeSet];
- val np2: Npair = nsrc.get( nset ).asInstanceOf[Npair] ;
-
- //assert( np2 != null );
- ////System.out.println("target: n"+npair.nstate+" via: "+theLabel+" from "+ np2.toString( dLeft.indexMap ));// nset:"+nset+ " namely state n"+ dest);
-
- val v = ratDelta.get( npair ).asInstanceOf[Vector];
-
- v.add( np2 );
-
- if( !visited_n.contains( np2 ) ) {
-
- visited_n.add( np2 );
- rest.push( np2 );
- }
-
- }
-
- //System.out.println("default sources: ");
-
- // maps nsets to the active nstates
- nsrc = new TreeMap( new StateSetComparator() );
-
- // now for all default transitions that arrive at this nfa state
- val defqs = right.defaultq( npair.nstate );
- val kt = defqs.iterator();
- while( kt.hasNext() ) {
- val nq = kt.next().asInstanceOf[Integer];
- //System.out.println("checking nq="+nq);
- filterItOutQuoiDefault( dLeft, npair, nq, nsrc );
- //System.out.println( "nsrc after "+nq+" is "+nsrc );
- }
-
- //System.out.println( "defqs :"+defqs );
- //System.out.println( "nsrc :"+nsrc );
- var nut = nsrc.keySet().iterator();
- while(nut.hasNext()) {
-
- val np2 = nsrc.get( nut.next() ).asInstanceOf[Npair];
-
- var v = ratDefault.get( npair ).asInstanceOf[Vector] ;
- if( v == null )
- ratDefault.put( npair, {v = new Vector(); v} );
- v.add( np2 );
-
- if( !visited_n.contains( np2 ) ) {
-
- visited_n.add( np2 );
- rest.push( np2 );
- }
-
- }
-
- ////System.out.println("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
-
- }
-
- // Renumbering
-
- ////System.out.println( "output: a dfa with "+ix+"states");
-
- // FIX: empty regular expression (as in "List()") is valid
- //assert ( !ix_final.isEmpty() ) : "no final states found";
-
- ////System.out.println( "final state:"+ix_final);
-
- //System.out.println( "indexMap: " +indexMap);
- //System.out.println( "newIndexMap: " +newIndexMap);
- this.finals = new TreeMap();
- this._nstates = ix;
- val dratDelta = new Array[HashMap]( ix );
- qbinders = new Array[Vector]( ix );
- _labels = new HashSet();
- val kit = ratDelta.keySet().iterator();
- while(kit.hasNext()) {
- val np = kit.next().asInstanceOf[Npair];
-
- //System.out.print( "\nstate: "+np);
- val ndset = np.nset;
- val dstate = newIndexMap.get( np ).asInstanceOf[Integer];
- //assert dstate != null : "no dstate for "+np.toString(dLeft.indexMap);
-
- //System.out.print(" binders:");
-
- qbinders( dstate.intValue() ) = left.qbinders( np.nstate.intValue() );
-
- //System.out.print( qbinders[dstate.intValue() ]);
-
- //System.out.println(" transitions:");
- if( ix_final.contains( np ) ) {
- val fin_ix = newIndexMap.get( np ).asInstanceOf[Integer];
- finals.put( fin_ix, new Integer( 0 ));
- }
-
- val lab = ratLab.get( np ).asInstanceOf[Label];
- val v = ratDelta.get( np ).asInstanceOf[Vector];
-
- val ddelta = new HashMap();
-
- // v might be null if there are only default transitions
- if( v != null ) {
- val it2 = v.iterator();
- while(it2.hasNext()) {
-
- val np2= it2.next().asInstanceOf[Npair];
- //System.out.print( "("+lab+","+np2+") " );
- val ddestR = newIndexMap.get( np2 ).asInstanceOf[Integer];
- val ddest = indexMap.get( np2.nset ).asInstanceOf[Integer];
- //assert ddest != null :
- //"no ddest for "
- //+np2.toString(dLeft.indexMap);
-
- val newLab = new LPair(ddest, lab);
- ddelta.put( newLab, ddestR );
- _labels.add( newLab );
-
- }
- dratDelta( dstate.intValue() ) = ddelta;
-
- }
- }
- var itt = ratDefault.keySet().iterator();
- while(itt.hasNext()) {
- val np = itt.next().asInstanceOf[Npair];
- val dstate = newIndexMap.get( np ).asInstanceOf[Integer];
-
- //System.out.print("\nstate: "+np+" default trans: ");
-
- val v = ratDefault.get( np ).asInstanceOf[Vector];
- val ut = v.iterator();
- while(ut.hasNext()) {
- val np2 = ut.next().asInstanceOf[Npair];
- val targetL = indexMap.get( np2.nset ).asInstanceOf[Integer];;
- val targetR = newIndexMap.get( np2 ).asInstanceOf[Integer];;
-
- val defLab = new LPair( targetL, DefaultLabel() );
-
- _labels.add( defLab );
- //System.out.print( "("+defLab+","+np2+") " );
-
- var d = dratDelta( dstate.intValue() );
- if( d == null )
- dratDelta( dstate.intValue() ) = {d = new HashMap(); d};
-
- d.put( defLab, targetR );
- }
- }
-
- _deltaq = dratDelta;
-
- val hmap = new HashMap();
-
- // final states of left are initial states of right
- // problem: still need to choose the one
-
- while( !ix_initial.isEmpty() ) {
- val np = ix_initial.pop().asInstanceOf[Npair];
-
- val i = newIndexMap.get( np ).asInstanceOf[Integer]; //R-state
- val dtarget = indexMap.get( np.nset ).asInstanceOf[Integer];// left-d-state
-
- hmap.put( dtarget, i );
- }
- _deltaq( 0 ) = hmap; // careful, this maps Int to Int
-
- qbinders( 0 ) = new Vector();
- //((Vector[])defaultq)[ 0 ] = new Vector(); is null
- //printBeforeRAT( dratDelta );
-
- }
-
- def printBeforeRAT1(str: String): Unit = {
- val tmp = new StringBuffer( str );
- var j = tmp.length();
- while(j < 20) {
- tmp.append(" ");
- j = j + 1;
- }
- Console.println( tmp.toString() );
- }
-
- def printBeforeRAT( dratDelta: Array[HashMap] ): Unit = {
- //System.out.println();
- printBeforeRAT1( "dratDelta" );
- printBeforeRAT1( "[index]" );
- //System.out.println();
- var i = 0;
- while(i < dratDelta.length) {
- if( isFinal( i ))
- printBeforeRAT1( "*"+i );
- else
- printBeforeRAT1( " "+i );
-
- //System.out.println( dratDelta[ i ] );
- i = i + 1
- }
- }
-
- /** you may only call this before the set[set[...]] representation
- * gets flattened.
- */
- def printBefore(states: TreeSet, deftrans: HashMap): Unit = {
- var trans: HashMap = _;
- Console.println(states);
- val it = states.iterator();
- while (it.hasNext()) {
- val state = it.next().asInstanceOf[TreeSet];
- Console.print("state:" + state.toString() + " transitions ");
- trans = delta.get( state ).asInstanceOf[HashMap];
- val labs = _labels.iterator();
- while(labs.hasNext()) {
- val label = labs.next();
- val target = trans.get( label ).asInstanceOf[TreeSet];
- Console.print( " (" + label.toString()
- + "," + target.toString()+")");
- }
- Console.print("default trans"+deftrans.get(state));
- Console.println;
- }
- Console.println("final states:" + finals);
- }
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/Label.scala b/sources/scala/tools/scalac/transformer/matching/Label.scala
deleted file mode 100644
index d260feded6..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/Label.scala
+++ /dev/null
@@ -1,136 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.ApplicationError;
-import scalac.ast.Tree;
-import scalac.ast.TreeInfo;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-import Tree.Literal;
-
-/**
- * This class represents the label that a transition in an automaton
- * may carry. These get translated to specific (boolean) tests
- */
-package scala.tools.scalac.transformer.matching {
-
-class Label {
-
-
- //case class RLabel(Object rstate, Label lab, Symbol vars[]);
-
- override def hashCode(): Int = this match {
- case DefaultLabel() =>
- return 0;
- case SimpleLabel(lit) =>
- return lit.value.hashCode();
- case TreeLabel(pat) =>
- // if pat is an Apply, than this case can only be correctly
- // handled there are no other similar Applys (nondeterminism)
- return pat.getType().hashCode();
- case TypeLabel(tpe) =>
- return tpe.hashCode();
- case _ =>
- return super.hashCode();
- }
-
- override def equals( o: Any ): Boolean = {
- if( !(o.isInstanceOf[Label] ))
- return false;
- val oL = o.asInstanceOf[Label];
- //System.out.print(this + " equals " + oL);
- this match {
- case DefaultLabel()=>
- oL match {
- case DefaultLabel() =>
- return true;
- case _ => false;
- } //
- case SimpleLabel( lit ) =>
- oL match {
- case SimpleLabel( lit2 ) =>
- return /*(lit.kind == lit2.kind)
- && */lit.value.equals( lit2.value );
- case _ => false;
- }
-
- case TreeLabel( pat ) =>
- oL match {
- case TreeLabel( pat2 ) =>
- pat match {
- case Tree.Apply( _, _ ) =>
- pat2 match {
- case Tree.Apply( _, _ ) =>
- return TreeInfo.methSymbol( pat ) == TreeInfo.methSymbol( pat2 );
- }
- case _ => false;
- }
- case _ => false
- }
-
- case TypeLabel(tpe) =>
- oL match {
- case TypeLabel( tpe2) =>
- return tpe.equals(tpe2);
- case _ => false;
- }
- case LPair(state, lab) =>
- oL match {
- case LPair(state2, lab2) =>
- return state.equals(state2) && lab.equals(lab2);
- case _ => false;
- }
- case _ => return false;
- }
- }
-
-
- def toString2(): String = {
- val ext = System.getProperty("extendedMatching");
- if ((ext != null) && ext.equals("true")) {
- this match {
- case DefaultLabel() =>
- return "<>:p"+p;
- case SimpleLabel( lit ) =>
- return lit.toString()+":p"+p;
- case TreeLabel( pat ) =>
- return pat.getType().toString()+":p"+p;
-
- case _ => throw new ApplicationError("this never happens");
- }
- }
- throw new ApplicationError("this never happens");
- }
-
- override def toString(): String = this match {
- case DefaultLabel() =>
- "<>";
- case SimpleLabel( lit) =>
- lit.toString();
- case TreeLabel(pat) =>
- pat.toString();
- case TypeLabel(tpe) =>
- tpe.toString();
- case LPair(state, lab) =>
- "(" + state.toString() + "," + lab.toString() + ")";
- case _ =>
- throw new ApplicationError("this never happens");
- }
-
- val p = -1; // tree state - only needed for extended matching
-
-}
-
-case class DefaultLabel() extends Label;
-case class SimpleLabel(lit: Literal) extends Label;
-case class TreeLabel(pat: Tree) extends Label; // Apply, Sequence
-case class TypeLabel(tpe: Type) extends Label; // Apply, Sequence
-case class LPair(state: Integer, lab: Label) extends Label;
-
-} // package
diff --git a/sources/scala/tools/scalac/transformer/matching/LeftTracerInScala.scala b/sources/scala/tools/scalac/transformer/matching/LeftTracerInScala.scala
deleted file mode 100644
index 3629f94ed6..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/LeftTracerInScala.scala
+++ /dev/null
@@ -1,246 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import Tree._;
-import scalac.util.Names;
-
-import java.util._ ;
-
-import scala.tools.util.Position;
-
-package scala.tools.scalac.transformer.matching {
-
-class LeftTracerInScala(dfa: DetWordAutom, elementType: Type, owner: Symbol, cf: CodeFactory, val selector: Tree)
-extends TracerInScala(dfa, elementType, owner, cf) {
-
- //final def defs = cf.defs;
-
- /** symbol of the accumulator ( scala.SequenceList )
- */
- var accumSym: Symbol = _;
- var accumType: Type = _;
- var accumTypeArg: Type =_ ;
-
- def _accumType(elemType: Type): Type = {
- cf.SeqTraceType( elemType );
- }
-
-
- protected def initializeSyms(): Unit = {
- this.funSym = owner.newLabel( pos,
- cf.fresh.newName( "left" ));
-
- this.iterSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName( "iter" ))
- .setType( cf._seqIterType( elementType ) ) ;
-
- this.stateSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName( "q" ))
- .setType( defs.int_TYPE() ) ;
-
- this.accumType = _accumType( elementType );
- this.accumTypeArg = accumType.typeArgs()( 0 );
- this.accumSym = owner.newVariable( pos, // accumulator
- Modifiers.MUTABLE,
- cf.fresh.newName( "acc" ))
- .setType( accumType );
-
- //this.funSym
- // .setType( new Type.MethodType( new Symbol[] {
- // accumSym, iterSym, stateSym},
- // accumType));
-
- this.funSym
- .setType( new Type.MethodType( Predef.Array[Symbol] ( // dummy symbol MethodType
- funSym.newVParam( pos, 0, cf.fresh.newName( "q" ), defs.int_TYPE()),
- funSym.newVParam( pos, 0, cf.fresh.newName( "acc" ), accumType ) ),
- accumType)); // result type = List[T]
-
- this.resultSym = owner.newVariable(pos,
- 0,
- cf.fresh.newName("trace"))
- .setType( accumType ) ;
-
- this.curSym = owner.newVariable( pos, 0, Names.cur )
- .setType( elementType );
-
- this.hasnSym = owner.newVariable( pos, 0, Names.hasNext )
- .setType( defs.boolean_TYPE() );
-
- }
-
- /* should throw an exception here really, e.g. MatchError
- */
- override def code_fail() = {
- gen.Ident( accumSym.pos, accumSym );
- }
-
- /** returns translation of transition with label from i.
- * returns null if there is no such transition(no translation needed)
- */
- override def code_delta(i: Int, label: Label): Tree = {
- val target = dfa.delta( i, label );
-
- /*
- System.out.println("LeftTracer:calling dfa.delta("+i+","+label+")");
- System.out.println("result: "+target);
- */
- if( target == null )
- null;
- else {
- // (optimization) that one is a dead state (does not make sense for tracer)
- /*
- if( target == dfa.nstates - 1 )
- return code_fail();
- */
-
- /*
- Tree newAcc = cf.newSeqTraceCons(new Integer(i),
- currentElem(),
- _ref( accumSym ));
- */
- val hd = cf.newPair( gen.mkIntLit(cf.pos, i), currentElem() );
- val newAcc = gen.mkNewCons( cf.pos,
- accumTypeArg,
- hd,
- gen.Ident( cf.pos, accumSym ));
-
- //return callFun( new Tree[] { newAcc , _iter(), gen.mkIntLit( cf.pos, target )} );
- callFun( Predef.Array[Tree]( gen.mkIntLit( cf.pos, target.intValue() ), newAcc ) );
- }
- }
-
-
- def code_body(): Tree = {
-
- var body = code_error(); // never reached at runtime.
-
- // state [ nstates-1 ] is the dead state, so we skip it
-
- //`if( state == q ) <code_state> else {...}'
- var i = dfa.nstates() - 2;
- while (i >= 0) {
- body = code_state(i, body);
- i = i - 1;
- }
- loadCurrentElem(body);
- }
-
- /** return code for state i of the dfa SAME AS IN SUPER, ONLY SINK IS GONE
- */
- def code_state(i: Int, elseBody: Tree): Tree = {
-
- var runFinished: Tree = _; // holds result of the run
- var finalSwRes: Int = 0;
-
- runFinished = run_finished(i);
-
- var stateBody: Tree = _ ; // action(delta) for one particular label/test
-
- // default action (fail if there is none)
-
- stateBody = code_delta( i, DefaultLabel());
-
- if( stateBody == null )
- stateBody = code_fail();
- // transitions of state i
-
- val trans = dfa.deltaq( i );
- val labs = dfa.deltaq( i ).keySet().iterator();
- while(labs.hasNext()) {
- val label = labs.next();
- val next = trans.get( label ).asInstanceOf[Integer];
-
- val action = code_delta( i, label.asInstanceOf[Label] );
-
- if( action != null ) {
- stateBody = gen.If( currentMatches(label.asInstanceOf[Label]),
- action,
- stateBody);
- }
- }
- stateBody = gen.If(cf.Negate(gen.Ident(cf.pos, hasnSym)),
- runFinished,
- stateBody );
- gen.If( cf.Equals( _state(), gen.mkIntLit(cf.pos, i )),
- stateBody ,
- elseBody );
- }
-
- def getTrace(): Tree = {
-
- initializeSyms();
-
- cf.gen.mkBlock(cf.pos, Predef.Array[Tree] (
- gen.ValDef( iterSym, cf.newIterator( selector, selector.getType() )),
- gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ),
- gen.ValDef( accumSym, gen.mkNil( cf.pos )),
- gen.ValDef( resultSym,
- gen.LabelDef( this.funSym,
- Predef.Array[Ident] (
- gen.Ident( pos, stateSym ),
- gen.Ident( pos, accumSym )
- ), code_body() /* code_body_new ? */ ))
- ),
- gen.Ident( cf.pos, resultSym ));
- }
-
- // calling the AlgebraicMatcher here
- override def _cur_match(pat: Tree): Tree = {
- //return gen.mkBooleanLit(cf.pos, true);
-
- //System.out.println("calling algebraic matcher on type:" + pat.type);
-
- val m = new PartialMatcher( owner,
- currentElem(),
- defs.boolean_TYPE() );
-
- val res1 = if(containsBinding(pat)) {
- pat match {
- case Sequence(pats) =>
- gen.mkBooleanLit(cf.pos, true);
- case _ =>
- null
- }
- } else null;
-
- if (res1 == null) {
-
- am.construct(m, Predef.Array[Tree] (
- cf.gen.CaseDef( pat,
- gen.mkBooleanLit( cf.pos, true )),
- cf.gen.CaseDef( cf.gen.Ident( pat.pos, defs.PATTERN_WILDCARD ),
- gen.mkBooleanLit( cf.pos, false)) ),
- false);
- val res = am.toTree();
- // debugprint ?
- res;
- } else null
- }
-
-
- /** return the accumulator + last state
- */
- override def run_finished(state: Int): Tree = {
- val hd = cf.newPair( gen.mkIntLit(cf.pos, state),
- gen.mkDefaultValue(cf.pos,
- elementType));
- //System.err.println(hd.type);
- gen.mkNewCons(cf.pos,
- accumTypeArg,
- hd,
- gen.Ident( cf.pos, accumSym ));
- }
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/NondetWordAutom.scala b/sources/scala/tools/scalac/transformer/matching/NondetWordAutom.scala
deleted file mode 100644
index d87cee40f2..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/NondetWordAutom.scala
+++ /dev/null
@@ -1,527 +0,0 @@
-
-
-import scalac.ApplicationError ;
-import scalac.ast.Tree ;
-import scalac.util.Name ;
-import Tree._ ;
-
-import java.util._ ;
-package scala.tools.scalac.transformer.matching {
-/** a nondeterministic word automaton.
- * states are represented (implicitly) as Integer objects.
- */
-
-class NondetWordAutom {
- // BEGIN stuff from FiniteAutom
-
- //final static Integer FINTAG = new Integer(0);
-
- /** number of states */
- var nstates: int =_;
-
- /** the 'alphabet' */
- var labels: HashSet = _;
-
- /** the set of final states, here as a TreeMap */
- var finals: TreeMap = _;
-
- /** dfa: HashMap trans: Object -> Integer
- * nfa: HashMap trans: Object -> Vector [ Integer ]
- *
- * nfa: Integer ->(Object -> Vector [ Int ])
- * [q] |->( a |-> { q' | (q,a,q') in \deltaright } )
- *
- * dfa: Integer ->(Object -> Int)
- * [q] |->( a |-> q' | \deltaright(q,a) = q' } )
- */
-
- var _deltaq:Array[HashMap] = _;
-
- var _defaultq:Array[Vector] = _; // this gives the default transitions
-
- //public HashMap deltaq[];
-
- // --- accessor methods
-
- /** returns number of states
- def nstates(): int = {
- return nstates;
- }
- */
-
- /** returns the labels
- def labels(): HashSet = {
- return _labels;
- }
- */
-
- /** returns the transitions
- */
- def deltaq( state: int ):HashMap = {
- return _deltaq( state );
- }
-
- /** returns the transitions
- */
- def deltaq( state: Integer ): HashMap = {
- return _deltaq( state.intValue() );
- }
-
- /** returns the transitions
- */
- def defaultq( state: int ): Vector = {
- return _defaultq( state );
- }
-
- /** returns the transitions
- */
- def defaultq( state:Integer ): Vector = {
- return _defaultq( state.intValue() );
- }
-
-
- /** returns true if the state is final
- */
- def isFinal( state:int ): boolean = {
- return ((finals != null)
- && (finals.get( new Integer( state )) != null));
- }
-
- /** returns true if the state is final
- */
- def isFinal( state:Integer ): boolean = {
- return ((finals != null) && finals.containsKey( state ));
- }
-
- /** returns true if the state is final
- */
- def finalTag( state: Integer ): Integer = {
- return finals.get( state ).asInstanceOf[Integer];
- }
-
-
- def finalTag( state:int ): Integer = {
- return finals.get( new Integer (state )).asInstanceOf[Integer];
- }
-
- /** returns true if the set of states contains at least one final state
- */
- def containsFinal( Q:TreeSet ): boolean = {
- var it = Q.iterator();
- while(it.hasNext()) {
- if( isFinal( it.next().asInstanceOf[Integer]))
- return true;
- }
- return false;
- }
-
-
- /** returns true if there are no finite states
- */
- def isEmpty(): boolean = finals.isEmpty();
-
- // END stuff from FiniteAutom
-
-
- // inherited from FiniteAutom
-
- // set of *distinct* objects that may label transitions
- // see Object.hashCode() to see why this works
-
- //HashSet labels;
- //TreeMap finals;
-
- var initials: TreeSet = _; // ? need this ?
- // ---
-
- // Object deltaq -->
- // HashMap deltaq[]; // this gives the transitions of q;
-
- var leftTrans: boolean = _;
- var rightTrans: boolean = _;
-
- /** if true, this automaton behaves as a special left transducer.
- * if a run succeeds, the result is not "true" but the entire
- * run of the automaton as a sequence of (label,state) - pairs.
- * used for binding variables.
- */
- def producesRun(): boolean = {
- return leftTrans;
- }
-
- def consumesRun(): boolean = {
- return rightTrans;
- }
-
- def initial( i: Integer ): boolean = {
- return initials.contains( i );
- }
- var qbinders: Array[Vector] = _;
-
- /** returns all states accessible from Qsrc via label.
- * used by class DetWordAutomaton.
- */
- def getSide ( Qsrc:TreeSet , label:Object ): TreeSet = {
- //Console.println("NWA::getSide(Qsrc="+Qsrc);
- val Qdest = new TreeSet();
- var it = Qsrc.iterator();
- while(it.hasNext()) {// state
- val q = it.next().asInstanceOf[Integer].intValue();
- val ps = deltaq( q ).get( label ).asInstanceOf[Vector];
- //Console.println("deltaq(q) = "+deltaq(q));
- //Console.println("_deltaq(q) = "+_deltaq(q));
- //Console.println("ps = "+ps);
- if( null != ps ) {
- Qdest.addAll( ps );
- }
- //Console.println("defq = "+_defaultq( q ));
- Qdest.addAll( _defaultq( q ) );
- }
- //Console.println("DONE-NWA::getSide");
- return Qdest;
- }
-
- /** returns the transitions
- */
- def defaultq( P1: Set ): Object = {
- val defTarget = new TreeSet();
- var p1 = P1.iterator();
- while(p1.hasNext()) {
- val q1 = p1.next().asInstanceOf[Integer].intValue();
- //System.out.println(" q1:"+q1+ " defa: "+defaultq( q1 ));
- defTarget.addAll( _defaultq( q1 ) );
- }
- return defTarget;
- }
-
-
- /** first match policy: among several final states, the smallest one is
- * chosen. used by class DetWordAutomaton
- */
- def finalTag( Q:Set ): Integer = {
-
- var min = Integer.MAX_VALUE ;
- var it = Q.iterator();
- while(it.hasNext()) {
- val state = it.next().asInstanceOf[Integer];
- val tag = finals.get( state ).asInstanceOf[Integer];
- if( tag != null ) {
- if( tag.intValue() < min )
- min = tag.intValue();
- }
- }
-
- if ( min == Integer.MAX_VALUE )
- throw new ApplicationError( "there should be a final state ");
-
- return new Integer( min );
- }
-
- /*
- void tmap(int offs, TreeMap t) = {
- TreeMap nt = new TreeMap();
- for(Iterator it = t.keySet().iterator(); it.hasNext(); ) = {
- Integer key = (Integer) it.next();
- Integer newkey = new Integer( key.intValue() + offs );
- Integer val = (Integer) t.get( key );
- Integer newval = new Integer( val.intValue() + offs );
-
- nt.put( newkey, newval );
- }
- return nt;
- }
- */
- // hashmaps, treemaps
- def mapmap(src:Map, offset:int , dest:Map , mapkeys:boolean , mapvals:boolean ): Map = {
- var it = src.keySet().iterator();
- while(it.hasNext()) {
- var key = it.next();
- var value = src.get( key );
- if( mapkeys ) key = new Integer( key.asInstanceOf[Integer].intValue()
- + offset );
- if( mapvals ) value = vmap( offset, value.asInstanceOf[Vector] ) ;
- /* new Integer( ((Integer)val).intValue()
- + offset );
- */
- dest.put( key, value );
- }
- return dest;
- }
-
- def vmap(offs:int , v:Vector ): Vector = {
- if( v == null )
- return null;
- var res = new Vector( v.size() );
- var it = v.iterator();
- while(it.hasNext()) {
- val item = it.next().asInstanceOf[Integer];
- res.add( new Integer( item.intValue() + offs ));
- }
- return res;
-
- }
-
- /*
- void relocate_defaultq( int offs, Vector _defaultq[] ) = {
- for( int i = 0; i < this.nstates; i++ ) = {
- _defaultq[ i + offset ] = vmap( offset, ((Vector[])defaultq)[ i ]);
- }
- }
- */
-
- /** copies the values in the fields of this object into the
- * arguments, possibly adding an offset.
- */
- def relocate( offset:int, _finals:TreeMap, _deltaq1:Array[HashMap], _defaultq1:Array[Vector], _qbinders1:Array[Vector] ): Unit = {
-
- mapmap( finals, offset, _finals, true, false);
- var i = 0;
- while(i < this.nstates) {
-
- _deltaq1 ( i + offset ) =
- mapmap( deltaq( i ), offset, new HashMap(), false, true).asInstanceOf[HashMap];
-
- _defaultq1( i + offset ) = vmap( offset, this.defaultq( i ) );
- i = i + 1;
- }
- if ((_qbinders1 != null) &&( qbinders != null )) {
- i = 0;
- while(i < this.nstates ) {
- //System.out.println("hallo"+qbinders);
- //System.out.println("qbinders[ i ] :"+qbinders[ i ]);
- //assert _qbinders != null;
- //System.out.println("_qbinders :"+_qbinders);
-
- _qbinders1( i + offset ) = qbinders( i );
- i = i + 1
- }
- }
- }
-
-
- /** if there is more than one initial state, a new initial state
- * is created, with index 0
- */
- def normalize( initials:TreeSet , reloc:boolean ): Unit = {
- //if( initials.size() == 1 )
- // return;
-
- var idelta = new HashMap();
- var idefault = new TreeSet();
-
- var q0 = new Integer( 0 );
-
- var it = initials.iterator();
- while(it.hasNext()) {
-
- val ostate = it.next().asInstanceOf[Integer];
-
- val finTag = finals.get( ostate ).asInstanceOf[Integer] ;
- if(( finTag != null ) && ( finals.get( q0 ) == null))
- finals.put( q0, finTag );
-
-
- var tmp = deltaq( ostate );
-
- if( reloc )
- tmp = mapmap( tmp, 1, new HashMap(), false, true ).asInstanceOf[HashMap];
-
- val labs = tmp.keySet().iterator();
- while(labs.hasNext()) {
- val lab = labs.next();
- var itarget = idelta.get( lab ).asInstanceOf[Vector];
- if( null == itarget )
- idelta.put( lab, {itarget = new Vector(); itarget});
- val otarget = tmp.get( lab ).asInstanceOf[Vector];
- itarget.addAll( otarget );
- }
- //System.out.println( "normalize:defaultq[ "+ostate+" ] "+((Vector[]) defaultq) [ ostate.intValue() ]);
- if( defaultq( ostate ) != null )
- idefault.addAll( defaultq( ostate ) );
- }
-
- if( reloc ) {
- val m = 1 + this.nstates;
- val _finals = new TreeMap();
- val _deltaq = new Array[HashMap]( m );
- val _defaultq = new Array[Vector]( m );
- var _qbinders: Array[Vector] = null;
-
- if( qbinders != null )
- _qbinders = new Array[Vector]( m );
-
- relocate( 1, _finals, _deltaq, _defaultq, _qbinders );
-
- this.nstates = m;
- this.finals = _finals;
- this._deltaq = _deltaq;
- this._defaultq = _defaultq;
- this.qbinders = _qbinders;
- }
-
- this._deltaq ( 0 ) = idelta;
- //System.out.println("normalize:deltaq[ 0 ]"+ idelta );
- this._defaultq( 0 ) = new Vector( idefault );
-
- //System.out.println("normalize:defaultq[ 0 ]"+ idefault );
-
- this.initials = new TreeSet();
- this.initials.add( q0 );
- }
-
-
- /** called from Berry-Sethi construction.
- */
-
- def this(nstates:int, _labels:HashSet, initials: TreeSet, finals:TreeMap, deltaq:Array[HashMap], defaultq:Array[Vector], qbinders:Object ) = {
- this();
- //Console.println("NWA::this(. . . . )");
- this.nstates = nstates;
- this.labels = _labels;
- this.initials = initials;
- this.finals = finals;
- this._deltaq = deltaq;
- this._defaultq = defaultq;
- this.qbinders = qbinders.asInstanceOf[Array[Vector]];
- //print();
- //System.exit(0);
- }
-
-
-
- var offset:Array[int] = _; // only used if constructed from multiple
-
- def collectLabels( nfa:Array[NondetWordAutom ] ): Unit = {
- this.labels = new HashSet();
- var i = 0;
- while(i < nfa.length) {
- this.labels.addAll( nfa( i ).labels );
- i = i + 1
- }
- }
-
- def collectOffsets( nfa:Array[NondetWordAutom] ): Unit = {
- this.offset = new Array[int]( nfa.length + 1 );
- offset( 0 ) = 1; // we have a new initial state
- var i = 0;
- while(i < nfa.length ) {
- offset( i + 1 ) = nfa( i ).nstates + offset( i );
- i = i + 1
- }
- }
-
- /** collapses several normalized NondetWordAutom objects into one.
- */
-
- def this( nfa: Array[NondetWordAutom] ) = {
- this();
- //Console.println("NWA::this(.)");
-
- //this.m
- val m = nfa.length;
- //System.out.println("enter NondetWordSwitch, "
- // +"combining " + m + " automata");
-
- collectLabels( nfa );
- collectOffsets( nfa );
-
- //Console.println(" X 1");
-
-
- this.nstates = offset( nfa.length ); //m - 1 ] + nfa[ m - 1 ].nstates;
-
-
- this.finals = new TreeMap();
-
- this.qbinders = new Array[Vector]( nstates );
-
- // new initial state gets all transitions from all initial states
-
- this._deltaq = new Array[HashMap]( nstates );
- this._defaultq = new Array[Vector]( nstates );
- //Console.println(" X 2");
-
- //TreeSet defaultqSet = new TreeSet();
- _deltaq( 0 ) = new HashMap(); // 0 = our new initial state
-
- val initials = new TreeSet();
-
- var i = 0;
- while(i < m) {
- //System.out.println("i (current NFA):"+i);
-
- val n = nfa( i );
-
- val offs = offset( i );
-
- initials.add( new Integer( offs ));
-
- n.relocate( offs,
- this.finals,
- this._deltaq,
- this._defaultq,
- this.qbinders );
- i = i + 1;
- }
-
- normalize( initials, false );
- //Console.println("Leave-NWA::this(.)");
- }
-
-
-
-
- def print(): Unit = {
-
- Console.print("NFA on labels "+ this.labels);
-
- if( offset != null ) {
- Console.print("offset");
- var k = 0;
- while(k < offset.length) {
- if( k > 0)
- Console.print(", ");
- Console.print(offset(k));
- k = k + 1;
- }
- }
- Console.println;
-
- Console.print("max state number :" + (nstates - 1) );
-
- Console.println("initials" + initials);
-
- Console.println("finals" + finals);
-
- var i = 0;
- while(i < nstates) {
- Console.print("state: " + i);
- if( finals.containsKey( new Integer( i )) ){
- Console.print("*"); //final
- }
- Console.print(" transitions: {");
- var arrows:HashMap = deltaq( i );
-
- var it = arrows.keySet().iterator();
- while(it.hasNext()) {
- val label = it.next();
- val targets = arrows.get( label ).asInstanceOf[Vector];
- val jt = targets.iterator();
- while(jt.hasNext()) {
- val p = jt.next().asInstanceOf[Integer];
- Console.print("("+label+","+p+")");
- }
- }
-
- Console.print("} ");
- Console.print(" default transitions: "+_defaultq( i ));
- if( null != qbinders )
- Console.println(" binders "+qbinders( i ));
- Console.println;
- i = i + 1;
- }
- }
-
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/Npair.scala b/sources/scala/tools/scalac/transformer/matching/Npair.scala
deleted file mode 100644
index a33bd7d77f..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/Npair.scala
+++ /dev/null
@@ -1,67 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scala.tools.scalac.transformer.matching ;
-
-import java.util.{ HashMap, TreeSet };
-/** cartesian
- */
-
-/** Int x TreeSet[ Int ]
- */
-case class Npair(nstate: Integer, nset: TreeSet) {
-
- override def equals(that: Any): Boolean = {
- this match {
- case Npair(nstate, nset) =>
- that match {
- case Npair(_nstate, _nset) =>
- return ((nstate == _nstate)
- && (nset == _nset));
- case _ => return false
- }
- case _ => return false
- }
- }
-
- override def toString(): String = this match {
- case Npair(nstate, nset) =>
- //Integer dstate = (Integer) indexMap.get(nset);
- "<n" + nstate.toString() + " in " + nset /*+" = d"+dstate*/ + ">";
- case _ => null
- }
-
- def toString(indexMap: HashMap): String = {
- //assert indexMap != null;
- this match {
- case Npair(nstate, nset) =>
- //assert nstate != null;
- val dstate = indexMap.get( nset ).asInstanceOf[Integer];
- return "<n" + nstate.toString() + " in " + nset + " = d" + dstate + ">";
- case _ =>
- return null;
- }
- }
-
-
-}
-
-class NpairComparator extends StateSetComparator {
- override def compare(o1: Any, o2: Any): Int = {
- o1 match {
- case Npair(nstate, nset) => o2 match {
- case Npair(_nstate, _nset) =>
- val res = nstate.compareTo(_nstate);
- if (res != 0)
- return res;
- else
- return super.compare(nset, _nset);
- }
- }
- }
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/PartialMatcher.scala b/sources/scala/tools/scalac/transformer/matching/PartialMatcher.scala
deleted file mode 100644
index f841427049..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PartialMatcher.scala
+++ /dev/null
@@ -1,46 +0,0 @@
-import scalac.ast.Tree;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import java.util.HashMap ;
-
-package scala.tools.scalac.transformer.matching {
-
-/** container. classes AlgebraicMatcher and SequenceMatcher get input and store their results in here.
- * resembles the 'Memento' design pattern, could also be named 'Liaison'
- */
-class PartialMatcher(owner1: Symbol, root1: Tree, resultType1: Type) {
-
- /** owner of the code we create (input)
- */
- var owner: Symbol = owner1;
-
- /** the selector value (input)
- */
- var selector:Tree = root1;
-
- /** type of the result of the whole match (input)
- */
- var resultType:Type = resultType1 ;
-
- /** tree representing the matcher (output)
- */
- var tree: Tree = _ ;
-
- var pos: int = root1.pos;
-
- //assert( owner != null ) : "owner is null";
- //assert owner != Symbol.NONE ;
- //this.owner = owner;
-
- //assert root != null;
- //assert root.type != null;
- //this.selector = root;
-
- //assert this.resultType != Type.NoType;
- //this.resultType = resultType;
-
- //this.pos = root.pos; // for convenience only
-
- }
-
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala b/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala
deleted file mode 100644
index 836c46f9f5..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PatternMatcher.scala
+++ /dev/null
@@ -1,940 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import scala.tools.util.Position;
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.util._;
-import scalac.symtab._;
-//import scalac.transformer.matching.CodeFactory;
-//import scalac.transformer.matching.PatternNodeCreator;
-//import scalac.transformer.matching.PatternNode;
-//import scalac.transformer.matching.CaseEnv;
-//import scalac.transformer.matching.PatternTool;
-//import PatternNode._;
-import Tree._;
-
-package scala.tools.scalac.transformer.matching {
-
-class PatternMatcher(unit: CompilationUnit) extends PatternTool(unit) {
-
- protected var optimize = true;
- protected var delegateSequenceMatching = false;
- protected var doBinding = true;
-
- /** the owner of the pattern matching expression
- */
- protected var owner:Symbol = _ ;
-
- /** the selector expression
- */
- protected var selector: Tree = _;
-
- /** the root of the pattern node structure
- */
- protected var root: PatternNode = _;
-
- /** the symbol of the result variable
- */
- protected var resultVar: Symbol = _;
-
- /** methods to generate scala code
- */
- protected var cf: CodeFactory = _;
-
- /** methods to create pattern nodes
- */
- protected var mk: PatternNodeCreator = _;
-
- /** init method, also needed in subclass AlgebraicMatcher
- */
- def initialize(selector: Tree, owner: Symbol,
- resultType: Type, doBinding: Boolean): Unit = {
- this.mk = new PatternNodeCreator(unit, owner);
- this.cf = new CodeFactory(unit, selector.pos);
- this.root = mk.ConstrPat(selector.pos, selector.getType().widen());
- this.root.and = mk.Header(selector.pos,
- selector.getType().widen(),
- gen.Ident(selector.pos, root.symbol()));
- this.resultVar = owner.newVariable(selector.pos,
- Modifiers.MUTABLE,
- Names.result);
- this.resultVar.setType(resultType);
- this.owner = owner;
- this.selector = selector;
- this.optimize = this.optimize & (unit.global.target == Global.TARGET_JVM);
- this.doBinding = doBinding;
- }
-
- /** pretty printer
- */
- def print(): Unit = {
- new PatternNodeDebugPrinter().print(root.and, "");
- }
-
- /** enters a sequence of cases into the pattern matcher
- */
- def construct(cases: Array[Tree]): Unit = {
- //Console.println("pattern matcher.construct "+cases);
- var i = 0; while(i < cases.length) {
- enter(cases(i));
- i = i + 1
- }
- }
-
- /** enter a single case into the pattern matcher
- */
- protected def enter(caseDef: Tree): Unit = {
- caseDef match {
- case CaseDef(pat, guard, body) =>
- val env = new CaseEnv(owner, unit);
- // PatternNode matched = match(pat, root);
- val target = enter1(pat, -1, root, root.symbol(), env);
- // if (target.and != null)
- // unit.error(pat.pos, "duplicate case");
- if (null == target.and)
- target.and = mk.Body(caseDef.pos, env.getBoundVars(), guard, body);
- else if (target.and.isInstanceOf[Body])
- updateBody(target.and.asInstanceOf[Body], env.getBoundVars(), guard, body);
- else {
- //Console.println("target is "+target.getClass());
- //Console.println("target.and is "+target.and.getClass());
- //Console.println("target.or is "+target.or.getClass());
-
- unit.error(pat.pos, "duplicate case");
- }
- }
- }
-
- /** this method is only called if 2 patterns are redundant. In such
- * a case, the right body has to be chosen by means of the guards!
- * case 3 if false => "x";
- * case 3 if true => "y";
- */
- protected def updateBody(tree: Body, bound: Array[ValDef], guard: Tree , body: Tree): Unit = {
- if (tree.guard(tree.guard.length - 1) == Tree.Empty) {
- //unit.error(body.pos, "unreachable code");
- } else {
- val bd = new Array[Array[ValDef]](tree.bound.length + 1);
- val ng = new Array[Tree](tree.guard.length + 1);
- val nb = new Array[Tree](tree.body.length + 1);
- System.arraycopy(tree.bound, 0, bd, 0, tree.bound.length);
- System.arraycopy(tree.guard, 0, ng, 0, tree.guard.length);
- System.arraycopy(tree.body, 0, nb, 0, tree.body.length);
- bd(bd.length - 1) = bound;
- ng(ng.length - 1) = guard;
- nb(nb.length - 1) = body;
- tree.bound = bd ;
- tree.guard = ng ;
- tree.body = nb ;
- }
- }
-
- protected def patternArgs(tree: Tree):Array[Tree] = {
- tree match {
- case Bind(_, pat) => patternArgs(pat);
- case Apply(_, args) => if ( isSeqApply(tree.asInstanceOf[Apply])
- && !delegateSequenceMatching)
- args(0) match {
- case Sequence(ts) => ts;
- case _ => args;
- }
- else
- args
-
- case Sequence(ts) => if (!delegateSequenceMatching)
- ts;
- else
- Tree.EMPTY_ARRAY;
-
- case _ => Tree.EMPTY_ARRAY;
- }
- }
-
- /** returns true if apply is a "sequence apply". analyzer inserts Sequence nodes if something is a
- *
- * - last update: discussion with Martin 2005-02-18
- *
- * - if true, tree.fn must be ignored. The analyzer ensures that the selector will be a subtype
- * of fn; it thus assigns the expected type from the context (which is surely a subtype,
- * but may have different flags etc.
- *
- * - so should be
- * (( tree.args.length == 1 ) && tree.args(0).isInstanceOf[Sequence])
- * but fails
- */
- protected def isSeqApply( tree: Tree.Apply ): Boolean =
- (( tree.args.length == 1 ) && tree.args(0).isInstanceOf[Sequence])
- && (tree.getType().symbol().flags & Modifiers.CASE) == 0;
-
- protected def patternNode(tree:Tree , header:Header , env: CaseEnv ): PatternNode = {
- //Console.println("patternNode("+tree+","+header+")");
- //Console.println("tree.getType()"+tree.getType());
- tree match {
- case Bind(name, Typed(Ident(Names.PATTERN_WILDCARD), tpe)) => // x@_:Type
- if (header.getTpe().isSubType(tpe.getType())) {
- val node = mk.DefaultPat(tree.pos, tpe.getType());
- env.newBoundVar( tree.symbol(), tree.getType(), header.selector );
- node;
- }
- else {
- val node = mk.ConstrPat(tree.pos, tpe.getType());
- env.newBoundVar( tree.symbol(), tree.getType(), gen.Ident(tree.pos, node.casted));
- node;
- }
- case Bind(name, Ident(Names.PATTERN_WILDCARD)) => // x @ _
- val node = mk.DefaultPat(tree.pos, header.getTpe());
- if ((env != null) && (tree.symbol() != defs.PATTERN_WILDCARD))
- env.newBoundVar( tree.symbol(), tree.getType(), header.selector);
- node;
- case Bind(name, pat) =>
- //if ( tree.getType() == null ) throw new ApplicationError("Bind tpe is null"); // DEBUG
- val node = patternNode(pat, header, env);
- if ((env != null) && (tree.symbol() != defs.PATTERN_WILDCARD)) {
- val casted = node.symbol();
- val theValue = if (casted == Symbol.NONE) header.selector else gen.Ident(tree.pos, casted);
- env.newBoundVar(tree.symbol(), tree.getType(), theValue);
- }
- node;
- case t @ Apply(fn, args) => // pattern with args
- if (isSeqApply(t)) {
- if (!delegateSequenceMatching) {
- args(0) match {
- case Sequence(ts)=>
- mk.SequencePat(tree.pos, tree.getType(), ts.length);
- }
- } else {
- val res = mk.ConstrPat(tree.pos, tree.getType());
- res.and = mk.Header(tree.pos, header.getTpe(), header.selector);
- res.and.and = mk.SeqContainerPat(tree.pos, tree.getType(), args(0));
- res;
- }
- } else if ((fn.symbol() != null) &&
- fn.symbol().isStable() &&
- !(fn.symbol().isModule() &&
- ((fn.symbol().flags & Modifiers.CASE) != 0))) {
- mk.VariablePat(tree.pos, tree);
- }
- else {
- /*
- Console.println("apply but not seqApply");
- Console.println("tree.getType()="+tree.getType());
- Console.println("tree.symbol()="+tree.symbol());
- */
- mk.ConstrPat(tree.pos, tree.getType());
- }
- case t @ Typed(ident, tpe) => // variable pattern
- //Console.println("typed! header:" + header.getTpe() +" "+tpe.getType());
- val doTest = header.getTpe().isSubType(tpe.getType());
- val node = {
- if(doTest)
- mk.DefaultPat(tree.pos, tpe.getType())
- else
- mk.ConstrPat(tree.pos, tpe.getType());
- }
- if ((null != env) && (ident.symbol() != defs.PATTERN_WILDCARD))
- node match {
- case ConstrPat(casted) =>
- env.newBoundVar(t.expr.symbol(),
- tpe.getType(),
- gen.Ident(tree.pos, casted));
- case _ =>
- env.newBoundVar(t.expr.symbol(),
- tpe.getType(),
- {if(doTest) header.selector else gen.Ident(tree.pos, node.asInstanceOf[ConstrPat].casted)});
- }
- node;
-
- case Ident(name) => // pattern without args or variable
- if (tree.symbol() == defs.PATTERN_WILDCARD)
- mk.DefaultPat(tree.pos, header.getTpe());
- else if (tree.symbol().isPrimaryConstructor()) {
- throw new ApplicationError("this may not happen"); // Burak
- } else if (name.isVariable()) {// Burak
- throw new ApplicationError("this may not happen"); // Burak
- } else
- mk.VariablePat(tree.pos, tree);
-
- case Select(_, name) => // variable
- if (tree.symbol().isPrimaryConstructor())
- mk.ConstrPat(tree.pos, tree.getType());
- else
- mk.VariablePat(tree.pos, tree);
-
- case Literal(value) =>
- mk.ConstantPat(tree.pos, tree.getType(), value);
-
- case Sequence(ts) =>
- if ( !delegateSequenceMatching ) {
- //throw new ApplicationError("cannot happen:"+tree);
- //Console.println("PatternMatcher:patternNode:Sequence "+tree.getType());
- mk.SequencePat(tree.pos, tree.getType(), ts.length);
- } else {
- mk.SeqContainerPat(tree.pos, tree.getType(), tree);
- }
- case Alternative(branches) =>
- throw new ApplicationError("kicked out Alternatives");
- /*
- if(branches.length < 2)
- throw new ApplicationError("ill-formed Alternative");
- val subroot = mk.ConstrPat(header.pos, header.getTpe());
- subroot.and = mk.Header(header.pos, header.getTpe(), header.selector.duplicate());
- val subenv = new CaseEnv(owner, unit);
- var i = 0; while(i < branches.length) {
- val target = enter1(branches(i), -1, subroot, subroot.symbol(), subenv);
- target.and = mk.Body(tree.pos);
- i = i + 1
- }
- mk.AltPat(tree.pos, subroot.and.asInstanceOf[Header]);
- */
- case _ =>
- throw new ApplicationError("unit = " + unit + "; tree = "+tree);
- }
- }
-
- protected def enter(pat: Tree, index: Int, target: PatternNode, casted: Symbol, env: CaseEnv ): PatternNode = {
- target match {
- case ConstrPat(newCasted) =>
- enter1(pat, index, target, newCasted, env);
- case SequencePat(newCasted, len) =>
- enter1(pat, index, target, newCasted, env);
- case _ =>
- enter1(pat, index, target, casted, env);
- }
- }
-
- private def newHeader(pos: Int, casted: Symbol, index: Int): Header = {
- //Console.println("newHeader(pos,"+casted+","+index+")");
- //Console.println(" casted.getType()"+casted.getType());
- val ident = gen.Ident(pos, casted);
- if (casted.pos == Position.FIRSTPOS) {
- //Console.println("FIRSTPOS");
- val t = gen.mkApply_V(
- gen.Select( ident, defs.FUNCTION_APPLY( 1 )),
- Predef.Array[Tree]( gen.mkIntLit( pos, index ) ));
- val seqType = t.getType();
- mk.Header( pos, seqType, t );
- } else {
- //Console.println("NOT FIRSTPOS");
- val ts = casted.getType().symbol().asInstanceOf[ClassSymbol]
- .caseFieldAccessor(index);
- //Console.println("ts="+ts);
- val accType = casted.getType().memberType(ts);
- val accTree = gen.Select( ident, ts);
- accType match {
- // scala case accessor
- case Type.MethodType(_, _) =>
- mk.Header(pos, accType.resultType(), gen.mkApply__(accTree));
- // jaco case accessor
- case _ =>
- mk.Header(pos, accType, accTree);
- }
- }
- }
-
- /** main enter function
- *
- * invariant: ( curHeader == (Header)target.and ) holds
- */
- protected def enter1(pat: Tree, index: Int, target: PatternNode, casted: Symbol, env: CaseEnv): PatternNode = {
- //System.err.println("enter(" + pat + ", " + index + ", " + target + ", " + casted + ")");
- val patArgs = patternArgs(pat); // get pattern arguments
- var curHeader = target.and.asInstanceOf[Header]; // advance one step in IR
- if (curHeader == null) { // check if we must add new header
- //assert index >= 0 : casted;
- if (index < 0) throw new ApplicationError("error entering:" + casted);
- target.and = {curHeader = newHeader(pat.pos, casted, index); curHeader};
- curHeader.or = patternNode(pat, curHeader, env);
- enter(patArgs, curHeader.or, casted, env);
-
- } else {
- // find most recent header
- while (curHeader.next != null)
- curHeader = curHeader.next;
- // create node
- var patNode = patternNode(pat, curHeader, env);
- var next: PatternNode = curHeader;
- // add branch to curHeader, but reuse tests if possible
- while (true) {
- if (next.isSameAs(patNode)) { // patNode already present ?--> reuse
- // substitute... !!!
- patNode match {
- case ConstrPat(ocasted) =>
- env.substitute(ocasted, gen.Ident(patNode.pos,
- next.asInstanceOf[ConstrPat].casted));
- case _ =>
- }
- return enter(patArgs, next, casted, env);
- } else if (next.isDefaultPat() || // default case reached, or
- ((next.or == null) && // no more alternatives and
- (patNode.isDefaultPat() || next.subsumes(patNode)))) {
- // new node is default or subsumed
- var header = mk.Header(patNode.pos,
- curHeader.getTpe(),
- curHeader.selector);
- {curHeader.next = header; header};
- header.or = patNode;
- return enter(patArgs,
- patNode,
- casted,
- env);
- }
- else if (next.or == null) {
- return enter(patArgs, {next.or = patNode; patNode}, casted, env); // add new branch
- } else
- next = next.or;
- }
- throw new ApplicationError("must not happen");
- null // never reached
- }
- }
-
- /** calls enter for an array of patterns, see enter
- */
- protected def enter(pats:Array[Tree], target1: PatternNode , casted1: Symbol , env: CaseEnv): PatternNode = {
- var target = target1;
- var casted = casted1;
- target match {
- case ConstrPat(newCasted) =>
- casted = newCasted;
- case SequencePat(newCasted, len) =>
- casted = newCasted;
- case _ =>
- }
- var i = 0; while(i < pats.length) {
- target = enter1(pats(i), i, target, casted, env);
- i = i + 1
- }
- target;
- }
-
- protected def nCaseComponents(tree: Tree): int = {
- tree match {
- case Apply(fn, _) =>
- val tpe = tree.getType().symbol().primaryConstructor().getType();
- //Console.println("~~~ " + tree.type() + ", " + tree.type().symbol().primaryConstructor());
- tpe match {
- // I'm not sure if this is a good idea, but obviously, currently all case classes
- // without constructor arguments have type NoType
- case Type.NoType =>
- throw new ApplicationError("this cannot happen");
- 0
- case Type.MethodType(args, _) =>
- args.length;
- case Type.PolyType(tvars, Type.MethodType(args, _)) =>
- args.length;
- case Type.PolyType(tvars, _) =>
- 0;
- case _ =>
- throw new ApplicationError("not yet implemented;" +
- "pattern matching for " + tree + ": " + tpe);
- }
- }
- return 0;
- }
-
-
- //////////// generator methods
-
- def toTree(): Tree = {
- if (optimize && isSimpleIntSwitch())
- intSwitchToTree();
- else if (false /* optimize && isSimpleSwitch() */) // disabled
- switchToTree();
- else {
- //print();
- generalSwitchToTree();
- }
- }
-
-
- protected def isSimpleIntSwitch(): Boolean = {
- if (selector.getType().widen().isSameAs(defs.int_TYPE())) {
- var patNode = root.and;
- while (patNode != null) {
- var node = patNode;
- while (({node = node.or; node}) != null) {
- node match {
- case ConstantPat(_) => ;
- case _ =>
- return false;
- }
- node.and match {
- case _b:Body =>
- if ((_b.guard.length > 1) ||
- (_b.guard(0) != Tree.Empty) ||
- (_b.bound(0).length > 0))
- return false;
- case _ =>
- return false;
- }
- }
- patNode = patNode.nextH();
- }
- return true;
- } else
- return false;
- }
-
-
- protected def numCases(patNode1: PatternNode): Int = {
- var patNode = patNode1;
- var n = 0;
- while (({patNode = patNode.or; patNode}) != null)
- patNode match {
- case DefaultPat() => ;
- case _ =>
- n = n + 1;
- }
- n;
- }
-
- protected def _defaultBody(patNode1: PatternNode, otherwise: Tree ): Tree = {
- var patNode = patNode1;
- while (patNode != null) {
- var node = patNode;
- while (({node = node.or; node}) != null)
- node match {
- case DefaultPat() =>
- return node.and.bodyToTree();
- case _ =>
- }
- patNode = patNode.nextH();
- }
- otherwise;
- }
-
- /** This method translates pattern matching expressions that match
- * on integers on the top level.
- */
- def intSwitchToTree(): Tree = {
-
- case class TagBodyPair(tag: Int, body: Tree, next: TagBodyPair) {
- def length(): Int = {
- if (null == next) 1 else (next.length() + 1);
- }
- }
- def insert(tag: Int, body: Tree, current: TagBodyPair): TagBodyPair = {
- if (current == null)
- return new TagBodyPair(tag, body, null);
- else if (tag > current.tag)
- return new TagBodyPair(current.tag, current.body, insert(tag, body, current.next));
- else
- return new TagBodyPair(tag, body, current);
- }
- //print();
- val ncases = numCases(root.and);
- val matchError = cf.ThrowMatchError(selector.pos, resultVar.getType());
- // without a case, we return a match error if there is no default case
- if (ncases == 0)
- return _defaultBody(root.and, matchError);
- // for one case we use a normal if-then-else instruction
- else if (ncases == 1) {
- root.and.or match {
- case ConstantPat(value) =>
- return gen.If(cf.Equals(selector,
- gen.Literal(root.and.or.pos, value)),
- (root.and.or.and).bodyToTree(),
- _defaultBody(root.and, matchError));
- case _ =>
- return generalSwitchToTree();
- }
- }
- //
- // if we have more than 2 cases than use a switch statement
-
- val _h:Header = root.and.asInstanceOf[Header];
- val next = _h.next;
- var mappings: TagBodyPair = null;
- var defaultBody = matchError;
- var patNode = root.and;
-
- // convert or-branches to sorted list of tag-body pairs
-
- while (patNode != null) {
- var node = patNode.or;
- while (node != null) {
- node match {
- case DefaultPat() =>
- if (defaultBody != null)
- throw new ApplicationError(); // shouldn't happen
- defaultBody = node.and.bodyToTree();
- node = node.or;
-
- case ConstantPat(AConstant.INT(value))=>
- mappings = insert(value, node.and.bodyToTree(), mappings);
- node = node.or;
-
- case _ =>
- throw new ApplicationError(node.toString());
- }
- }
- patNode = patNode.nextH();
- }
- /* mappings != null because numCases(...) > 2
- * so there were at least 2 or-branches
- */
- var n = mappings.length();
- val tags = new Array[Int](n);
- val bodies = new Array[Tree](n);
- n = 0;
- while (mappings != null) {
- tags(n) = mappings.tag;
- bodies(n) = mappings.body;
- n = n + 1;
- mappings = mappings.next;
- }
- return gen.Switch(selector,tags, bodies, defaultBody, resultVar.getType());
- }
-
- def generalSwitchToTree(): Tree = {
- val ts = Predef.Array[Tree] (
- gen.ValDef(root.symbol(), selector),
- gen.ValDef(resultVar, gen.mkDefaultValue(selector.pos, resultVar.getType())));
- val res = gen.If(
- selector.pos,
- toTree(root.and),
- gen.Ident(selector.pos, resultVar),
- cf.ThrowMatchError(selector.pos, resultVar.getType(), gen.Ident(selector.pos, root.symbol())));
- return gen.mkBlock(selector.pos, ts, res);
- }
-
- def toTree(node1: PatternNode): Tree = {
- def optimize1(selType:Type, alternatives1: PatternNode ): boolean = {
- var alts = alternatives1;
- if (!optimize || !selType.isSubType(defs.SCALAOBJECT_TYPE()))
- return false;
- var cases = 0;
- while (alts != null) {
- alts match {
- case ConstrPat(_) =>
- if (alts.getTpe().symbol().isCaseClass())
- cases = cases +1;
- else
- return false;
-
- case DefaultPat() =>
- ;
- case _ =>
- return false;
- }
- alts = alts.or;
- }
- return cases > 2;
- }
-
- var node = node1;
- var res = gen.mkBooleanLit(node.pos, false);
-
- while (node != null)
- node match {
- case _h:Header =>
- val selector = _h.selector;
- val next = _h.next;
- //res = cf.And(mkNegate(res), toTree(node.or, selector));
- //Console.println("HEADER TYPE = " + selector.type);
-
- /* TEST
- next match {
- case _b:Body if ((_b.guard.length > 1) ||
- (_b.guard(0) != Tree.Empty)) =>
- Console.println("guard! = "+_b.guard(0));
- case _ =>
- }
- */
-
- if (optimize1(node.getTpe(), node.or))
- res = cf.Or(res, toOptTree(node.or, selector));
- else
- res = cf.Or(res, toTree(node.or, selector));
- node = next;
-
- case _b:Body =>
- var bound = _b.bound;
- val guard = _b.guard;
- val body = _b.body;
- if ((bound.length == 0) &&
- (guard.length == 0) &&
- (body.length == 0)) {
- return gen.mkBooleanLit(node.pos, true); // cf.Or(res, gen.mkBooleanLit(node.pos, true));
- } else if (!doBinding)
- bound = Predef.Array[Array[ValDef]]( Predef.Array[ValDef]() );
- var i = guard.length - 1; while(i >= 0) {
- val ts = bound(i).asInstanceOf[Array[Tree]];
- var res0 = gen.mkBlock(gen.Assign(gen.Ident(body(i).pos, resultVar),
- body(i)),
- gen.mkBooleanLit(body(i).pos, true));
- if (guard(i) != Tree.Empty)
- res0 = cf.And(guard(i), res0);
- res = cf.Or(gen.mkBlock(body(i).pos, ts, res0), res);
- i = i - 1
- }
- return res;
- }
- return res;
- }
-
- protected def toOptTree(node1: PatternNode, selector: Tree): Tree = {
-
- class TagNodePair(tag1: int, node1: PatternNode, next1: TagNodePair) {
- var tag: int = tag1;
- var node: PatternNode = node1;
- var next: TagNodePair = next1;
-
- def length(): Int = {
- return if (null == next) 1 else (next.length() + 1);
- }
- }
- def insertNode(tag:int , node:PatternNode , current:TagNodePair ): TagNodePair = {
- def insert(tag: Int, node: PatternNode, current: TagNodePair): TagNodePair = {
- if (current == null)
- return new TagNodePair(tag, node, null);
- else if (tag > current.tag)
- return new TagNodePair(current.tag, current.node, insert(tag, node, current.next));
- else if (tag == current.tag) {
- val old = current.node;
- current.node = node;
- node.or = old;
- return current;
- } else
- return new TagNodePair(tag, node, current);
- } // def insert
- val newnode = node.dup();
- newnode.or = null;
- return insert(tag, newnode, current);
- } // def insertNode
-
- var node = node1;
- //System.err.println("pm.toOptTree called"+node);
- var cases: TagNodePair = null;
- var defaultCase: PatternNode = null;
- while (node != null)
- node match {
- case ConstrPat(casted) =>
- cases = insertNode(node.getTpe().symbol().tag(), node, cases);
- node = node.or;
-
- case DefaultPat() =>
- defaultCase = node;
- node = node.or;
- }
- var n = cases.length();
- val tags = new Array[int](n);
- val bodies = new Array[Tree](n);
- n = 0;
- while (null != cases) {
- tags(n) = cases.tag;
- bodies(n) = toTree(cases.node, selector);
- n = n + 1;
- cases = cases.next;
- }
- return gen.Switch(gen.mkApply__(gen.Select(selector.duplicate(), defs.SCALAOBJECT_TAG())),
- tags,
- bodies,
- { if (defaultCase == null) gen.mkBooleanLit(selector.pos, false) else toTree(defaultCase.and) },
- defs.boolean_TYPE());
- }
-
- protected def toTree(node:PatternNode , selector:Tree ): Tree = {
- //System.err.println("pm.toTree("+node+","+selector+")");
- if (node == null)
- return gen.mkBooleanLit(selector.pos, false);
- else
- node match {
- case DefaultPat() =>
- return toTree(node.and);
-
- case ConstrPat(casted) =>
- return gen.If(gen.mkIsInstanceOf(selector.duplicate(), node.getTpe()),
- gen.mkBlock(gen.ValDef(casted,
- gen.mkAsInstanceOf(selector.pos, selector.duplicate(), node.getTpe(), true)),
- toTree(node.and)),
- toTree(node.or, selector.duplicate()));
- case SequencePat(casted, len) =>
- return
- cf.Or(
- cf.And(
- cf.And(gen.mkIsInstanceOf(selector.duplicate(), node.getTpe()),
- cf.Equals(gen.mkApply__(gen.Select(gen.mkAsInstanceOf(selector.pos, selector.duplicate(), node.getTpe(), true),
- defs.SEQ_LENGTH())),
- gen.mkIntLit(selector.pos, len))),
- gen.mkBlock(gen.ValDef(casted,
- gen.mkAsInstanceOf(selector.pos, selector.duplicate(), node.getTpe(), true)),
- toTree(node.and))),
- toTree(node.or, selector.duplicate()));
- case ConstantPat(value) =>
- return gen.If(cf.Equals(selector.duplicate(),
- gen.Literal(selector.pos, value)),
- toTree(node.and),
- toTree(node.or, selector.duplicate()));
- case VariablePat(tree) =>
- return gen.If(cf.Equals(selector.duplicate(), tree),
- toTree(node.and),
- toTree(node.or, selector.duplicate()));
- /*
- case AltPat(header) =>
- return gen.If(toTree(header),
- toTree(node.and),
- toTree(node.or, selector.duplicate()));
- */
- }
- }
-
-
- protected def isSimpleSwitch(): Boolean = {
- /*
-
- case class Break(res:Boolean) extends java.lang.Throwable;
- case class Break2() extends java.lang.Throwable;
-
-
- print();
- var patNode = root.and;
- while (patNode != null) {
- var node = patNode;
- while (({node = node.or; node}) != null) {
- node match {
- case VariablePat(tree) =>
- Console.println(((tree.symbol().flags & Modifiers.CASE) != 0));
- case ConstrPat(_) =>
- Console.println(node.getTpe().toString() + " / " + ((node.getTpe().symbol().flags & Modifiers.CASE) != 0));
- var inner = node.and;
- def funct(inner: PatternNode): Boolean = {
- //outer: while (true) {
- inner match {
- case _h:Header =>
- if (_h.next != null)
- throw Break(false);
- funct(inner.or)
-
- case DefaultPat() =>
- funct(inner.and);
-
- case b:Body =>
- if ((b.guard.length > 1) ||
- (b.guard(0) != Tree.Empty))
- throw Break(false);
-
- throw Break2() // break outer
- case _ =>
- Console.println(inner);
- throw Break(false);
- }
- }
- var res = false;
- var set = false;
- try {
- funct(inner)
- } catch {
- case Break(res1) =>
- res = res1;
- set = true;
- case Break2() =>
- }
- if(set) return res;
- case _ =>
- return false;
- }
- }
- patNode = patNode.nextH();
- }
- return true;
- */
- return false;
- }
-
- def switchToTree(): Tree = {
- throw new Error();
- }
-
-}
-}
-
-/* idea::
-
- case class BooleanTree(x:Tree) {
- def &&&(z:BooleanTree) = new BooleanTree(cf.And(x,z.x));
- def |||(z:BooleanTree) = new BooleanTree(cf.Or(x,z.x));
- }
- def view(x:Tree): BooleanTree = new BooleanTree(x);
- def view(x:BooleanTree): Tree = x.x;
-
- def view(x:Symbol): AssignableTree = new AssignableTree(x);
- case class AssignableTree(x:Symbol) {
- def := (z:Tree) = gen.Assign(gen.Ident(z.pos, x), z);
- }
-
- def view(x:Tree): TestableTree = new TestableTree(x);
- case class TestableTree(x:Tree) {
- def __isOf__ (z:Type) = gen.mkIsInstanceOf(x, z)
- }
-
- def view(x:Tree): CastableTree = new CastableTree(x);
- case class CastableTree(x:Tree) {
- def __castTo__ (z:Type) = gen.mkAsInstanceOf(x, z)
- }
-
- def view(x:Tree): EquatableTree = new EquatableTree(x);
- case class EquatableTree(x:Tree) {
- def === (z:Tree) = cf.Equals(x,z)
- }
-
- def view(x:Tree): SelectableTree = new SelectableTree(x);
- case class SelectableTree(x:Tree) {
- def __dot__ (z:Symbol) = gen.Select(x, z)
- }
-
- def view(x:Symbol): ValDefableTree = new ValDefableTree(x);
- case class ValDefableTree(x:Symbol) {
- def __valdef__ (z:Tree) = gen.ValDef(x,z);
- }
-
- protected def toTree(node:PatternNode , _selector:Tree ): Tree = {
-
- def selector() = _selector.duplicate();
- def pos() = _selector.pos;
-
- //System.err.println("pm.toTree("+node+","+selector+")");
- if (node == null)
- return gen.mkBooleanLit(pos(), false);
- else
- node match {
- case DefaultPat() =>
- return toTree(node.and);
-
- case ConstrPat(casted) =>
- return gen.If(selector() __isOf__ node.getTpe(),
- gen.mkBlock(casted __valdef__ (selector() __castTo__ node.getTpe()),
- toTree(node.and)),
- toTree(node.or, selector()));
-
- case SequencePat(casted, len) =>
- return gen.If((selector() __isOf__ node.getTpe()) &&&
- (gen.mkApply__(selector() __castTo__ node.getTpe() __dot__ (defs.SEQ_LENGTH())) === gen.mkIntLit(pos(), len)),
- gen.mkBlock(casted __valdef__ (selector() __castTo__ node.getTpe()),
- toTree(node.and)),
- toTree(node.or, selector()));
- case ConstantPat(value) =>
- return gen.If(selector() === gen.Literal(pos(), value),
- toTree(node.and),
- toTree(node.or, selector()));
- case VariablePat(tree) =>
- return gen.If(selector() === tree,
- toTree(node.and),
- toTree(node.or, selector()));
- case AltPat(header) =>
- return gen.If(toTree(header),
- toTree(node.and),
- toTree(node.or, selector()));
- case _ =>
- throw new ApplicationError();
- }
- }
-*/
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternNode.scala b/sources/scala/tools/scalac/transformer/matching/PatternNode.scala
deleted file mode 100644
index f6a80be95c..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PatternNode.scala
+++ /dev/null
@@ -1,249 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import scala.tools.util.Position;
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.symtab._;
-import scalac.typechecker._;
-
-package scala.tools.scalac.transformer.matching {
-
-/** Intermediate data structure for algebraic + pattern matcher
- */
- class PatternNode {
- var pos = Position.FIRSTPOS;
- var tpe: Type = _;
- var or: PatternNode = _;
- var and: PatternNode = _;
-
- def bodyToTree(): Tree = this match {
- case _b:Body =>
- return _b.body(0);
- }
-
- def getTpe(): Type = {
- tpe;
- }
- def setType(tpe: Type): Unit = {
- this.tpe = tpe;
- }
-
- def dup(): PatternNode = {
- var res: PatternNode = _;
- this match {
- case h:Header =>
- res = new Header(h.selector, h.next);
-
- case b:Body=>
- res = new Body(b.bound, b.guard, b.body);
-
- case DefaultPat() =>
- res = DefaultPat();
-
- case ConstrPat(casted) =>
- res = ConstrPat(casted);
-
- case SequencePat(casted, len) =>
- res = SequencePat(casted, len);
-
- case SeqContainerPat(casted, seqpat) =>
- res = SeqContainerPat(casted, seqpat);
-
- case ConstantPat(value) =>
- res = ConstantPat(value);
-
- case VariablePat(tree) =>
- res = VariablePat(tree);
-
- //case AltPat(subheader) =>
- // res = AltPat(subheader);
-
- case _ =>
- throw new ApplicationError();
- }
- res.pos = pos;
- res.tpe = tpe;
- res.or = or;
- res.and = and;
- return res;
- }
-
- def symbol(): Symbol = {
- this match {
- case ConstrPat(casted) =>
- return casted;
- case SequencePat(casted, _) =>
- return casted;
- case SeqContainerPat(casted, _) =>
- return casted;
- case _ =>
- return Symbol.NONE;
- }
- }
-
- def nextH(): PatternNode = {
- this match {
- case _h:Header =>
- return _h.next;
- case _ =>
- return null;
- }
- }
-
- def isDefaultPat(): boolean = {
- this match {
- case DefaultPat() =>
- return true;
- case _ =>
- return false;
- }
- }
-
- /** returns true if
- * p and q are equal (constructor | sequence) type tests, or
- * "q matches" => "p matches"
- */
- def isSameAs(q: PatternNode): boolean = {
- //Console.println("isSameAs("+this+","+q+")");
- this match {
- case ConstrPat(_) =>
- q match {
- case ConstrPat(_) =>
- q.getTpe().isSameAs(this.getTpe());
- case _ =>
- false
- }
- case SequencePat(_, plen) =>
- q match {
- case SequencePat(_, qlen) =>
- return (plen == qlen) && q.getTpe().isSameAs(this.getTpe());
- case _ =>
- false
- }
- case _ =>
- subsumes(q);
- }
- }
-
- /** returns true if "q matches" => "p matches"
- */
- def subsumes(q:PatternNode): Boolean = {
- //Console.print("subsumes("+this+","+q+")");
- /* val res = */
- this match {
- case DefaultPat() =>
- q match {
- case DefaultPat() =>
- true;
- case _ =>
- false;
- }
- case ConstrPat(_) =>
- q match {
- case ConstrPat(_) =>
- q.getTpe().isSubType(this.getTpe());
- case _ =>
- false;
- }
- case SequencePat(_, plen) =>
- q match {
- case SequencePat(_, qlen) =>
- (plen == qlen) && q.getTpe().isSubType(this.getTpe());
- case _ =>
- false;
- }
- case ConstantPat(pval) =>
- q match {
- case ConstantPat(qval) =>
- pval == qval;
- case _ =>
- false;
- }
- case VariablePat(tree) =>
- q match {
- case VariablePat(other) =>
- val treesym = tree match {
- case _: Tree.Apply => TreeInfo.methSymbol( tree );
- case _ => tree.symbol()
- }
- val othersym = tree match {
- case _: Tree.Apply => TreeInfo.methSymbol( other );
- case _ => other.symbol()
- }
-/*
- Console.println("VPat, getc = "+tree.getClass());
- Console.println("[tree.symbol() = "+tree.symbol());
- if (tree.symbol() != null) {
- Console.println("[other.symbol() = "+other.symbol());
- Console.println("[ ==? "+(tree.symbol() == other.symbol()));
-
- Console.println("\n\n[treesym != null? "+ tree.symbol() != null);
- Console.println("\n\n[!treesym.isNone? "+ !tree.symbol().isNone());
- Console.println("\n\n[!treesym.isError? "+ !tree.symbol().isError());
- }
-*/
- (treesym != null) &&
- (!treesym.isNone()) &&
- (!treesym.isError()) &&
- (treesym == othersym);
- case _ =>
- false;
- }
- case _ =>
- false;
- }
- /*Console.println("="+res);
- return res;*/
- }
-
- override def toString(): String = {
- this match {
- case _h:Header =>
- return "Header(" + _h.selector + ")";
- case _b:Body =>
- return "Body";
- case DefaultPat() =>
- return "DefaultPat";
- case ConstrPat(casted) =>
- return "ConstrPat(" + casted + ")";
- case SequencePat(casted, len) =>
- return "SequencePat(" + casted + ", " + len + "...)";
- case SeqContainerPat(casted, seqpat) =>
- return "SeqContainerPat(" + casted + ", " + seqpat + ")";
- case ConstantPat(value) =>
- return "ConstantPat(" + value + ")";
- case VariablePat(tree) =>
- return "VariablePat";
- case _ =>
- return "<unknown pat>";
- }
- }
- }
-
- class Header(sel1: Tree, next1: Header ) extends PatternNode {
- var selector: Tree = sel1;
- var next: Header = next1;
- }
-
- class Body(bound1: Array[Array[Tree.ValDef]] , guard1:Array[Tree] , body1:Array[Tree] ) extends PatternNode {
- var bound = bound1;
- var guard = guard1;
- var body = body1;
- }
-
- case class DefaultPat()extends PatternNode;
- case class ConstrPat(casted:Symbol )extends PatternNode;
- case class ConstantPat(value:AConstant )extends PatternNode;
- case class VariablePat(tree:Tree )extends PatternNode;
- //case class AltPat(subheader:Header )extends PatternNode;
- case class SequencePat( casted:Symbol, len:int)extends PatternNode; // only used in PatternMatcher
- case class SeqContainerPat(casted:Symbol , seqpat:Tree)extends PatternNode; // in AlgebraicMatcher
- }
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternNodeCreator.scala b/sources/scala/tools/scalac/transformer/matching/PatternNodeCreator.scala
deleted file mode 100644
index fdda3f01ab..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PatternNodeCreator.scala
+++ /dev/null
@@ -1,109 +0,0 @@
-import scala.tools.util.Position;
-
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.util._;
-import scalac.symtab._;
-//import PatternNode._;
-import Tree._;
-
-import java.util.Vector ;
-
-package scala.tools.scalac.transformer.matching {
-
- /** PatternNode factory.
- * we inherit the globals from PatternTool.
- */
-
- class PatternNodeCreator(unit:CompilationUnit, val owner:Symbol)
- extends PatternTool(unit) {
-
- /** the owner of the variable symbols that might be created */
- //Symbol owner;
-
- def SequencePat(pos: Int , tpe:Type , len:int) = {
- val sym = newVar(Position.FIRSTPOS, tpe);
- val node = new SequencePat(sym, len);
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def SeqContainerPat(pos: int, tpe: Type, seqpat:Tree ) = {
- val sym = newVar(Position.NOPOS, tpe);
- val node = new SeqContainerPat(sym, seqpat);
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def DefaultPat(pos: int, tpe: Type) = {
- val node = new DefaultPat();
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def ConstrPat(pos: int, tpe: Type) = {
- val node = new ConstrPat(newVar(pos, tpe));
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def ConstantPat(pos: int, tpe: Type, value:AConstant ) = {
- val node = new ConstantPat( value );
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def VariablePat(pos: int, tree:Tree) = {
- val node = new VariablePat( tree );
- node.pos = pos;
- node.setType(tree.getType());
- node;
- }
- /*
- def AltPat(pos: int, header:Header ) = {
- val node = new AltPat(header);
- node.pos = pos;
- node.setType(header.getTpe());
- node;
- }
- */
- // factories
-
- def Header(pos: int, tpe: Type, selector:Tree) = {
- val node = new Header(selector, null);
- node.pos = pos;
- node.setType(tpe);
- node;
- }
-
- def Body(pos: int) = {
- val node = new Body(new Array[Array[ValDef]](0), new Array[Tree](0), new Array[Tree](0));
- node.pos = pos;
- node;
- }
-
- def Body(pos: int, bound:Array[ValDef] , guard:Tree, body:Tree) = {
- val node = new Body(Predef.Array[Array[ValDef]](bound), Predef.Array[Tree](guard), Predef.Array[Tree](body));
- node.pos = pos;
- node;
- }
-
- def newVar(pos: int, name: Name, tpe: Type): Symbol= {
- val sym = owner.newVariable(pos, 0, name);
- sym.setType(tpe);
- //System.out.println("PatternNodeCreator::newVar creates symbol "+sym);
- //System.out.println("owner: "+sym.owner());
- sym;
- }
-
- def newVar(pos: int, tpe: Type): Symbol = {
- newVar(pos, fresh.newName("temp"), tpe);
- }
- }
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternNodeDebugPrinter.scala b/sources/scala/tools/scalac/transformer/matching/PatternNodeDebugPrinter.scala
deleted file mode 100644
index c2a4c459e8..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PatternNodeDebugPrinter.scala
+++ /dev/null
@@ -1,118 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-
-import scala.tools.util.Position;
-import scalac._;
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.util._;
-import scalac.symtab._;
-//import scalac.transformer.matching.CodeFactory;
-//import scalac.transformer.matching.PatternNodeCreator;
-//import scalac.transformer.matching.PatternNode;
-//import scalac.transformer.matching.CaseEnv;
-//import scalac.transformer.matching.PatternTool;
-//import PatternNode._;
-import Tree._;
-
-package scala.tools.scalac.transformer.matching {
-
- class PatternNodeDebugPrinter() {
-
- def print(patNode: PatternNode, indent: String): Unit = {
-
- def newIndent(s: String) = {
- val removeBar: Boolean = (null == patNode.or);
- val sb = new StringBuffer();
- sb.append(indent);
- if (removeBar)
- sb.setCharAt(indent.length() - 1, ' ');
- var i = 0; while (i < s.length()) {
- sb.append(' ');
- i = i + 1
- }
- sb.toString()
- }
-
- if (patNode == null)
- System.out.println(indent + "NULL");
- else
- patNode match {
-
- case _h: Header =>
- val selector = _h.selector;
- val next = _h.next;
- Console.println(indent + "HEADER(" + patNode.getTpe() +
- ", " + selector + ")");
- print(patNode.or, indent + "|");
- if (next != null)
- print(next, indent);
-
- case ConstrPat(casted) =>
- val s = "-- " + patNode.getTpe().symbol().name +
- "(" + patNode.getTpe() + ", " + casted + ") -> ";
- val nindent = newIndent(s);
- Console.println(nindent + s);
- print(patNode.and, nindent);
- if (patNode.or != null)
- print(patNode.or, indent);
-
- case SequencePat( casted, plen ) =>
- val s = "-- " + patNode.getTpe().symbol().name + "(" +
- patNode.getTpe() +
- ", " + casted + ", " + plen + ") -> ";
- val nindent = newIndent(s);
- Console.println(indent + s);
- print(patNode.and, nindent);
- if (patNode.or != null)
- print(patNode.or, indent);
-
- case DefaultPat() =>
- Console.println(indent + "-- _ -> ");
- print(patNode.and, indent.substring(0, indent.length() - 1) +
- " ");
- if (patNode.or != null)
- print(patNode.or, indent);
-
- case ConstantPat(value) =>
- val s = "-- CONST(" + value + ") -> ";
- val nindent = newIndent(s);
- Console.println(indent + s);
- print(patNode.and, nindent);
- if (patNode.or != null)
- print(patNode.or, indent);
-
- case VariablePat(tree) =>
- val s = "-- STABLEID(" + tree + ": " + patNode.getTpe() + ") -> ";
- val nindent = newIndent(s);
- Console.println(indent + s);
- print(patNode.and, nindent);
- if (patNode.or != null)
- print(patNode.or, indent);
-
- /*
- case AltPat(header) =>
- Console.println(indent + "-- ALTERNATIVES:");
- print(header, indent + " * ");
- print(patNode.and, indent + " * -> ");
- if (patNode.or != null)
- print(patNode.or, indent);
-*/
- case _b:Body =>
- if ((_b.guard.length == 0) && (_b.body.length == 0))
- Console.println(indent + "true");
- else
- Console.println(indent + "BODY(" + _b.body.length + ")");
-
- }
- } // print
-
- } // class PatternNodeDebugPrinter
-
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/PatternTool.scala b/sources/scala/tools/scalac/transformer/matching/PatternTool.scala
deleted file mode 100644
index d71a9e384a..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/PatternTool.scala
+++ /dev/null
@@ -1,88 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import scalac.ApplicationError;
-import scalac.CompilationUnit;
-//import scalac.ast.TreeGen;
-//import scalac.util.*;
-//import scalac.symtab.*;
-import scalac.ast.Tree;
-import scalac.symtab.Symbol;
-import scalac.util.Name;
-
-package scala.tools.scalac.transformer.matching {
-/** this class takes care of tedious stuff which has nothing to do with
- * matching
- */
- abstract class PatternTool(unit: CompilationUnit) {
-
- def containsBinding(pat: Tree): Boolean = {
- var generatedVars = false;
-
- def handleVariableSymbol(sym: Symbol): Unit =
- if (sym.name.toString().indexOf("$") == -1) {
- generatedVars = true; // .add(sym);
- }
-
- def isVariableName(name: Name): Boolean =
- ( name.isVariable() ) && ( name != Name.fromString("_") ) ;
-
- def isVariableSymbol(sym: Symbol): Boolean =
- ( sym != null )&&( !sym.isPrimaryConstructor() );
-
- def traverse1(trees: Array[Tree]): Unit = {
- var i = 0; while(i < trees.length) {
- traverse(trees(i));
- i = i + 1
- }
- }
- def traverse(tree: Tree): Unit = {
-
- import Tree._ ;
-
- tree match {
- case x @ Ident(name) =>
- if(x.symbol() != unit.global.definitions.PATTERN_WILDCARD)
- throw new ApplicationError("shouldn't happen?!");
-
- case Bind(name, subtree) =>
- var sym: Symbol = _;
-
- if (isVariableName(name)
- && isVariableSymbol( {sym = tree.symbol(); tree.symbol()} ))
- handleVariableSymbol(sym);
-
- traverse( subtree );
-
- // congruence
- case Apply(fun, args) =>
- traverse1(args);
- case Sequence(trees) =>
- traverse1(trees);
- case Typed(expr, tpe) => // needed??
- traverse(expr);
- case _ : Alternative | _ : Select | _ : Literal => ; // no variables
-
- case _ =>
- throw new ApplicationError(
- "unknown pattern node:" + tree + " = " + tree.getClass());
- }
- }
- traverse(pat);
- generatedVars;
- }
-
- final def fresh = unit.fresh;
-
- final def gen = unit.global.treeGen;
-
- final def defs = unit.global.definitions;
-
- } // class PatternTool
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/RightTracerInScala.scala b/sources/scala/tools/scalac/transformer/matching/RightTracerInScala.scala
deleted file mode 100644
index 2958da8e03..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/RightTracerInScala.scala
+++ /dev/null
@@ -1,551 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import Tree._;
-
-import java.util._ ;
-import Scope.SymbolIterator;
-
-import scalac.util.Name ;
-import scalac.util.Names ;
-
-import scala.tools.util.Position;
-
-package scala.tools.scalac.transformer.matching {
-
- /** translate right tracer to code
- * @param dfa determinized left tracer
- * @param left nondeterm. left tracer (only needed for variables!)
- * @param cf ...
- * @param pat ?
- * @param elementType ...
- */
-class RightTracerInScala(dfa: DetWordAutom, seqVars: Set, owner: Symbol, cf: CodeFactory, pat:Tree, elementType: Type)
-extends TracerInScala(dfa, elementType, owner, cf) {
-
-
- final def collectVars(pat: Tree): HashSet = {
- var vars = new HashSet();
-
- def handleVariableSymbol(sym: Symbol): Unit = {
- vars.add( sym );
- }
- def isVariableName(name: Name): Boolean = {
- ( name.isVariable() ) && ( name != Name.fromString("_") ) ;
- }
- def isVariableSymbol(sym: Symbol): Boolean = {
- ( sym != null )&&( !sym.isPrimaryConstructor() );
- }
-
- def traverse1(trees: Array[Tree]): Unit = {
- var i = 0; while(i < trees.length) {
- traverse(trees(i));
- i = i + 1
- }
- }
- def traverse(tree: Tree): Unit = {
- import Tree._ ;
- tree match {
- case x @ Ident(name)=>
- if(x.symbol() != cf.unit.global.definitions.PATTERN_WILDCARD)
- throw new ApplicationError("shouldn't happen?!");
- case Bind(name, subtree) =>
- var sym: Symbol = _;
- if( isVariableName( name )
- && isVariableSymbol( {sym = tree.symbol(); tree.symbol()} ))
- handleVariableSymbol( sym );
-
- traverse( subtree );
-
- // congruence cases
- case Apply(fun, args) =>
- traverse1(args);
- case Sequence(trees) =>
- traverse1(trees);
- case Typed(expr, tpe) => // needed??
- traverse(expr);
- case _ : Alternative | _ : Select | _ : Literal => ; // no variables
- case _ =>
- throw new ApplicationError("unknown pattern node:"+tree+" = "+tree.getClass());
- }
- }
- traverse( pat );
- return vars;
- }
-
- //final def defs = cf.defs;
-
- val allVars: Set = collectVars( pat );
-
- var varsToExport: Set = new HashSet(); // @todo HANDLE seqVars THESE GLOBALLY INSTEAD OF LOCALLY
-
- varsToExport.addAll( allVars );
- varsToExport.removeAll( seqVars );
-
- var targetSym:Symbol = _;
-
- var helpMap = new HashMap();
- var helpMap2 = new HashMap();
- var helpVarDefs = new TreeList();
-
- val it = seqVars.iterator();
- while(it.hasNext()) {
- makeHelpVar( it.next().asInstanceOf[Symbol] );
- }
-
- val jt = allVars.iterator();
- while(jt.hasNext()) {
- val varSym = jt.next().asInstanceOf[Symbol];
- if(( varSym.name.toString().indexOf("$") == -1 )
- && ( !seqVars.contains( varSym ))) {
- makeHelpVar( varSym, true );
- }
- }
-
- //System.out.println("allVars: "+allVars);
- //System.out.println("seqVars: "+seqVars);
- //System.out.println("helpVarDefs now: "+helpVarDefs);
-
- initializeSyms();
-
- def makeHelpVar(realVar: Symbol): Unit = {
- makeHelpVar( realVar, false );
- }
-
- /** makes a helpvar and puts mapping into helpMap, ValDef into helpVarDefs
- */
-
- def makeHelpVar(realVar: Symbol, keepType: Boolean): Unit = {
- val helpVar = owner.newVariable( cf.pos,
- 0,
- cf.fresh.newName( realVar.name
- .toString()+"RTIS" ));
- var rhs: Tree = _;
-
- //System.out.println("RTiS making helpvar : "+realVar+" -> "+helpVar);
-
- if( keepType ) {
- helpVar.setType( realVar.getType() );
- rhs = gen.mkDefaultValue( cf.pos, realVar.getType() );
- } else {
- helpVar.setType( defs.LIST_TYPE(elementType) );
- rhs = gen.mkNil( cf.pos );
- }
-
- helpMap.put( realVar, helpVar );
- helpVar.flags = helpVar.flags | Modifiers.MUTABLE;
- val varDef = gen.ValDef( helpVar, rhs );
- //((ValDef) varDef).kind = Kinds.VAR;
- helpVarDefs.append( varDef );
-
- }
-
- def prependToHelpVar(realVar: Symbol, elem:Tree): Tree = {
- val hv = refHelpVar( realVar );
- gen.Assign( hv, gen.mkNewCons( cf.pos, elementType, elem, hv ));
- /*
- return cf.Block(pos,
- new Tree [] {
- cf.debugPrintRuntime( "ASSIGN" ),
- gen.Assign( hv, cf.newSeqCons( elem, hv ))
- }, defs.UNIT_TYPE());
- */
- }
-
- protected def initializeSyms(): Unit = {
-
- this.funSym = owner.newLabel( pos,
- cf.fresh.newName( "right" ));
-
- this.iterSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("iter"))
- .setType( cf.SeqTraceType( elementType ));
-
- this.stateSym = owner.newVariable ( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("q"))
- .setType( defs.int_TYPE() ) ;
-
- this.curSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("cur"))
- .setType( elementType ) ;
-
- this.targetSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("p"))
- .setType( defs.int_TYPE() ) ;
-
- funSym.setType( new Type.MethodType( Predef.Array[Symbol] ( // dummy symbol MethodType
- funSym.newVParam( pos, 0, cf.fresh.newName("iter"), cf.SeqTraceType( elementType )),
- funSym.newVParam( pos, 0, cf.fresh.newName( "q" ), defs.int_TYPE()) ),
- defs.void_TYPE() )); // result
-
- }
-
- // load current elem and trace
- override def loadCurrentElem(body: Tree): Tree = {
- gen.If( cf.isEmpty( _iter() ),
- run_finished( 0 ), // we are done
- gen.mkBlock( Predef.Array[Tree] (
- gen.ValDef( this.targetSym,
- cf.SeqTrace_headState( gen.Ident( pos, iterSym))),
- gen.ValDef( this.curSym,
- cf.SeqTrace_headElem( gen.Ident( pos, iterSym )))),
- body )
- );
- }
-
- /** see code_state0_NEW
- */
- def code_state0(elseBody: Tree) = { // careful, map Int to Int
-
- gen.If( cf.Equals( _state(), gen.mkIntLit( cf.pos, 0 )),
- code_state0_NEW(),
- elseBody );
-
- }
-
- /** this one is special, we check the first element of the trace
- * and choose the next state depending only on the state part
- */
- def code_state0_NEW(): Tree = { // careful, map Int to Int
-
- val hmap = dfa.deltaq( 0 ); // all the initial states
-
- var i = 0;
- val n = hmap.keySet().size(); // all transitions defined
-
- val tmapTag = new TreeMap();
- val tmapBody = new TreeMap();
- var it = hmap.keySet().iterator();
- while(it.hasNext()) {
- val targetL = it.next().asInstanceOf[Integer];
- val targetR = hmap.get( targetL ).asInstanceOf[Integer];
-
- val I = new Integer( i );
- tmapTag.put( targetL, I );
- tmapBody.put( I, callFun( Predef.Array[Tree] (
- cf.SeqTrace_tail( _iter() ),
- gen.mkIntLit( cf.pos, targetR.intValue() ) )));
- i = i + 1;
- }
- i = 0;
- val tags = new Array[Int]( n );
- val targets = new Array[Tree]( n );
- var jt = tmapTag.keySet().iterator();
- while(jt.hasNext()) {
- val tagI = jt.next().asInstanceOf[Integer];
- tags( i ) = tagI.intValue();
- val I = tmapTag.get( tagI ).asInstanceOf[Integer];
- targets( i ) = tmapBody.get( I ).asInstanceOf[Tree];;
- i = i + 1
- }
- gen.Switch( gen.Ident( pos, targetSym ),
- tags,
- targets,
- code_error()/*cannot happen*/ );
-
- }
-
- override def currentMatches(label: Label): Tree = {
- label match {
- case LPair( target, theLab ) =>
- cf.Equals( gen.mkIntLit( cf.pos, target.intValue() ),
- current() );
- case _ => throw new ApplicationError("expected Pair label");
- }
- }
-
-
- override def code_state_NEW(i: Int): Tree = { // precondition i != 0
- var stateBody = code_delta( i, DefaultLabel() );
- if( stateBody == null ) {
- stateBody = code_error();
- }
- val trans = dfa.deltaq( i );
- val tmapTag = new TreeMap();
- val tmapBody = new TreeMap();
- var j = 0;
- var labs = dfa.labels().iterator();
- while(labs.hasNext()) {
- val label = labs.next();
- val next = trans.get( label ).asInstanceOf[Integer];
- val action = code_delta( i, label.asInstanceOf[Label] );
-
- if( action != null ) {
- val J = new Integer( j );
- tmapTag.put( label.asInstanceOf[LPair].state, J );
- tmapBody.put( J, action );
-
- stateBody = gen.If( currentMatches( label.asInstanceOf[Label] ),
- action,
- stateBody);
- }
- j = j + 1;
- }
- val n = tmapTag.keySet().size();
- j = 0;
- val tags = new Array[int]( n );
- val targets = new Array[Tree]( n );
- val it = tmapTag.keySet().iterator();
- while(it.hasNext()) {
- val tagI = it.next().asInstanceOf[Integer];
- tags( j ) = tagI.intValue();
- val J = tmapTag.get( tagI ).asInstanceOf[Integer];
- targets( j ) = tmapBody.get( J ).asInstanceOf[Tree];
- j = j + 1;
- }
- if( n > 0 )
- gen.Switch( gen.Ident( pos, targetSym ), tags, targets, code_error() );
- else
- code_error();
- }
-
- // calling the AlgebraicMatcher here
- override def _cur_match(pat1: Tree): Tree = {
- var pat = pat1;
- //System.out.println("RTiS._cur_match("+pat.toString()+")");
- //System.out.println("calling algebraic matcher on type:"+pat.type);
-
- //System.err.println( "curT"+currentElem().type().widen() );
- val m = new PartialMatcher( owner, //funSym,//this.funSym,
- currentElem(),
- defs.boolean_TYPE() );
-
- val freshenMap = new HashMap(); // sym2exp -> new sym
- val helpMap3 = new HashMap(); // new sym -> original sym
-
- // "freshening": never use the same symbol more than once
- // (in later invocations of _cur_match)
-
- var it = varsToExport.iterator();
- while(it.hasNext() ) {
- val key = it.next().asInstanceOf[Symbol];
- if( key.name.toString().indexOf("$") == -1 ) {
- this.helpMap2.put( key, helpMap.get( key ));
- // "freshening" by appending string ( a bit dangerous )
- val newSym = key.cloneSymbol().setOwner( owner /*funSym*/ );
- newSym.name = Name.fromString( key.name.toString() + "%" );
- freshenMap.put( key, newSym );
- helpMap3.put( newSym, helpMap.get( key ));
- //System.out.println( "key: "+ key + " key.owner:"+key.owner());
- //System.out.println( "newsym owner:"+newSym.owner());
- } else {
- freshenMap.put( key, key );
- }
- }
-
- //System.out.println("RightTracerInScala:: -pat :"+pat.toString());
- /*
- System.out.println("RightTracerInScala - the seqVars"+seqVars);
- System.out.println("RightTracerInScala - the varsToExport"+varsToExport);
- */
- //System.out.println("RightTracerInScala::freshenMap :"+freshenMap);
-
- // "freshening"
-
- /* TEST
- */
- val tc = new TreeCloner( cf.unit.global, freshenMap, Type.IdMap );
-
- /*
- Transformer tc = new Transformer(cf.unit.global) {
- public Tree transform(Tree tree) {
- tree = super.transform(tree);
- if (tree.hasSymbol()) {
- Object symbol = freshenMap.get(tree.symbol());
- if (symbol != null) tree.setSymbol((Symbol)symbol);
- }
- return tree;
- }
- };
- */
- pat = tc.transform( pat );
-
-
- //System.out.println("RightTracerInScala:: -pat( after subst ) :"+pat);
-
-
- // val match { case <pat> => { <do binding>; true }
- // case _ => false
-
-
- val ts = new Array[Tree]( helpMap3.keySet().size() );
- var j = 0;
- var jt = helpMap3.keySet().iterator();
- while(jt.hasNext()) {
- val vsym = jt.next().asInstanceOf[Symbol];
- val hv = helpMap3.get( vsym ).asInstanceOf[Symbol];
- //hv.setType( defs.LIST_TYPE( elementType ) ) ; DEBUG ALARM ?
- val refv = gen.Ident(cf.pos, vsym);
- val refhv = gen.Ident(cf.pos, hv);
- ts( j ) = gen.Assign( refhv, refv );
- j = j + 1;
- // System.out.println( "the assign" + res[ j - 1 ] );
- }
-
- val res = gen.mkBooleanLit( cf.pos, true ); // just `true'
- val theBody = gen.mkBlock(ts, res);
-
- am.construct( m, Predef.Array[Tree] (
-
- cf.gen.CaseDef( pat, // if tree val matches pat -> update vars, return true
- theBody/* "freshening */),
- cf.gen.CaseDef( cf.gen.Ident( pat.pos, defs.PATTERN_WILDCARD ),
- gen.mkBooleanLit( pat.pos, false )) ), // else return false
- true // do binding please
- );
-
- am.toTree();
- }
-
- /** returns translation of transition with label from i.
- * returns null if there is no such transition(no translation needed)
- */
- override def code_delta(i: Int , label: Label ): Tree = {
- val hmap = dfa.deltaq( i );
- val ntarget = hmap.get( label ).asInstanceOf[Integer];
- var algMatchTree: Tree = null;
- if( ntarget == null )
- return null;
-
- //System.out.println("delta("+i+","+label+")" );
- var theLab: Label = null;
- label match {
- case LPair ( state, lab2 )=>
- //assert ntarget == state;
- theLab = lab2;
- lab2 match {
- case TreeLabel( pat ) =>
- algMatchTree = _cur_match( pat );
- case _ =>
- }
- case DefaultLabel() =>
- throw new ApplicationError(); // should not happen
- }
- //assert dfa.qbinders != null : "qbinders ?";
-
- var vars = dfa.qbinders(i);
-
- //System.out.println("dfa.qbinders[ i ]"+vars);
-
- if (null == vars) vars = new Vector(); // TODO: make this more consistent
- //assert vars != null;
-
- val stms = new Array[Tree]( vars.size()
- + { if (algMatchTree != null ) 1 else 0 });
- var j = 0;
- var it = vars.iterator();
- while(it.hasNext()) {
- val vble = it.next().asInstanceOf[Symbol];
- val rhs = gen.Ident( pos, curSym );
- stms( j ) = prependToHelpVar( vble , rhs);
- j = j + 1;
- }
-
- if( algMatchTree != null ) {
- stms( j ) = algMatchTree ;
- j = j + 1
- }
-
- val value = callFun( Predef.Array[Tree] ( cf.SeqTrace_tail( _iter() ),
- gen.mkIntLit( cf.pos, ntarget.intValue() ) ) );
-
- gen.mkBlock( pos, stms, value );
- }
-
- override def stateWrap(i: Int): Tree = {
- if (i == 0)
- code_state0_NEW();
- else
- code_state_NEW(i);
- }
-
- /* returns statements that do the work of the right-transducer
- */
- def getStms(trace: Tree, unit: CompilationUnit, body: Tree): Tree = {
-
- val stms = new TreeList();
- val loopbody = code_body_NEW();
-
- stms.append( gen.ValDef( iterSym, trace ) );
- stms.append( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) );
- stms.append( helpVarDefs );
- stms.append( gen.LabelDef( this.funSym,
- Predef.Array[Ident] (
- gen.Ident( pos, iterSym ),
- gen.Ident( pos, stateSym )
- ), loopbody ));
-
- // bind variables handled by this righttracer
- var it = seqVars.iterator();
- while(it.hasNext()) {
- stms.append( bindVar( it.next().asInstanceOf[Symbol] ) );
- }
-
- val treeCloner = new Transformer(unit.global) {
- override def transform(tree1: Tree): Tree = {
- val tree = super.transform(tree1);
- if (tree.hasSymbol()) {
- val symbol = helpMap2.get(tree.symbol());
- if (symbol != null) tree.setSymbol(symbol.asInstanceOf[Symbol]);
- }
- tree;
- }
- };
-
- gen.mkBlock(stms.toArray(), treeCloner.transform( body ));
- }
-
-
-
- /** return the accumulator. (same as in LeftTracerInScala)
- * todo: move tree generation of Unit somewhere else
- */
- override def run_finished(state: Int): Tree = {
- gen.mkUnitLit(Position.FIRSTPOS);
- }
-
- def current() = { gen.Ident( pos, targetSym );}
-
- def refHelpVar(realVar: Symbol) = {
- val hv = helpMap.get( realVar ).asInstanceOf[Symbol];
- //assert hv != null : realVar;
- gen.Ident(Position.FIRSTPOS, hv);
- }
-
- def assignToHelpVar(realVar: Symbol, rhs: Tree): Tree = {
- val hv = refHelpVar(realVar);
- gen.Assign(hv, rhs);
- }
-
- def bindVar(realVar: Symbol): Tree = {
- val hv = refHelpVar(realVar);
- /*
- System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to hv type:"+hv.type());
- realVar.setOwner( owner );
- System.out.println("is same as realVar"+realVar.type().isSameAs( elementType ));
- System.out.println("is same as hv"+realVar.type().isSameAs( hv.type() ));
- if( realVar.type().isSameAs( elementType ))
- return gen.ValDef( realVar, cf.SeqList_head( hv ));
- else
- return gen.ValDef( realVar, hv );
- */
- if( realVar.getType().isSameAs( hv.getType())) {
- gen.ValDef( realVar, hv ); // e.g. x @ _*
- } else
- gen.ValDef( realVar, cf.SeqList_head( hv ));
- }
-}
-}
-
diff --git a/sources/scala/tools/scalac/transformer/matching/SequenceMatcher.scala b/sources/scala/tools/scalac/transformer/matching/SequenceMatcher.scala
deleted file mode 100644
index 17d840b29a..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/SequenceMatcher.scala
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-import scalac._;
-import scalac.ast.Tree;
-import Tree._;
-
- //import scala.compiler.printer.XMLAutomPrinter ; // DEBUGGING\
-
-import scalac.ast._ ;
-import scalac.symtab._ ;
-
-import java.util._ ;
-
-import scala.tools.util.Position;
-
-package scala.tools.scalac.transformer.matching {
-/** constructs a matcher for a sequence pattern. plays two roles in
- * described in design pattern Builder.
- * is the "Director" for "Builder" class BerrySethi.
- * is the "Builder" for "Director" class TransMatch.
- */
-
-class SequenceMatcher(unit: CompilationUnit) extends PatternTool(unit) {
-
-// Console.println("CONSTR SEQUENCEMATCHER");
- final val IGNORED = new Integer(42);
-
- var cf: CodeFactory = _;
- var _m: PartialMatcher = _;
-
- var bbuild: BindingBerrySethi = null;
-
- /** collects variables
- * @return all variables bound by this binding nfa
- */
- def collectNfaVariables(nfa: NondetWordAutom): Set = {
- val seqVars = new HashSet();
- var j = 0;
- while(j < nfa.nstates) {
- if( nfa.qbinders( j ) != null )
- seqVars.addAll( nfa.qbinders( j ) );
- j = j + 1
- }
- seqVars;
- }
-
-
- /** translates the det/switching automaton to scala code
- * precondition: pat.type() corresponds to element type
- */
- def addBinderToBody( pat:Tree , body:Tree ): Tree = {
- if( bbuild == null )
- bbuild = new BindingBerrySethi(unit);
-
- val elementType = cf.getElemType_Sequence( pat.getType() );
-
- // (a) build *binding* nfa (sequential machine)
- val left = bbuild.automatonFrom( pat, IGNORED );
- val right = bbuild.revnfa;
-
- // (b) determinize + translate L
-
- val dLeft = new DetWordAutom( left );
-
- val ltis = new LeftTracerInScala( dLeft, elementType, _m.owner, cf, _m.selector);
-
- val trace = ltis.getTrace();
-
- // (c) determinize + translate R
-
- val dRight = new DetWordAutom( right, left, dLeft );
-
- val seqVars = collectNfaVariables( left );
- //System.out.println("seqVars here are:"+seqVars);
- val rtis = new RightTracerInScala( dRight, seqVars, _m.owner,
- cf, pat, elementType );
-
- // !!! Tree stms2 = rtis.getStms( theTrace, unit, body );
- // !!! gen.mkBlock_( body.pos, trace, stms2 );
- val stms2 = rtis.getStms( trace, unit, body );
- stms2;
- }
-
- private def buildNfas( pat:Array[Tree] ): Array[NondetWordAutom] = {
- val build = new BerrySethi(unit);
- val manyNfa = new Array[NondetWordAutom]( pat.length );
- var i = 0;
- while( i < pat.length ) {
- manyNfa( i ) = build.automatonFrom( pat( i ),
- new Integer( i ));
- i = i + 1;
- //manyNfa[ i ].print();
- }
- manyNfa;
- }
-
- /** constructs a word recognizer from an array of patterns which
- * should all be SequencePatterns ( no wildcard * )
- * precondition: pat.type corresponds to element type
- * @param _m Matcher object, holds the result
- * @param pat the (Sequence) patterns
- * @param body the bodies
- * @param defaultCase code that is run when nothing matches. may be null, it
- * becomes a ThrowMatchError then
- * @param doBinding flasg that indicates whether variables should be bound
- */
- def construct(_m: PartialMatcher, pat: Array[Tree] , body: Array[Tree] , defcase1: Tree, doBinding: Boolean ): Unit = {
- var defaultCase = defcase1;
- this._m = _m;
- //assert body.length == pat.length;
- if( defaultCase == null )
- defaultCase = cf.ThrowMatchError( cf.pos, _m.resultType );
-
- this.cf = new CodeFactory( unit, _m.pos );
-
- val seqType = pat( 0 ).getType();
- val elementType = cf.getElemType_Sequence( seqType );
-
- // STEP 1 - build nfas for each pattern
-
- val manyNfa = buildNfas( pat );
-
- // STEP 2 - recognizing
-
- // (a) merge nfas into one if necessary
- val nfa = if(pat.length > 1) new NondetWordAutom( manyNfa ) else manyNfa( 0 );
-
- //nfa.print();
-
- // (b) determinize
- val dfa = new DetWordAutom( nfa );
-
- // (c) translate to scala code
- val scalaAut =
- new WordAutomInScala( dfa,
- elementType,
- _m.owner,
- cf,
- unit.global.target == Global.TARGET_JVM );
- scalaAut.translate();
-
- // STEP 3 - binding
-
- var newbody:Array[Tree] = _;
- if( !doBinding )
- newbody = body;
- else { // this is done in the body of the matching case
- newbody = new Array[Tree](body.length);
- var i = 0;
- while(i < body.length) {
- if( !containsBinding( pat( i ) ) )
- newbody( i ) = body( i ); // no need for binding
- else
- newbody( i ) = addBinderToBody( pat( i ), body( i ) );
- i = i + 1;
- }
- }
- _m.tree = scalaAut.getMatcherSwitch( _m.selector,
- defaultCase,
- newbody,
- _m.resultType );
- } // construct (PartialMatcher, Tree[], Tree[], Tree, boolean )
-
- } // class SequenceMatcher
- }
diff --git a/sources/scala/tools/scalac/transformer/matching/StateSetComparator.scala b/sources/scala/tools/scalac/transformer/matching/StateSetComparator.scala
deleted file mode 100644
index c57e9c8f74..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/StateSetComparator.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-package scala.tools.scalac.transformer.matching ;
-
-import java.util.{Comparator, TreeSet} ;
-
-class StateSetComparator extends Comparator {
- // use lexicographic order
- def compare(o1: Any , o2: Any ): Int = {
- /*
- System.out.print("lexi" );
- System.out.print( o1 +" ");
- System.out.println( o2 );
- */
- val it1 = o1.asInstanceOf[TreeSet].iterator();
- val it2 = o2.asInstanceOf[TreeSet].iterator();
- while( it1.hasNext() ) {
- while( it2.hasNext() ) {
- if( !it1.hasNext() )
- return -1;
-
- val i1 = it1.next().asInstanceOf[Integer].intValue();
- val i2 = it2.next().asInstanceOf[Integer].intValue();
- if( i1 < i2 )
- return -1;
- else if ( i1 > i2 )
- return 1;
- }
- if( it1.hasNext() )
- return 1;
- }
- if( it2.hasNext() )
- return -1;
- return 0;
- }
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/TracerInScala.scala b/sources/scala/tools/scalac/transformer/matching/TracerInScala.scala
deleted file mode 100644
index 448c9fb17e..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/TracerInScala.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-import scalac.ast.Tree;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-package scala.tools.scalac.transformer.matching {
-/** @todo: factor common things of LeftTracerInScala and RightTracerInScala
- */
-class TracerInScala(dfa: DetWordAutom, elementType: Type, owner: Symbol, cf: CodeFactory )
-extends Autom2Scala(dfa, elementType, owner, cf) {
-
- override var optimize = true;
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/VariableTraverser.scala b/sources/scala/tools/scalac/transformer/matching/VariableTraverser.scala
deleted file mode 100644
index fbb385491b..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/VariableTraverser.scala
+++ /dev/null
@@ -1,56 +0,0 @@
-import scalac.ast.Tree;
-import scalac.util.Name;
-import scalac.symtab.Symbol ;
-import scalac.ast.Traverser ;
-
-import Tree.Ident;
-import Tree.Bind;
-import Tree.Select;
-
-package scala.tools.scalac.transformer.matching {
-
-abstract class VariableTraverser extends Traverser {
-
- def isVariableName(name: Name): Boolean = {
- ( name.isVariable() ) && ( name != Name.fromString("_") ) ;
- }
-
- def isVariableSymbol(sym: Symbol): Boolean = {
- ( sym != null )&&( !sym.isPrimaryConstructor() );
- }
-
- def handleVariableSymbol(sym: Symbol): Unit;
-
- override def traverse(tree: Tree): Unit = {
- tree match {
- case Ident(name)=>
- var sym: Symbol = _;
-
- if( isVariableName( name )
- && isVariableSymbol( {sym = tree.symbol(); tree.symbol()} ) )
- handleVariableSymbol( sym );
-
- return;
-
- case Bind(name, subtree) =>
- var sym: Symbol = _;
-
- if( isVariableName( name )
- && isVariableSymbol( {sym = tree.symbol(); tree.symbol()} ))
- handleVariableSymbol( sym );
-
- traverse( subtree );
-
- return;
-
- case Select(_,_) =>
- return;
-
- case _ =>
- super.traverse( tree );
- }
- }
-
-
-}
-}
diff --git a/sources/scala/tools/scalac/transformer/matching/WordAutomInScala.scala b/sources/scala/tools/scalac/transformer/matching/WordAutomInScala.scala
deleted file mode 100644
index 3d30cf6f91..0000000000
--- a/sources/scala/tools/scalac/transformer/matching/WordAutomInScala.scala
+++ /dev/null
@@ -1,153 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scala.tools.util.Position;
-
-import scalac._;
-import scalac.ast.Tree;
-import scalac.ast.TreeGen;
-import scalac.symtab.{ Modifiers, Symbol, Type };
-import Tree._;
-
-import java.util._;
-import scala.tools.scalac.util.NewArray;
-
-import scalac.util.Names;
-
-package scala.tools.scalac.transformer.matching {
- /** translates a recognizer to scala code
- */
-
- /** constructor
- * @param dfa the dfa that is to be translated
- * @param elementType type of the objects in the sequence
- * @param owner the owner of the pattern match
- * @param cf code factory
- * @param optim flag that indicates whether to optimize
- * @return an object that translates the dfa
- */
- class WordAutomInScala(dfa: DetWordAutom, elementType: Type, owner: Symbol, cf: CodeFactory, optim: Boolean )
- extends Autom2Scala(dfa, elementType, owner, cf) {
-
- this.optimize = this.optimize && optim;
-
- var theDefDef: Tree = _ ;
-
- def getMatcherSwitch(selector: Tree, failTree: Tree, body: Array[Tree], resultType: Type ): Tree = {
-
- var result: Tree = _;
- val tags = new Array[int](body.length);
- var i = body.length - 1;
- while( i >= 0 ) {
- tags(i) = i;
- i = i - 1
- }
- result = gen.Switch( _swres(), tags, body, failTree );
-
- //}
-
- result = cf.gen.mkBlock( cf.pos,
- NewArray.Tree (
- gen.ValDef( iterSym, cf.newIterator( selector.duplicate() )),
- gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ),
- gen.ValDef( resultSym, theDefDef )),
- result );
- //unit.global.debugPrinter.print( result );
- result;
- }
-
- protected def initializeSyms(): Unit = { // TEST
-
- this.funSym = owner.newLabel( pos,
- cf.fresh.newName( "matcher" ));
-
- this.iterSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("iter"))
- .setType( cf._seqIterType( elementType ) ) ;
-
- this.stateSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("q"))
- .setType( defs.int_TYPE() ) ;
-
- this.resultSym = owner.newVariable( pos,
- Modifiers.MUTABLE,
- cf.fresh.newName("swRes"))
- .setType( defs.int_TYPE() ) ;
-
- this.funSym
- .setType( new Type.MethodType( Predef.Array[Symbol] (
- funSym.newVParam( pos, 0, cf.fresh.newName("q"), defs.int_TYPE())
- ), defs.int_TYPE() ));
-
- this.curSym = owner.newVariable( pos, 0, Names.cur )
- .setType( elementType );
-
- this.hasnSym = owner.newVariable( pos, 0, Names.hasNext )
- .setType( defs.boolean_TYPE() );
-
- }
-
- /** code for the return value of the automaton translation
- */
- override def run_finished(state: Int): Tree = { // T E S T
- if( dfa.isFinal(state))
- gen.mkIntLit(Position.FIRSTPOS, dfa.finals.get(new Integer(state)).asInstanceOf[Integer].intValue());
- else
- gen.mkIntLit(Position.FIRSTPOS, FAIL);
- }
-
-
- // calling the /*AlgebraicMatcher*/PatternMatcher here
- override def _cur_match(pat: Tree): Tree = { // TE ST
- val m = new PartialMatcher(this.owner, /* owner*/
- currentElem(), /* root */
- defs.boolean_TYPE() /* restype */);
-
- am.construct( m, Predef.Array[Tree] (
- cf.gen.CaseDef( pat,
- gen.mkBooleanLit( pat.pos, true )),
- cf.gen.CaseDef( cf.gen.Ident(pat.pos, defs.PATTERN_WILDCARD),
- gen.mkBooleanLit( pat.pos, false )) ),
- false);
- am.toTree();
- }
-
- /** do the translation
- */
- def translate(): Unit = {
- initializeSyms();
- val tb = code_body_NEW();
- //theDefDef = gen.DefDef(this.funSym, tb);
- theDefDef = gen.LabelDef(this.funSym, Predef.Array[Ident] ( /*(Ident)_iter(),*/ _state().asInstanceOf[Ident] ), tb);
- }
-
- /** ...
- * @return returns translation of transition with label from i.
- * returns null if there is no such transition
- * (no translation needed)
- */
- override def code_delta(i: Int, label: Label): Tree = {
- val target = dfa.delta(i, label);
-
- if (target == null)
- label match {
- case DefaultLabel() =>
- code_error(); // this may not happen !
- case _ =>
- null; // not good
- }
- else if (target.intValue() == dfa.nstates() - 1) // that one is a dead state
- code_fail();
- else
- callFun(Predef.Array[Tree]( gen.mkIntLit( cf.pos, target.intValue() )));
- }
-
- }
-}
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala
deleted file mode 100644
index e39316a7b4..0000000000
--- a/sources/scala/tools/scalac/typechecker/Analyzer.scala
+++ /dev/null
@@ -1,3153 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-// todo: eliminate Typed nodes.
-// todo: use SELECTOR flag to avoid access methods for privates
-// todo: use mangled name or drop.
-// todo: emit warnings for unchecked.
-// todo: synchronize on module instantiation.
-// todo: empty package
-
-
-import java.lang.{Boolean => JBoolean, Integer, Object => JObject}
-import java.util.HashMap;
-
-import ch.epfl.lamp.util.Pair;
-
-import scalac._;
-import scalac.{Global => scalac_Global}
-import scalac.ast._;
-import scalac.atree.AConstant;
-import scalac.atree.AConstant$CHAR;
-import scalac.atree.AConstant$INT;
-import scalac.symtab.classfile._;
-import scalac.symtab._;
-import scalac.util._;
-import Tree._;
-
-import scala.tools.scalac.util.NewArray;
-import scala.tools.util.Position;
-
-package scala.tools.scalac.typechecker {
-
-
-/** The main attribution phase.
- */
-class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(global) {
-
- import Modifiers._;
- import Kinds._;
-
- private var context: Context = _;
- private var pt: Type = _;
- private var mode: Int = _;
-
- private var inAlternative: Boolean = _;
- // for pattern matching; maps x to {true,false}
- private val patternVars = new HashMap/*<Symbol,JBoolean>*/();
-
- val definitions = global.definitions;
- val infer = new scala.tools.scalac.typechecker.Infer(this) {
- override def getContext = context;
- override def error(pos: int, msg: String) = Analyzer.this.error(pos, msg);
- }
- val desugarize = new DeSugarize(make, copy, gen, infer, global);
- val constfold = new ConstantFolder(global);
-
- var unit: CompilationUnit = _;
-
- def enterUnit(unit: CompilationUnit): unit =
- enter(
- new Context(
- Tree.Empty,
- if (unit.console) descr.consoleContext else descr.startContext),
- unit);
-
- def enter(context: Context, unit: CompilationUnit): Unit = {
- assert(this.unit == null, "start unit non null for " + unit);
- context.infer = infer;
- this.unit = unit;
- this.context = context;
- descr.contexts.put(unit, context);
- enterSyms(unit.body);
- this.unit = null;
- this.context = null;
- }
-
- def lateEnter(unit: CompilationUnit): unit = {
- enterUnit(unit);
- }
-
- def loadMixinCode(pos: Int, clasz: Symbol): unit = {
- assert(clasz.isClass() && !clasz.isModuleClass(), Debug.show(clasz));
- if (clasz.isExternal()) {
- var c: Symbol = clasz;
- try {
- while (!c.owner().isPackageClass()) c = c.owner();
- global.compileLate(global.getSourceFile(c), true);
- } catch {
- case exception: java.io.IOException =>
- if (global.debug) exception.printStackTrace();
- unit.error(pos, exception.getMessage() + "; source file for "
- + c + " is needed because it is used as a mixin");
- }
- }
- }
-
- override def apply(unit: CompilationUnit): unit = {
- global.log("checking " + unit);
- assert(this.unit == null, "start unit non null for " + unit);
- this.unit = unit;
- this.context = descr.contexts.remove(unit).asInstanceOf[Context];
- assert(this.context != null, "could not find context for " + unit);
- unit.body = transformStatSeq(unit.body, Symbol.NONE);
- if (global.target != scalac_Global.TARGET_INT && global.reporter.errors() == 0) {
- genSymData(unit.body);
- }
- this.unit = null;
- this.context = null;
- global.operation("checked " + unit);
- }
-
- def genSymData(stats: Array[Tree]): unit = {
- var i = 0; while (i < stats.length) {
- stats(i) match {
- case Tree.ClassDef(_, _, _, _, _, _) | Tree.ModuleDef(_, _, _, _) =>
- val sym = stats(i).symbol();
- val key = if (sym.isModule()) sym.moduleClass() else sym;
- var termSym = sym.owner().info().lookup(sym.name.toTermName());
- var typeSym = sym.owner().info().lookup(sym.name.toTypeName());
- if (termSym.isExternal()) termSym = Symbol.NONE;
- if (typeSym.isExternal()) typeSym = Symbol.NONE;
- if (sym.isClass() || (sym.isModule() && typeSym.isNone())) {
- val pickle: Pickle = new Pickle();
- if (!termSym.isNone()) pickle.add(termSym);
- if (!typeSym.isNone()) pickle.add(typeSym);
- pickle.pickle();
- global.symdata.put(key, pickle);
- }
- case Tree.PackageDef(packaged, templ) =>
- genSymData(templ.body);
- case _ =>
- }
- i = i + 1
- }
- }
-
- /** Mode constants
- */
- val NOmode = 0x000;
- val EXPRmode = 0x001; // these 4 modes are mutually exclusive.
- val PATTERNmode = 0x002;
- val CONSTRmode = 0x004;
- val TYPEmode = 0x008;
-
- val FUNmode = 0x10; // orthogonal to above. When set
- // we are looking for a method or constructor
-
- val POLYmode = 0x020; // orthogonal to above. When set
- // expression types can be polymorphic.
-
- val QUALmode = 0x040; // orthogonal to above. When set
- // expressions may be packages and
- // Java statics modules.
-
- val SUPERmode = 0x080; // Goes with CONSTRmode. When set
- // we are checking a superclass
- // constructor invocation.
-
- val baseModes = EXPRmode | PATTERNmode | CONSTRmode;
-
- val SEQUENCEmode = 0x1000; // only for PATTERNmode, otherwise orthogonal to above. When set
- // we turn "x" into "x@_"
- // and allow args to be of type Seq( a) instead of a
-
-// Diagnostics ----------------------------------------------------------------
-
- private def errorName(tree: Tree): Name =
- Name.fromString("<error: " + tree + ">");
-
- private def errorTree(tree: Tree): Tree =
- try {
- if (tree.isType()) errorTypeTree(tree) else errorTermTree(tree);
- } catch {
- case ex: Type$Error =>
- Tree.Empty;
- }
-
- private def errorTypeTree(tree: Tree): Tree = {
- val symbol = context.owner.newErrorClass(errorName(tree).toTypeName());
- tree match {
- case Tree.Ident(_) =>
- make.Ident(tree.pos, symbol).setType(symbol.getType());
- case Tree.Select(qualifier, _) =>
- make.Select(tree.pos, symbol, qualifier).setType(symbol.getType());
- case _ =>
- gen.mkType(tree.pos, symbol.getType());
- }
- }
-
- private def errorTermTree(tree: Tree): Tree =
- gen.mkLocalRef(tree.pos, Symbol.NONE.newErrorValue(errorName(tree)));
-
- private def setError(tree: Tree): Tree = {
- if (tree.hasSymbol() && tree.symbol() == null)
- tree.setSymbol(
- if (tree.isType()) Symbol.NONE.newErrorClass(errorName(tree).toTypeName())
- else Symbol.NONE.newErrorValue(errorName(tree)));
- tree.setType(Type.ErrorType);
- }
-
- def error(pos: int, msg: String): unit =
- unit.error(pos, msg);
-
- def typeError(pos: int, found: Type, req: Type): unit = {
- if (found.isError() || req.isError()) return;
- var msg: String = infer.typeErrorMsg("type mismatch", found, req);
- val foundResult: Type = found.resultType();
- if (foundResult != found && infer.isCompatible(foundResult, req))
- msg = msg + "\n possible cause: missing arguments for method or constructor";
- error(pos, msg);
- }
-
- def reportTypeError(pos: int, ex: Type$Error): unit = {
- if (global.debug) ex.printStackTrace();
- if (ex.isInstanceOf[CyclicReference]) {
- val cyc: CyclicReference = ex.asInstanceOf[CyclicReference];
- if (cyc.info.isInstanceOf[LazyTreeType]) {
- (cyc.info.asInstanceOf[LazyTreeType]).tree match {
- case Tree.ValDef(_, _, Tree.Empty, _) =>
- return error(pos, "recursive " + cyc.sym + " needs type");
- case Tree.DefDef(_, _, _, _, Tree.Empty, _) =>
- return error(pos, "recursive function " + cyc.sym.name + " needs result type");
- case _ =>
- }
- }
- }
- error(pos, ex.msg);
- }
-
- def decode(name: Name): String =
- (if (name.isTypeName()) "type " else "value ") + NameTransformer.decode(name);
-
-// Checking methods ----------------------------------------------------------
-
- /** Check that symbol's definition is well-formed. This means:
- * - no conflicting modifiers
- * - `abstract' modifier only for classes
- * - `override' modifier never for classes
- * - `def' modifier never for parameters of case classes
- * - declarations only in traits or abstract classes
- * - symbols with `override' modifier override some other symbol.
- */
- def validate(sym: Symbol): unit = {
- if ((sym.flags & (ABSTRACT | OVERRIDE)) == ABSTRACT && sym.kind != CLASS) {
- error(sym.pos, "`abstract' modifier can be used only for classes; " +
- "\nit should be omitted for abstract members");
- }
- if (sym.isOverride() && sym.kind == CLASS) {
- error(sym.pos, "`override' modifier not allowed for classes");
- }
- if ((sym.flags & DEF) != 0 && sym.owner().isPrimaryConstructor() &&
- (sym.owner().constructorClass().flags & CASE) != 0) {
- error(sym.pos, "pass-by-name arguments not allowed for case class parameters");
- }
- /*!!!
- if ((sym.flags & REPEATED) != 0 && sym.owner().isPrimaryConstructor()) {
- error(sym.pos, "`*' modifier not allowed for class parameters");
- }
- */
- if (sym.isDeferred()) {
- if (sym.owner().kind != CLASS || (sym.owner().flags & MODUL) != 0 || sym.owner().isAnonymousClass()) {
- error(sym.pos,
- "only classes can have declared but undefined members" +
- (if ((sym.flags & MUTABLE) == 0) ""
- else "\n(Note that variables need to be initialized to be defined)"));
- sym.flags = sym.flags & ~DEFERRED;
- }
- }
- checkNoConflict(sym, DEFERRED, PRIVATE);
- checkNoConflict(sym, FINAL, SEALED);
- if ((sym.flags & MODUL) == 0) checkNoConflict(sym, FINAL, PRIVATE);
- checkNoConflict(sym, PRIVATE, PROTECTED);
- checkNoConflict(sym, PRIVATE, OVERRIDE);
- checkNoConflict(sym, DEFERRED, FINAL);
- }
-
- /** Check that
- * - all parents are class types
- * - supertype conforms to supertypes of all mixin types.
- * - final classes are only inherited by classes which are
- * nested within definition of base class, or that occur within same
- * statement sequence.
- * - self-type of current class is a subtype of self-type of each parent class.
- * - parent constructors do not refer to value parameters of class.
- * - no two parents define same symbol.
- *
- * @param constrs
- * @param parents
- */
- def validateParentClasses(constrs: Array[Tree], parents: Array[Type], selfType: Type): Unit = {
- var i = 0;
- while (i < parents.length) {
- if (!checkClassType(constrs(i).pos, parents(i))) return;
- val bsym: Symbol = parents(i).symbol();
- if (i > 0) {
- if ((bsym.flags & (JAVA | INTERFACE)) == JAVA)
- error(constrs(i).pos, "Java class may not be used as mixin");
- val grandparents = parents(i).parents();
- if (grandparents.length > 0 && !parents(0).isSubType(grandparents(0)))
- error(constrs(i).pos, "illegal inheritance;\n " + parents(0) +
- " does not conform to " + parents(i) + "'s supertype " + grandparents(0));
- }
- if ((bsym.flags & FINAL) != 0) {
- error(constrs(i).pos, "illegal inheritance from final class");
- } else if (bsym.isSealed() ||
- bsym.isSubClass(definitions.ANYVAL_CLASS) ||
- bsym.isSubClass(definitions.ARRAY_CLASS)) {
- // are we in same scope as base type definition?
- val e: Scope$Entry = context.scope.lookupEntry(bsym.name);
- if (e.sym != bsym) {
- // we are not within same statement sequence
- var c: Context = context;
- while (c != Context.NONE && c.owner != bsym)
- c = c.outer.enclClass;
- if (c == Context.NONE) {
- error(constrs(i).pos, "illegal inheritance from sealed class");
- }
- }
- }
- if (!selfType.isSubType(parents(i).instanceType())) {
- error(constrs(i).pos, "illegal inheritance;\n self-type " +
- selfType + " does not conform to " + parents(i) +
- "'s selftype " + parents(i).instanceType());
- }
- var j = 0; while (j < i) {
- if (parents(i).symbol() == parents(j).symbol())
- error(constrs(i).pos, "" + parents(i).symbol() + " is inherited twice");
- j = j + 1
- }
- i = i + 1;
- }
- }
-
- /** Check that type is a class type.
- *
- * @param pos
- * @param tp
- * @return
- */
- private def checkClassType(pos: Int, tp: Type): Boolean = {
- tp.unalias() match {
- case Type$TypeRef(_, sym, _) =>
- if (sym.kind == CLASS) return true;
- case _ =>
- }
- if (!tp.isError()) error(pos, "class type expected");
- false
- }
-
- /** Check that type is an object type
- *
- * @param pos
- * @param tp
- * @return
- */
- private def checkObjectType(pos: Int, tp: Type): Type =
- if (tp.isObjectType()) tp
- else {
- if (!tp.isError()) error(pos, "object type expected");
- Type.ErrorType
- }
-
- /** Check that type is eta-expandable (i.e. no `def' or `*' parameters)
- *
- * @param pos
- * @param tp
- */
- def checkEtaExpandable(pos: Int, tp: Type): Unit = tp match {
- case Type$MethodType(params, restype) =>
- var i = 0; while (i < params.length) {
- if ((params(i).flags & DEF) != 0)
- error(pos, "method with pass-by-name parameters needs to be fully applied");
- if ((params(i).flags & REPEATED) != 0)
- error(pos, "method with `*' parameters needs to be fully applied");
- i = i + 1
- }
- checkEtaExpandable(pos, restype);
- case _ =>
- }
-
- /** Check that `sym' does not contain both `flag1' and `flag2'.
- *
- * @param sym
- * @param flag1
- * @param flag2
- */
- def checkNoConflict(sym: Symbol, flag1: Int, flag2: Int): Unit = {
- if ((sym.flags & (flag1 | flag2)) == (flag1 | flag2)) {
- if (flag1 == DEFERRED)
- error(sym.pos, "abstract member may not have " +
- Modifiers$Helper.toString(flag2) + " modifier");
- else
- error(sym.pos, "illegal combination of modifiers: " +
- Modifiers$Helper.toString(flag1) + " and " +
- Modifiers$Helper.toString(flag2));
- }
- }
-
- /** Check that type `tp' is not a subtype of itself.
- */
- def checkNonCyclic(pos: int, tp: Type): unit = tp match {
- case Type$TypeRef(pre, sym, args) =>
- sym.initialize();
- if (sym.isLocked()) {
- error(pos, "cyclic aliasing or subtyping involving " + sym);
- } else if (sym.kind == ALIAS || sym.kind == TYPE) {
- sym.flags = sym.flags | LOCKED;
- //System.out.println("checking " + sym);//DEBUG
- checkNonCyclic(
- pos, pre.memberInfo(sym).subst(sym.typeParams(), args));
- if (sym.kind == TYPE) {
- checkNonCyclic(
- pos, pre.memberLoBound(sym).subst(sym.typeParams(), args));
- checkNonCyclic(
- pos, pre.memberVuBound(sym).subst(sym.typeParams(), args));
- }
- sym.flags = sym.flags & ~LOCKED;
- }
-
- case Type$CompoundType(parents, members) =>
- var i = 0; while (i < parents.length) {
- checkNonCyclic(pos, parents(i));
- i = i + 1
- }
-
- case Type$SingleType(pre, sym) =>
- sym.initialize();
- if (sym.isLocked()) {
- error(pos, "cyclic aliasing or subtyping involving " + sym);
- }
-
- case _ =>
- }
-
- /** Check that type does not refer to components defined in current scope.
- *
- * @param pos
- * @param tp
- * @return
- */
- def checkNoEscape(pos: Int, tp: Type): Type = {
-
- val checkNoEscapeMap = new Type$Map() {
- override def apply(t: Type): Type = {
- t.unalias() match {
- case Type$TypeRef(Type.NoPrefix, sym, args) =>
- checkNoEscape(t, sym);
- case Type$SingleType(Type.NoPrefix, sym) =>
- checkNoEscape(t, sym);
- case _ =>
- }
- return map(t);
- }
- private def checkNoEscape(t: Type, sym: Symbol): unit = {
- val e: Scope$Entry = context.scope.lookupEntry(sym.name);
- if (e.sym == sym && e.owner == context.scope &&
- !e.sym.isTypeParameter()) {
- throw new Type$Error(
- "type " + t + " escapes its defining scope");
- }
- }
- };
-
- try {
- checkNoEscapeMap.apply(tp)
- } catch {
- case ex: Type$Error =>
- if ((mode & EXPRmode) != 0 && infer.isFullyDefined(pt)) pt
- else {
- error(pos, ex.msg + " as part of " + tp.unalias());
- Type.ErrorType
- }
- }
- }
-
- /** Check that there are no dependent parameter types among parameters.
- *
- * @param vparams
- */
- def checkNoEscapeParams(vparams: Array[Array[Tree.ValDef]]): Unit = {
- var i = 0; while (i < vparams.length) {
- var j = 0; while (j < vparams(i).length) {
- checkNoEscape(vparams(i)(j).pos, vparams(i)(j).tpe.getType());
- j = j + 1
- }
- i = i + 1
- }
- }
-
- /** Check that tree represents a legal trait definition.
- *
- * @param pos
- * @param clazz
- * @param templ
- */
- def checkTraitDef(pos: Int, clazz: Symbol, templ: Tree.Template): Unit = {
-
- /** Check that type does not have value parameters
- */
- def checkNoParams(tpe: Type): Unit = tpe match {
- case Type$MethodType(vparams, _) =>
- if (vparams.length > 0)
- error(pos, "trait may not have value parameters")
- case Type$PolyType(tparams, restpe) =>
- checkNoParams(infer.skipViewParams(tparams, restpe))
- case _ =>
- }
-
- /** Check that tree represents a pure constructor.
- */
- def checkPureConstr(tree: Tree): Unit = {
- if (!TreeInfo.isPureConstr(tree) && !tree.getType().isError())
- error(tree.pos, "" + clazz + " may invoke only pure superclass constructors");
- }
-
- /** Check that tree refers to a trait
- */
- def checkTraitRef(tree: Tree): Unit = {
- if (!tree.getType().symbol().isTrait() && !tree.getType().isError())
- error(tree.pos, " " + clazz + " may inherit only traits as mixins");
- }
-
- /** Check that tree represents a pure definition.
- */
- def checkPureDef(tree: Tree): unit = {
- if (!TreeInfo.isPureDef(tree) && !tree.getType().isError())
- error(tree.pos, "" + clazz + " may contain only pure definitions");
- }
-
- checkNoParams(clazz.primaryConstructor().getType());
- var i = 0; while (i < templ.parents.length) {
- checkPureConstr(templ.parents(i));
- if (i >= 1) checkTraitRef(templ.parents(i));
- i = i + 1
- }
- var j = 0; while (j < templ.body.length) {
- checkPureDef(templ.body(j));
- j = j + 1
- }
- }
-
- /** Check that tree is a stable expression .p
- *
- * @param tree
- * @return the validated tree
- */
- def checkStable(tree: Tree): Tree =
- if (TreeInfo.isPureExpr(tree) || tree.getType().isError()) tree;
- else {
- error(tree.pos, "stable identifier required, but " + tree + " found.");
- errorTermTree(tree);
- }
-
- /** Check that class can be instantiated.
- *
- * @param pos
- * @param tp
- */
- def checkInstantiatable(pos: Int, tp: Type): Unit = {
- val clazz: Symbol = tp.symbol();
- if (clazz.kind == CLASS) {
- if (clazz.isAbstractClass())
- error(pos, "" + clazz + " is abstract, so it cannot be instantiated");
- else if (!tp.isSubType(tp.instanceType()))
- error(pos, "" + tp + " does not conform to its self-type " +
- tp.instanceType() + ", so it cannot be instantiated");
- }
- }
-
- /** Check that all subtrees have their types defined.
- * Used for asserting an internal invariant
- */
- private class CheckDefined extends Traverser {
- var all: Tree = null;
- override def traverse(tree: Tree): unit = {
- if (tree.getType() == null) assert(false, "" + tree + " in " + all);
- if (!tree.getType().isError())
- super.traverse(tree);
- }
- }
-
- private val checkDefined: CheckDefined = new CheckDefined();
-
- // Helper definitions for calculating types -----------------------------------------
-
- /** The qualifier type of a potential application of the `match' method.
- * or NoType, if this is something else.
- */
- private def matchQualType(fn: Tree): Type = {
- fn match {
- case Tree.Select(qual, _) =>
- if (fn.symbol() == definitions.ANY_MATCH)
- return qual.getType().widen();
-
- case Tree.TypeApply(fn1, _) =>
- return matchQualType(fn1);
-
- case Tree.Ident(_) =>
- if (fn.symbol() == definitions.ANY_MATCH)
- return context.enclClass.owner.typeOfThis();
-
- case _ =>
- }
- if (fn.getType().isError()) Type.ErrorType else Type.NoType
- }
-
- private def isSetterMethod(sym: Symbol): boolean =
- sym != null &&
- !sym.isLocal() &&
- !sym.isStable() &&
- sym.getType().isInstanceOf[Type$PolyType] &&
- sym.typeParams().length == 0;
-
- /**
- * Returns true if the adaption 'from => to' corresponds to a delegate
- * forward view.
- *
- * TODO: The check should probably be deeper than just for a function type
- * because the user might introduce a view from a delegate type to a
- * function type himself, which is okay as long as it doesn't collide with
- * the forward view.
- */
- private def isDelegateForwardView(from: Type, to: Type): boolean =
- definitions.DELEGATE_TYPE() != null &&
- from.isSubType(definitions.DELEGATE_TYPE()) &&
- to.isFunctionType();
-
-// Views -----------------------------------------------------------------------
-
- private def applyView(v: View, tree: Tree, mode: int, pt: Type): Tree = {
- val vexpr = infer.viewExpr(tree.pos, v);
- val vapp = transform(
- make.Apply(tree.pos, vexpr, NewArray.Tree(tree)), mode, pt);
- if (v.symtype.isObjectType()) {
- val tree1 = gen.mkAsInstanceOf(tree.duplicate(), vapp.getType());
- gen.If(
- gen.Apply(
- gen.Select(
- vexpr.duplicate(),
- definitions.ANY_EQEQ),
- NewArray.Tree(gen.mkNullLit(tree.pos))),
- tree1,
- vapp)
- } else vapp
- }
-
-// Contexts ------------------------------------------------------------------
-
- /** Push new context associated with given tree, owner, and scope on stack.
- */
- def pushContext(tree: Tree, owner: Symbol, scope: Scope): Context = {
- val prevContext = context;
- context = new Context(tree, owner, scope, context);
- prevContext
- }
-
-// Lazy Types ----------------------------------------------------------------
-
- /** A lazy type which, when forced returns the type of a symbol defined
- * in `tree'.
- */
- class LazyTreeType(_tree: Tree) extends Type$LazyType {
- val tree: Tree = _tree;
- val u: CompilationUnit = unit;
- val c: Context = context;
-
- override def complete(sym: Symbol): unit = {
- defineSym(tree, u, c);
- }
- }
-
- /** A lazy type for case constructor methods (whose name is a term name)
- * which sets the method's type to the class constructor type.
- */
- class LazyConstrMethodType(_tree: Tree) extends LazyTreeType(_tree) {
- override def complete(sym: Symbol): unit = {
- val constr: Symbol = tree.symbol().primaryConstructor();
- if (!sym.isInitialized())
- sym.setInfo(constr.getType().instanceType().cloneType(constr, sym));
- }
- }
-
- /** A lazy type for self types
- */
- class LazySelfType(clazz: Symbol, tree: Tree) extends LazyTreeType(tree) {
- override def complete(sym: Symbol): unit = {
- defineSelfType(sym, clazz, tree, u, c);
- }
- }
-
-// Entering Symbols ----------------------------------------------------------
-
- def transformPackageId(tree: Tree): Tree = {
- if (tree.getType() != null) return tree;
- tree match {
- case Tree.Ident(name) =>
- tree
- .setSymbol(packageSymbol(tree.pos, context.owner, name))
- .setType(tree.symbol().getType())
-
- case Tree.Select(qual, name) =>
- val qual1: Tree = transformPackageId(qual);
- val sym: Symbol = packageSymbol(tree.pos, qual1.symbol().moduleClass(), name);
- copy.Select(tree, sym, qual1).setType(sym.getType())
-
- case _ =>
- transform(tree);
- }
- }
-
- def packageSymbol(pos: int, base: Symbol, name: Name): Symbol = {
- var p: Symbol = base.members().lookup(name);
- if (p.isNone()) {
- p = base.newPackage(pos, name);
- base.members().enterNoHide(p);
- } else if (p.isPackage()) {
- // as the package is used, we change its position to make sure
- // its symbol is not reused for a module definition with the
- // same name
- p.pos = Position.FIRSTPOS;
- p.moduleClass().pos = Position.FIRSTPOS;
- } else {
- val dst = if ((p.flags & CASE) != 0) "case class " + name;
- else "" + p;
- error(pos, "package " + name + " has the same name as existing " + dst);
- p = base.newPackage(pos, name);
- }
- p
- }
-
- def moduleSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
- val symbol = termSymbolOrNone(scope, pos, name, flags | MODUL | FINAL);
- if (symbol.isNone()) owner.newModule(pos, flags, name) else symbol;
- }
-
- def termSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
- val symbol = termSymbolOrNone(scope, pos, name, flags);
- if (symbol.isNone()) owner.newTerm(pos, flags, name) else symbol
- }
-
- def classSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
- val symbol = typeSymbolOrNone(scope, pos, CLASS, name, flags);
- if (symbol.isNone()) owner.newClass(pos, flags, name) else symbol
- }
-
- def typeAliasSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
- val symbol = typeSymbolOrNone(scope, pos, ALIAS, name, flags);
- if (symbol.isNone()) owner.newTypeAlias(pos, flags, name) else symbol
- }
-
- def absTypeSymbol(pos: int, name: Name, owner: Symbol, flags: int, scope: Scope): Symbol = {
- val symbol = typeSymbolOrNone(scope, pos, TYPE, name, flags);
- if (symbol.isNone()) owner.newAbstractType(pos, flags, name) else symbol
- }
-
- def termSymbolOrNone(scope: Scope, pos: int, name: Name, flags: int): Symbol = {
- var symbol = getDefinedSymbol(scope, VAL, name);
- if (!symbol.isNone()) {
- if (symbol.isInitialized()) {
- symbol.getType() match {
- case Type$OverloadedType(alts, _) =>
- var i = 0;
- while (i < alts.length && !alts(i).isExternal()) i = i + 1;
- if (i == alts.length)
- throw Debug.abort("missing alternative", Debug.show(symbol));
- if (i == alts.length - 1) symbol.pos = pos;
- symbol = alts(i);
- case _ =>
- }
- }
- updateFlagsAndPos(symbol, pos, flags);
- }
- symbol
- }
-
- def typeSymbolOrNone(scope: Scope, pos: int, kind: int, name: Name, flags: int): Symbol = {
- val symbol = getDefinedSymbol(scope, kind, name);
- if (!symbol.isNone()) {
- updateFlagsAndPos(symbol, pos, flags);
- symbol.allConstructors().pos = pos;
- }
- symbol
- }
-
- def getDefinedSymbol(scope: Scope, kind: int, name: Name): Symbol = {
- val entry = scope.lookupEntry(name);
- val symbol = entry.sym;
- if (entry.owner == scope && symbol.isExternal() && symbol.kind == kind) {
- symbol
- } else {
- Symbol.NONE;
- }
- }
-
- def updateFlagsAndPos(symbol: Symbol, pos: int, flags: int): unit = {
- symbol.pos = pos;
- val oldflags = symbol.flags & (INITIALIZED | LOCKED);
- val newflags = flags & ~(INITIALIZED | LOCKED);
- symbol.flags = oldflags | newflags;
- if (symbol.isModule()) {
- // here we repeat what is done in the constructor of ModuleClassSymbol
- val clasz = symbol.moduleClass();
- val classFlags = (flags & MODULE2CLASSFLAGS) | MODUL | FINAL;
- updateFlagsAndPos(clasz, pos, classFlags);
- clasz.primaryConstructor().flags =
- clasz.primaryConstructor().flags | PRIVATE;
- }
- if (symbol.isType()) {
- // here we repeat what is done in the constructor of TypeSymbol
- val constr = symbol.primaryConstructor();
- val constrFlags = flags & CONSTRFLAGS;
- updateFlagsAndPos(constr, pos, constrFlags);
- }
- }
-
- /** Enter symbol `sym' in current scope. Check for double definitions.
- * Handle overloading.
- *
- * @param sym
- */
- def enterInScope(sym: Symbol): Unit = {
-
- def covers(presym: Symbol, newsym: Symbol) = {
- if (presym == newsym) true
- else if (!presym.isInitialized()) false
- else presym.getType() match {
- case Type$OverloadedType(alts, _) =>
- var i = 0;
- while (i < alts.length && alts(i) != newsym) i = i + 1;
- i < alts.length
- case _ =>
- false
- }
- }
-
- // handle double and overloaded definitions
- val e: Scope$Entry = context.scope.lookupEntry(sym.name);
- val other: Symbol = e.sym;
- if (covers(other, sym)) {
- if (global.debug) global.log("redefined: " + sym + ":" + sym.rawInfo());
- } else if (e.owner == context.scope) {
- assert(!other.isExternal(), other);
- if (sym.owner().isPackageClass()) {
- if (other.isPackage()) {
- val src = if ((sym.flags & CASE) != 0) "case class " + sym.name;
- else "" + sym;
- error(sym.pos, "" + src + " has the same name as existing " + other);
- } else {
- if (global.compiledNow.get(other) != null) {
- error(sym.pos, "" + sym + " is compiled twice");
- }
- context.scope.unlink(e);
- context.scope.enter(sym);
- }
- } else if (context.owner.kind == CLASS &&
- sym.kind == VAL && other.kind == VAL &&
- ((sym.flags & ACCESSOR) == 0 || (other.flags & ACCESSOR) == 0)
- ||
- (sym.name == Names.view &&
- (sym.flags & (PARAM | SYNTHETIC)) == (PARAM | SYNTHETIC))) {
- e.setSymbol(other.overloadWith(sym));
- } else if (context.owner.kind == CLASS)
- error(sym.pos,
- sym.nameString() + " is already defined as " +
- other + other.locationString());
- else
- error(sym.pos,
- sym.nameString() +
- " is already defined in local scope");
- } else {
- context.scope.enter(sym);
- }
- if (sym.owner().isPackageClass())
- global.compiledNow.put(sym, unit.source);
- }
-
- def outerEnterSym(tree: Tree): Symbol = enterSym(tree);
-
- /** If `tree' is a definition, create a symbol for it with a lazily
- * constructed type, and enter into current scope.
- */
- def enterSym(tree: Tree): Symbol = {
-
- /** Enter `sym' in current scope and make it the symbol of `tree'.
- */
- def enterSym(tree: Tree, sym: Symbol): Symbol = {
- //if (global.debug) System.out.println("entering " + sym);//DEBUG
- if (!sym.isInitialized()) {
- sym.setInfo(new LazyTreeType(tree));
- }
- if (!sym.isConstructor()) {
- val owner: Symbol = sym.owner();
- if (sym.kind == VAL && (sym.flags & (PRIVATE | SEALED)) == 0 &&
- owner != null && owner.kind == CLASS &&
- (owner.flags & FINAL) != 0)
- sym.flags = sym.flags | FINAL;
- enterInScope(sym);
- }
- tree.setSymbol(sym);
- sym
- }
-
- /** Make `sym' the symbol of import `tree' and push an
- * import context.
- *
- * @param tree
- * @param sym
- * @return
- */
- def enterImport(tree: Tree, sym: Symbol): Symbol = {
- sym.setInfo(new LazyTreeType(tree));
- tree.setSymbol(sym);
- pushContext(tree, context.owner, context.scope);
- sym
- }
-
- val owner: Symbol = context.owner;
- tree match {
- case Tree.PackageDef(_packaged, templ) =>
- var packaged = _packaged;
- templ match {
- case Tree.Template(_, body) =>
- val prevContext = pushContext(tree, context.owner, context.scope);
- packaged = transformPackageId(packaged);
- tree.asInstanceOf[Tree.PackageDef].packaged = packaged;
- context = prevContext;
- val pkg: Symbol = checkStable(packaged).symbol();
- if (pkg != null && !pkg.isError()) {
- if (pkg.isPackage()) {
- val prevContext = pushContext(templ, pkg.moduleClass(), pkg.members());
- enterSyms(body);
- context = prevContext;
- } else {
- error(tree.pos, "only Java packages allowed for now");
- }
- }
- templ.setSymbol(Symbol.NONE);
- null
- case _ =>
- throw new ApplicationError();
- }
-
- case Tree.Attributed(attr, definition) =>
- outerEnterSym(definition);
-
- case Tree.DocDef(comment, definition) =>
- val sym = outerEnterSym(definition);
- global.mapSymbolComment.put(sym, new Pair(comment, unit));
- sym
-
- case Tree.ClassDef(mods, name, tparams, vparams, _, templ) =>
- val clazz =
- if (mods == SYNTHETIC && name == Names.ANON_CLASS_NAME.toTypeName())
- context.owner.newAnonymousClass(templ.pos, name)
- else
- classSymbol(tree.pos, name, owner, mods, context.scope);
- clazz.setOrigin(SymbolOrigin.ScalaUnit(unit));
- if (!clazz.primaryConstructor().isInitialized())
- clazz.primaryConstructor().setInfo(new LazyTreeType(tree));
- if ((mods & CASE) != 0) {
- if ((mods & ABSTRACT) == 0) {
- // enter case constructor method.
- val cf: Symbol = termSymbol(
- tree.pos, name.toTermName(), owner,
- mods & ACCESSFLAGS | CASE, context.scope);
- enterInScope(cf);
- if (!cf.isInitialized() || cf.info().symbol().isModuleClass()) {
- cf.setInfo(new LazyConstrMethodType(tree));
- }
- }
- }
- enterSym(tree, clazz)
-
- case Tree.ModuleDef(mods, name, _, _) =>
- var modul = moduleSymbol(tree.pos, name, owner, mods, context.scope);
- if (!modul.isPackage() || modul.getOrigin() == SymbolOrigin.Unknown)
- modul.moduleClass().setOrigin(SymbolOrigin.ScalaUnit(unit));
- val clazz: Symbol = modul.moduleClass();
- if (!clazz.isInitialized()) {
- val info = new LazyTreeType(tree);
- clazz.setInfo(info);
- modul.setInfo(info);
- }
- enterSym(tree, modul)
-
- case Tree.ValDef(mods, name, _, _) =>
- enterSym(tree, termSymbol(tree.pos, name, owner, mods, context.scope))
-
- case Tree.DefDef(mods, name, _, _, _, _) =>
- var sym: Symbol = null;
- if (name == Names.CONSTRUCTOR) {
- var c = context;
- while (c.isImportContext) c = c.outer;
- val clazz: Symbol = c.enclClass.owner;
- if (!(c.tree.isInstanceOf[Tree.Template]) ||
- clazz.isModuleClass() ||
- clazz.isAnonymousClass() ||
- clazz.isCompoundSym() ||
- clazz.isPackageClass())
- error(tree.pos, "constructor definition not allowed here");
- sym = clazz.newConstructor(tree.pos, clazz.flags & CONSTRFLAGS);
- clazz.addConstructor(sym);
- sym.flags = sym.flags | mods;
- } else {
- sym = termSymbol(tree.pos, name, owner, mods, context.scope);
- }
- enterSym(tree, sym);
-
- case Tree.AliasTypeDef(mods, name, _, _) =>
- val tsym: Symbol = typeAliasSymbol(tree.pos, name, owner, mods, context.scope);
- if (!tsym.primaryConstructor().isInitialized())
- tsym.primaryConstructor().setInfo(new LazyTreeType(tree));
- enterSym(tree, tsym)
-
- case Tree.AbsTypeDef(mods, name, _, _) =>
- enterSym(
- tree,
- absTypeSymbol(tree.pos, name, owner, mods, context.scope))
-
- case Tree.Import(expr, selectors) =>
- enterImport(tree,
- Symbol.NONE.newTerm(
- tree.pos, SYNTHETIC, Name.fromString("import " + expr)))
-
- case _ =>
- null
- }
- }
-
- /** Enter all symbols in statement list
- */
- def enterSyms(stats: Array[Tree]): unit = {
- var i = 0; while (i < stats.length) {
- stats(i) = desugarize.Definition(stats(i));
- enterSym(stats(i));
- i = i + 1
- }
- }
-
- def enterParams[t <: Tree](params: Array[t]): Array[Symbol] = {
- var i = 0; while (i < params.length) {
- enterSym(params(i));
- (params(i) : Tree) match {
- case Tree.ValDef(mods, _, _, _) =>
- if ((mods & REPEATED) != 0 && i != params.length - 1)
- error(params(i).pos,
- "`*' parameter must be the last parameter of a `('...`)' section");
- case _ =>
- }
- i = i + 1
- }
- Tree.symbolOf(params.asInstanceOf[Array[Tree]])
- }
-
- def enterParams(vparams: Array[Array[Tree.ValDef]]): Array[Array[Symbol]] = {
- val vparamSyms = new Array[Array[Symbol]](vparams.length);
- var i = 0; while (i < vparams.length) {
- vparamSyms(i) = enterParams(vparams(i));
- i = i + 1
- }
- vparamSyms
- }
-
- /** Re-enter type parameters in current scope.
- *
- *
- */
- def reenterParams(tparams: Array[Tree.AbsTypeDef], tsyms: Array[Symbol]): unit = {
- var i = 0; while (i < tparams.length) {
- tsyms(i).pos = tparams(i).pos;
- tsyms(i).name = tparams(i).name;
- //necessary since tsyms might have been unpickled
- tparams(i).setSymbol(tsyms(i));
- context.scope.enter(tsyms(i));
- i = i + 1
- }
- }
-
- /** Re-enter type and value parameters in current scope.
- */
- def reenterParams(tparams: Array[Tree.AbsTypeDef], vparamss: Array[Array[Tree.ValDef]], mt: Type): unit = {
- var rest: Type = mt;
- rest match {
- case Type$PolyType(tsyms, restp) =>
- reenterParams(tparams, tsyms);
- rest = restp;
- case _ =>
- }
- var j = 0; while (j < vparamss.length) {
- val vparams = vparamss(j);
- rest match {
- case Type$MethodType(vsyms, restp) =>
- var i = 0; while (i < vparams.length) {
- vsyms(i).pos = vparams(i).pos;
- vsyms(i).name = vparams(i).name;
- //necessary since vsyms might have been unpickled
- vparams(i).setSymbol(vsyms(i));
- //potential overload in case this is a view parameter
- context.scope.enterOrOverload(vsyms(i));
- i = i + 1
- }
- rest = restp;
- case _ =>
- }
- j = j + 1
- }
- }
-
- def addInheritedOverloaded(sym: Symbol, tp: Type): unit =
- if (sym.owner().kind == CLASS &&
- !sym.isConstructor() &&
- sym.owner().lookup(sym.name) == sym)
- // it's a class member which is not an overloaded alternative
- sym.addInheritedOverloaded(tp);
-
-// Definining Symbols -------------------------------------------------------
-
- /** Define symbol associated with `tree' using given `unit' and `context'.
- */
- def defineSym(tree: Tree, unit: CompilationUnit, curcontext: Context): unit = {
- val savedUnit: CompilationUnit = this.unit;
- this.unit = unit;
- val savedContext: Context = this.context;
- this.context = curcontext;
- val savedMode: int = this.mode;
- this.mode = EXPRmode;
- val savedPt: Type = this.pt;
- this.pt = Type.AnyType;
-
- try {
- val sym: Symbol = tree.symbol();
- if (global.debug) global.log("defining " + sym);
- var owntype: Type = null;
- tree match {
- case Tree.ClassDef(mods, name, tparams, vparams, tpe, templ) =>
- val prevContext = pushContext(
- tree, sym.primaryConstructor(), new Scope(context.scope));
- val tparamSyms = enterParams(tparams);
- var vparamSyms = enterParams(vparams);
- if (vparamSyms.length == 0) {
- vparamSyms = NewArray.SymbolArray{Symbol.EMPTY_ARRAY};
- } else if (infer.isViewBounded(tparamSyms) && vparamSyms.length == 1) {
- val vparamSyms1 = new Array[Array[Symbol]](2);
- vparamSyms1(0) = vparamSyms(0);
- vparamSyms1(1) = Symbol.EMPTY_ARRAY;
- vparamSyms = vparamSyms1
- }
- if (vparams.length > 0)
- templ.body = desugarize.addParamAccessors(
- templ.body, vparams(vparams.length - 1));
-
- val constrtype: Type = makeMethodType(
- tparamSyms,
- vparamSyms,
- Type.typeRef(sym.owner().thisType(), sym, Symbol.getType(tparamSyms)));
- //System.out.println("set info " + sym.constructor() + " to " + constrtype + " was " + sym.constructor().rawInfo());//DEBUG
- sym.primaryConstructor().setInfo(constrtype);
- // necessary so that we can access tparams
- sym.primaryConstructor().flags =
- sym.primaryConstructor().flags | INITIALIZED;
-
- if (tpe != Tree.Empty)
- sym.setTypeOfThis(new LazySelfType(sym, tpe));
-
- defineTemplate(templ, sym, new Scope());
- owntype = templ.getType();
- context = prevContext;
-
- case Tree.ModuleDef(mods, name, _tpe, templ) =>
- var tpe = _tpe;
- val clazz: Symbol = sym.moduleClass();
- val prevContext = pushContext(
- tree, clazz.primaryConstructor(), context.scope);
- defineTemplate(templ, clazz, new Scope());
- context = prevContext;
- clazz.setInfo(templ.getType());
- tpe = transform(tpe, TYPEmode);
- (tree.asInstanceOf[Tree.ModuleDef]).tpe = tpe;
- if (tpe != Tree.Empty)
- clazz.setTypeOfThis(new LazySelfType(sym, tpe));
- owntype = if (tpe == Tree.Empty) clazz.getType() else tpe.getType();
-
- case Tree.DefDef(mods, name, tparams, vparams, _tpe, _rhs) =>
- var tpe = _tpe;
- var rhs = _rhs;
- var restype: Type = null;
- val prevContext = pushContext(tree, sym, new Scope(context.scope));
- val tparamSyms = enterParams(tparams);
- val vparamSyms = enterParams(vparams);
- if (tpe != Tree.Empty) {
- tpe = transform(tpe, TYPEmode);
- (tree.asInstanceOf[Tree.DefDef]).tpe = tpe;
- restype = tpe.getType();
- } else if (name == Names.CONSTRUCTOR) {
- if (context.enclClass.owner.typeParams().length != 0)
- error(tree.pos, "secondary constructors for parameterized classes not yet implemented");
- restype = context.enclClass.owner.getType();/*.subst(
- context.enclClass.owner.typeParams(), tparamSyms)*/;
- } else {
- if (sym.hasParamAccessorFlag()) {
- rhs.setType(rhs.symbol().getType());
- } else {
- rhs = transform(rhs, EXPRmode);
- (tree.asInstanceOf[Tree.DefDef]).rhs = rhs;
- }
- restype = rhs.getType();
- if (!sym.isFinal()) restype = restype.deconst();
- }
- restype = checkNoEscape(tpe.pos, restype);
- if (name == Names.view &&
- infer.containsSymbol(tparamSyms, restype.symbol())) {
- error(tree.pos, "result type of view may not be a type variable");
- restype = definitions.ANY_TYPE();
- }
- context = prevContext;
-
- owntype = makeMethodType(tparamSyms, vparamSyms, restype);
- //System.out.println("methtype " + name + ":" + owntype);//DEBUG
- addInheritedOverloaded(sym, owntype);
-
- case Tree.ValDef(mods, name, _tpe, _rhs) =>
- var tpe = _tpe;
- var rhs = _rhs;
- if (tpe != Tree.Empty) {
- tpe = transform(tpe, TYPEmode);
- (tree.asInstanceOf[Tree.ValDef]).tpe = tpe;
- owntype = tpe.getType();
- } else {
- val prevContext = pushContext(tree, sym, context.scope);
- if (rhs == Tree.Empty) {
- if (sym.owner().isAccessor()) {
- // this is the parameter of a variable setter method.
- assert(sym.isParameter());
- owntype = sym.owner().accessed().getType();
- } else {
- error(tree.pos, "missing parameter type");
- owntype = Type.ErrorType;
- }
- } else {
- rhs = transform(rhs, EXPRmode);
- (tree.asInstanceOf[Tree.ValDef]).rhs = rhs;
- owntype = rhs.getType();
- if (sym.isVariable() || !sym.isFinal())
- owntype = owntype.deconst();
- }
- context = prevContext;
- addInheritedOverloaded(sym, owntype);
- }
-
- case Tree.AliasTypeDef(mods, name, tparams, _rhs) =>
- var rhs = _rhs;
- val prevContext =
- pushContext(tree, sym.primaryConstructor(), new Scope(context.scope));
- val tparamSyms = enterParams(tparams);
- rhs = transform(rhs, TYPEmode);
- (tree.asInstanceOf[Tree.AliasTypeDef]).rhs = rhs;
- owntype = rhs.getType();
- sym.primaryConstructor().setInfo(
- new Type$PolyType(tparamSyms, owntype));
- context = prevContext;
-
- case Tree.AbsTypeDef(mods, name, _rhs, _lobound) =>
- var rhs = _rhs;
- var lobound = _lobound;
- //can't have `sym' as owner since checkNonCyclic would fail.
- rhs = transform(rhs, TYPEmode);
- tree.asInstanceOf[Tree.AbsTypeDef].rhs = rhs;
- lobound = transform(lobound, TYPEmode);
- (tree.asInstanceOf[Tree.AbsTypeDef]).lobound = lobound;
- if (sym.isViewBounded()) {
- sym.setVuBound(rhs.getType());
- owntype = definitions.ANY_TYPE();
- } else {
- owntype = rhs.getType();
- }
- sym.setLoBound(lobound.getType());
- owntype.symbol().initialize();//to detect cycles todo: needed?
-
- case Tree.Import(_expr, selectors) =>
- val expr = transform(_expr, EXPRmode | QUALmode);
- tree.asInstanceOf[Tree.Import].expr = expr;
- checkStable(expr);
- owntype = expr.getType();
- val tp: Type = owntype.widen();
- { var i = 0; while (i < selectors.length) {
- if (selectors(i) != Names.IMPORT_WILDCARD &&
- tp.lookup(selectors(i)) == Symbol.NONE &&
- tp.lookup(selectors(i).toTypeName()) == Symbol.NONE)
- error(tree.pos, "" + NameTransformer.decode(selectors(i)) + " is not a member of " + expr);
- i = i + 2
- }}
- case _ =>
- throw new ApplicationError();
- }
- sym.setInfo(owntype);
- validate(sym);
- if (global.debug) global.log("defined " + sym);
- } catch {
- case ex: Type$Error =>
- reportTypeError(tree.pos, ex);
- setError(tree);
- if (tree.hasSymbol()) {
- tree.symbol().setInfo(Type.ErrorType);
- }
- }
-
- this.unit = savedUnit;
- this.context = savedContext;
- this.mode = savedMode;
- this.pt = savedPt;
- }
-
- /** Definition phase for a template. This enters all symbols in template
- * into symbol table.
- */
- def defineTemplate(templ: Tree.Template, clazz: Symbol, members: Scope): Unit = {
- // attribute parent constructors
- templ.parents = transformConstrInvocations(templ.pos, templ.parents);
- if (templ.parents.length > 0 &&
- (templ.parents(0).getType().symbol().flags & (JAVA | INTERFACE)) == (JAVA | INTERFACE)) {
- val constrs1 = new Array[Tree](templ.parents.length + 1);
- constrs1(0) = gen.mkApply__(
- gen.mkPrimaryConstructorGlobalRef(
- templ.parents(0).pos, definitions.OBJECT_CLASS));
- System.arraycopy(templ.parents, 0, constrs1, 1, templ.parents.length);
- templ.parents = constrs1;
- }
- val parents = Tree.typeOf(templ.parents);
-
- // enter all members
- val prevContext = pushContext(templ, clazz, members);
- templ.body = desugarize.Statements(unit, templ.body, false);
- enterSyms(templ.body);
- context = prevContext;
- templ.setType(Type.compoundType(parents, members, clazz));
- }
-
- def makeMethodType(tparams: Array[Symbol], vparams: Array[Array[Symbol]], restpe: Type): Type =
- if (tparams.length == 0 && vparams.length == 0) {
- new Type$PolyType(tparams, restpe);
- } else {
- var result: Type = restpe;
- var i = vparams.length - 1;
- while (i >= 0) {
- result = new Type$MethodType(vparams(i), result);
- i = i - 1;
- }
- if (tparams.length != 0)
- result = new Type$PolyType(tparams, result);
- result
- }
-
- /** Define self type of class or module `sym'
- * associated with `tree' using given `unit' and `context'.
- *
- * @param sym
- * @param clazz
- * @param tree
- * @param unit
- * @param curcontext
- */
- def defineSelfType(sym: Symbol, clazz: Symbol, tree: Tree, unit: CompilationUnit, curcontext: Context): Unit = {
- val savedUnit: CompilationUnit = this.unit;
- this.unit = unit;
- val savedContext: Context = this.context;
- this.context = curcontext;
-
- val selftype: Type = transform(tree, TYPEmode).getType();
- //todo: can we really make a compound type with class
- val selftype1: Type =
- if (clazz.getType().isSubType(selftype))
- clazz.getType()
- else if (selftype.isSubType(clazz.getType()))
- selftype
- else if (selftype.isSingletonType() && selftype.singleDeref().symbol().isSubClass(clazz))
- selftype
- else
- selftype match {
- case Type$CompoundType(parts, members) =>
- val parts1 = new Array[Type](parts.length + 1);
- System.arraycopy(parts, 0, parts1, 0, parts.length);
- parts1(parts.length) = clazz.getType();
- Type.compoundTypeWithOwner(clazz.owner().enclClass(), parts1, members);
-
- case _ =>
- Type.compoundTypeWithOwner(
- clazz.owner().enclClass(), NewArray.Type(selftype, clazz.getType()), Scope.EMPTY);
- }
- if (global.debug) global.log("assigning self type " + selftype1);
- sym.setInfo(selftype1);
-
- this.unit = savedUnit;
- this.context= savedContext;
- }
-
-// Attribution and Transform -------------------------------------------------
-
- /** Turn tree type into stable type if possible and required by
- * context.
- */
- def mkStable(tree: Tree, pre: Type, mode: int, pt: Type): Tree = {
- tree.getType() match {
- case Type$ConstantType(_, value) =>
- return make.Literal(tree.pos, value).setType(tree.getType())
- case Type$PolyType(tparams, restp) =>
- if (tparams.length == 0) {
- restp match {
- case Type$ConstantType(_, value) =>
- return make.Literal(tree.pos, value).setType(tree.getType());
- case _ =>
- }
- }
- case _ =>
- }
- if ((pt != null && pt.isStable() ||
- (mode & QUALmode) != 0 ||
- tree.getType().symbol().isModuleClass()) &&
- (pre != null) && pre.isStable()) {
- var sym: Symbol = tree.symbol();
- tree.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- if ((mode & FUNmode) == 0) {
- try {
- infer.exprAlternative(tree, alts, alttypes, pt);
- sym = tree.symbol();
- } catch {
- case ex: Type$Error =>
- reportTypeError(tree.pos, ex);
- }
- }
- case _ =>
- }
- if (sym.isStable()) {
- tree.setType(Type.singleType(pre, sym));
- }
- }
- tree
- }
-
- /** The qualifying class of a this or super
- */
- def qualifyingClass(tree: Tree, name: Name): Symbol = {
- if (name == TypeNames.EMPTY) {
- val clazz: Symbol = context.enclClass.owner;
- if (clazz != null)
- clazz
- else {
- error(tree.pos, "" + tree +
- " can be used only in a class, object, or template");
- Symbol.NONE
- }
- } else {
- var i: Context = context;
- while (i != Context.NONE &&
- !(i.owner.kind == CLASS && i.owner.name == name))
- i = i.outer.enclClass;
- if (i != Context.NONE)
- i.owner
- else {
- error(tree.pos, "" + name + " is not an enclosing class");
- Symbol.NONE
- }
- }
- }
-
- /** Adapt tree to given mode and given prototype.
- *
- * @param tree
- * @param mode
- * @param pt
- * @return
- */
- def adapt(tree: Tree, mode: Int, pt: Type): Tree = {
- //System.out.println(tree + ":" + tree.getType() + " adapt " + pt + " " + mode);//DEBUG
- tree.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- // resolve overloading
- if ((mode & FUNmode) == 0) {
- try {
- infer.exprAlternative(tree, alts, alttypes, pt);
- } catch {
- case ex: Type$Error =>
- reportTypeError(tree.pos, ex);
- }
- tree.getType() match {
- case Type$OverloadedType(_, _) =>
- // overload resolution failed bcs no alternative matched prototype.
- typeError(tree.pos, tree.getType(), pt);
- return errorTermTree(tree);
- case _ =>
- }
- return adapt(tree, mode, pt);
- }
-
- case Type$PolyType(tparams, restp) =>
- // apply parameterless functions
- // instantiate polymorphic expressions
- if (tparams.length == 0) {
- return adapt(constfold.tryToFold(tree.setType(restp)), mode, pt);
- } else if ((mode & (FUNmode | POLYmode)) == 0) {
- var tree1: Tree = null;
- try {
- tree1 = infer.exprInstance(tree, tparams, restp, pt);
- } catch {
- case ex: Type$Error =>
- error(tree.pos, ex.msg);
- tree1 = errorTermTree(tree);
- }
- return adapt(tree1, mode, pt);
- }
-
- case Type$MethodType(_, _) =>
- // convert unapplied methods to functions.
- if ((mode & (EXPRmode | FUNmode)) == EXPRmode &&
- (infer.isCompatible(tree.getType(), pt))) {
- checkEtaExpandable(tree.pos, tree.getType());
- if (TreeInfo.methPart(tree).symbol() == definitions.ANY_MATCH) {
- error(tree.pos, "`match' needs to be applied fully");
- return errorTree(tree)
- } else {
- return transform(desugarize.etaExpand(tree, tree.getType()), mode, pt);
- }
- } else if ((mode & (CONSTRmode | FUNmode)) == CONSTRmode) {
- error(tree.pos, "missing arguments for class constructor");
- return errorTermTree(tree);
- }
-
- case _ =>
- }
- if ((mode & PATTERNmode) != 0) {
- if (tree.isType()) {
- val clazz: Symbol = tree.getType().withDefaultArgs().unalias().symbol();
-
- if (clazz.isCaseClass()) {
- // set type to instantiated case class constructor
- tree.setType(tree.getType().prefix().memberType(clazz.primaryConstructor()));
- // MZ: this is a hack, but I didn't know how to do it better
- if ((clazz.flags & (JAVA | CASE)) == (JAVA | CASE)) {
- val altconstr = clazz.allConstructors().alternativeSymbols();
- tree.setType(tree.getType().prefix().memberType(
- altconstr(altconstr.length - 1)));
- }
- tree.getType() match {
- case Type$PolyType(tparams, restp) =>
- try {
- infer.constructorInstance(tree, tparams, restp, pt);
- //System.out.println("constr inst " + ArrayApply.toString(tparams) + restp + " against " + pt + " = " + tree.getType());//DEBUG
- } catch {
- case ex: Type$Error =>
- if (!pt.isError()) error(tree.pos, ex.msg);
- setError(tree);
- }
- case _ =>
- }
- } else if (clazz.isSubClass(definitions.SEQ_CLASS)) {
- // set type to instantiated sequence class constructor
- // todo: should we admit even supertypes of the target type?
- val seqtp: Type = pt.baseType(clazz);
- if (seqtp != Type.NoType) {
- def seqConstructorType(paramtp: Type, resulttp: Type) = {
- val constr: Symbol = resulttp.symbol().primaryConstructor();
- val param: Symbol = constr.newVParam(
- tree.pos, REPEATED, Names.PATTERN_WILDCARD,
- paramtp.baseType(definitions.SEQ_CLASS));
- new Type$MethodType(NewArray.Symbol(param), resulttp);
- }
- tree.setType(seqConstructorType(seqtp, pt));
- } else {
- error(tree.pos, "expected pattern type " + pt +
- " does not conform to sequence " + clazz);
- return errorTermTree(tree);
- }
- } else if (!tree.getType().isError()) {
- error(tree.pos, "" + tree.getType().symbol() +
- " is neither a case class constructor nor a sequence class constructor");
- return errorTermTree(tree);
- }
- }
- if ((mode & FUNmode) != 0) {
- return tree;
- } else {
- val sym: Symbol = tree.symbol();
- // check that idents or selects are stable.
- tree match {
- case Tree.Ident(_) | Tree.Select(_, _) =>
- checkStable(tree);
- case _ =>
- }
- }
- } else if ((mode & EXPRmode) != 0) {
- if ((mode & FUNmode) != 0) {
- if (tree.getType().isObjectType()) {
- // insert apply method
- val applyMeth: Symbol = tree.getType().lookup(Names.apply);
- if (applyMeth != Symbol.NONE) {
- val applyType: Type = infer.checkAccessible(
- tree.pos, applyMeth, tree.getType().memberType(applyMeth),
- tree, tree.getType());
- val tree1 = make.Select(tree.pos, tree, Names.apply)
- .setSymbol(applyMeth)
- .setType(applyType);
- return adapt(tree1, mode, pt);
- }
- }
- } else if ((mode & QUALmode) == 0) {
- // check that packages and static modules are not used as values
- tree match {
- case Tree.Ident(_) | Tree.Select(_, _) =>
- val sym: Symbol = tree.symbol();
- if (sym != null && !sym.isError() && !sym.isValue()) {
- error(tree.pos, "" + tree.symbol() + " is not a value");
- return errorTermTree(tree);
- }
- case _ =>
- }
- }
- }
-
- var owntype: Type = tree.getType();
- if ((mode & (CONSTRmode | FUNmode)) == (CONSTRmode) && pt != Type.AnyType) {
- owntype = owntype.instanceType();
- // this works as for superclass constructor calls the expected
- // type `pt' is always AnyType (see transformConstrInvocations).
- }
- if (!(owntype.isInstanceOf[Type$PolyType] || owntype.isSubType(pt))) {
- tree match {
- case Tree.Literal(constant) =>
- var n: int = constant match {
- case AConstant$INT(value) => value
- case AConstant$CHAR(value) => value
- case _ => Integer.MAX_VALUE
- }
- val value1: AConstant =
- if (pt.symbol() == definitions.BYTE_CLASS && -128 <= n && n <= 127)
- AConstant.BYTE(n.asInstanceOf[byte])
- else if (pt.symbol() == definitions.SHORT_CLASS && -32768 <= n && n <= 32767)
- AConstant.SHORT(n.asInstanceOf[short])
- else if (pt.symbol() == definitions.CHAR_CLASS && 0 <= n && n <= 65535)
- AConstant.CHAR(n.asInstanceOf[char])
- else null;
- if (value1 != null)
- return gen.Literal(tree.pos, value1);
- case _ =>
- }
- if ((mode & EXPRmode) != 0) {
- if (pt.isInstanceOf[Type$TypeRef] && pt.symbol() == definitions.UNIT_CLASS && tree.getType().isSubType(definitions.ANY_TYPE())) {
- return gen.mkUnitBlock(tree);
- } else if (infer.isCompatible(tree.getType(), pt)) {
- tree match {
- case Tree.Literal(value) =>
- val value1 = constfold.cast(value, pt);
- if (value1 != null)
- return adapt(gen.Literal(tree.pos, value1), mode, pt);
- case _ =>
- }
- val v = infer.bestView(tree.getType(), pt, Names.EMPTY);
- // Convert views of delegate types to closures wrapped around
- // the expression's apply method.
- if(global.target == scalac_Global.TARGET_MSIL &&
- v != null && isDelegateForwardView(tree.getType(), pt)) {
- val meth: Symbol = tree.symbol().lookup(Names.apply);
- return adapt(gen.Select(tree, meth), mode, pt);
- }
- if (v != null) return applyView(v, tree, mode, pt);
- // todo: remove
- val coerceMeth: Symbol = tree.getType().lookup(Names.coerce);
- if (coerceMeth != Symbol.NONE) {
- val coerceType = infer.checkAccessible(
- tree.pos, coerceMeth, tree.getType().memberType(coerceMeth),
- tree, tree.getType());
- val tree1 = make.Select(tree.pos, tree, Names.coerce)
- .setSymbol(coerceMeth)
- .setType(coerceType);
- return adapt(tree1, mode, pt);
- }
- }
- }
- if ((mode & CONSTRmode) == 0) {
- typeError(tree.pos, owntype, pt);
- Type.explainTypes(owntype, pt);
- setError(tree);
- } // for constructors, delay until after the `new'.
- }
- tree
- }
-
- /** Attribute an identifier consisting of a simple name or an outer reference.
- * @param tree The tree representing the identifier.
- * @param name The name of the identifier.
- */
- def transformIdent(_tree: Tree, name: Name): Tree = {
- var tree = _tree;
- //System.out.println("transforming " + name);//DEBUG
- // find applicable definition and assign to `sym'
- var sym: Symbol = Symbol.NONE;
- var pre: Type = null;
- var qual: Tree = Tree.Empty;
- var stopPos: int = Integer.MIN_VALUE;
- var nextcontext: Context = context;
- while (sym.kind == NONE && nextcontext != Context.NONE) {
- sym = nextcontext.scope.lookup(name);
- if (sym.kind != NONE) {
- stopPos = sym.pos;
- } else {
- nextcontext = nextcontext.enclClass;
- if (nextcontext != Context.NONE) {
- sym = nextcontext.owner.typeOfThis().lookup(name);
- if (sym.kind != NONE) {
- stopPos = nextcontext.owner.pos;
- } else {
- nextcontext = nextcontext.outer;
- }
- }
- }
- }
-
- if (stopPos > tree.pos) {
- // set stopPos to beginning of block enclosed in the scope which defines the
- // referenced symbol.
- var lastc = Context.NONE;
- var c = nextcontext;
- while (c.outer.scope != null && c.outer.scope.lookup(name) == sym) {
- c.tree match {
- case Tree.Block(_, _) | Tree.CaseDef(_, _, _) | Tree.ClassDef(_, _, _, _, _, _) | Tree.ModuleDef(_, _, _, _) =>
- lastc = c;
- case _ =>
- }
- c = c.outer
- }
- if (lastc != Context.NONE) {
- //System.out.println("revising stop to [" + lastc.tree + "]; symbol = " + sym + ", context = " + nextcontext);//DEBUG
- stopPos = lastc.tree.pos;
- }
- }
-
- var impcontext: Context = context.prevImport;
- var lastimpcontext: Context = null;
- var sym1: Symbol = Symbol.NONE;
- while (sym1.kind == NONE && impcontext != Context.NONE && impcontext.tree.pos > stopPos) {
- sym1 = impcontext.importedSymbol(name);
- lastimpcontext = impcontext;
- impcontext = impcontext.outer.prevImport;
- }
-
- // evaluate what was found
- if (sym1.kind == NONE) {
- if (sym.kind == NONE) {
- //System.out.println(name);//DEBUG
- error(tree.pos, "not found: " + decode(name));
- return errorTree(tree);
- } else {
- if (sym.owner().kind == CLASS) {
- pre = nextcontext.enclClass.owner.thisType();
- if (!sym.owner().isPackageClass()) {
- val qual1: Tree = gen.This(tree.pos, nextcontext.enclClass.owner);
- tree = make.Select(tree.pos, qual1, name);
- //System.out.println(name + " :::> " + tree + " " + qual1.symbol());//DEBUG
- }
- } else {
- pre = Type.NoPrefix;
- }
- }
- } else if (sym.kind != NONE && !sym.isExternal()) {
- error(tree.pos,
- "reference to " + name + " is ambiguous;\n" +
- "it is both defined in " + sym.owner() +
- " and imported subsequently by \n" + lastimpcontext.tree);
- return errorTree(tree);
- } else {
- // check that there are no other applicable imports in same scope.
- while (impcontext != Context.NONE && impcontext.scope == lastimpcontext.scope) {
- if (!impcontext.sameImport(lastimpcontext) && impcontext.importedSymbol(name).kind != NONE) {
- error(tree.pos,
- "reference to " + name + " is ambiguous;\n" +
- "it is imported twice in the same scope by\n " +
- lastimpcontext.tree + "\nand " + impcontext.tree);
- return errorTree(tree);
- }
- impcontext = impcontext.outer.prevImport;
- }
- sym = sym1;
- qual = lastimpcontext.importPrefix().duplicate();
- pre = qual.getType();
- //System.out.println(name + " => " + lastimpcontext.tree + "." + name);//DEBUG
- tree = make.Select(tree.pos, qual, name);
- }
-
- var symtype: Type =
- (if (sym.isType()) sym.typeConstructor() else sym.getType())
- .asSeenFrom(pre, sym.owner());
- symtype = infer.checkAccessible(
- tree.pos, sym, symtype, qual,
- if (qual == Tree.Empty && sym.owner().isPackageClass()) sym.owner().getType()
- else qual.getType());
- if (symtype == Type.NoType) {
- error(tree.pos, "not found: " + decode(name));
- return errorTree(tree);
- }
- //System.out.println(name + ":" + symtype);//DEBUG
- mkStable(tree.setSymbol(sym).setType(symtype), pre, mode, pt)
- }
-
- /** Attribute a selection where `tree' is `qual.name'.
- * `qual' is already attributed.
- */
- def transformSelect(tree: Tree, _qual: Tree, name: Name): Tree = {
- var qual = _qual;
- var uninst: Array[Symbol] = Symbol.EMPTY_ARRAY;
- qual.getType() match {
- case Type$PolyType(tparams, restype) =>
- qual = infer.mkTypeApply(qual, tparams, restype, Symbol.getType(tparams));
- uninst = tparams;
- case _ =>
- }
- var sym: Symbol = qual.getType().lookup(name);
- if (sym.kind == NONE) {
- if (name != Names.view) {
- val qtype = qual.getType().singleDeref();
- val v = infer.bestView(qtype, Type.AnyType, name);
- if (v != null) {
- qual = applyView(v, qual.setType(qtype), EXPRmode, Type.AnyType);
- sym = qual.getType().lookup(name);
- assert(sym.kind != NONE);
- } else {
- //System.out.println(qual.getType() + " has members " + qual.getType().members());//DEBUG
- error(tree.pos,
- decode(name) + " is not a member of " + qual.getType().widen());
- return errorTree(tree);
- }
- }
- }
- val qualtype =
- if (qual.isInstanceOf[Tree.Super]) context.enclClass.owner.thisType()
- else qual.getType();
- var symtype: Type =
- (if (sym.isType()) sym.typeConstructor() else sym.getType())
- .asSeenFrom(qualtype, sym.owner());
- if (symtype == Type.NoType) {
- error(tree.pos, "not found: " + decode(name));
- return errorTree(tree);
- } else
- symtype = infer.checkAccessible(tree.pos, sym, symtype, qual, qualtype);
- //System.out.println(sym.name + ":" + symtype);//DEBUG
- if (uninst.length != 0) {
- def polymorphize(tp: Type): Type = tp match {
- case Type$PolyType(tparams, restype) =>
- new Type$PolyType(tparams, polymorphize(restype))
- case Type$OverloadedType(alts, alttypes) =>
- val alttypes1 = new Array[Type](alttypes.length);
- var i = 0; while (i < alttypes.length) {
- alttypes1(i) = polymorphize(alttypes(i));
- i = i + 1
- }
- new Type$OverloadedType(alts, alttypes1)
- case _ =>
- new Type$PolyType(uninst, tp);
- }
- symtype = polymorphize(symtype);
- }
- //System.out.println(qual.getType() + ".member: " + sym + ":" + symtype);//DEBUG
- val tree1: Tree = tree match {
- case Tree.Select(_, _) =>
- copy.Select(tree, sym, qual);
- case Tree.SelectFromType(_, _) =>
- copy.SelectFromType(tree, sym, qual)
- }
- mkStable(tree1.setType(symtype), qualtype, mode, pt)
- }
-
- /** Attribute a pattern matching expression where `pattpe' is the
- * expected type of the patterns and `pt' is the expected type of the
- * results.
- */
- def transformVisitor(tree: Tree, pattpe: Type, pt: Type): Tree =
- //System.out.println("trans visitor with " + pattpe + "," + pt);//DEBUG
- tree match {
- case Tree.Visitor(cases) =>
- val cases1 = cases;
- var i = 0; while (i < cases.length) {
- cases1(i) = transformCase(cases(i), pattpe, pt);
- i = i + 1
- }
- return copy.Visitor(tree, cases1)
- .setType(Type.lub(Tree.typeOf(cases1.asInstanceOf[Array[Tree]])));
- case _ =>
- throw new ApplicationError();
- }
-
- /** Attribute a case where `pattpe' is the expected type of the pattern
- * and `pt' is the expected type of the result.
- */
- def transformCase(tree: Tree.CaseDef, pattpe: Type, pt: Type): Tree.CaseDef =
- tree match {
- case Tree.CaseDef(pat, guard, body) =>
- val prevContext = pushContext(tree, context.owner, new Scope(context.scope));
- this.inAlternative = false; // no vars allowed below Alternative
- val pat1: Tree = transform(pat, PATTERNmode, pattpe);
- val guard1: Tree =
- if (guard == Tree.Empty) Tree.Empty
- else transform(guard, EXPRmode, definitions.boolean_TYPE());
- val body1: Tree = transform(body, EXPRmode, pt);
- context = prevContext;
- return copy.CaseDef(tree, pat1, guard1, body1)
- .setType(body1.getType()).asInstanceOf[Tree.CaseDef];
- }
-
- def transformStatSeq(stats: Array[Tree], exprOwner: Symbol): Array[Tree] = {
- var stats1 = stats;
- var i = 0; while (i < stats.length) {
- val stat: Tree = stats(i);
- if (context.owner.isCompoundSym() && !TreeInfo.isDeclaration(stat)) {
- error(stat.pos, "only declarations allowed here");
- }
- val mode: int = if (TreeInfo.isDefinition(stat)) NOmode else EXPRmode;
- var stat1: Tree = null;
- if (exprOwner.kind != NONE && !TreeInfo.isDefinition(stat)) {
- val prevContext = pushContext(stat, exprOwner, context.scope);
- stat1 = transform(stat, mode);
- context = prevContext;
- } else {
- stat1 = transform(stat, mode);
- }
- // todo: if we comment next 4 lines out, test/pos/scoping2 fails.
- // find out why
- if (stat1 != stat && stats1 == stats) {
- stats1 = new Array[Tree](stats.length);
- System.arraycopy(stats, 0, stats1, 0, i);
- }
- stats1(i) = stat1;
- i = i + 1
- }
- stats1
- }
-
- /** Attribute a sequence of constructor invocations.
- *
- * @param pos
- * @param constrs
- * @return
- */
- def transformConstrInvocations(pos: Int, constrs: Array[Tree]): Array[Tree] = {
- var i = 0; while (i < constrs.length) {
- constrs(i) = transform(constrs(i), CONSTRmode | SUPERmode, Type.AnyType);
- val f: Symbol = TreeInfo.methSymbol(constrs(i));
- if (f != null) {
- val cSym: Symbol = f.constructorClass();
- if (cSym.kind == CLASS) {
- cSym.initialize();//to detect cycles
- if (i > 0 && (cSym.flags & JAVA) == 0) loadMixinCode(pos, cSym);
- }
- }
- i = i + 1
- }
- constrs
- }
-
- def transformConstrInvocationArgs(constrs: Array[Tree]): Unit = {
- var i = 0; while (i < constrs.length) {
- constrs(i) match {
- case Tree.Apply(fn, args) =>
- if (fn.getType().isInstanceOf[Type$MethodType])
- transformArgs(
- constrs(i).pos, TreeInfo.methSymbol(fn), Symbol.EMPTY_ARRAY,
- fn.getType(), EXPRmode, args, Type.AnyType);
- case _ =>
- }
- i = i + 1
- }
- }
-
- /** Attribute a template
- */
- def transformTemplate(templ: Tree.Template, owner: Symbol): Tree.Template = {
- //if (global.debug) global.log("transforming template of " + owner);//DEBUG
- if (templ.getType() == null)
- defineTemplate(templ, owner, owner.members());//may happen for mixins
- //System.out.println(owner.info());//DEBUG
- val parents = templ.parents;
- transformConstrInvocationArgs(parents);
- if (!owner.isError()) {
- validateParentClasses(
- parents, owner.info().parents(), owner.thisType());
- }
- val prevContext = pushContext(templ, owner, owner.members());
- /*
- val params: Scope = new Scope();
- def computeParams(t: Type): unit = t match {
- case Type$PolyType(tparams, t1) =>
- var i = 0; while (i < tparams.length) {
- params.enter(tparams(i));
- i = i + 1;
- }
- computeParams(t1);
- case Type$MethodType(vparams, _) =>
- var i = 0; while (i < vparams.length) {
- params.enter(vparams(i));
- i = i + 1;
- }
- case _ =>
- }
- computeParams(owner.primaryConstructor().getType());
- val prevContext = pushContext(templ, owner.primaryConstructor(), params);
- */
- templ.setSymbol(owner.newLocalDummy());
- val body1 = transformStatSeq(templ.body, templ.symbol());
- /*
- context = prevContext;
- */
- context = prevContext;
- val templ1: Tree.Template = copy.Template(templ, parents, body1);
- templ1.setType(owner.getType());
- // initialize all members; necessary to initialize overloaded symbols
- val members: Array[Symbol] = owner.members().elements();
- var i = 0; while (i < members.length) {
- val sym = members(i);
- sym.initialize();
- //System.out.println(owner.toString() + " defines " + sym + ":" + sym.getType());//DEBUG
- i = i + 1
- }
- templ1
- }
-
- /** Attribute an argument list.
- * @param pos Position for error reporting
- * @param meth The symbol of the called method, or `null' if none exists.
- * @param tparams The type parameters that need to be instantiated
- * @param methtype The method's type w/o type parameters
- * @param argMode The argument mode (either EXPRmode or PATTERNmode)
- * @param args The actual arguments
- * @param pt The proto-resulttype.
- * @return The vector of instantiated argument types, or null if error.
- */
- def transformArgs(pos: int, meth: Symbol, tparams: Array[Symbol], methtype: Type, argMode: int, args: Array[Tree], pt: Type): Array[Type] = {
- //System.out.println("trans args " + meth + ArrayApply.toString(tparams.asInstanceOf[Array[Object]]) + ":" + methtype + "," + pt);//DEBUG
- val argtypes = new Array[Type](args.length);
- methtype match {
- case Type$MethodType(params, restp) =>
- val formals = infer.formalTypes(params, args.length);
- if (formals.length != args.length) {
- error(pos, "wrong number of arguments for " +
- (if (meth == null) "<function>" else meth) +
- ArrayApply.toString(formals.asInstanceOf[Array[Object]], "(", ",", ")"));
- return null;
- }
- if (tparams.length == 0) {
- var i = 0; while (i < args.length) {
- args(i) = transform(args(i), argMode, formals(i));
- argtypes(i) = args(i).getType().deconst();
- i = i + 1
- }
- } else {
- // targs: the type arguments inferred from the prototype
- val targs: Array[Type] = infer.protoTypeArgs(tparams, restp, pt, params);
-
- // argpts: prototypes for arguments
- val argpts = new Array[Type](formals.length);
- var i = 0; while (i < formals.length) {
- argpts(i) = formals(i).subst(tparams, targs);
- i = i + 1
- }
-
- // transform arguments with (targs/tparams)formals as prototypes
- { var i = 0; while (i < args.length) {
- args(i) = transform(
- args(i), argMode | POLYmode, formals(i).subst(tparams, targs));
- i = i + 1
- }}
-
- // targs1: same as targs except that every AnyType is mapped to
- // formal parameter type.
- val targs1 = new Array[Type](targs.length);
- { var i = 0; while (i < targs.length) {
- targs1(i) = if (targs(i) != Type.AnyType) targs(i)
- else tparams(i).getType();
- i = i + 1
- }}
-
- { var i = 0; while (i < args.length) {
- argtypes(i) = args(i).getType().deconst();
- argtypes(i) match {
- case Type$PolyType(tparams1, restype1) =>
- argtypes(i) = infer.argumentTypeInstance(
- tparams1, restype1,
- formals(i).subst(tparams, targs1),
- argpts(i));
- case _ =>
- }
- i = i + 1
- }}
- }
- // desugarizing ident patterns
- if (params.length > 0 && (params(params.length-1).flags & REPEATED) != 0) {
- if ((mode & PATTERNmode) != 0) {
- def desug_allIdentPatterns(trees: Array[Tree], currentOwner: Symbol): unit = {
- var i = 0; while (i < trees.length) {
- trees(i) match {
- case Tree.Ident(name) =>
- if (name != Names.PATTERN_WILDCARD) {
- val vble: Symbol = context.scope.lookup(name);
- trees(i) = desugarize.IdentPattern(trees(i)).setSymbol(vble)
- .setType(vble.getType());
- } else {
- trees(i) = gen.Ident(trees(i).pos, definitions.PATTERN_WILDCARD);
- }
- case _ =>
- }
- i = i + 1
- }
- }
- desug_allIdentPatterns(args, context.owner);
- } else {
- assert(args.length != params.length ||
- !(args(params.length-1).isInstanceOf[Tree.Sequence]));
- }
- }
- argtypes;
-
- case Type$PolyType(tparams1, restp) =>
- var tparams2: Array[Symbol] = tparams1;
- if (tparams.length != 0) {
- tparams2 = new Array[Symbol](tparams.length + tparams1.length);
- System.arraycopy(tparams, 0, tparams2, 0, tparams.length);
- System.arraycopy(tparams1, 0, tparams2, tparams.length, tparams1.length);
- }
- transformArgs(pos, meth, tparams2,
- infer.skipViewParams(tparams2, restp), argMode, args, pt)
-
- case Type.ErrorType =>
- var i = 0; while (i < args.length) {
- args(i) = transform(args(i), argMode, Type.ErrorType);
- argtypes(i) = args(i).getType().deconst();
- i = i + 1
- }
- argtypes
-
- case Type.OverloadedType(alts, alttypes) if (alts.length == 1) =>
- transformArgs(pos, alts(0), tparams, alttypes(0), argMode, args, pt)
-
- case _ =>
- var i = 0; while (i < args.length) {
- args(i) = transform(args(i), argMode, Type.AnyType);
- argtypes(i) = args(i).getType().deconst();
- i = i + 1
- }
- argtypes
- }
- }
-
- /** Atribute an expression or pattern with prototype `pt'.
- * Check that expression's type conforms to `pt'.
- * Resolve overloading and apply parameterless functions.
- * Insert `apply' function if needed.
- */
- def transform(tree: Tree, mode: int, pt: Type): Tree = {
- val savedMode: int = this.mode;
- val savedPt: Type = this.pt;
- this.mode = mode;
- this.pt = pt;
- val tree1: Tree = adapt(transform(tree), mode, pt);
-
- //System.out.println(tree1 + ": " + tree1.getType());//DEBUG
-
- this.mode = savedMode;
- this.pt = savedPt;
- tree1
- }
-
- /** Transform expression or type with a given mode.
- *
- * @param tree
- * @param mode
- * @return
- */
- def transform(tree: Tree, mode: Int): Tree = {
- if ((mode & (EXPRmode | PATTERNmode | CONSTRmode)) != 0)
- return transform(tree, mode, Type.AnyType);
-
- val savedMode: Int = this.mode;
- this.mode = mode;
- val tree1: Tree = transform(tree);
- this.mode = savedMode;
-
- if ((mode & TYPEmode) != 0) {
- val sym: Symbol = tree1.symbol();
- def typeParamCount = sym.primaryConstructor().rawInfo() match {
- case t: LazyTreeType =>
- t.tree match {
- case Tree.ClassDef(_, _, tparams, _, _, _) => tparams.length
- case Tree.AliasTypeDef(_, _, tparams, _) => tparams.length
- case _ => 0
- }
- case _ => sym.typeParams().length
- }
- if ((mode & FUNmode) == 0 && sym != null && typeParamCount != 0) {
- error(tree.pos, "" + sym + " takes type parameters.");
- return errorTree(tree);
- }
-// else if (tree1.isType())
-// return gen.mkType(tree1.pos, tree1.getType());
- }
- tree1
- }
-
- def transform(trees: Array[Tree], mode: Int): Array[Tree] = {
- var i = 0; while (i < trees.length) {
- trees(i) = transform(trees(i), mode);
- i = i + 1
- }
- trees
- }
-
- override def transform(trees: Array[Tree]): Array[Tree] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree.CaseDef]): Array[Tree.CaseDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree.AbsTypeDef]): Array[Tree.AbsTypeDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree.ValDef]): Array[Tree.ValDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Array[Tree.ValDef]]): Array[Array[Tree.ValDef]] =
- super.transform(trees);
-
- /** The main attribution function
- *
- * @param tree
- * @return
- */
- override def transform(tree: Tree): Tree = {
- //System.out.println("transforming " + tree + ":" + pt);//DEBUG
- if (tree.getType() != null) {
- checkDefined.all = tree; checkDefined.traverse(tree);//debug
- return tree;
- }
- val sym: Symbol = tree.symbol();
- if (sym != null && !sym.isInitialized()) sym.initialize();
- if (global.debug && TreeInfo.isDefinition(tree))
- global.log("transforming definition of " + sym);
- try {
- tree match {
- case Tree.Empty =>
- tree.setType(Type.NoType)
-
- case Tree.Attributed(attr, definition) =>
-
- def attrInfo(attr: Tree): Tuple2[Symbol, Array[AConstant]] = attr match {
- case Tree.Ident(_) | Tree.Select(_, _) =>
- Tuple2(attr.symbol(), AConstant.EMPTY_ARRAY)
- case Tree.Apply(fn, args) =>
- Tuple2(attrInfo(fn)._1, attrArgInfos(args))
- case _ =>
- unit.error(attr.pos, "malformed attribute");
- Tuple2(Symbol.NONE.newErrorClass(errorName(attr).toTypeName()),
- AConstant.EMPTY_ARRAY)
- }
-
- def attrArgInfos(args: Array[Tree]): Array[AConstant] = {
- val infos = new Array[AConstant](args.length);
- var i = 0; while (i < args.length) {
- args(i) match {
- case Tree.Literal(value) => infos(i) = value;
- case _ => unit.error(args(i).pos,
- "attribute argument needs to be a constant; found: " + args(i) + " " + args(i).getClass());
- }
- i = i + 1
- }
- infos
- }
-
- val attr1 = transform(attr, CONSTRmode, definitions.ATTRIBUTE_TYPE());
- val res = transform(definition);
- val defsym = res.symbol();
- val attrpair = attrInfo(attr1);
- global.addAttribute(defsym, attrpair._1, attrpair._2);
- res
-
- case Tree.DocDef(comment, definition) =>
- transform(definition)
-
- case Tree.PackageDef(pkg, templ @ Tree.Template(parents, body)) =>
- val pkgSym: Symbol = pkg.symbol();
- if (pkgSym != null && pkgSym.isPackage()) {
- val prevContext = pushContext(templ, pkgSym.moduleClass(), pkgSym.members());
- val body1: Array[Tree] = transform(body);
- context = prevContext;
- val templ1: Tree.Template = copy.Template(templ, parents, body1);
- templ1.setType(Type.NoType).setSymbol(Symbol.NONE);
- copy.PackageDef(tree, pkg, templ1)
- .setType(Type.NoType);
- } else {
- setError(tree);
- }
-
- case Tree.PackageDef(_, _) =>
- setError(tree)
-
- case Tree.ClassDef(_, _, tparams, vparams, tpe, templ) =>
- val prevContext = pushContext(
- tree, sym.primaryConstructor(), new Scope(context.scope));
- reenterParams(tparams, vparams, sym.primaryConstructor().getType());
- val tparams1 = transform(tparams);
- val vparams1 = transform(vparams);
- checkNoEscapeParams(vparams1);
- val tpe1: Tree = transform(tpe, TYPEmode);
- if (vparams.length > 0 && templ.getType() == null)
- templ.body = desugarize.addParamAccessors(
- templ.body, vparams(vparams.length - 1));
-
- val templ1: Tree.Template = transformTemplate(templ, sym);
- if (sym.isTrait()) checkTraitDef(tree.pos, sym, templ1);
- checkNoEscape(tree.pos, sym.info());
- context = prevContext;
- copy.ClassDef(tree, sym, tparams1, vparams1, tpe1, templ1)
- .setType(Type.NoType);
-
- case Tree.ModuleDef(_, _, tpe, templ) =>
- val clazz = sym.moduleClass();
- clazz.initialize();
- val prevContext = pushContext(
- tree, clazz.primaryConstructor(), context.scope);
- val tpe1: Tree = transform(tpe, TYPEmode);
- context = prevContext;
- val templ1: Tree.Template = transformTemplate(templ, sym.moduleClass());
- if (tpe1 != Tree.Empty && !templ1.getType().isSubType(tpe1.getType()))
- error(tree.pos, "" + sym + " does not implement " + tpe1.getType());
-
- val lclass = sym.linkedClass();
- // Taken from SymbolLoader.initializeRoot()
- if (lclass != null) {
- if (lclass.rawInfo().isInstanceOf[SymbolLoader]) {
- lclass.setInfo(Type.ErrorType);
- val allConstr = lclass.allConstructors();
- allConstr.setInfo(Type.ErrorType);
- allConstr.flags = allConstr.flags | Modifiers.PRIVATE;
- }
- }
-
- copy.ModuleDef(tree, sym, tpe, templ1)
- .setType(Type.NoType);
-
- case Tree.DefDef(_, name, tparams, vparams, tpe, rhs) =>
- val prevContext = pushContext(tree, sym, new Scope(context.scope));
- reenterParams(tparams, vparams, sym.getType());
- if (name == Names.CONSTRUCTOR) {
- val enclClass = context.enclClass.owner;
- enclClass.flags =
- enclClass.flags | INCONSTRUCTOR;
- enclClass.primaryConstructor().flags =
- enclClass.primaryConstructor().flags | INCONSTRUCTOR;
- }
- val tparams1 = transform(tparams);
- val vparams1 = transform(vparams);
- checkNoEscapeParams(vparams1);
- val tpe1: Tree =
- if (tpe == Tree.Empty) gen.mkType(tree.pos, sym.getType().resultType())
- else transform(tpe, TYPEmode);
- var rhs1: Tree =
- if (rhs == Tree.Empty) rhs
- else transform(
- rhs,
- if (name == Names.CONSTRUCTOR) CONSTRmode else EXPRmode,
- if (name == Names.CONSTRUCTOR) definitions.void_TYPE() else tpe1.getType());
- context = prevContext;
- if (name == Names.CONSTRUCTOR) {
- val enclClass = context.enclClass.owner;
- enclClass.flags =
- enclClass.flags & ~ INCONSTRUCTOR;
- enclClass.primaryConstructor().flags =
- enclClass.primaryConstructor().flags & ~ INCONSTRUCTOR;
- }
- sym.flags = sym.flags | LOCKED;
- checkNonCyclic(tree.pos, tpe1.getType());
- sym.flags = sym.flags & ~LOCKED;
- copy.DefDef(tree, sym, tparams1, vparams1, tpe1, rhs1)
- .setType(Type.NoType);
-
- case Tree.ValDef(_, _, tpe, rhs) =>
- assert(sym != null, tree);
- val tpe1: Tree =
- if (tpe == Tree.Empty) gen.mkType(tree.pos, sym.getType())
- else transform(tpe, TYPEmode);
- var rhs1: Tree = rhs;
- if (rhs != Tree.Empty) {
- val prevContext = pushContext(tree, sym, context.scope);
- rhs1 = transform(rhs, EXPRmode, tpe1.getType());
- context = prevContext;
- } else if ((sym.flags & (MUTABLE | DEFERRED)) == MUTABLE) {
- rhs1 = gen.mkDefaultValue(tree.pos, sym.getType());
- }
- sym.flags = sym.flags | LOCKED;
- checkNonCyclic(tree.pos, tpe1.getType());
- sym.flags = sym.flags & ~LOCKED;
- copy.ValDef(tree, sym, tpe1, rhs1)
- .setType(Type.NoType);
-
- case Tree.AbsTypeDef(_, _, rhs, lobound) =>
- val rhs1: Tree = transform(rhs, TYPEmode);
- val lobound1: Tree = transform(lobound, TYPEmode);
- checkNonCyclic(tree.pos, sym.getType());
- copy.AbsTypeDef(tree, sym, rhs1, lobound1)
- .setType(Type.NoType);
-
- case Tree.AliasTypeDef(_, _, tparams, rhs) =>
- val prevContext = pushContext(tree, sym.primaryConstructor(), new Scope(context.scope));
- reenterParams(tparams, sym.typeParams());
- val tparams1 = transform(tparams);
- val rhs1: Tree = transform(rhs, TYPEmode);
- context = prevContext;
- checkNonCyclic(tree.pos, sym.getType());
- copy.AliasTypeDef(tree, sym, tparams1, rhs1)
- .setType(Type.NoType);
-
- case Tree.Import(expr, selectors) =>
- pushContext(tree, context.owner, context.scope);
- Tree.Empty
-/*
-
- case _ =>
- transform1(tree, sym)
- }
- }
-
- // extracted from transform0 to avoid overflows in GenJVM
- private def transform1(tree: Tree, sym: Symbol): Tree = {
-
- tree match {
-*/
- case Tree.Block(stats, value) =>
- val prevContext = pushContext(tree, context.owner, new Scope(context.scope));
- val newContext = context;
- val stats1 = desugarize.Statements(unit, stats, true);
- enterSyms(stats1);
- context = newContext;
- val curmode: int = mode;
- var start: Int = 0;
- var valuemode: Int = curmode;
- if ((curmode & CONSTRmode) != 0) {
- stats1(0) = transform(stats1(0), curmode, pt);
- context.enclClass.owner.flags = context.enclClass.owner.flags & ~INCONSTRUCTOR;
- start = 1;
- valuemode = (curmode & ~CONSTRmode) | EXPRmode;
- }
- var i = start; while (i < stats1.length) {
- stats1(i) = transform(stats1(i), EXPRmode);
- i = i + 1
- }
- val value1: Tree = transform(value, valuemode & ~(FUNmode | QUALmode), pt);
- val owntype: Type =
- checkNoEscape(tree.pos, value1.getType().deconst());
- context = prevContext;
- copy.Block(tree, stats1, value1)
- .setType(owntype);
-
- case Tree.Sequence(trees) =>
- var i = 0; while (i < trees.length) {
- trees(i) = transform(trees(i),
- this.mode | SEQUENCEmode,
- pt);
- i = i + 1
- }
- copy.Sequence(tree, trees).setType(pt);
-
- case Tree.Alternative(choices) =>
- val save: boolean = this.inAlternative;
- this.inAlternative = true;
-
- val newts = new Array[Tree](choices.length);
- var i = 0; while (i < choices.length) {
- newts(i) = transform(choices(i), this.mode, pt);
- i = i + 1
- }
-
- //val tpe: Type = Type.lub(Tree.typeOf(newts));
-
- this.inAlternative = save;
- copy.Alternative(tree, newts).setType(pt);
-
- case Tree.Bind(name, body) =>
- var vble: Symbol = null;
- if (name != Names.PATTERN_WILDCARD) {
- vble = context.owner.newPatternVariable(tree.pos, name).setType(pt);
- enterInScope(vble);
- //System.out.println("Bind("+name+",...) enters in scope:"+Debug.show(vble));
-
- patternVars.put(vble, new JBoolean(this.inAlternative));
- //System.out.println("case Bind.. put symbol vble="+vble+" in scope and patternVars.");
- }
- val body1: Tree = transform(body);
- if (name == Names.PATTERN_WILDCARD) body1
- else {
- //assert body1.getType() != null;
- if(TreeInfo.isSequenceValued(body1)) {
- vble.setType(definitions.LIST_TYPE(pt));
- } else {
- vble.setType(body1.getType());
- }
- copy.Bind(tree, name, body1)
- .setSymbol(vble).setType(body1.getType());
- }
-
- case Tree.Visitor(cases) =>
- if (pt.symbol().isSubClass(definitions.PARTIALFUNCTION_CLASS)) {
- val pft: Type = pt.baseType(definitions.PARTIALFUNCTION_CLASS);
- val pftargs = pft.typeArgs();
- if (pftargs.length == 2 && infer.isFullyDefined(pftargs(0))) {
- val pattype: Type = pftargs(0);
- var restype: Type = pftargs(1);
- val isDefinedAtVisitor: Tree = transformVisitor(
- desugarize.isDefinedAtVisitor(tree),
- pattype, definitions.boolean_TYPE());
- val applyVisitor: Tree = transformVisitor(tree, pattype, restype);
- if (!infer.isFullyDefined(restype))
- restype = applyVisitor.getType().deconst();
- loadMixinCode(tree.pos, definitions.PARTIALFUNCTION_CLASS);
- gen.mkPartialFunction(
- tree.pos, applyVisitor, isDefinedAtVisitor,
- pattype, restype, context.owner);
- } else {
- error(tree.pos, "expected pattern type of cases could not be determined");
- errorTermTree(tree)
- }
- } else {
- transform(desugarize.Visitor(unit, tree))
- }
-
- case Tree.Assign(Tree.Apply(_, _), _) =>
- transform(desugarize.Update(tree))
-
- case Tree.Assign(lhs, rhs) =>
- val lhs1: Tree = transform(lhs, EXPRmode);
- val varsym: Symbol = lhs1.symbol();
- if (isSetterMethod(varsym)) {
- // todo: change this to require setters in same template
- transform(desugarize.Assign(tree.pos, lhs, rhs));
- } else if (varsym != null && (varsym.flags & MUTABLE) != 0) {
- val rhs1: Tree = transform(rhs, EXPRmode, lhs1.getType());
- copy.Assign(tree, lhs1, rhs1)
- .setType(definitions.void_TYPE());
- } else {
- if (!lhs1.getType().isError())
- error(tree.pos, "assignment to non-variable ");
- gen.mkUnitLit(tree.pos)
- }
-
- case Tree.If(cond, thenp, elsep) =>
- val cond1: Tree = transform(cond, EXPRmode, definitions.boolean_TYPE());
- var thenp1: Tree = _;
- var elsep1: Tree = _;
- if (elsep == Tree.Empty) {
- thenp1 = transform(thenp, EXPRmode, definitions.void_TYPE());
- elsep1 = gen.mkUnitLit(tree.pos);
- } else {
- thenp1 = transform(thenp, EXPRmode, pt);
- elsep1 = transform(elsep, EXPRmode, pt);
- }
- copy.If(tree, cond1, thenp1, elsep1)
- .setType(Type.lub(NewArray.Type(thenp1.getType(), elsep1.getType())));
-
- case Tree.Throw(expr) =>
- val expr1: Tree = transform(
- expr, EXPRmode, definitions.THROWABLE_TYPE());
- gen.Select(tree.pos, expr1, definitions.THROWABLE_THROW);
-
- case Tree.Return(expr) =>
- if (!context.owner.isInitialized()) {
- error(tree.pos, "method with return needs result type");
- errorTermTree(tree)
- } else {
- val enclFun: Symbol = context.owner.enclMethod();
- if (enclFun.kind == VAL && !enclFun.isConstructor()) {
- val expr1: Tree = transform(
- expr, EXPRmode, enclFun.getType().resultType());
- copy.Return(tree, expr1)
- .setSymbol(enclFun).setType(definitions.ALL_TYPE());
- } else {
- error(tree.pos, "return outside method definition");
- errorTermTree(tree)
- }
- }
-
- case Tree.New(init) =>
- val init1: Tree = transform(init, CONSTRmode, pt);
- checkInstantiatable(tree.pos, init1.getType());
- val tree1 = gen.New(tree.pos, init1);
- val clazz = tree1.getType().symbol();
- if (clazz.isAnonymousClass()) {
- val parentTypes = clazz.info().parents();
- val refinement: Scope = new Scope();
- val base: Type = Type.compoundTypeWithOwner(context.enclClass.owner, parentTypes, Scope.EMPTY);
- val it: Scope$SymbolIterator = clazz.members().iterator();
- while (it.hasNext()) {
- val sym1: Symbol = it.next();
- val basesym1: Symbol = base.lookupNonPrivate(sym1.name);
- if (!basesym1.isNone() &&
- sym1.kind != VAL && // todo: remove once refinements work!
- !base.symbol().thisType().memberType(basesym1)
- .isSameAs(sym1.getType()))
- refinement.enter(sym1);
- }
- val owntype =
- if (refinement.isEmpty() && parentTypes.length == 1)
- parentTypes(0)
- else
- checkNoEscape(
- tree.pos,
- Type.compoundTypeWithOwner(
- context.enclClass.owner, parentTypes, refinement));
- gen.Typed(tree1, owntype)
- } else
- tree1
-
- case Tree.Typed(expr, tpe) =>
- expr match {
- case Tree.Ident(n)
- if (n != Names.PATTERN_WILDCARD && (mode & PATTERNmode) != 0) =>
- transform(desugarize.TypedPattern(tree.asInstanceOf[Tree.Typed]),
- mode,
- pt);
- case _ =>
- var expr1: Tree = _;
- var tpe1: Tree = _;
- tpe match {
- case Tree.Ident(TypeNames.WILDCARD_STAR) =>
- expr1 = transform(
- expr, mode & baseModes, definitions.SEQ_TYPE(pt));
- val elemtps =
- expr1.getType().baseType(definitions.SEQ_CLASS).typeArgs();
- val elemtp: Type = if (elemtps.length == 1) elemtps(0)
- else Type.ErrorType;
-
- tpe1 = tpe.setType(elemtp);
- case _ =>
- tpe1 = transform(tpe, TYPEmode);
- expr1 = transform(expr, mode & baseModes, tpe1.getType());
- }
- copy.Typed(tree, expr1, tpe1).setType(tpe1.getType())
- }
-
- case Tree.Function(vparams, body) =>
- val prevContext = pushContext(tree, context.owner, new Scope(context.scope));
- var restype: Type = desugarize.preFunction(vparams, pt);
- enterParams(vparams);
- val vparams1 = transform(vparams);
- val body1: Tree = transform(body, EXPRmode, restype);
- if (!infer.isFullyDefined(restype))
- restype = body1.getType().deconst();
- restype = checkNoEscape(tree.pos, restype);
- context = prevContext;
- gen.mkFunction(tree.pos, vparams1, body1, restype, context.owner, false);
-
- case Tree.TypeApply(fn, args) =>
-
- val fn1: Tree = transform(
- fn, (mode & (EXPRmode | CONSTRmode)) | FUNmode, Type.AnyType);
- val args1 = transform(args, TYPEmode);
- val argtypes = Tree.typeOf(args1);
-
- // propagate errors in arguments
- var i = 0;
- while (i < argtypes.length && !argtypes(i).isError())
- i = i + 1;
- if (i < argtypes.length)
- setError(tree);
- else {
-
- // resolve overloading
- fn1.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- try {
- infer.polyAlternative(fn1, alts, alttypes, args.length);
- } catch {
- case ex: Type$Error => reportTypeError(tree.pos, ex);
- }
- case _ =>
- }
-
- // match against arguments
- fn1.getType() match {
- case Type$PolyType(tparams, restp) if (tparams.length == argtypes.length) =>
- constfold.tryToFold(
- infer.completeTypeApply(
- copy.TypeApply(tree, fn1, args1)
- .setType(restp.subst(tparams, argtypes))));
-
- case Type.ErrorType =>
- setError(tree)
-
- case fn1tp =>
- if (!fn1tp.isError()) error(tree.pos,
- infer.toString(fn1.symbol(), fn1.getType()) +
- " cannot be applied to " +
- ArrayApply.toString(
- argtypes.asInstanceOf[Array[Object]], "(", ",", ")"));
- errorTermTree(tree)
- }
- }
- case Tree.Apply(fn, args) if ((mode & PATTERNmode) != 0) =>
- val fn1 = transform(fn, mode | FUNmode, pt);
- val argMode = PATTERNmode;
- // type arguments with formals as prototypes if they exist.
- fn1.setType(infer.freshInstance(fn1.getType()));
- val argtypes = transformArgs(
- tree.pos, fn1.symbol(), Symbol.EMPTY_ARRAY, fn1.getType(), argMode, args, pt);
-
-
- if (argtypes == null)
- setError(tree)
- else {
- var i: int = 0;
- while (i < argtypes.length && !argtypes(i).isError())
- i = i + 1;
- if (i < argtypes.length) setError(tree);
-
- fn1.getType() match {
- case Type$MethodType(params, restp) =>
- copy.Apply(tree, fn1, args).setType(restp);
- case _ =>
- if (!fn1.getType().isError())
- error(
- tree.pos,
- infer.applyErrorMsg(
- "", fn1, " cannot be applied to ", argtypes, pt));
- errorTermTree(tree)
- }
- }
-
-
- case Tree.Apply(fn, args) =>
- mode = mode & ~SEQUENCEmode;
- var fn1: Tree = _;
- var argMode: int = _;
- var selfcc: boolean = false;
- //todo: Should we pass in both cases a methodtype with
- // AnyType's for args as a prototype?
- if ((mode & EXPRmode) != 0) {
- fn1 = transform(fn, mode | FUNmode, Type.AnyType);
- argMode = EXPRmode;
- } else if ((mode & PATTERNmode) != 0) {
- fn1 = transform(fn, mode | FUNmode, pt);
- argMode = PATTERNmode;
- } else {
- assert((mode & CONSTRmode) != 0);
- fn1 = transform(fn, mode | FUNmode, Type.AnyType);
- argMode = EXPRmode;
-
- // convert type to constructor
- val tsym: Symbol = TreeInfo.methSymbol(fn1);
- if (!tsym.isError()) {
- assert(tsym.isType(), tsym);
- fn1.getType().withDefaultArgs().unalias() match {
- case Type$TypeRef(pre, c, argtypes) =>
- if (c.kind != CLASS) {
- error(tree.pos,
- "" + tsym + " is not a class; cannot be instantiated");
- } else if (!pre.isStable()) {
- error(tree.pos, "" + pre + " is not a legal prefix for a constructor");
- } else {
- c.initialize();
- val constr: Symbol = c.allConstructors();
- val fn0: Tree = fn1;
- fn1 = gen.mkRef(fn1.pos, pre, constr);
- var enclClassOrConstructorContext = Context.NONE;
- if (constr.owner().isPackageClass()) {
- var c = context;
- while (c != Context.NONE &&
- !c.tree.isInstanceOf[Tree.ClassDef] &&
- !c.tree.isInstanceOf[Tree.ModuleDef] &&
- !c.tree.isInstanceOf[Tree.Template])
- c = c.outer;
- enclClassOrConstructorContext = c
- }
- if (enclClassOrConstructorContext == Context.NONE) {
- fn1 match {
- case Tree.Select(fn1qual, _) =>
- fn1.setType(infer.checkAccessible(
- fn1.pos, constr, fn1.getType(), fn1qual, fn1qual.getType()));
- case _ =>
- if (constr.owner().isPackageClass())
- fn1.setType(infer.checkAccessible(
- fn1.pos, constr, fn1.getType(), Tree.Empty, constr.owner().getType()));
- }
- } else {
- val cowner = enclClassOrConstructorContext.owner;
- if (cowner.isConstructor())
- // we are in a superclass constructor call
- fn1.setType(
- infer.checkAccessible(
- fn1.pos, constr, fn1.getType(),
- make.Super(tree.pos,
- Names.EMPTY.toTypeName(),
- Names.EMPTY.toTypeName()),
- cowner.constructorClass().typeConstructor()));
- else
- fn1.setType(infer.checkAccessible(
- fn1.pos, constr, fn1.getType(),
- enclClassOrConstructorContext.tree,
- cowner.typeConstructor()));
- }
- if (tsym == c) {
- fn0 match {
- case Tree.AppliedType(_, targs) =>
- fn1 = infer.completeTypeApply(gen.TypeApply(fn1, targs));
- case _ =>
- }
- } else {
- // it was an alias type
- // todo: handle overloaded constructors
- if (argtypes.length != 0)
- fn1 = gen.TypeApply(
- fn1, gen.mkTypes(fn1.pos, argtypes));
- if (tsym.typeParams().length != 0 &&
- !(fn0.isInstanceOf[Tree.AppliedType]))
- fn1.setType(new Type$PolyType(
- tsym.typeParams(), fn1.getType()));
- }
- //System.out.println(TreeInfo.methSymbol(fn1) + ":" + tp + " --> " + fn1.getType() + " of " + fn1);//DEBUG
- selfcc = TreeInfo.isSelfConstrCall(fn0);
- }
-
- case _ =>
- error(tree.pos,
- "" + tsym + " is not a class; cannot be instantiated");
- }
- }
- }
-
- // if function is overloaded with one alternative
- // whose arity matches argument length and whose result type matches prototype,
- // preselect this alternative.
- fn1.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- val argtypes = new Array[Type](args.length);
- { var i = 0; while (i < argtypes.length) {
- argtypes(i) = definitions.ALL_TYPE(); i = i + 1
- }}
- var matching1: Int = -1;
- var matching2: Int = -1;
- { var i = 0; while (i < alttypes.length) {
- if (infer.isApplicable(alttypes(i), argtypes, pt)) {
- //System.out.println("matches: " + alttypes(i) + " with " + pt);//debug
- matching2 = matching1;
- matching1 = i;
- }
- i = i + 1;
- }}
- if (matching1 >= 0 && matching2 < 0) {
- fn1.setSymbol(alts(matching1)).setType(alttypes(matching1));
- }
- case _ =>
- }
-
- def handleApply: Tree = {
- // handle the case of application of match to a visitor specially
- if (args.length == 1 && args(0).isInstanceOf[Tree.Visitor]) {
- val pattp: Type = matchQualType(fn1);
- if (pattp.isError()) {
- return setError(tree)
- } else if (pattp != Type.NoType) {
- if (infer.isFullyDefined(pattp) &&
- !(fn1.getType().isInstanceOf[Type$PolyType] &&
- pattp.containsSome(fn1.getType().typeParams()))) {
- val fn2: Tree = desugarize.postMatch(fn1, context.enclClass.owner);
- val arg1: Tree = transformVisitor(args(0), pattp, pt);
- return copy.Apply(tree, fn2, NewArray.Tree(arg1))
- .setType(arg1.getType());
- } else {
- error(tree.pos, "expected pattern type of cases could not be determined");
- return errorTermTree(tree)
- }
- }
- }
-
- // return prematurely if function is a superclass constructor
- // and no type arguments need to be inferred.
- if ((mode & SUPERmode) != 0 && fn1.getType().isInstanceOf[Type$MethodType]) {
- return copy.Apply(tree, fn1, args).setType(fn1.getType().resultType()) : Tree;
- }
-
- // type arguments with formals as prototypes if they exist.
- fn1.setType(infer.freshInstance(fn1.getType()));
- val argtypes = transformArgs(
- tree.pos, fn1.symbol(), Symbol.EMPTY_ARRAY, fn1.getType(), argMode, args, pt);
-
- if (argtypes == null)
- return setError(tree)
- else {
- var i: int = 0;
- while (i < argtypes.length && !argtypes(i).isError())
- i = i + 1;
- if (i < argtypes.length) return setError(tree);
- }
-
- // resolve overloading1g
- fn1.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- try {
- infer.methodAlternative(fn1, alts, alttypes, argtypes, pt);
- } catch {
- case ex: Type$Error => reportTypeError(tree.pos, ex);
- }
- case _ =>
- }
-
- // check that self constructors go backwards.
- if (selfcc) {
- val constr: Symbol = TreeInfo.methSymbol(fn1);
- if (constr != null && constr.kind == VAL &&
- !(constr.getType().isInstanceOf[Type$OverloadedType]) &&
- constr.pos > tree.pos)
- error(tree.pos,
- "illegal forward reference to self constructor");
- }
-
- fn1.getType() match {
- case Type$PolyType(tparams, restp) =>
- // if method is polymorphic,
- // infer instance, and adapt arguments to instantiated formals
- try {
- fn1 = infer.methodInstance(fn1, tparams, restp, argtypes, pt);
- //System.out.println(fn1 + ":" + fn1.getType());//DEBUG
- } catch {
- case ex: Type$Error =>
- //ex.printStackTrace();//DEBUG
- reportTypeError(tree.pos, ex);
- }
- case _ =>
- }
-
- fn1.getType() match {
- case Type$MethodType(params, restp) => {
- if ((mode & PATTERNmode) != 0)
- return copy.Apply(tree, fn1, args).setType(restp);
- if(global.target == scalac_Global.TARGET_MSIL) {
- fn1 match {
- case Tree.Select(qual, name) =>
- if (qual.getType().isSubType(definitions.DELEGATE_TYPE())
- && (name == Names.PLUSEQ || name == Names.MINUSEQ)) {
- val n = if (name == Names.PLUSEQ) Names.PLUS else Names.MINUS;
- val fun = make.Select(fn1.pos, qual, n);
- val rhs = copy.Apply(tree, fun, args);
- return transform(make.Assign(fn1.pos, qual, rhs));
- }
- case _ =>
- }
- }
- val formals = infer.formalTypes(params, args.length);
- if (formals.length == args.length) {
- var i = 0; while (i < args.length) {
- args(i) = adapt(args(i), argMode, formals(i));
- args(i) match {
- case Tree.Typed( arg, Tree.Ident( TypeNames.WILDCARD_STAR ) ) =>
- if( i != args.length - 1 ) {
- error( arg.pos, "escape only allowed in last position");
- } else if ( args.length > params.length ) {
- error( arg.pos, "escaping cannot be mixed with values");
- }
- case _ => /* nop */
- }
- i = i + 1
- }
- }
- return constfold.tryToFold(
- copy.Apply(tree, fn1, args)
- .setType(restp));
- }
- case _ =>
- }
-
- if (!fn1.getType().isError())
- error(
- tree.pos,
- infer.applyErrorMsg(
- "", fn1, " cannot be applied to ", argtypes, pt));
- errorTermTree(tree)
- }
-
- handleApply
-
- case Tree.Super(qualifier, mixin) =>
- val clazz: Symbol = qualifyingClass(tree, qualifier);
- if (clazz.isNone()) {
- setError(tree);
- } else {
- tree.setSymbol(clazz);
- val parents = clazz.parents();
- if (mixin == TypeNames.EMPTY) {
- tree.setType(parents(0).instanceType());
- } else {
- var i = 0;
- while (i < parents.length && parents(i).symbol().name != mixin)
- i = i + 1;
- if (i < parents.length)
- tree.setType(parents(i).instanceType());
- else {
- error(tree.pos,
- "" + mixin + " does not name a mixin base class of " + clazz);
- errorTermTree(tree)
- }
- }
- }
-
- case Tree.This(name) =>
- val clazz: Symbol = qualifyingClass(tree, name);
- if (clazz.isNone())
- setError(tree)
- else {
- tree.setSymbol(clazz);
- tree.setType(
- if (pt != null && pt.isStable() || (mode & QUALmode) != 0) clazz.thisType()
- else clazz.typeOfThis());
- }
-
- case Tree.Select(qual, name) =>
- val qualmode: int = if (name == Names._match) EXPRmode
- else EXPRmode | POLYmode | QUALmode;
- var qual1: Tree = transform(qual, qualmode);
- if (name.isTypeName())
- qual1 = checkStable(qual1);
- transformSelect(
- tree, adapt(qual1, qualmode, Type.AnyType), name);
-
- case Tree.Ident(name) =>
- if (name == Names.CONSTRUCTOR) {
- assert((mode & CONSTRmode) != 0, tree);
- copy.Ident(tree, context.enclClass.owner)
- .setType(context.enclClass.owner.getType());
- } else if (((mode & (PATTERNmode | FUNmode)) == PATTERNmode) && name.isVariable()) {
- var vble: Symbol = null;
- var vble2: Symbol = null;
-
- // if vble is bound with @, there is already a symbol
- if (name != Names.PATTERN_WILDCARD) {
- vble2 = context.scope.lookup(name);
- }
- var tree1 = tree;
- if (patternVars.containsKey(vble2))
- vble = vble2;
- else {
- vble =
- if (name == Names.PATTERN_WILDCARD)
- definitions.PATTERN_WILDCARD
- else context.owner.newPatternVariable(tree.pos, name).setType(pt);
- //if(((mode & SEQUENCEmode) != 0)&&(name != Names.PATTERN_WILDCARD)) {
- if(name != Names.PATTERN_WILDCARD) {
- // x => x @ _ in sequence patterns
- tree1 = desugarize.IdentPattern(tree);
- }
- }
- if (name != Names.PATTERN_WILDCARD) enterInScope(vble);
- tree1.setSymbol(vble).setType(pt);
- } else {
- transformIdent(tree, name)
- }
-
- case Tree.Literal(value) =>
- tree.setType(Type.constantType(value))
-
- case Tree.LabelDef(name, params, body) =>
- assert(params.length == 0);
- val prevContext = pushContext(tree, context.owner, new Scope(context.scope));
- val lsym: Symbol = context.owner.newLabel(tree.pos, name);
- lsym.setInfo(
- new Type$MethodType(Symbol.EMPTY_ARRAY, definitions.void_TYPE()));
- context.scope.enter(lsym);
- val body1: Tree = transform(body, mode, pt);
- context = prevContext;
- copy.LabelDef(tree, lsym, params, body1)
- .setSymbol(lsym).setType(definitions.void_TYPE());
-
- case Tree.TypeTerm() =>
- tree
-
- case Tree.SingletonType(ref) =>
- val ref1: Tree = checkStable(
- transform(ref, EXPRmode | QUALmode, definitions.ANYREF_TYPE()));
- copy.SingletonType(tree, ref1)
- .setType(ref1.getType().resultType());
-
- case Tree.SelectFromType(qual, name) =>
- val qual1: Tree = transform(qual, TYPEmode);
- transformSelect(tree, qual1, name);
-
- case Tree.CompoundType(parents, refinements) =>
- val parents1 = transform(parents, TYPEmode);
- val ptypes = new Array[Type](parents1.length);
- { var i = 0; while (i < parents1.length) {
- val tp = parents(i).getType();
- if (i > 0 || tp.unalias().symbol().kind != TYPE)
- checkClassType(parents(i).pos, tp);
- ptypes(i) = tp;
- i = i + 1
- }}
- val members: Scope = new Scope();
- val cowner =
- if (context.owner.isPrimaryConstructor() && context.owner.owner().isPackageClass())
- context.owner.constructorClass()
- else context.enclClass.owner;
- val self: Type = Type.compoundTypeWithOwner(cowner, ptypes, members);
- val clazz: Symbol = self.symbol();
- val prevContext = pushContext(tree, clazz, members);
- { var i = 0; while (i < refinements.length) {
- val m = enterSym(refinements(i));
- m.flags = m.flags | OVERRIDE;
- i = i + 1
- }}
- val refinements1 = transformStatSeq(refinements, Symbol.NONE);
- context = prevContext;
- copy.CompoundType(tree, parents1, refinements1)
- .setType(self)
-
- case Tree.AppliedType(tpe, args) =>
- val tpe1: Tree = transform(tpe, mode | FUNmode);
- val args1 = transform(args, TYPEmode);
- val argtypes = Tree.typeOf(args);
- val tparams = tpe1.getType().symbol().typeParams();
- var owntype: Type = Type.ErrorType;
- if (!tpe1.getType().isError()) {
- if (tparams.length == args.length)
- owntype = Type.appliedType(tpe1.getType(), argtypes);
- else if (tparams.length == 0)
- error(tree.pos, "" + tpe1.getType() + " does not take type parameters");
- else
- error(tree.pos, "wrong number of type arguments for " +
- tpe1.getType());
- }
- copy.AppliedType(tree, tpe1, args1).setType(owntype);
-
- case Tree.FunType(_, _) =>
- transform(desugarize.FunType(tree))
-
- case _ =>
- throw new ApplicationError("illegal tree: " + tree)
- }
- } catch {
- case ex: Type$Error =>
- reportTypeError(tree.pos, ex);
- errorTree(tree)
- }
- }
-
-}
-
-}
-
-// LocalWords: SOcos
diff --git a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala b/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
deleted file mode 100644
index 288b2e0e3f..0000000000
--- a/sources/scala/tools/scalac/typechecker/AnalyzerPhase.scala
+++ /dev/null
@@ -1,83 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scala.tools.util.Position;
-import scalac._;
-import scalac.symtab._;
-import scalac.util._;
-import scalac.ast._;
-import java.util.HashMap;
-import java.util.ArrayList;
-import scala.tools.scalac.util.NewArray;
-import scalac.typechecker.{AnalyzerPhase => scalac_AnalyzerPhase}
-import scalac.{Global => scalac_Global}
-
-package scala.tools.scalac.typechecker {
-
-class NamerPhase(global0: scalac_Global, descriptor0: PhaseDescriptor)
- extends Phase(global0, descriptor0)
-{
- override def apply(unit: CompilationUnit): Unit = {
- // change phase to make sure that no setInfo occurs before phase ANALYZER
- val analyzer = global.PHASE.ANALYZER.phase().asInstanceOf[AnalyzerPhase];
- val backup = global.currentPhase;
- global.currentPhase = analyzer;
- new Analyzer(global, analyzer).lateEnter(unit);
- global.currentPhase = backup;
- }
-}
-
-class AnalyzerPhase(global: scalac_Global, descriptor: PhaseDescriptor) extends scalac_AnalyzerPhase(global, descriptor) {
-
- var startContext = new Context(
- Tree.Empty,
- global.definitions.ROOT_CLASS,
- global.definitions.ROOT_CLASS.members(),
- Context.NONE);
- startContext.enclClass = startContext;
-
- if (!global.noimports) {
- startContext = addImport(startContext, global.definitions.JAVALANG);
- startContext = addImport(startContext, global.definitions.SCALA);
- }
-
- if (!global.noimports && !global.nopredefs) {
- startContext = addImport(startContext, global.definitions.PREDEF);
- }
-
- startContext = new Context(
- Tree.Empty,
- startContext.owner,
- global.definitions.ROOT_CLASS.members(),
- startContext);
-
- var consoleContext = new Context(
- Tree.Empty,
- global.definitions.ROOT_CLASS,
- global.definitions.ROOT_CLASS.members(),
- startContext);
-
- val contexts = new HashMap/*<CompilationUnit,Context>*/();
-
- override def addConsoleImport(module: Symbol): unit =
- consoleContext = addImport(consoleContext, module);
-
- private def addImport(context: Context, module: Symbol): Context = {
- global.prevPhase();
- val tree = gen.mkImportAll(Position.NOPOS, module);
- global.nextPhase();
- val c = new Context(tree, context.owner, new Scope(), context);
- c.depth = context.depth;
- c
- }
-
- override def apply(unit: CompilationUnit): Unit =
- new Analyzer(global, this).apply(unit);
-
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/ConstantFolder.scala b/sources/scala/tools/scalac/typechecker/ConstantFolder.scala
deleted file mode 100644
index b8510ca0a9..0000000000
--- a/sources/scala/tools/scalac/typechecker/ConstantFolder.scala
+++ /dev/null
@@ -1,329 +0,0 @@
-/* ************************************************************************
- * Pizza constant folder
- * by Martin Odersky
- *
- * Copyright (C) 1996,97 Martin Odersky. All rights reserved.
- * Permission is hereby granted to modify and use this software for research
- * and teaching purposes. Modification for commercial purposes requires
- * prior written permission by the author.
- * The software, or modifications thereof, may be redistributed only
- * if this copyright notice stays attached.
- *************************************************************************/
-
-import java.lang.Object;
-
-import scalac.symtab._;
-import scalac.{Global => scalac_Global}
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.ast._;
-import scalac.ast.TreeGen;
-import scalac.atree._;
-import scalac.atree.ATypeKind;
-import scalac.atree.ATypeKind._;
-
-package scala.tools.scalac.typechecker {
-
-class ConstantFolder(global: scalac_Global) {
-
- //########################################################################
- // Private Fields
-
- /** The global definitions */
- private val definitions: Definitions = global.definitions;
-
- /** The tree generator */
- private val gen: TreeGen = global.treeGen;
-
- //########################################################################
- // Public Methods
-
- /**
- * Attempts to constant fold given tree. Returns the input tree if
- * constant folding fails.
- */
- def tryToFold(tree: Tree): Tree = {
- val value: AConstant = evaluate(tree);
- if (value != null) gen.Literal(tree.pos, value) else tree;
- }
-
- /**
- * Evaluates the expression represented by the tree and returns
- * the resulting value. Returns null if the evaluation can't be
- * performed.
- */
- def evaluate(tree: Tree): AConstant = tree match {
- case Tree$TypeApply(Tree$Select(qualifier, Names.asInstanceOf), args) if args.length == 1 =>
- qualifier.getType() match {
- case Type$ConstantType(_, lvalue) => cast(lvalue, args(0).getType());
- case _ => null;
- }
-
- case Tree$Apply(Tree$Select(qualifier, op), args) if args.length == 1=>
- qualifier.getType() match {
- case Type$ConstantType(_, lvalue) =>
- args(0).getType() match {
- case Type$ConstantType(_, rvalue) => evaluate(op, lvalue, rvalue)
- case _ => null
- }
- case _ => null
- }
-
- case Tree$Select(qualifier, op) =>
- qualifier.getType() match {
- case Type$ConstantType(_, lvalue) => evaluate(op, lvalue)
- case _ => null
- }
-
- case _ => null
- }
-
- /**
- * Evaluates the unary operation and returns the resulting value.
- * Returns null if the evaluation can't be performed.
- */
- def evaluate(op: Name, value: AConstant): AConstant = kind(value) match {
- case ATypeKind.BOOL =>
- val v = value.booleanValue();
- if (op == Names.ZNOT) AConstant.BOOLEAN(!v)
- else null
- case ATypeKind.I4 =>
- val v = value.intValue();
- if (op == Names.ADD) AConstant.INT(+v)
- else if (op == Names.SUB) AConstant.INT(-v)
- else if (op == Names.NOT) AConstant.INT(~v)
- else null;
- case ATypeKind.I8 =>
- val v = value.longValue();
- if (op == Names.ADD) AConstant.LONG(+v)
- else if (op == Names.SUB) AConstant.LONG(-v)
- else if (op == Names.NOT) AConstant.LONG(~v)
- else null;
- case ATypeKind.R4 =>
- val v = value.floatValue();
- if (op == Names.ADD) AConstant.FLOAT(+v)
- else if (op == Names.SUB) AConstant.FLOAT(-v)
- else null
- case ATypeKind.R8 =>
- val v = value.doubleValue();
- if (op == Names.ADD) AConstant.DOUBLE(+v)
- else if (op == Names.SUB) AConstant.DOUBLE(-v)
- else null
- case _ =>
- null
- }
-
- /**
- * Evaluates the binary operation and returns the resulting value.
- * Returns null if the evaluation can't be performed.
- */
- def evaluate(op: Name, lvalue: AConstant, rvalue: AConstant): AConstant = {
- val k = kind(lvalue, rvalue);
- if (k == null) return null;
- k match {
- case ATypeKind.I4 =>
- val l = lvalue.intValue();
- val r = rvalue.intValue();
- if (op == Names.OR ) AConstant.INT(l | r)
- else if (op == Names.AND) AConstant.INT(l & r)
- else if (op == Names.XOR) AConstant.INT(l ^ r)
- else if (op == Names.ADD) AConstant.INT(l + r)
- else if (op == Names.SUB) AConstant.INT(l - r)
- else if (op == Names.MUL) AConstant.INT(l * r)
- else if (op == Names.DIV) if (r == 0) null else AConstant.INT(l / r)
- else if (op == Names.MOD) if (r == 0) null else AConstant.INT(l % r)
- else if (op == Names.EQ ) AConstant.BOOLEAN(l == r)
- else if (op == Names.NE ) AConstant.BOOLEAN(l != r)
- else if (op == Names.LT ) AConstant.BOOLEAN(l < r)
- else if (op == Names.GT ) AConstant.BOOLEAN(l > r)
- else if (op == Names.LE ) AConstant.BOOLEAN(l <= r)
- else if (op == Names.GE ) AConstant.BOOLEAN(l >= r)
- else if (op == Names.LSL) AConstant.INT(l << r)
- else if (op == Names.LSR) AConstant.INT(l >>> r)
- else if (op == Names.ASR) AConstant.INT(l >> r)
- else null
-
- case ATypeKind.I8 =>
- val l = lvalue.longValue();
- val r = rvalue.longValue();
- if (op == Names.OR ) AConstant.LONG(l | r)
- else if (op == Names.AND) AConstant.LONG(l & r)
- else if (op == Names.XOR) AConstant.LONG(l ^ r)
- else if (op == Names.ADD) AConstant.LONG(l + r)
- else if (op == Names.SUB) AConstant.LONG(l - r)
- else if (op == Names.MUL) AConstant.LONG(l * r)
- else if (op == Names.DIV) if (r == 0) null else AConstant.LONG(l / r)
- else if (op == Names.MOD) if (r == 0) null else AConstant.LONG(l % r)
- else if (op == Names.EQ ) AConstant.BOOLEAN(l == r)
- else if (op == Names.NE ) AConstant.BOOLEAN(l != r)
- else if (op == Names.LT ) AConstant.BOOLEAN(l < r)
- else if (op == Names.GT ) AConstant.BOOLEAN(l > r)
- else if (op == Names.LE ) AConstant.BOOLEAN(l <= r)
- else if (op == Names.GE ) AConstant.BOOLEAN(l >= r)
- else if (kind(lvalue) == ATypeKind.I4) {
- val li = lvalue.intValue();
- if (op == Names.LSL) AConstant.INT(li << r)
- else if (op == Names.LSR) AConstant.INT(li >>> r)
- else if (op == Names.ASR) AConstant.INT(li >> r)
- else null
- } else {
- if (op == Names.LSL) AConstant.LONG(l << r)
- else if (op == Names.LSR) AConstant.LONG(l >>> r)
- else if (op == Names.ASR) AConstant.LONG(l >> r)
- else null
- }
-
- case ATypeKind.R4 =>
- val l = lvalue.floatValue();
- val r = rvalue.floatValue();
- if (op == Names.ADD) AConstant.FLOAT(l + r)
- else if (op == Names.SUB) AConstant.FLOAT(l - r)
- else if (op == Names.MUL) AConstant.FLOAT(l * r)
- else if (op == Names.DIV) AConstant.FLOAT(l / r)
- else if (op == Names.MOD) AConstant.FLOAT(l % r)
- else if (op == Names.EQ ) AConstant.BOOLEAN(l == r)
- else if (op == Names.NE ) AConstant.BOOLEAN(l != r)
- else if (op == Names.LT ) AConstant.BOOLEAN(l < r)
- else if (op == Names.GT ) AConstant.BOOLEAN(l > r)
- else if (op == Names.LE ) AConstant.BOOLEAN(l <= r)
- else if (op == Names.GE ) AConstant.BOOLEAN(l >= r)
- else null
-
- case ATypeKind.R8 =>
- val l = lvalue.doubleValue();
- val r = rvalue.doubleValue();
- if (op == Names.ADD) AConstant.DOUBLE(l + r)
- else if (op == Names.SUB) AConstant.DOUBLE(l - r)
- else if (op == Names.MUL) AConstant.DOUBLE(l * r)
- else if (op == Names.DIV) AConstant.DOUBLE(l / r)
- else if (op == Names.MOD) AConstant.DOUBLE(l % r)
- else if (op == Names.EQ ) AConstant.BOOLEAN(l == r)
- else if (op == Names.NE ) AConstant.BOOLEAN(l != r)
- else if (op == Names.LT ) AConstant.BOOLEAN(l < r)
- else if (op == Names.GT ) AConstant.BOOLEAN(l > r)
- else if (op == Names.LE ) AConstant.BOOLEAN(l <= r)
- else if (op == Names.GE ) AConstant.BOOLEAN(l >= r)
- else null
-
- case ATypeKind.BOOL =>
- val l = lvalue.booleanValue();
- val r = rvalue.booleanValue();
- if (op == Names.ZOR ) AConstant.BOOLEAN(l | r)
- else if (op == Names.OR ) AConstant.BOOLEAN(l | r)
- else if (op == Names.ZAND) AConstant.BOOLEAN(l & r)
- else if (op == Names.AND ) AConstant.BOOLEAN(l & r)
- else if (op == Names.XOR ) AConstant.BOOLEAN(l ^ r)
- else if (op == Names.EQ ) AConstant.BOOLEAN(l == r)
- else if (op == Names.NE ) AConstant.BOOLEAN(l != r)
- else null
-
- case ATypeKind.STR =>
- if (op == Names.ADD) AConstant.STRING(lvalue.stringValue()+rvalue.stringValue())
- else null
-
- case _ =>
- null
- }
- }
-
- /**
- * Casts the value to given type and returns the resulting value.
- * Returns null if the cast can't be performed.
- */
- def cast(value: AConstant, tpe: Type): AConstant = value.kind() match {
- case UNIT =>
- if (tpe.isSameAs(definitions.void_TYPE())) value // !!! -> UNIT_TYPE()
- else null
- case BOOL =>
- if (tpe.isSameAs(definitions.boolean_TYPE())) value
- else null
- case U1 | U2 | U4 | U8 | I1 | I2 | I4 | I8 | R4 | R8 =>
- if (tpe.isSameAs(definitions.byte_TYPE()))
- AConstant.BYTE(value.byteValue())
- else if (tpe.isSameAs(definitions.short_TYPE()))
- AConstant.SHORT(value.shortValue())
- else if (tpe.isSameAs(definitions.char_TYPE()))
- AConstant.CHAR(value.charValue())
- else if (tpe.isSameAs(definitions.int_TYPE()))
- AConstant.INT(value.intValue())
- else if (tpe.isSameAs(definitions.long_TYPE()))
- AConstant.LONG(value.longValue())
- else if (tpe.isSameAs(definitions.float_TYPE()))
- AConstant.FLOAT(value.floatValue())
- else if (tpe.isSameAs(definitions.double_TYPE()))
- AConstant.DOUBLE(value.doubleValue())
- else null
- case STR =>
- if (tpe.isSameAs(definitions.STRING_TYPE())) value
- else null
- case _ =>
- null
- }
-
- //########################################################################
- // Private Methods
-
- /** Returns the kind of given value. */
- private def kind(value: AConstant): ATypeKind = {
- val k = value.kind();
- k match {
- case I1 | I2 | U2 =>
- ATypeKind.I4
- case _ =>
- k
- }
- }
-
- /**
- * Returns the combined kind of given values or null if the values
- * can't be combined.
- */
- private def kind(lvalue: AConstant, rvalue: AConstant): ATypeKind = {
- val lkind = kind(lvalue);
- val rkind = kind(rvalue);
- if (lkind == rkind) lkind
- else if (lkind == ATypeKind.ZERO) null
- else if (rkind == ATypeKind.ZERO) null
- else if (lkind == ATypeKind.STR) lkind
- else if (rkind == ATypeKind.STR) rkind
- else lkind match {
- case I4 =>
- rkind match {
- case I4 => lkind
- case I8 => rkind
- case R4 => rkind
- case R8 => rkind
- case _ => null
- }
- case I8 =>
- rkind match {
- case I4 => lkind
- case I8 => lkind
- case R4 => rkind
- case R8 => rkind
- case _ => null
- }
- case R4 =>
- rkind match {
- case I4 => lkind
- case I8 => lkind
- case R4 => lkind
- case R8 => rkind
- case _ => null
- }
- case R8 =>
- rkind match {
- case I4 => lkind
- case I8 => lkind
- case R4 => lkind
- case R8 => lkind
- case _ => null
- }
- case _ =>
- null
- }
- }
-
- //########################################################################
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/Context.scala b/sources/scala/tools/scalac/typechecker/Context.scala
deleted file mode 100644
index ceedc3c2e0..0000000000
--- a/sources/scala/tools/scalac/typechecker/Context.scala
+++ /dev/null
@@ -1,146 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-**
-** $Id$
-\* */
-import scalac.symtab._;
-import scalac.ast._;
-import scalac.util.Names;
-import scalac.util.Name;
-import scalac.{Global => scalac_Global}
-
-package scala.tools.scalac.typechecker {
-
-object Context {
- val NONE = new Context();
- NONE.viewCache = List();
-}
-
-class Context {
-
- import Kinds._;
-
- var tree: Tree = _; // Tree associated with this context
- var owner: Symbol = _; // The current owner
- var scope: Scope = _; // The current scope
- var outer: Context = _; // The next outer context
- var enclClass: Context = this; // The next outer context whose tree
- // is a class template
- var prevImport: Context = this; // the next outer import context
- var variance: int = _; // Variance relative to enclosing class.
- var constructorClass: Symbol = _; // Class for auxiliary constructor
- var viewCache: List[View] = null; // View symbols visible in scope
- var infer: Infer = null; // Type inferencer
- var depth: int = 0;
-
- def this(tree: Tree, owner: Symbol, scope: Scope, outer: Context) = {
- this();
- this.tree = tree;
- this.owner = owner;
- this.scope = scope;
- this.enclClass = if ((tree.isInstanceOf[Tree$Template] ||
- tree.isInstanceOf[Tree$CompoundType]) &&
- tree != outer.tree) this
- else outer.enclClass;
- this.prevImport = if (isImportContext && tree != outer.tree) this
- else outer.prevImport;
- this.variance = outer.variance;
- this.constructorClass = outer.constructorClass;
- this.infer = outer.infer;
- this.depth = outer.depth + 1;
- this.outer = outer;
- }
-
- def this(tree: Tree, outer: Context) =
- this(tree, outer.owner, outer.scope, outer);
-
- def outerContext(clazz: Symbol): Context = {
- var c = this;
- while (c != Context.NONE && c.owner != clazz) c = c.outer.enclClass;
- c
- }
-
- def isTopLevel(): boolean = tree match {
- case Tree$Block(_,_) =>
- false
- case Tree$Template(_, _) =>
- outer.tree.isInstanceOf[Tree$PackageDef]
- case Tree.Empty =>
- true
- case _ =>
- outer.isTopLevel()
- }
-
- def isImportContext: boolean = tree.isInstanceOf[Tree$Import];
-
- def importString(): String =
- if (prevImport == Context.NONE) ""
- else
- prevImport.outer.importString() +
- prevImport.tree.symbol().toString() + ";";
-
- override def toString(): String = {
- if (this == Context.NONE) "Context.NONE";
- else tree.toString() + "\n:: " + outer.toString()
- }
-
- def importPrefix(): Tree = tree match {
- case Tree$Import(expr, _) => expr
- }
-
- def importType(): Type =
- tree.symbol().getType();
-
- def sameImport(that: Context): boolean =
- this.importType().isSameAs(that.importType());
-
- def importedSymbol(name: Name): Symbol = {
- return TreeInfo.importedSymbol(tree, name);
- }
-
- def viewMeths: List[View] = {
-
- def addView(sym: Symbol, symtype: Type, qual: Tree): unit = symtype match {
- case Type$OverloadedType(alts, alttypes) =>
- var i = alts.length - 1;
- while (i >= 0) {
- addView(alts(i), alttypes(i), qual);
- i = i - 1;
- }
- case _ =>
- /*
- def isUnShadowed(view: View) =
- view.context == this || !infer.specializes(view.symtype, symtype);
- */
- if (viewCache.forall(v => v.sym != sym)) {
- val v = View(sym, symtype, qual, this);
- //System.out.println("VIEW " + sym + ":" + symtype + " " + qual);//DEBUG
- viewCache = v :: viewCache;//.filter(isUnShadowed);
- }
- }
-
- if (viewCache == null) {
- viewCache = outer.viewMeths;
- if (enclClass == this) {
- val sym = owner.typeOfThis().lookup(Names.view);
- if (sym.kind == VAL) {
- addView(sym, owner.thisType().memberType(sym),
- scalac_Global.instance.treeGen.This(owner.pos, owner));
- }
- } else if (scope != outer.scope) {
- val e = scope.lookupEntry(Names.view);
- if (e.owner == scope && e.sym.kind == VAL)
- addView(e.sym, e.sym.getType(), Tree.Empty);
- }
- if (prevImport == this) {
- val sym = importedSymbol(Names.view);
- if (sym.kind == VAL)
- addView(sym, importType().memberType(sym), importPrefix());
- }
- }
- viewCache
- }
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/DeSugarize.scala b/sources/scala/tools/scalac/typechecker/DeSugarize.scala
deleted file mode 100644
index c860ae84db..0000000000
--- a/sources/scala/tools/scalac/typechecker/DeSugarize.scala
+++ /dev/null
@@ -1,641 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-import java.io._;
-import java.lang.Object;
-import java.util.ArrayList;
-
-import scalac._;
-import scalac.{Global => scalac_Global, CompilationUnit => scalac_CompilationUnit}
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.typechecker.Infer;
-import scalac.util._;
-
-import scala.tools.scalac.util.NewArray;
-
-package scala.tools.scalac.typechecker {
-
-/** A transformer for removing syntactic sugar. This transformer does
- * not need any type or symbol-table information.
- *
- * @author Martin Odersky
- * @version 2.0
- */
-class DeSugarize(make: TreeFactory, copy: TreeCopier, gen: TreeGen, infer: scala.tools.scalac.typechecker.Infer, global: scalac_Global) {
-
- import Kinds._, Modifiers._;
- import scalac.ast.TreeList;
-
- def this(analyzer: Analyzer, global: scalac_Global) =
- this(analyzer.make, analyzer.copy, analyzer.gen, analyzer.infer, global);
-
-// Auxiliary definitions and functions -------------------------------------------
-
- /** introduce fresh variable of the form "ds$56"
- */
- def getvar(unit: scalac_CompilationUnit): Name = unit.fresh.newName("ds", '$');
-
- def setterName(name: Name): Name = Name.fromString(name.toString() + Names._EQ);
-
- def parameterName(i: int): Name = Name.fromString("x$" + i);
-
- def tupleSelectorName(i: int): Name = Name.fromString("_" + i);
-
- /** extract variables from a pattern */
- def getVariables(tree: Tree, vars: ArrayList): unit = tree match {
- case Tree$Ident(name) =>
- if (name.isVariable() && name != Names.PATTERN_WILDCARD) vars.add(name);
-
- case Tree$Typed(expr, _) =>
- getVariables(expr, vars);
-
- case Tree$Apply(fn, args) =>
- fn match {
- case Tree$Apply(_, _) => getVariables(fn, vars);
- case _ =>
- }
- for (val i <- Iterator.range(0, args.length))
- getVariables(args(i), vars);
-
- case Tree$Sequence(elems) =>
- for (val i <- Iterator.range(0, elems.length))
- getVariables(elems(i), vars);
-
- case Tree$Literal( _ ) =>
-
- case Tree$Bind(name, t) =>
- if (name.isVariable() && name != Names.PATTERN_WILDCARD) vars.add(name);
- getVariables(t, vars);
-
- case Tree$Alternative(ts) =>
- for (val i <- Iterator.range(0, ts.length))
- getVariables(ts(i), vars);
- }
-
-// Transform functions -----------------------------------------------------
-
- /** (T_1, ..., T_N) => T ==> scala.FunctionN[T_1, ..., T_N, +T]
- */
- def FunType(tree: Tree): Tree = tree match {
- case Tree$FunType(argtpes, restpe) =>
- mkFunType(tree.pos, argtpes, restpe)
- }
-
- def mkFunType(pos: int, argtpes: Array[Tree], restpe: Tree): Tree = {
- val types = new Array[Tree](argtpes.length + 1);
- System.arraycopy(argtpes, 0, types, 0, argtpes.length);
- types(argtpes.length) = restpe;
- make.AppliedType(
- pos,
- make.Select(
- pos,
- make.Ident(pos, Names.scala),
- Name.fromString("Function" + argtpes.length).toTypeName()),
- types);
- }
-
- def mkTuple(pos: int, trees: Array[Tree]): Tree =
- if (trees.length == 0)
- gen.mkUnitLit(pos);
- else
- make.Apply(
- pos,
- make.Select(
- pos,
- make.Ident(pos, Names.scala),
- Name.fromString("Tuple" + trees.length)),
- trees);
-
- /** Convert method to function type.
- */
- def meth2fun(tp: Type): Type = tp match {
- case Type$MethodType(params, restype) =>
- global.definitions.FUNCTION_TYPE(
- Symbol.getType(params), meth2fun(restype));
- case _ =>
- tp
- }
-
- /** If `pt' is a matching function type insert missing parameters
- * in `vparams' from it, return: and result type,
- * else return AnyType.
- */
- def preFunction(vparams: Array[Tree$ValDef], pt: Type): Type = pt match {
- case Type$TypeRef(pre, psym, ptargs)
- if (ptargs.length == vparams.length + 1 &&
- vparams.length < global.definitions.FUNCTION_CLASS.length &&
- psym == global.definitions.FUNCTION_CLASS(vparams.length)) =>
-
- def assignType(vparam: Tree$ValDef, pt: Type): unit =
- if (vparam.tpe == Tree.Empty && infer.isFullyDefined(pt))
- vparam.tpe = gen.mkType(vparam.pos, pt);
-
- for (val i <- Iterator.range(0, vparams.length))
- assignType(vparams(i), ptargs(i));
-
- ptargs(vparams.length);
-
- case _ =>
- Type.AnyType
- }
-
- def isDefinedAtVisitor(tree: Tree): Tree = tree match {
- case Tree$Visitor(cases) =>
- val lastCase = cases(cases.length - 1);
- lastCase match {
- case Tree$CaseDef(Tree$Ident(name), Tree.Empty, expr) if (name.isVariable()) =>
- make.Visitor(
- tree.pos,
- NewArray.CaseDef(
- make.CaseDef(
- lastCase.pos,
- lastCase.pat.duplicate(),
- Tree.Empty,
- gen.mkBooleanLit(lastCase.body.pos, true))));
- case _ =>
- val cases1 = new Array[Tree$CaseDef](cases.length + 1);
- for (val i <- Iterator.range(0, cases.length)) {
- cases(i) match {
- case Tree$CaseDef(pat, guard, _) =>
- cases1(i) = make.CaseDef(
- cases(i).pos,
- pat.duplicate(),
- guard.duplicate(),
- gen.mkBooleanLit(tree.pos, true));
- }
- }
- cases1(cases.length) = make.CaseDef(
- tree.pos,
- gen.Ident(tree.pos, global.definitions.PATTERN_WILDCARD),
- Tree.Empty,
- gen.mkBooleanLit(tree.pos, false));
- make.Visitor(tree.pos, cases1);
- }
- }
-
- /** match => this.match
- * match[targs] => this.match[targs]
- * IMPORTANT: tree is already attributed and attributes need to be preserved.
- */
- def postMatch(tree: Tree, currentclazz: Symbol): Tree = tree match {
- case Tree$Ident(name) =>
- make.Select(
- tree.pos,
- gen.This(tree.pos, currentclazz),
- name).setSymbol(tree.symbol()).setType(tree.getType());
- case Tree$TypeApply(fn, args) =>
- copy.TypeApply(tree, postMatch(fn, currentclazz), args);
- case _ =>
- tree
- }
-
- /** { cases } ==> (x => x.match {cases})
- * only called when match has to be added
- * no type for parameter x
- */
- def Visitor(unit: scalac_CompilationUnit, tree: Tree): Tree = tree match {
- case Tree$Visitor(cases) =>
- val x: Name = getvar(unit);
- val param: Tree$ValDef = make.ValDef(
- tree.pos, PARAM, x, Tree.Empty, Tree.Empty);
- val xuse: Tree = make.Ident(tree.pos, x);
- // x.match {cases}
- val body: Tree = make.Apply(
- tree.pos,
- make.Select(tree.pos, xuse, Names._match),
- NewArray.Tree(tree));
- make.Function(tree.pos, NewArray.ValDef(param), body);
- }
-
- /** e = e' ==> e_=(e')
- */
- def Assign(pos: int, lhs: Tree, rhs: Tree): Tree = {
- val lhs1 = lhs match {
- case Tree$Ident(name) =>
- make.Ident(lhs.pos, setterName(name));
- case Tree$Select(qual, name) =>
- make.Select(lhs.pos, qual, setterName(name));
- }
- make.Apply(pos, lhs1, NewArray.Tree(rhs));
- }
-
- /** e(args) = e' ==> e.update(args ; e')
- */
- def Update(tree: Tree): Tree = tree match {
- case Tree$Assign(Tree$Apply(fn, args), rhs) =>
- // e.update
- val update: Tree = make.Select(fn.pos, fn, Names.update);
- val args1 = new Array[Tree](args.length + 1);
- System.arraycopy(args, 0, args1, 0, args.length);
- args1(args.length) = rhs;
- make.Apply(tree.pos, update, args1);
- }
-
- /** Remove the DocDef shell, if any.
- */
- def unboxDocDef(tree: Tree): Tree = tree match {
- case Tree$DocDef(_, definition) => definition
- case _ => tree
- }
-
- /** If "tree" is a DocDef, add its comment to "trees".
- */
- def boxDocDef(trees: Array[Tree], tree: Tree): Array[Tree] = {
- tree match {
- case Tree$DocDef(comment, _) =>
- for (val i <- Iterator.range(0, trees.length))
- trees(i) = make.DocDef(tree.pos, comment, trees(i))
- case _ =>
- }
- trees
- }
-
- /** expand pattern definitions and variable definitions in templates.
- */
- def Statements(unit: scalac_CompilationUnit, stats: Array[Tree], isLocal: boolean): Array[Tree] = {
- var change: boolean = false;
- var i = 0;
- while (i < stats.length && !change) {
- unboxDocDef(stats(i)) match {
- case Tree$PatDef(_, _, _) =>
- change = true;
- case Tree$ValDef(_, _, _, _) =>
- change = !isLocal;
- case _ =>
- }
- i = i + 1
- }
- if (change) {
- val ts: TreeList = new TreeList();
- for (val i <- Iterator.range(0, stats.length)) {
- val stat = unboxDocDef(stats(i));
- stat match {
- case Tree$PatDef(_, _, _) =>
- ts.append(boxDocDef(Statements(unit, this.PatDef(unit, stat), isLocal), stats(i)));
- case Tree$ValDef(_, _, _, _) =>
- if (isLocal) ts.append(stats(i))
- else ts.append(boxDocDef(this.ValDef(stat), stats(i)));
- case _ =>
- ts.append(stats(i));
- }
- }
- ts.toArray()
- } else {
- stats;
- }
- }
-
- /** expands view-bounded class and method definitions
- */
- def Definition(tree: Tree): Tree =
- tree match {
- case Tree$ClassDef(mods, name, tparams, vparams, tpe, templ) =>
- //System.out.println("DEF " + make.ClassDef(tree.pos, mods, name, tparams, addViewParams(tparams, vparams), tpe, templ));//DEBUG
- make.ClassDef(tree.pos, mods, name, tparams,
- addViewParams(tparams, vparams), tpe, templ);
-
- case Tree$DefDef(mods, name, tparams, vparams, tpe, rhs) =>
- //System.out.println("DEF " + make.DefDef(tree.pos, mods, name, tparams, addViewParams(tparams, vparams), tpe, rhs));//DEBUG
- make.DefDef(tree.pos, mods, name, tparams,
- addViewParams(tparams, vparams), tpe, rhs)
-
- case Tree$DocDef(comment, definition) =>
- make.DocDef(tree.pos, comment, Definition(definition))
-
- case _ =>
- tree
- }
-
- def addViewParams(tparams: Array[Tree$AbsTypeDef], vparams: Array[Array[Tree$ValDef]]): Array[Array[Tree$ValDef]] = {
- var viewparams = new TreeList();
- var i = 0;
- while (i < tparams.length) {
- tparams(i) match {
- case Tree$AbsTypeDef(mods, tname, rhs, _) if (mods & VIEWBOUND) != 0 =>
- viewparams.append(
- make.ValDef(
- tparams(i).pos,
- PARAM | SYNTHETIC,
- Names.view,
- mkFunType(
- tparams(i).pos,
- NewArray.Tree(make.Ident(tparams(i).pos, tname)),
- rhs.duplicate()),
- Tree.Empty));
- case _ =>
- }
- i = i + 1
- }
- if (viewparams.length() > 0) {
- val vparams1 = new Array[Array[Tree$ValDef]](vparams.length + 1);
- vparams1(0) = new Array[Tree$ValDef](viewparams.length());
- viewparams.copyTo(vparams1(0));
- //for (val t <- vparams1(0)) System.out.println("new view param: " + t);//DEBUG
- System.arraycopy(vparams, 0, vparams1, 1, vparams.length);
- vparams1
- } else vparams
- }
-
- /** expands pattern definitions
- * in case pattern is a simple (typed) identifier:
- * val x = e ==> val x = e
- * val x: T = e ==> val x: T = e
- *
- * in case there are no variables in pattern
- * val p = e ==> e.match (case p => ())
- *
- * in case there is exactly one variable in pattern
- * val x_1 = e.match (case p => (x_1))
- *
- * in case there are more variables in pattern
- * val p = e ==> private synthetic val t$ = e.match (case p => (x_1, ..., x_N))
- * val x_1 = t$._1
- * ...
- * val x_N = t$._N
- *
- */
- def PatDef(unit: scalac_CompilationUnit, tree: Tree): Array[Tree] = tree match {
- case Tree$PatDef(mods, Tree$Ident(name), rhs) =>
- // val x = e ==> val x = e
- NewArray.Tree(make.ValDef(tree.pos, mods, name, Tree.Empty, rhs))
-
- case Tree$PatDef(mods, Tree$Typed(Tree$Ident(name), tpe), rhs) =>
- // val x: T = e ==> val x: T = e
- NewArray.Tree(make.ValDef(tree.pos, mods, name, tpe, rhs))
-
- case Tree$PatDef(mods, pat, rhs) =>
- val pos: int = tree.pos;
- val varlist: ArrayList = new ArrayList();
- getVariables(pat, varlist);
- val vars = new Array[Name](varlist.size());
- varlist.toArray(vars.asInstanceOf[Array[Object]]);
-
- // Tuple_N(x_1, ..., x_N)
- val vtree = new Array[Tree](vars.length);
- for (val i <- Iterator.range(0, vars.length)) {
- vtree(i) = make.Ident(pos, vars(i));
- }
- val tuple: Tree = if (vars.length == 1) vtree(0)
- else mkTuple(tree.pos, vtree);
-
- // e.match (case p => Tuple_N(x_1, ..., x_N))
- val cases = NewArray.CaseDef(make.CaseDef(pos, pat, Tree.Empty, tuple));
- val matchTree: Tree = make.Apply(
- pos,
- make.Select(pos, rhs, Names._match),
- NewArray.Tree(make.Visitor(pos, cases)));
-
- if (vars.length == 0) {
- // e.match (case p => ())
- print(pat, "patdef", matchTree);
- NewArray.Tree(matchTree);
- }
- else if (vars.length == 1) {
- // val x_1 = e.match (case p => x_1)
- val valdef: Tree = make.ValDef(pos, mods, vars(0), Tree.Empty, matchTree);
- print(pat, "patdef", valdef);
- NewArray.Tree(valdef)
- } else {
- // t$
- val vble: Name = getvar(unit);
-
- // private synthetic val t$ = e.match (case p => (x_1, ..., x_N))
- val res = new Array[Tree](vars.length + 1);
- res(0) = make.ValDef(pos, PRIVATE | SYNTHETIC, vble, Tree.Empty, matchTree);
- for (val i <- Iterator.range(0, vars.length)) {
- // val x_i = t$._i
- res(i + 1) = make.ValDef(
- pos, mods, vars(i), Tree.Empty,
- make.Select(pos, make.Ident(pos, vble), tupleSelectorName(i + 1)));
- }
- print(pat, "patdef", new Tree$Block(res, gen.mkUnitLit(pos)));//debug
- res
- }
- }
-
- def ValDef(tree: Tree): Array[Tree] = tree match {
- case Tree$ValDef(mods, name, tpe, rhs) =>
- val valname: Name = Name.fromString("" + name + "$");
- val valdef1: Tree = copy.ValDef(
- tree, (mods & (DEFERRED | MUTABLE | PARAMACCESSOR | MODUL)) | PRIVATE,
- valname, tpe, rhs).setType(null);
- var mods1: int = mods | ACCESSOR;
- if ((mods1 & MUTABLE) == 0) mods1 = mods1 | STABLE;
- val getter: Tree = make.DefDef(
- tree.pos, mods1, name,
- Tree.AbsTypeDef_EMPTY_ARRAY, Tree.ValDef_EMPTY_ARRAY_ARRAY,
- tpe.duplicate(),
- if ((mods & DEFERRED) != 0) Tree.Empty
- else make.Ident(tree.pos, valname));
- if ((mods1 & MUTABLE) == 0) {
- if ((mods1 & DEFERRED) != 0)
- NewArray.Tree(getter)
- else
- NewArray.Tree(valdef1, getter)
- } else {
- val setter: Tree = make.DefDef(
- tree.pos, mods1, setterName(name),
- Tree.AbsTypeDef_EMPTY_ARRAY,
- NewArray.ValDefArray(
- NewArray.ValDef(
- make.ValDef(
- tree.pos, SYNTHETIC | PARAM, parameterName(0),
- tpe.duplicate(), Tree.Empty))),
- gen.mkType(tree.pos, global.definitions.void_TYPE()),
- if ((mods1 & DEFERRED) != 0) Tree.Empty
- else make.Assign(
- tree.pos,
- make.Ident(tree.pos, valname),
- make.Ident(tree.pos, parameterName(0))));
- if ((mods1 & DEFERRED) != 0)
- NewArray.Tree(getter, setter)
- else
- NewArray.Tree(valdef1, getter, setter)
- }
- }
-
- /** Expand partial function applications of type `type'.
- *
- * p.f(es_1)...(es_n)
- * ==> {
- * private synthetic val eta$f = p.f // if p is not stable
- * ...
- * private synthetic val eta$e_i = e_i // if e_i is not stable
- * ...
- *
- * (ps_1 => ... => ps_m => eta$f([es_1])...([es_m])(ps_1)...(ps_m))
- * }
- * tree is already attributed
- */
- def etaExpand(tree: Tree, tpe: Type): Tree = {
- val defs: TreeList = new TreeList();
- val lambda: Tree =
- toFunction(toApply(liftoutPrefix(tree, defs), tpe), tpe);
- val result: Tree = make.Block(tree.pos, defs.toArray(), lambda);
- print(tree, "eta", result);//debug
- result
- }
-
- private val preName = "eta$";
-
- /** Append to `defs' value definitions for all non-stable subexpressions
- * of the function application `tree'
- */
- def liftoutPrefix(tree: Tree, defs: TreeList): Tree = {
-
- def liftoutList(trees: Array[Tree], defs: TreeList): Array[Tree] = {
- var trees1 = trees;
- for (val i <- Iterator.range(0, trees.length)) {
- val tree: Tree = trees(i);
- val tree1: Tree = liftout(tree, defs);
- if (tree1 != tree && trees1 == trees) {
- trees1 = new Array[Tree](trees.length);
- System.arraycopy(trees, 0, trees1, 0, trees.length);
- }
- trees1(i) = tree1;
- }
- trees1;
- }
-
- def liftout(tree: Tree, defs: TreeList): Tree =
- if (TreeInfo.isPureExpr(tree)) tree
- else {
- val vname: Name = Name.fromString(preName + defs.length());
- defs.append(
- make.ValDef(
- tree.pos, SYNTHETIC, vname, Tree.Empty, tree));
- make.Ident(tree.pos, vname)
- }
-
- tree match {
- case Tree$Ident(_) =>
- tree;
- case Tree$Select(qual, _) =>
- copy.Select(tree, liftout(qual, defs)).setType(null);
- case Tree$TypeApply(fn, args) =>
- copy.TypeApply(tree, liftoutPrefix(fn, defs), args).setType(null);
- case Tree$Apply(fn, args) =>
- copy.Apply(tree, liftoutPrefix(fn, defs), liftoutList(args, defs)).setType(null);
- }
- }
-
- /** in patterns x => x @ _
- * precondition: name != '_'
- * post: returns *unattributed* Bind tree
- */
-
- def IdentPattern(tree: Tree): Tree = tree match {
- case Tree$Ident(name) =>
- if (name == Names.PATTERN_WILDCARD)
- throw new ApplicationError("nothing to desugarize");
- make.Bind(
- tree.pos,
- name,
- gen.Ident(tree.pos, global.definitions.PATTERN_WILDCARD))
- .setType(tree.getType());
- }
-
- /** in patterns x:T => x @ _ : T
- * pre: t is a typed variable.
- * post: returns *unattributed* Bind tree
- */
- def TypedPattern(t: Tree$Typed): Tree = t match {
- case Tree$Typed(Tree$Ident(name), tpe) =>
- make.Bind(
- t.pos,
- name,
- make.Typed(
- t.pos,
- gen.Ident(t.pos, global.definitions.PATTERN_WILDCARD),
- tpe));
- }
-
- /** f, (syms_1)...(syms_n)T ==> f(ps_1)...(ps_n)
- */
- def toApply(tree: Tree, tpe: Type): Tree = tpe match {
- case Type$MethodType(vparams, restpe) =>
- val res: Tree = make.Apply(tree.pos, tree, toIdents(vparams));
- toApply(res, restpe);
- case _ =>
- tree
- }
-
- /** e, (syms_1)...(syms_n)T ==> (ps_1 => ... => ps_n => e)
- */
- def toFunction(tree: Tree, tpe: Type): Tree = tpe match {
- case Type$MethodType(vparams, restpe) =>
- make.Function(tree.pos, toVparams(vparams), toFunction(tree, restpe));
- case _ =>
- tree
- }
-
- /** Extract value parameters from type.
- */
- def toVparams(symbols: Array[Symbol]): Array[Tree$ValDef] = {
- val vpars = new Array[Tree$ValDef](symbols.length);
- for (val i <- Iterator.range(0, symbols.length)) {
- vpars(i) = make.ValDef(
- symbols(i).pos, PARAM | SYNTHETIC, symbols(i).name,
- gen.mkType(symbols(i).pos, symbols(i).getType()),
- Tree.Empty);
- }
- vpars
- }
-
- /** Extract value identifiers from method type.
- * It is assumed that all symbols are term symbols ==> make.Ident().
- */
- def toIdents(symbols: Array[Symbol]): Array[Tree] = {
- val idents = new Array[Tree](symbols.length);
- for (val i <- Iterator.range(0, symbols.length)) {
- idents(i) = make.Ident(symbols(i).pos, symbols(i).name);
- }
- idents.asInstanceOf[Array[Tree]];
- }
-
- /** Build value element definition name for case parameter.
- */
- def addParamAccessor(ts: TreeList, vparam: Tree$ValDef): unit = {
- if ((vparam.symbol().owner().constructorClass().flags & CASE) != 0)
- vparam.mods = vparam.mods | PARAMACCESSOR;
- if ((vparam.mods & PARAMACCESSOR) != 0)
- ts.append(
- make.DefDef(
- vparam.pos, (vparam.mods & ~PARAM) | STABLE, vparam.name,
- Tree.AbsTypeDef_EMPTY_ARRAY, Tree.ValDef_EMPTY_ARRAY_ARRAY,
- Tree.Empty,
- make.Ident(vparam.pos, vparam.name)
- .setSymbol(vparam.symbol())))
- }
-
- /** add case constructor, definitions value and access functions.
- */
- def addParamAccessors(body: Array[Tree], vparams: Array[Tree$ValDef]): Array[Tree] = {
- val stats: TreeList = new TreeList();
- for (val i <- Iterator.range(0, vparams.length)) {
- addParamAccessor(stats, vparams(i));
- }
- if (stats.length() == 0) body
- else {
- stats.append(body);
- stats.toArray()
- }
- }
-
- //debug
- def print(tree: Tree, conv: String, result: Tree): unit = {
- if (global.log()) {
- System.out.println(tree);
- System.out.println(" --" + conv + "--> ");
- System.out.println(tree);
- }
- }
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/ImportList.scala b/sources/scala/tools/scalac/typechecker/ImportList.scala
deleted file mode 100644
index 0ff717965a..0000000000
--- a/sources/scala/tools/scalac/typechecker/ImportList.scala
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-**
-** $Id$
-\* */
-
-import scalac._;
-import scalac.util._;
-import scalac.symtab._;
-import scalac.ast._;
-
-package scala.tools.scalac.typechecker {
-
-/////////////////////////////////////////////////////////////////////////////
-// Import Lists
-/////////////////////////////////////////////////////////////////////////////
-
-/** A class for import expressions
-* @param tree The import definition
-* @param enclScope The scope in which the import occurs.
-* @param prev The previous active import list.
-*/
-case class ImportList(tree: Tree, enclScope: Scope, prev: ImportList) {
-
- override def toString(): String = {
- var str = tree.symbol().toString();
- if (prev != null) str = "" + prev + "; " + str;
- str
- }
-
- def importPrefix(): Tree = tree match {
- case Tree$Import(expr, _) => expr
- }
-
- def importType(): Type =
- tree.symbol().getType();
-
- def sameImport(that: ImportList): boolean =
- this.importType().isSameAs(that.importType());
-
- def importedSymbol(name: Name): Symbol = {
- return TreeInfo.importedSymbol(tree, name);
- }
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/Infer.scala b/sources/scala/tools/scalac/typechecker/Infer.scala
deleted file mode 100644
index 69b74f8adc..0000000000
--- a/sources/scala/tools/scalac/typechecker/Infer.scala
+++ /dev/null
@@ -1,1428 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import java.lang.Object;
-
-import scalac.{Global => scalac_Global}
-import scalac.symtab._;
-import scalac.typechecker.{Infer => scalac_Infer}
-import scalac.ApplicationError;
-import scalac.util._;
-import scalac.ast._;
-import scala.collection.mutable.HashMap;
-import scala.tools.util.Position;
-
-import scala.tools.scalac.util.NewArray;
-
-package scala.tools.scalac.typechecker {
-
-class Infer(global: scalac_Global, gen: TreeGen, make: TreeFactory) extends scalac_Infer {
-
- import Modifiers._, Kinds._;
-
- val definitions: Definitions = global.definitions;
- val substituter: Substituter = new Substituter(global, gen);
-
- def this(trans: Transformer) = this(trans.global, trans.gen, trans.make);
-
-// Context accessor and error function, overridable */
-
- def getContext: Context = Context.NONE;
-
- def error(pos: int, msg: String): unit =
- throw new Type$Error(msg);
-
-
-// Error messages -------------------------------------------------------------
-
- def applyErrorMsg(msg1: String, fn: Tree, msg2: String, argtypes: Array[Type], pt: Type): String =
- msg1 + toString(fn.symbol(), fn.getType()) + msg2 +
- ArrayApply.toString(argtypes.asInstanceOf[Array[Object]], "(", ",", ")") +
- (if (pt == Type.AnyType) "" else " with expected result type " + pt);
-
- def typeErrorMsg(msg: String, found: Type, req: Type): String =
- msg + ";\n found : " + found.toLongString() + "\n required: " + req;
-
- def overloadResolveErrorMsg(sym1: Symbol, tpe1: Type, sym2: Symbol, tpe2: Type): String =
- "ambiguous reference to overloaded definition,\n" +
- "both " + sym1 + ": " + tpe1 + "\n" +
- "and " + sym2 + ": " + tpe2 + "\nmatch";
-
- /** Give a string representation of symbol `sym' with type `tp'
- * for error diagnostics. `sym' may be null.
- */
- def toString(sym: Symbol, tp: Type): String =
- (if (tp.isInstanceOf[Type$OverloadedType]) "overloaded " else "") +
- (if (sym == null) "expression" else sym) + " of type " + tp;
-
-// Variance calculation ----------------------------------------------------------
-
- private def flip(v: int): int = {
- if (v == COVARIANT) CONTRAVARIANT;
- else if (v == CONTRAVARIANT) COVARIANT;
- else v
- }
-
- private def cut(v: int): int = {
- if (v == VARIANCES) v
- else 0
- }
-
- /** Compute variances of all type parameters `tparams' in type `tp'.
- * A variance is taken from the four point lattice
- *
- * 0, Modifiers.COVARIANT, Modifiers.CONTRAVARIANT, Modifiers.VARIANCES.
- */
- private def variance(tparams: Array[Symbol], tp: Type): Array[int] = {
- val vs: Array[int] = new Array[int](tparams.length);
- { var i = 0; while (i < vs.length) {
- vs(i) = variance(tparams(i), tp);
- i = i + 1;
- }}
- vs
- }
-
- /** Compute variances of all type parameters `tparams' in types `tps'.
- */
- private def variance(tparams: Array[Symbol], tps: Array[Type]): Array[int] = {
- val vs: Array[int] = new Array[int](tparams.length);
- { var i = 0; while (i < vs.length) {
- vs(i) = variance(tparams(i), tps);
- i = i + 1;
- }}
- vs
- }
-
- /** Compute variance of type parameter `tparam' in types of all symbols `sym'.
- */
- private def variance(tparam: Symbol, syms: Array[Symbol]): int = {
- var v: int = VARIANCES;
- { var i = 0; while (i < syms.length) {
- v = v & variance(tparam, syms(i));
- i = i + 1;
- }}
- v
- }
-
- /** Compute variance of type parameter `tparam' in type of symbol `sym'.
- */
- private def variance(tparam: Symbol, sym: Symbol): int = sym.kind match {
- case VAL =>
- variance(tparam, sym.info())
- case TYPE =>
- variance(tparam, sym.info()) &
- flip(variance(tparam, sym.loBound())) &
- variance(tparam, sym.vuBound())
- case ALIAS =>
- cut(variance(tparam, sym.info()))
- case _ =>
- 0
- }
-
- /** Compute variance of type parameter `tparam' in all types `tps'.
- */
- private def variance(tparam: Symbol, tps: Array[Type]): int = {
- var v: int = VARIANCES;
- { var i = 0; while (i < tps.length) {
- v = v & variance(tparam, tps(i));
- i = i + 1;
- }}
- v
- }
-
- /** Compute variance of type parameter `tparam' in all type arguments
- * `tps' which correspond to formal type parameters `tparams'.
- */
- private def varianceInArgs(tvar: Symbol, tps: Array[Type], tparams: Array[Symbol]): int = {
- var v: int = VARIANCES;
- { var i = 0; while (i < tps.length) {
- if ((tparams(i).flags & COVARIANT) != 0) {
- v = v & variance(tvar, tps(i));
- } else if ((tparams(i).flags & CONTRAVARIANT) != 0) {
- v = v & flip(variance(tvar, tps(i)));
- } else {
- v = v & cut(variance(tvar, tps(i)));
- }
- i = i + 1;
- }}
- v
- }
-
- /** Compute variance of type parameter `tparam' in type `tp'.
- */
- private def variance(tparam: Symbol, tp: Type): int = tp match {
- case Type.ErrorType | Type.AnyType | Type.NoType | Type.NoPrefix |
- Type$ThisType(_) | Type$ConstantType(_, _) =>
- VARIANCES
- case Type$TypeRef(pre, sym, args) =>
- if (sym == tparam) COVARIANT
- else variance(tparam, pre) & varianceInArgs(tparam, args, sym.typeParams())
- case Type$SingleType(pre, sym) =>
- cut(variance(tparam, pre))
- case Type$CompoundType(parts, members) =>
- variance(tparam, parts) & variance(tparam, members.elements())
- case Type$MethodType(params, restype) =>
- flip(variance(tparam, params)) & variance(tparam, restype)
- case Type$PolyType(tparams, restype) =>
- flip(variance(tparam, tparams)) & variance(tparam, restype)
- }
-
-// Accessibility ------------------------------------------------------------
-
- /** Check that `sym' is accessible as a member of tree `site' in current context.
- */
- def checkAccessible(pos: int, sym: Symbol, symtype: Type, site: Tree, sitetype: Type): Type = {
- //System.out.println("check acc " + sym);//DEBUG
- if ((sym.owner().flags & INCONSTRUCTOR) != 0 &&
- !(sym.kind == TYPE && sym.isParameter()) &&
- (site == Tree.Empty || site.isInstanceOf[Tree$This])) {
- error(pos, "" + sym + " cannot be accessed from constructor");
- Type.ErrorType;
- } else {
- symtype match {
- case Type$OverloadedType(alts, alttypes) =>
- var nacc: int = 0;
- var i = 0; while (i < alts.length) {
- if (isAccessible(alts(i), site, sitetype))
- nacc = nacc + 1;
- i = i + 1
- }
- if (nacc == 0) {
- error(pos, "" + sym + " cannot be accessed in " + sitetype.widen());
- Type.ErrorType
- } else {
- val alts1: Array[Symbol] = new Array[Symbol](nacc);
- val alttypes1: Array[Type] = new Array[Type](nacc);
- nacc = 0;
- var i = 0; while (i < alts.length) {
- if (isAccessible(alts(i), site, sitetype)) {
- alts1(nacc) = alts(i);
- alttypes1(nacc) = alttypes(i);
- nacc = nacc + 1;
- }
- i = i + 1
- }
- new Type$OverloadedType(alts1, alttypes1)
- }
- case _ =>
- if (isAccessible(sym, site, sitetype)) {
- symtype
- } else {
- error(pos, "" + sym + " cannot be accessed in " + sitetype.widen());
- Type.ErrorType
- }
- }
- }
- }
-
- /** Is `sym' accessible as a member of tree `site' in current context?
- */
- private def isAccessible(sym: Symbol, site: Tree, sitetype: Type): boolean = {
-
- /** Are we inside definition of `owner'?
- */
- def accessWithin(owner: Symbol): boolean = {
- var c: Context = getContext;
- while (c != Context.NONE && c.owner != owner) {
- c = c.outer.enclClass;
- }
- c != Context.NONE;
- }
-
- /** Is `clazz' a subclass of an enclosing class?
- */
- def isSubClassOfEnclosing(clazz: Symbol): boolean = {
- var c: Context = getContext;
- while (c != Context.NONE && !clazz.isSubClass(c.owner)) {
- c = c.outer.enclClass;
- }
- c != Context.NONE;
- }
-
- site == Tree.Empty
- ||
- (sym.flags & (PRIVATE | PROTECTED)) == 0
- ||
- {val owner = if (sym.isConstructor()) sym.constructorClass()
- else sym.owner();
- accessWithin(owner)
- ||
- ((sym.flags & PRIVATE) == 0) &&
- (site.isInstanceOf[Tree$Super] ||
- (sitetype.symbol().isSubClass(owner) &&
- isSubClassOfEnclosing(sitetype.symbol())))
- }
- }
-
-// Views ---------------------------------------------------------------------
-
- val memberViewCache = new HashMap[Symbol, List[View]];
-
- /** Return all views which are members of one of the objects associated
- * with the base types of `tp'.
- */
- private def memberViews(tp: Type): List[View] = {
- val tpsym = tp.widen().symbol();
- memberViewCache.get(tpsym) match {
- case Some(vs) => vs
- case None =>
- var vs = companionObjViews(tp, tpsym);
- val ps = tpsym.parents();
- var i = ps.length - 1; while (i >= 0) {
- vs = memberViews(ps(i)) ::: vs;
- i = i - 1
- }
- memberViewCache.update(tpsym, vs);
- vs
- }
- }
-
- /** Return all views which are member of the companion object of
- * base class `clazz' of type `tp', empty if no companion object exists.
- */
- private def companionObjViews(tp: Type, clazz: Symbol): List[View] = {
- if (clazz.kind == CLASS && !clazz.isModuleClass() && !clazz.isCaseClass()) {
- var obj = clazz.owner().info().lookupNonPrivate(clazz.name.toTermName());
- if (obj.isExternal() == clazz.isExternal()) {
- //System.out.println("comp obj view " + tp + " " + obj);//DEBUG
- obj.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- var i = 0; while (i < alts.length) {
- if (alts(i).isModule()) obj = alts(i);
- i = i + 1
- }
- case _ =>
- }
- if (obj.isModule()) {
- val qual = if (tp.prefix() == Type.NoType) Tree.Empty
- else gen.mkRef(Position.NOPOS, tp.prefix(), obj);
- val viewsym = obj.info().lookupNonPrivate(Names.view);
- if (viewsym.kind == VAL) {
- obj.getType().memberType(viewsym) match {
- case Type$OverloadedType(alts, alttypes) =>
- var i = alttypes.length - 1;
- var vs: List[View] = List();
- while (i >= 0) {
- vs = View(alts(i), alttypes(i), qual, Context.NONE) :: vs;
- i = i - 1
- }
- vs
- case viewtype =>
- List(View(viewsym, viewtype, qual, Context.NONE))
- }
- } else List()
- } else List()
- } else List()
- } else List()
- }
-
- /** Return all available views for type `tp'
- */
- private def availableViews(tp: Type): List[View] = {
- //System.out.println("view for " + tp + " = " + (memberViews(tp) ::: getContext.viewMeths));//DEBUG
- memberViews(tp) ::: getContext.viewMeths
- }
-
- def containsSymbol(syms: Array[Symbol], sym: Symbol): boolean = {
- var i = 0;
- while (i < syms.length && syms(i) != sym) i = i + 1;
- i < syms.length
- }
-
- def isContractive(tp: Type): boolean = {
- tp match {
- case Type$PolyType(tparams, tp1) =>
- skipViewParams(tparams, tp1) match {
- case Type$MethodType(vparams, _) =>
- vparams.length != 1 ||
- !containsSymbol(tparams, vparams(0).getType().symbol())
- case _ => true
- }
- case _ => true
- }
- }
-
- /** Construct a tree referring to the view method in `v' at position `pos'.
- */
- def viewExpr(pos: int, v: View): Tree = {
- val viewType = checkAccessible(
- pos, v.sym, v.symtype, v.qual, v.qual.getType());
- v.qual match {
- case Tree.Empty =>
- make.Ident(pos, v.sym.name)
- .setSymbol(v.sym).setType(viewType)
- case _ =>
- val qual = v.qual.duplicate();
- qual.pos = pos;
- make.Select(pos, qual, v.sym.name)
- .setSymbol(v.sym).setType(viewType)
- }
- }
-
- /** Construct a function value tree from method reference `meth'.
- */
- private def viewObj(meth: Tree): Tree = meth.getType() match {
- case Type$MethodType(params: Array[Symbol], _) =>
- assert(params.length == 1);
- val paramsym = params(0).cloneSymbol(getContext.owner);
- gen.mkFunction(
- meth.pos,
- NewArray.ValDef(gen.mkParam(paramsym)),
- gen.Apply(meth, NewArray.Tree(gen.Ident(meth.pos, paramsym))),
- meth.getType().resultType(),
- getContext.owner,
- false)
- case _ =>
- meth
- }
-
- /** Construct an implicit view argument for a formal type parameter
- * with type `vtype'. `targs' is the vector of type arguments
- * in the current application for which a view argument is needed.
- * This is needed for error diagnostics only.
- */
- private def viewArg(pos: int, vtype: Type, targs: Array[Type]): Tree = {
- val vargs = vtype.typeArgs();
- if (vargs(0).isSubType(vargs(1))) {
- gen.mkNullLit(pos)
- } else {
- val v = bestView(vargs(0), vargs(1), Names.EMPTY);
- if (v != null && !v.locked) {
- if (v.locked) {
- error(pos, "recursive view instantiation of non-contractive " +
- v.sym + v.sym.locationString() + " with type " +
- v.sym.getType());
- gen.mkDefaultValue(pos, vtype)
- } else {
- v.locked = !isContractive(v.symtype);
- var vmeth = viewExpr(pos, v);
- vmeth.getType() match {
- case Type$PolyType(vtparams, vrestype) =>
- assert(vtparams.length != 0);
- vmeth = exprInstance(vmeth, vtparams, vrestype, vtype);
- case _ =>
- }
- val vobj = viewObj(vmeth);
- if (!vobj.getType().isSubType(vtype))
- assert(false, "view argument " + vobj + ":" + vobj.getType() + " is not a subtype of view param type " + vtype);
- v.locked = false;
- vobj
- }
- } else {
- error(pos,
- "type instantiation with [" +
- ArrayApply.toString(targs.asInstanceOf[Array[Object]], ",") +
- "] failed since " + vargs(0) + " is not viewable as " + vargs(1));
- gen.mkDefaultValue(pos, vtype)
- }
- }
- }
-
- /** Augment type application tree with implicit view arguments.
- * @param tree The type application
- * @param tparams The formal parameters of the application.
- * @param restype The result type of the type application (which
- * must be a method type containing the view parameters,
- * unless it is an error type.
- * @param targs The actual type arguments.
- */
- private def passViewArgs(tree: Tree, tparams: Array[Symbol], restype: Type,
- targs: Array[Type]): Tree =
- restype match {
- case Type$MethodType(params, _) =>
- val viewargs = new Array[Tree](params.length);
- var i = 0; while (i < params.length) {
- viewargs(i) = viewArg(
- tree.pos, params(i).getType().subst(tparams, targs), targs);
- i = i + 1
- }
- //System.out.println("new view args: " + gen.Apply(tree, viewargs));//DEBUG
- gen.Apply(tree, viewargs);
- case Type.ErrorType =>
- tree
- }
-
- /** Do type parameters `tparams' contain a view bounded parameter?
- */
- def isViewBounded(tparams: Array[Symbol]) = {
- var viewbounded = false;
- var j = 0; while (j < tparams.length) {
- viewbounded = viewbounded | tparams(j).isViewBounded();
- j = j + 1
- }
- viewbounded
- }
-
- /** Skip view parameters in type `tp' in the case where `tparams' contains
- * a view bound.
- */
- def skipViewParams(tparams: Array[Symbol], tp: Type): Type = tp match {
- case Type$MethodType(_, restp) if isViewBounded(tparams) =>
- restp
- case _ =>
- tp
- }
-
- /** If tree is a type application, pass implicit view arguments where
- * necessary.
- */
- def completeTypeApply(tree: Tree): Tree = {
- //System.out.println("complete type apply: " + tree + ":" + tree.getType());//DEBUG
- tree match {
- case Tree$TypeApply(fn, targs) =>
- fn.getType() match {
- case Type$PolyType(tparams, restp) if tparams.length == targs.length =>
- if (isViewBounded(tparams)) {
- val result = passViewArgs(tree, tparams, restp, Tree.typeOf(targs));
- //System.out.println("completed type apply: " + result + ":" + result.getType());//DEBUG
- result
- } else tree
- case _ => tree
- }
- case _ => tree
- }
- }
-
-// Type parameter inference -----------------------------------------------------
-
- private class NoInstance(msg: String) extends RuntimeException(msg);
-
- /** map every TypeVar to its constraint.inst field.
- * throw a NoInstance exception if a NoType or AnyType is encountered.
- */
- private val instantiateMap: Type$Map = new Type$Map() {
- def apply(t: Type): Type = instantiate(t)
- }
-
- private def instantiate(tp: Type): Type = tp match {
- case Type.AnyType | Type.NoType =>
- throw new NoInstance("undetermined type");
- case Type$TypeVar(origin, constr) =>
- if (constr.inst != Type.NoType) instantiate(constr.inst)
- else throw new NoInstance("no unique instantiation of type variable " +
- origin + " could be found");
- case _ =>
- instantiateMap.map(tp)
- }
-
- /** Map type variable to its instance, or, if `covariant' is true,
- * to its upper bound;
- */
- private def instantiateToBound(tp: Type, variance: int): Type = tp match {
- case Type$TypeVar(origin, constr) =>
- try {
- if (constr.inst != Type.NoType) {
- instantiate(constr.inst)
- } else if ((variance & COVARIANT) != 0 && constr.hibounds != Type$List.EMPTY) {
- maximizeVar(tp);
- instantiate(constr.inst)
- } else if ((variance & CONTRAVARIANT) != 0 && constr.lobounds != Type$List.EMPTY) {
- minimizeVar(tp);
- instantiate(constr.inst)
- } else {
- Type.AnyType;
- }
- } catch {
- case ex: NoInstance => Type.AnyType
- }
- }
-
- /** The formal parameter types corresponding to `params'.
- * If `params' has a repeated last parameter, a list of
- * (nargs - params.length + 1) copies of its type is returned.
- */
- def formalTypes(params: Array[Symbol], nargs: int): Array[Type] = {
- if (nargs >= params.length - 1 && params.length > 0 && (params(params.length-1).flags & REPEATED) != 0) {
- val args: Array[Type] = params(params.length-1).getType().typeArgs();
- if (args.length == 1) {
- val ft: Type = args(0); // last param has type Seq[T], we need T here
- val formals: Array[Type] = new Array[Type](nargs);
- var i = 0;
- while (i < params.length-1) {
- formals(i) = params(i).getType();
- i = i + 1;
- }
- while (i < nargs) {
- formals(i) = ft;
- i = i + 1;
- }
- return formals;
- }
- }
- Symbol.getType(params);
- }
-
- /** Is type fully defined, i.e. no embedded anytypes or typevars in it?
- */
- def isFullyDefined(tp: Type): boolean = {
- try {
- instantiate(tp);
- true
- } catch {
- case ex: NoInstance => false
- }
- }
-
- /** Do type arguments `targs' conform to formal parameters `tparams'?
- */
- private def isWithinBounds(tparams: Array[Symbol], targs: Array[Type]): boolean = {
- var i = 0;
- while (i < targs.length) {
- val hibound: Type = tparams(i).info().subst(tparams, targs);
- if (!targs(i).isSubType(hibound)) {
- var j = 0;
- while (j < tparams.length) {
- if (hibound.symbol() == tparams(j))
- return isWithinBounds(
- tparams,
- Type.subst(
- targs,
- NewArray.Symbol(tparams(j)),
- NewArray.Type(targs(i))));
- j = j + 1
- }
- return false;
- }
- val lobound: Type = tparams(i).loBound().subst(tparams, targs);
- if (!lobound.isSubType(targs(i))) {
- var j = 0;
- while (j < tparams.length) {
- if (lobound.symbol() == tparams(j))
- return isWithinBounds(
- tparams,
- Type.subst(
- targs,
- NewArray.Symbol(tparams(j)),
- NewArray.Type(targs(i))));
- j = j + 1
- }
- return false
- }
- i = i + 1
- }
- true
- }
-
- /** throw a type error if arguments not within bounds.
- */
- def checkBounds(tparams: Array[Symbol], targs: Array[Type], prefix: String): unit =
- if (!isWithinBounds(tparams, targs))
- throw new Type$Error(
- prefix + "type arguments " +
- ArrayApply.toString(targs.asInstanceOf[Array[Object]], "[", ",", "]") +
- " do not conform to " +
- tparams(0).owner() + "'s type parameter bounds " +
- ArrayApply.toString(Symbol.defString(tparams).asInstanceOf[Array[Object]], "[", ",", "]"));
-
- /** Instantiate variable to glb of its high bounds.
- */
- private def maximizeVar(tp: Type): unit = tp match {
- case Type$TypeVar(origin, constr) =>
- if (constr.inst == Type.NoType)
- constr.inst = Type.glb(constr.hibounds.toArray());
- }
-
- /** Instantiate variable to lub of its low bounds.
- */
- private def minimizeVar(tp: Type): unit = tp match {
- case Type$TypeVar(origin, constr) =>
- if (constr.inst == Type.NoType)
- constr.inst = Type.lub(constr.lobounds.toArray());
- }
-
- /** Solve constraint collected in types `tvars', instantiating `tvars(i)'
- * in the process.
- * @param tparams The type parameters corresponding to `tvars'
- * @param upper When `true' search for max solution else min.
- * @param variances The variances of type parameters; need to reverse
- * solution direction for all contravariant variables.
- * @param tvars All type variables to be instantiated.
- * @param i The index of the type variable to be instantiated.
- */
- private def solve(tparams: Array[Symbol], upper: boolean, variances: Array[int], tvars: Array[Type], i: int): unit = {
- if (tvars(i) != Type.NoType) {
- tvars(i) match {
- case Type$TypeVar(origin, constr) =>
- if (constr.inst != Type.NoType) {
- constr.inst = instantiate(constr.inst);
- tvars(i) = constr.inst;
- } else {
- val tvar: Type = tvars(i);
- val up: boolean = if (variances(i) != CONTRAVARIANT) upper
- else !upper;
- tvars(i) = Type.NoType;
- val bound: Type = if (up) tparams(i).info() else tparams(i).loBound();
- var cyclic: boolean = false;
- { var j = 0; while (j < tvars.length) {
- if (bound.contains(tparams(j)) ||
- up && tparams(j).loBound().isSameAs(tparams(i).getType()) ||
- !up && tparams(j).info().isSameAs(tparams(i).getType())) {
- cyclic = cyclic | tvars(j) == Type.NoType;
- solve(tparams, upper, variances, tvars, j);
- }
- j = j + 1
- }}
- if (!cyclic) {
- if (up) {
- if (bound.symbol() != definitions.ANY_CLASS)
- constr.hibounds = new Type$List(
- bound.subst(tparams, tvars), constr.hibounds);
- { var j = 0; while (j < tvars.length) {
- if (tparams(j).loBound().isSameAs(
- tparams(i).getType())) {
- constr.hibounds = new Type$List(
- tparams(j).getType().subst(tparams, tvars),
- constr.hibounds);
- }
- j = j + 1
- }}
- } else {
- if (bound.symbol() != definitions.ALL_CLASS)
- constr.lobounds = new Type$List(
- bound.subst(tparams, tvars), constr.lobounds);
- { var j = 0; while (j < tvars.length) {
- if (tparams(j).info().isSameAs(
- tparams(i).getType())) {
- constr.lobounds = new Type$List(
- tparams(j).getType().subst(tparams, tvars),
- constr.lobounds);
- }
- j = j + 1
- }}
- }
- }
- if (up) maximizeVar(tvar);
- else minimizeVar(tvar);
- tvars(i) = tvar.asInstanceOf[Type$TypeVar].constr.inst;
- }
- case _ =>
- }
- }
- }
-
- /** Generate an array of fresh type variables corresponding to parameters
- * `tparams'
- */
- def freshVars(tparams: Array[Symbol]): Array[Type] = {
- val tvars: Array[Type] = new Array[Type](tparams.length);
- { var i = 0; while (i < tvars.length) {
- tvars(i) = new Type$TypeVar(tparams(i).getType(), new Type$Constraint());
- i = i + 1
- }}
- tvars
- }
-
- private val freshInstanceMap: Type$Map = new Type$Map() {
- def apply(t: Type): Type = t match {
- case Type$PolyType(tparams, restp) =>
- val restp1: Type = apply(restp);
- var tparams1: Array[Symbol] = Symbol.EMPTY_ARRAY;
- var newparams1: Array[Symbol] = Symbol.EMPTY_ARRAY;
- restp1 match {
- case Type$PolyType(_, _) =>
- // If there is a nested polytype, we need to
- // substitute also its new type parameters for its old ones
- // here. Reason: The outer polytype may refer to type
- // variables of the inner one.
- tparams1 = restp.typeParams();
- newparams1 = restp1.typeParams();
- case _ =>
- }
- val newparams: Array[Symbol] = new Array[Symbol](tparams.length);
- { var i = 0; while (i < tparams.length) {
- newparams(i) = tparams(i).cloneSymbol();
- i = i + 1
- }}
- { var i = 0; while (i < tparams.length) {
- newparams(i).setInfo(
- newparams(i).info()
- .subst(tparams, newparams)
- .subst(tparams1, newparams1));
- newparams(i).setLoBound(
- newparams(i).loBound()
- .subst(tparams, newparams)
- .subst(tparams1, newparams1));
- newparams(i).setVuBound(
- newparams(i).vuBound()
- .subst(tparams, newparams)
- .subst(tparams1, newparams1));
- i = i + 1
- }}
- new Type$PolyType(newparams, restp1.subst(tparams, newparams))
-
- case Type$OverloadedType(_, _) =>
- map(t)
-
- case _ =>
- t
- }
- }
-
- def freshInstance(tp: Type): Type = freshInstanceMap.apply(tp);
-
- /** Automatically perform the following conversions on expression types:
- * A method type becomes the corresponding function type.
- * A nullary metAhod type becomes its result type.
- */
- private def normalize(tp: Type): Type = tp match {
- case Type$MethodType(params, restype) =>
- definitions.FUNCTION_TYPE(
- Symbol.getType(params), normalize(restype));
- case Type$PolyType(tparams, restype) if (tparams.length == 0) =>
- normalize(restype);
- case _ =>
- tp
- }
-
- /** Is normalized type `tp' a subtype of prototype `pt'?
- */
- def isCompatible(tp: Type, pt: Type): boolean =
- isCompatible(tp, pt, true);
-
- def isCompatible(tp: Type, pt: Type, regularValue: boolean): boolean = {
- def canView(tp: Type): boolean = tp match {
- case Type$OverloadedType(_, alttypes) =>
- var i = 0;
- while (i < alttypes.length && !canView(alttypes(i))) i = i + 1;
- i < alttypes.length
- case Type$PolyType(tparams, restype) if tparams.length == 0 =>
- restype.isSubType(pt)
- case _ =>
- false
- }
- val tp1 = normalize(tp);
- if (tp1.isSubType(pt)) true
- else if (regularValue) {
- val argtypes = NewArray.Type(tp1);
- var viewMeths = availableViews(tp1);
- while (!viewMeths.isEmpty &&
- !isApplicable(viewMeths.head.symtype, argtypes, pt, Names.EMPTY, false))
- viewMeths = viewMeths.tail;
- if (!viewMeths.isEmpty) {
- true
- }
- // todo: remove
- else {
- val coerceMeth: Symbol = tp1.lookup(Names.coerce);
- coerceMeth.kind != NONE && canView(tp1.memberType(coerceMeth));
- }
- } else false;
- }
-
- def isCompatible(tps: Array[Type], pts: Array[Type]): boolean =
- isCompatible(tps, pts, true);
-
- def isCompatible(tps: Array[Type], pts: Array[Type], regularValue: boolean): boolean = {
- var i = 0; while (i < tps.length) {
- if (!isCompatible(tps(i), pts(i), regularValue)) return false;
- i = i + 1
- }
- true
- }
-
- /** Type arguments mapped to `scala.All' and not covariant in `restype'
- * are taken to be uninstantiated.
- * Map all those type arguments to their corresponding type parameters
- * and return all these type parameters as result.
- */
- private def normalizeArgs(targs: Array[Type], tparams: Array[Symbol], restype: Type): Array[Symbol] = {
- var uninstantiated: Type$List = Type$List.EMPTY;
- { var i = 0; while (i < targs.length) {
- if (targs(i).symbol() == definitions.ALL_CLASS &&
- (variance(tparams(i), restype) & COVARIANT) == 0 &&
- !tparams(i).isViewBounded()) {
- //System.out.println("normalizing " + tparams(i) + " / " + restype);//DEBUG
- targs(i) = tparams(i).getType();
- uninstantiated = Type$List.append(uninstantiated, targs(i));
- }
- i = i + 1
- }}
- Type.symbol(uninstantiated.toArray());
- }
-
- /** Return inferred type arguments of polymorphic expression, given
- * its type parameters and result type and a prototype `pt'.
- * If no minimal type variables exist that make the
- * instantiated type a subtype of `pt', return `null'.
- */
- private def exprTypeArgs(tparams: Array[Symbol], restype: Type, pt: Type): Array[Type] =
- exprTypeArgs(tparams, restype, pt, true);
-
- private def exprTypeArgs(tparams: Array[Symbol], restype: Type,
- pt: Type, regularValue: boolean): Array[Type] = {
- val tvars: Array[Type] = freshVars(tparams);
- val insttype: Type = restype.subst(tparams, tvars);
- if (isCompatible(insttype, pt, regularValue)) {
- try {
- val restype1 = normalize(restype);
- { var i = 0; while (i < tvars.length) {
- solve(tparams, false, variance(tparams, restype1), tvars, i);
- i = i + 1
- }}
- tvars
- } catch {
- case ex: NoInstance => null
- }
- } else {
- null
- }
- }
-
- /** Return inferred proto-type arguments of function, given
- * its type and value parameters and result type, and a
- * prototype `pt' for the function result.
- * Type arguments need to be either determined precisely by
- * the prototype, or they are maximized, if they occur only covariantly
- * in the value parameter list.
- * If instantiation of a type parameter fails,
- * take Type.AnyType for the proto-type argument.
- */
- def protoTypeArgs(tparams: Array[Symbol], restype: Type, pt: Type, params: Array[Symbol]): Array[Type] = {
- val tvars: Array[Type] = freshVars(tparams);
- val insttype: Type = restype.subst(tparams, tvars);
- val targs: Array[Type] = new Array[Type](tvars.length);
- { var i = 0; while (i < tvars.length) {
- targs(i) = Type.AnyType;
- i = i + 1
- }}
- if (isCompatible(insttype, pt)) {
- try {
- { var i = 0; while (i < tvars.length) {
- targs(i) = instantiateToBound(
- tvars(i), variance(tparams(i), params));
- i = i + 1
- }}
- } catch {
- case ex: NoInstance =>
- { var i = 0; while (i < tvars.length) {
- targs(i) = Type.AnyType;
- i = i + 1
- }}
- }
- }
- targs
- }
-
- /** Return inferred type arguments, given type parameters, formal parameters,
- * argument types, result type and expected result type.
- * If this is not possible, throw a `NoInstance' exception, or, if
- * `needToSucceed' is false alternatively return `null'.
- * Undetermined type arguments are represented by `definitions.ALL_TYPE'.
- * No check that inferred parameters conform to their bounds is made here.
- */
- private def methTypeArgs(tparams: Array[Symbol], params: Array[Symbol],
- argtypes: Array[Type], restp: Type,
- pt: Type,
- needToSucceed: boolean, regularValue: boolean): Array[Type] = {
- //System.out.println("methTypeArgs, tparams = " + ArrayApply.toString(tparams.asInstanceOf[Array[Object]]) + ", params = " + ArrayApply.toString(params.asInstanceOf[Array[Object]]) + ", type(params) = " + ArrayApply.toString(Symbol.getType(params).asInstanceOf[Array[Object]]) + ", argtypes = " + ArrayApply.toString(argtypes.asInstanceOf[Array[Object]]) + ", restp = " + restp + ", pt = " + pt);//DEBUG
-
- val tvars: Array[Type] = freshVars(tparams);
- val formals: Array[Type] = formalTypes(params, argtypes.length);
- if (formals.length != argtypes.length) {
- if (needToSucceed)
- throw new NoInstance("parameter lists differ in length");
- return null;
- }
-
- // check first whether type variables can be fully defined from
- // expected result type.
- if (!isCompatible(restp.subst(tparams, tvars), pt, regularValue)) {
- if (needToSucceed)
- throw new NoInstance("result type " + restp +
- " is incompatible with expected type " + pt);
- return null;
- }
- { var i = 0; while (i < tvars.length) {
- val tvar: Type$TypeVar = tvars(i).asInstanceOf[Type$TypeVar];
- if (!isFullyDefined(tvar)) tvar.constr.inst = Type.NoType;
- i = i + 1
- }}
-
- // Then define remaining type variables from argument types.
- var i = 0;
- while (i < argtypes.length) {
- if (!isCompatible(argtypes(i).deconst()/*!!!*/.subst(tparams, tvars),
- formals(i).subst(tparams, tvars),
- regularValue)) {
- if (needToSucceed) {
- if (global.explaintypes) {
- Type.explainSwitch = true;
- argtypes(i).deconst()/*!!!*/.subst(tparams, tvars).isSubType(
- formals(i).subst(tparams, tvars));
- Type.explainSwitch = false;
- }
- throw new NoInstance(
- typeErrorMsg(
- "argument expression's type is not compatible with formal parameter type",
- argtypes(i).deconst()/*!!!*/.subst(tparams, tvars),
- formals(i).subst(tparams, tvars)));
- }
- return null;
- }
- i = i + 1;
- }
- { var i = 0; while (i < tvars.length) {
- solve(tparams, false, variance(tparams, formals), tvars, i);
- i = i + 1
- }}
- tvars
- }
-
- private def methTypeArgsSkipViews(
- tparams: Array[Symbol], params: Array[Symbol],
- argtypes: Array[Type], restpe: Type,
- pt: Type,
- needToSucceed: boolean, regularValue: boolean): Array[Type] = restpe match {
- case Type$MethodType(params1, restpe1) if isViewBounded(tparams) =>
- methTypeArgs(
- tparams, params1, argtypes, restpe1, pt, needToSucceed, regularValue);
- case _ =>
- methTypeArgs(
- tparams, params, argtypes, restpe, pt, needToSucceed, regularValue);
- }
-
- /** Create and attribute type application node. Pass arguments for that
- * `tparams' prefix which is owned by the tree's symbol. If there are remaining
- * type parameters, substitute corresponding type arguments for them in the
- * tree. Such remaining type parameters always come from an inferred PolyType.
- */
- def mkTypeApply(tree: Tree, tparams: Array[Symbol], restype: Type, targs: Array[Type]): Tree = {
- var tree1: Tree = tree;
- val sym: Symbol = tree.symbol();
- var i: int = 0;
- while (i < tparams.length && tparams(i).owner() == sym)
- i = i + 1;
- if (i < tparams.length) {
- //System.out.println("tpar " + tparams(i) + " of " + tparams(i).owner() + " <> " + sym);//DEBUG
- //new Printer().print(tree1);//DEBUG
- //System.out.println(ArrayApply.toString(targs) + "/" + i + "/" + ArrayApply.toString(tparams));//DEBUG
- val tparams1: Array[Symbol] = new Array[Symbol](tparams.length - i);
- System.arraycopy(tparams, i, tparams1, 0, tparams1.length);
- val targs1: Array[Type] = new Array[Type](tparams.length - i);
- System.arraycopy(targs, i, targs1, 0, targs1.length);
- tree1 = substituter.apply(tree1, tparams1, targs1);
- }
- if (0 < i) {
- val argtrees: Array[Tree] = new Array[Tree](i);
- { var j = 0; while (j < i) {
- argtrees(j) = gen.mkType(tree.pos, targs(j));
- j = j + 1
- }}
- completeTypeApply(
- make.TypeApply(tree.pos, tree1, argtrees)
- .setType(restype.subst(tparams, targs)))
- } else {
- tree1.setType(restype.subst(tparams, targs));
- }
- }
-
- /** Return the instantiated and normalized type of polymorphic expression
- * with type `[tparams]restype', given two prototypes `pt1', and `pt2'.
- * `pt1' is the strict first attempt prototype where type parameters
- * are left unchanged. `pt2' is the fall-back prototype where type parameters
- * are replaced by `AnyType's. We try to instantiate first to `pt1' and then,
- * if this fails, to `pt2'. If both attempts fail, a Type.Error is thrown.
- */
- def argumentTypeInstance(tparams: Array[Symbol], restype: Type, pt1: Type, pt2: Type): Type = {
- restype match {
- case Type$PolyType(tparams1, restype1) =>
- val tparams2: Array[Symbol] = new Array[Symbol](tparams.length + tparams1.length);
- System.arraycopy(tparams, 0, tparams2, 0, tparams.length);
- System.arraycopy(tparams1, 0, tparams2, tparams.length, tparams1.length);
- argumentTypeInstance(tparams2, restype1, pt1, pt2);
-
- case _ =>
- if (tparams.length != 0) {
- val skippedRestype = skipViewParams(tparams, restype);
- var targs: Array[Type] = exprTypeArgs(tparams, skippedRestype, pt1);
- if (targs == null)
- targs = exprTypeArgs(tparams, skippedRestype, pt2);
- if (targs == null)
- throw new Type$Error(
- typeErrorMsg(
- "polymorphic argument cannot be instantiated to formal parameter type",
- new Type$PolyType(tparams, restype), pt2));
- checkBounds(tparams, targs, "inferred ");
- restype.subst(tparams, targs);
- } else {
- normalize(restype);
- }
- }
- }
-
- /** Instantiate expression `tree' of polymorphic type [tparams]restype,
- * using prototype `pt'.
- */
- def exprInstance(tree: Tree, tparams: Array[Symbol], restype: Type, pt: Type): Tree = {
- restype match {
- case Type$PolyType(tparams1, restype1) =>
- val tparams2: Array[Symbol] = new Array[Symbol](tparams.length + tparams1.length);
- System.arraycopy(tparams, 0, tparams2, 0, tparams.length);
- System.arraycopy(tparams1, 0, tparams2, tparams.length, tparams1.length);
- exprInstance(tree, tparams2, restype1, pt)
- case _ =>
- val targs: Array[Type] =
- exprTypeArgs(tparams, skipViewParams(tparams, restype), pt);
- if (targs == null)
- throw new Type$Error(
- "polymorphic expression of type " + tree.getType() +
- " cannot be instantiated from expected type " + pt);
- checkBounds(tparams, targs, "inferred ");
- mkTypeApply(tree, tparams, restype, targs)
- }
- }
-
- /** Instantiate method `tree' of polymorphic type [tparams]restype,
- * so that resulting method type can be applied to arguments with
- * types `argtypes' and its result type is compatible with `pt'.
- */
- def methodInstance(tree: Tree, tparams: Array[Symbol], restype: Type, argtypes: Array[Type], pt: Type): Tree = {
- //System.out.println("methodinstance, tree = " + tree + ":" + tree.getType() + ", tparams = " + ArrayApply.toString(tparams.asInstanceOf[Array[Object]]) + ", restype = " + restype + ", argtypes = " + ArrayApply.toString(argtypes.asInstanceOf[Array[Object]]) + ", pt = " + pt);//DEBUG
- restype match {
- case Type$PolyType(tparams1, restype1) =>
- val tparams2: Array[Symbol] = new Array[Symbol](tparams.length + tparams1.length);
- System.arraycopy(tparams, 0, tparams2, 0, tparams.length);
- System.arraycopy(tparams1, 0, tparams2, tparams.length, tparams1.length);
- methodInstance(tree, tparams2, restype1, argtypes, pt)
-
- case Type$MethodType(params, restpe) =>
- var targs: Array[Type] = _;
- try {
- targs = methTypeArgsSkipViews(
- tparams, params, argtypes, restpe, pt, true, false);
- } catch {
- case ex: NoInstance =>
- throw new Type$Error(
- applyErrorMsg(
- "no type parameters for ", tree,
- " exist so that it can be applied to arguments ",
- Type.widen(argtypes), Type.AnyType) +
- "\n --- because ---\n" + ex.getMessage());
- }
- val uninstantiated: Array[Symbol] = normalizeArgs(targs, tparams, restype);
- checkBounds(tparams, targs, "inferred ");
- val restype1: Type =
- if (uninstantiated.length == 0) restype
- else new Type$MethodType(
- params, new Type$PolyType(uninstantiated, restpe));
- mkTypeApply(tree, tparams, restype1, targs);
- case _ =>
- tree
- }
- }
-
- /** Instantiate constructor `tree' of polymorphic type [tparams]restype',
- * so that its the result type of `restype' matches prototype `pt'.
- * If constructor is polymorphic, maximize all type variables under this
- * condition.
- */
- def constructorInstance(tree: Tree, tparams: Array[Symbol], restype: Type, pt: Type): unit = {
- restype match {
- case Type$PolyType(tparams1, restype1) =>
- val tparams2: Array[Symbol] = new Array[Symbol](tparams.length + tparams1.length);
- System.arraycopy(tparams, 0, tparams2, 0, tparams.length);
- System.arraycopy(tparams1, 0, tparams2, tparams.length, tparams1.length);
- constructorInstance(tree, tparams2, restype1, pt)
-
- case _ =>
- val tvars: Array[Type] = freshVars(tparams);
- val restype0: Type = skipViewParams(tparams, restype);
- val restype1: Type = restype0.subst(tparams, tvars);
- val ctpe1: Type = restype1.resultType();
- if (ctpe1.isSubType(pt)) {
- try {
- { var i = 0; while (i < tvars.length) {
- solve(tparams, true, variance(tparams, restype0.resultType()),
- tvars, i);
- i = i + 1
- }}
- checkBounds(tparams, tvars, "inferred ");
- tree.setType(restype0.subst(tparams, tvars));
- //System.out.println("inferred constructor type: " + tree.getType());//DEBUG
- } catch {
- case ex: NoInstance =>
- throw new Type$Error(
- "constructor of type " + ctpe1 +
- " can be instantiated in more than one way to expected type " +
- pt +
- "\n --- because ---\n" + ex.getMessage());
- }
- } else {
- throw new Type$Error(
- typeErrorMsg(
- "constructor cannot be instantiated to expected type",
- ctpe1, pt));
- }
- }
- }
-
-// Overload Resolution -------------------------------------------------------------
-
- /** Is function type `ftpe' applicable to `argtypes' and
- * does its result conform to `pt'?
- */
- def isApplicable(ftpe: Type, argtypes: Array[Type], pt: Type): boolean =
- isApplicable(ftpe, argtypes, pt, Names.EMPTY, true);
-
- def isApplicable(ftpe: Type, argtypes: Array[Type], pt: Type,
- fieldName: Name, regularValue: boolean): boolean = {
- //if (!regularValue) System.out.println("is app " + ftpe + " to " + ArrayApply.toString(argtypes.asInstanceOf[Array[Object]]));//DEBUG
- ftpe match {
- case Type$MethodType(params, restpe) =>
- // sequences ? List( a* )
- val formals: Array[Type] = formalTypes(params, argtypes.length);
- formals.length == argtypes.length &&
- isCompatible(argtypes, formals, regularValue) &&
- isCompatible(restpe, pt, regularValue) &&
- (fieldName == Names.EMPTY || restpe.lookup(fieldName).kind != NONE)
- case Type$PolyType(tparams, Type$MethodType(params, restpe)) =>
- var i = 0;
- while (i < argtypes.length && !argtypes(i).containsSome(tparams))
- i = i + 1;
- if (i < argtypes.length)
- isApplicable(freshInstance(ftpe), argtypes, pt, fieldName, regularValue);
- else
- try {
- val targs: Array[Type] = methTypeArgsSkipViews(
- tparams, params, argtypes, restpe, pt, false, regularValue);
- if (targs != null) {
- val uninstantiated: Array[Symbol] = normalizeArgs(targs, tparams, restpe);
- val restpe1 = skipViewParams(tparams, restpe);
- isWithinBounds(tparams, targs) &&
- exprTypeArgs(uninstantiated,
- restpe1.subst(tparams, targs), pt,
- regularValue) != null &&
- (fieldName == Names.EMPTY ||
- restpe1.subst(tparams, targs).lookup(fieldName).kind != NONE)
- } else {
- false
- }
- } catch {
- case ex: NoInstance => false
- }
- case Type.ErrorType =>
- true
- case _ =>
- if (!regularValue) {
- val ftpe1 = applyType(ftpe);
- ftpe1 != ftpe &&
- isApplicable(ftpe1, argtypes, pt, fieldName, false);
- } else false
- }}
-
- def applyType(tp: Type) =
- if (tp.isObjectType()) {
- val applyMeth: Symbol = tp.lookup(Names.apply);
- if (applyMeth != Symbol.NONE) tp.memberType(applyMeth)
- else tp
- } else tp;
-
- /** Does type `ftpe1' specialize type `ftpe2'
- * when both are alternatives in an overloaded function?
- */
- def specializes(ftpe1: Type, ftpe2: Type): boolean = ftpe1 match {
- case Type$MethodType(params, _) =>
- //System.out.println("does " + ftpe1 + " specialize " + ftpe2);//DEBUG
- val argtypes = Symbol.getType(params);
- // if both formal and actual have REPEATED flag set on corresponding parameters,
- // change actual to its element type.
- // this is a hack which should be corrected once REPEATED is part of a type.
- if (params.length > 0 && (params(params.length-1).flags & REPEATED) != 0) {
- val params2 = ftpe2.firstParams();
- if (params2.length == params.length && (params2(params2.length-1).flags & REPEATED) != 0) {
- argtypes(params.length-1) = argtypes(params.length-1)
- .baseType(definitions.SEQ_CLASS).typeArgs()(0);
- }
- }
- isApplicable(ftpe2, argtypes, Type.AnyType)
- case Type$PolyType(tparams, restype) =>
- skipViewParams(tparams, restype) match {
- case Type$MethodType(params, _) =>
- isApplicable(ftpe2, Symbol.getType(params), Type.AnyType);
- case _ =>
- false
- }
- case Type.ErrorType =>
- true
- case _ =>
- false
- }
-
- def specializesView(ftpe1: Type, ftpe2: Type): boolean =
- specializes(applyType(ftpe1), applyType(ftpe2));
-
- /** Assign `tree' the type of the alternative which matches
- * prototype `pt', if it exists.
- * If several alternatives match `pt', take unique parameterless one.
- * Throw a Type.Error if several such alternatives exist.
- * If no alternative matches, leave `tree' unchanged.
- */
- def exprAlternative(tree: Tree, alts: Array[Symbol], alttypes: Array[Type], pt: Type): unit = {
-
- def improves(tp1: Type, tp2: Type): boolean =
- tp2 == Type.ErrorType ||
- !normalize(tp2).isSubType(pt) && normalize(tp1).isSubType(pt) ||
- tp2.isParameterized() &&
- (!tp1.isParameterized() || specializes(tp1, tp2));
-
- // first, catch the case of a missing parameter
- // list for an overloaded constructor.
- if (alts.length > 0) {
- var i: int = 0;
- while (i < alts.length && alts(i).isConstructor() && alttypes(i).isInstanceOf[Type$MethodType])
- i = i + 1;
- if (i == alts.length)
- throw new Type$Error("missing arguments for " + alts(0));
- }
- // second, do the normal case.
- var best: int = -1;
- { var i = 0; while (i < alttypes.length) {
- if (isCompatible(alttypes(i), pt) && (best < 0 || improves(alttypes(i), alttypes(best)))) {
- best = i;
- }
- i = i + 1
- }}
- { var i = 0; while (i < alttypes.length) {
- if (isCompatible(alttypes(i), pt) && (best < 0 || improves(alttypes(i), alttypes(best)))) {
- best = i;
- }
- i = i + 1
- }}
- if (best >= 0) {
- { var i = 0; while (i < alttypes.length) {
- if (isCompatible(alttypes(i), pt) && best != i && !improves(alttypes(best), alttypes(i)) && pt != Type.ErrorType) {
- throw new Type$Error(
- overloadResolveErrorMsg(
- alts(best), alttypes(best), alts(i), alttypes(i)) +
- " expected type " + pt);
- }
- i = i + 1
- }}
- tree.setSymbol(alts(best)).setType(alttypes(best));
- }
- }
-
- /** Assign `tree' the type of an alternative
- * which is applicable to `argtypes', and whose result type is
- * a subtype of `pt' if it exists.
- * If several applicable alternatives exist, take the
- * most specialized one, or throw an error if no
- * most specialized applicable alternative exists.
- * If no alternative matches, leave `tree' unchanged,
- * try to select method with pt = AnyType.
- * If pt is AnyType, leave tree unchanged.
- */
- def methodAlternative(tree: Tree, alts: Array[Symbol], alttypes: Array[Type], argtypes: Array[Type], pt: Type): unit = {
- //System.out.println("meth alt " + ArrayApply.toString(argtypes.asInstanceOf[Array[Object]], "[", ",", "]") + pt);//debug
- if (alts.length == 1) {
- tree.setSymbol(alts(0)).setType(alttypes(0));
- return;
- }
- var best: int = -1;
- { var i = 0; while (i < alttypes.length) {
- if (isApplicable(alttypes(i), argtypes, pt) &&
- (best < 0 || specializes(alttypes(i), alttypes(best))))
- best = i;
- i = i + 1
- }}
- if (best >= 0) {
- { var i = 0; while (i < alttypes.length) {
- if (i != best &&
- isApplicable(alttypes(i), argtypes, pt) &&
- !(specializes(alttypes(best), alttypes(i)) &&
- !specializes(alttypes(i), alttypes(best))))
- throw new Type$Error(
- overloadResolveErrorMsg(
- alts(best), alttypes(best), alts(i), alttypes(i)) +
- " argument types " +
- ArrayApply.toString(argtypes.asInstanceOf[Array[Object]], "(", ",", ")") +
- (if (pt == Type.AnyType) "" else " and expected result type " + pt));
- i = i + 1
- }}
- tree.setSymbol(alts(best)).setType(alttypes(best));
- } else if (pt != Type.AnyType) {
- methodAlternative(tree, alts, alttypes, argtypes, Type.AnyType);
- }
- }
-
- /** Assign `tree' the type of unique polymorphic alternative with `nparams'
- * as the number of type parameters, if it exists.
- * Throw error if several such polymorphic alternatives exist.
- * If no alternative matches, leave `tree' unchanged.
- */
- def polyAlternative(tree: Tree, alts: Array[Symbol], alttypes: Array[Type], nparams: int): unit = {
- if (alts.length == 1) {
- tree.setSymbol(alts(0)).setType(alttypes(0));
- return;
- }
- var i: int = 0;
- while (i < alttypes.length &&
- !(alts(i).isValue() &&
- alttypes(i).typeParams().length == nparams))
- i = i + 1;
-
- if (i < alttypes.length) {
- { var j = i + 1; while (j < alttypes.length) {
- if (alts(j).isValue() &&
- alttypes(j).typeParams().length == nparams)
- throw new Type$Error(
- overloadResolveErrorMsg(alts(i), alttypes(i), alts(j), alttypes(j)) +
- " polymorphic function with " + nparams + " parameters");
- j = j + 1
- }}
- tree.setSymbol(alts(i)).setType(alttypes(i));
- }
- }
-
- /** return view which best matches argument type `tp' and has `name' as member.
- */
- def bestView(tp: Type, pt: Type, name: Name): View = {
- var best: View = null;
- var viewMeths = availableViews(tp);
- //System.out.println("best view for " + tp + "/" + pt + "/" + name + " in " + viewMeths);//DEBUG
- val argtypes = NewArray.Type(tp);
- while (!viewMeths.isEmpty) {
- if (isApplicable(viewMeths.head.symtype, argtypes, pt, name, false) &&
- (best == null || specializesView(viewMeths.head.symtype, best.symtype)))
- best = viewMeths.head;
- viewMeths = viewMeths.tail
- }
- if (best != null) {
- viewMeths = availableViews(tp);
- while (!viewMeths.isEmpty) {
- // Ugly hack necessary for MSIL delegate support
- // Used to be just:
- // if (viewMeths.head != best &&
- // isApplicable(viewMeths.head.symtype, argtypes, pt, name, false) &&
- // !(specializesView(best.symtype, viewMeths.head.symtype) &&
- // !specializesView(viewMeths.head.symtype, best.symtype))) {
- if ((if (global.target == scalac_Global.TARGET_MSIL)
- viewMeths.head.sym != best.sym
- else
- viewMeths.head != best) &&
- isApplicable(viewMeths.head.symtype, argtypes, pt, name, false) &&
- !(specializesView(best.symtype, viewMeths.head.symtype) &&
- !specializesView(viewMeths.head.symtype, best.symtype))) {
- throw new Type$Error(
- "ambiguous view,\n" +
- "both " + viewMeths.head.sym + ": " +
- viewMeths.head.symtype + viewMeths.head.sym.locationString() + "\n" +
- "and " + best.sym + ": " + best.symtype + best.sym.locationString() +
- (if (name == Names.EMPTY)
- "\nmap argument type " + tp.widen() + " to expected type " + pt
- else
- "\nadd member `" + name + "' to argument type " + tp.widen()))
- }
- viewMeths = viewMeths.tail;
- }
- }
- best
- }
-}
-}
-
diff --git a/sources/scala/tools/scalac/typechecker/RefCheck.scala b/sources/scala/tools/scalac/typechecker/RefCheck.scala
deleted file mode 100644
index 56109ebf07..0000000000
--- a/sources/scala/tools/scalac/typechecker/RefCheck.scala
+++ /dev/null
@@ -1,1224 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-
-import scala.collection.mutable.HashMap;
-import scalac._;
-import scalac.util._;
-import scalac.ast._;
-import scalac.symtab._;
-import Tree._;
-import scalac.{Global => scalac_Global}
-
-package scala.tools.scalac.typechecker {
-
-import scalac.util.NewArray;
-/*<export>*/
-/** Post-attribution checking and transformation.
- *
- * This phase performs the following checks.
- *
- * - All overrides conform to rules.
- * - All type arguments conform to bounds.
- * - All type variable uses conform to variance annotations.
- * - No forward reference to a term symbol extends beyond a value definition.
- *
- * It performs the following transformations.
- *
- * - Local modules are replaced by variables and classes
- * - caseArity, caseElement implementations added to case classes
- * - equals, and hashCode and toString methods are added to case classes,
- * unless they are defined in the class or a baseclass
- * different from java.lang.Object
- * - toString method is added to case objects,
- * 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
- */
-/*</export>*/
-class RefCheck(globl: scalac.Global) extends Transformer(globl) {
-
- import Modifiers._;
- import Kinds._;
-
- private val defs: Definitions = globl.definitions;
- private val infer: Infer = globl.newInfer();
-
- private var unit: CompilationUnit = _;
- private var enclClass: Symbol = _;
-
-// Forward reference checking ---------------------------------------------------
-
- private var levels: LevelInfo = _;
- private var symIndex = new HashMap[Symbol, int];
-
-// Main entry point --------------------------------------------------------------
-
- override def apply(unit: CompilationUnit): unit = {
- this.unit = unit;
- levels = null;
- unit.body = transformStats(unit.body);
- symIndex.clear;
- }
-
-// Override checking ------------------------------------------------------------
-
- private val HIBOUND = 0;
- private val LOBOUND = 1;
- private val VUBOUND = 2;
-
- private def isIncomplete(sym: Symbol): boolean =
- sym.isDeferred() ||
- sym.isAbstractOverride() &&
- isIncomplete(sym.overriddenSymbol(sym.owner().parents()(0)));
-
- /** 1. Check all members of class `clazz' for overriding conditions.
- * 2. Check that only abstract classes have deferred members*
- * 3. Check that every member with an `override' modifier
- * overrides a concrete member.
- */
- private def checkAllOverrides(pos: int, clazz: Symbol): unit = {
- val closure = clazz.closure();
- var i = 0; while (i < closure.length) {
- val basetype = closure(i);
- val baseclazz = basetype.symbol();
- val it = basetype.members().iterator();
- while (it.hasNext())
- checkOverride(pos, clazz, it.next());
- i = i + 1
- }
-
- val parents = clazz.info().parents();
- val it = clazz.members().iterator();
- while (it.hasNext()) {
- val sym = it.next();
- if ((sym.flags & OVERRIDE) != 0 && sym.owner() == clazz) {
- var i = parents.length - 1;
- while (i >= 0 && sym.overriddenSymbol(parents(i)).kind == NONE)
- i = i - 1;
- if (i < 0) {
- unit.error(sym.pos, sym.toString() + ":" + sym.getType() +
- sym.locationString() + " overrides nothing");
- sym.flags = sym.flags & ~OVERRIDE;
- } else if (sym.isAbstractOverride() && sym.overriddenSymbol(parents(0)).kind == NONE) {
- unit.error(sym.pos,
- sym.toString() + " does not override a superclass member in " +
- parents(0));
- }
- }
- }
- }
-
- private def checkOverride(pos: int, clazz: Symbol, other: Symbol): unit = {
-
- def abstractClassError(msg: String) = {
- if (clazz.isAnonymousClass() || clazz.isModuleClass())
- unit.error(clazz.pos, "object creation impossible, since " + msg);
- else
- unit.error(clazz.pos,
- clazz.toString() + " needs to be abstract, since " + msg);
- clazz.flags = clazz.flags | ABSTRACT;
- }
-
- if (other.kind == CLASS)
- return; // todo: see if we can sustain this
- var member = other;
- if ((other.flags & PRIVATE) == 0) {
- val member1 = clazz.info().lookup(other.name);
- if (member1.kind != NONE && member1.owner() != other.owner()) {
- if (member1.kind == VAL) {
- val self = clazz.thisType();
- val otherinfo = normalizedInfo(self, other);
- member1.info() match {
- case Type$OverloadedType(alts, _) =>
- var i = 0; while (i < alts.length) {
- if (normalizedInfo(self, alts(i)).overrides(otherinfo)) {
- if (member == other)
- member = alts(i);
- else
- unit.error(
- pos,
- "ambiguous override: both " +
- member + ":" + normalizedInfo(self, member) +
- "\n and " + alts(i) + ":" + normalizedInfo(self, alts(i)) +
- "\n override " + other + ":" + otherinfo +
- other.locationString());
- }
- i = i + 1
- }
-
- case _ =>
- if (normalizedInfo(self, member1).overrides(otherinfo))
- member = member1;
- }
- } else member = member1;
- }
- if (member != other) {
- member.flags = member.flags | ACCESSED;
- checkOverride(pos, clazz, member, other);
- }
- }
- if (clazz.kind == CLASS && (clazz.flags & ABSTRACT) == 0) {
- if ((member.flags & DEFERRED) != 0) {
- val parents = clazz.parents();
- var i = 0; while (i < parents.length) {
- val p = parents(i).symbol();
- if (p.isSubClass(member.owner()) && (p.flags & ABSTRACT) == 0)
- return; // everything was already checked elsewhere
- i = i + 1
- }
- abstractClassError(
- member.toString() + member.locationString() + " is not defined" +
- (if ((member.flags & MUTABLE) == 0) ""
- else "\n(Note that variables need to be initialized to be defined)"));
- } else if (member.isAbstractOverride()) {
- val superclazz: Type = clazz.parents()(0);
- val sup = member.overriddenSymbol(superclazz, clazz);
- if (clazz.kind == CLASS && (clazz.flags & ABSTRACT) == 0 && isIncomplete(sup))
- abstractClassError(
- member.toString() + member.locationString() +
- " is marked `abstract' and `override' and overrides an incomplete superclass member in " + superclazz);
- }
- }
- }
-
- /** Check that all conditions for overriding `other' by `member' are met.
- * That is for overriding member M and overridden member O:
- *
- * 1. M must have the same or stronger access privileges as O.
- * 2. O must not be final.
- * 3. O is deferred, or M has `override' modifier.
- * 4. O is not a class, nor a class constructor.
- * 5. If O is a type alias, then M is an alias of O.
- * 6. If O is an abstract type then
- * either M is an abstract type, and M's bounds are sharper than O's bounds.
- * or M is a type alias or class which conforms to O's bounds.
- * 7. If O and M are values, then M's type is a subtype of O's type.
- * 8. If O is an immutable value, then so is M.
- * 9. If O is a member of the static superclass of the class in which
- * M is defined, and O is labelled `abstract override', then
- * M must be labelled `abstract override'.
- */
- private def checkOverride(_pos: int, clazz: Symbol, member: Symbol, other: Symbol): unit = {
-
- var pos = _pos;
-
- def overrideError(msg: String): unit = {
- if (!other.getType().isError() && !member.getType().isError())
- unit.error(pos,
- "error overriding " + other + other.locationString() +
- ";\n " + member + member.locationString() + " " + msg);
- }
-
- //System.out.println(member + ":" + member.getType() + member.locationString() + " overrides " + other + ":" + other.getType() + other.locationString() + " in " + clazz);//DEBUG
-
- if (member.owner() == clazz) pos = member.pos;
- else {
- if (member.owner().isSubClass(other.owner()) &&
- (member.flags & DEFERRED) >= (other.flags & DEFERRED)) {
- //System.out.println(member + member.locationString() + " shadows1 " + other + other.locationString() + " in " + clazz);//DEBUG
- return; // everything was already checked elsewhere
- }
-
- val parents = clazz.parents();
- var memberShadowsOther = true;
- var i = 0;
- while (i < parents.length && memberShadowsOther) {
- val p = parents(i).symbol();
- val isSubMember = p.isSubClass(other.owner());
- val isSubOther = p.isSubClass(member.owner());
- if (isSubMember != isSubOther) {
- memberShadowsOther = false;
- } else if (isSubMember && isSubOther &&
- (member.flags & DEFERRED) >= (other.flags & DEFERRED)) {
- //System.out.println(member + member.locationString() + " shadows2 " + other + other.locationString() + " in " + clazz);//DEBUG
- return; // everything was already checked elsewhere
- }
- i = i + 1
- }
- if (memberShadowsOther) {
- //System.out.println(member + member.locationString() + " shadows " + other + other.locationString() + " in " + clazz);//DEBUG
- return; // everything was already checked elsewhere
- }
- }
-
- if ((member.flags & PRIVATE) != 0) {
- overrideError("has weaker access privileges; it should not be private");
- } else if ((member.flags & PROTECTED) != 0 && (other.flags & PROTECTED) == 0) {
- overrideError("has weaker access privileges; it should not be protected");
- } else if ((other.flags & FINAL) != 0) {
- overrideError("cannot override final member");
-/*
- } else if (other.kind == CLASS) {
- overrideError("cannot override a class");
-*/
- } else if ((other.flags & DEFERRED) == 0 && ((member.flags & OVERRIDE) == 0)) {
- overrideError("needs `override' modifier");
- } else if (other.isAbstractOverride() && !member.isAbstractOverride() && member.owner() == clazz && clazz.parents()(0).symbol().isSubClass(other.owner())) {
- overrideError("needs `abstract' and `override' modifiers");
- } else if (other.isStable() && !member.isStable()) {
- overrideError("needs to be an immutable value");
- } else if ((member.flags & DEFERRED) == 0 && (other.flags & DEFERRED) == 0 && member.owner() != clazz && !clazz.parents()(0).symbol().isSubClass(other.owner())) {
- unit.error(pos, "conflict between concrete members " +
- member + member.locationString() + " and " +
- other + other.locationString() +
- ":\n both are inherited from mixin classes; " +
- "\n an overriding definition in the current template is required");
- } else {
- val site: Type = clazz.thisType();
-
- def overrideTypeError(boundkind: int): unit = {
-
- def infoString(sym: Symbol, symtype: Type): String = sym.kind match {
- case Kinds.ALIAS => ", which equals " + symtype
- case Kinds.TYPE => " bounded" + (if (boundkind == LOBOUND) " from below" else "") + " by " + symtype
- case Kinds.VAL => " of type " + symtype
- case _ => ""
- }
-
- def oterror(memberInfo: Type, otherInfo: Type): unit = {
- unit.error(pos,
- member.toString() + member.locationString() +
- infoString(member, memberInfo) +
- "\n cannot override " + other + other.locationString() +
- infoString(other, otherInfo));
- Type.explainTypes(memberInfo, otherInfo);
- }
-
- if (!other.getType().isError() && !member.getType().isError()) {
- if (boundkind == LOBOUND) {
- oterror(site.memberLoBound(member), site.memberLoBound(other))
- } else if (boundkind == VUBOUND) {
- oterror(site.memberVuBound(member), site.memberVuBound(other));
- } else {
- oterror(normalizedInfo(site, member), normalizedInfo(site, other))
- }
- }
- }
-
- other.kind match {
- case ALIAS =>
- if (member.typeParams().length != 0)
- overrideError("may not be parameterized");
- if (other.typeParams().length != 0)
- overrideError("may not override parameterized type");
- if (!site.memberType(member).isSameAs(site.memberType(other)))
- overrideTypeError(HIBOUND);
-
- case TYPE =>
- if (member.typeParams().length != 0)
- overrideError("may not be parameterized");
- if (!site.memberInfo(member).isSubType(site.memberInfo(other)))
- overrideTypeError(HIBOUND);
- if (!site.memberLoBound(other).isSubType(site.memberLoBound(member)))
- overrideTypeError(LOBOUND);
- if (!site.memberVuBound(member).isSubType(site.memberVuBound(other)))
- overrideTypeError(VUBOUND);
-
- case _ =>
- if (other.isConstructor())
- overrideError("cannot override a class constructor");
- if (!normalizedInfo(site, member).isSubType(normalizedInfo(site, other)))
- overrideTypeError(HIBOUND);
- }
- }
- }
-
- private def normalizedInfo(site: Type, sym: Symbol): Type =
- site.memberInfo(sym).derefDef();
-
- /** compensate for renaming during addition of access functions
- */
- private def normalizeName(name: Name): String = {
- val string = name.toString();
- if (string.endsWith("$")) string.substring(0, string.length() - 1)
- else string;
- }
-
-// Basetype Checking --------------------------------------------------------
-
- /** 1. Check that only traits are inherited several times (except if the
- * inheriting instance is a compund type).
- * 2. Check that later type instances in the base-type sequence
- * of a class are subtypes of earlier type instances of the same trait.
- * 3. Check that case classes do not inherit from case classes.
- * 4. Check that at most one base type is a case-class.
- */
- private def validateBaseTypes(clazz: Symbol): unit = {
-
- val seen = new Array[Type](clazz.closure().length);
-
- def validateTypes(tps: Array[Type], caseSeen: Symbol, start: int): unit = {
- var i = tps.length - 1; while(i >= start) {
- validateType(tps(i).unalias(), caseSeen, if (i == 0) 0 else 1);
- i = i - 1
- }
- }
-
- def validateType(tp: Type, caseSeen: Symbol, start: int): unit = {
- var baseclazz = tp.symbol();
- if (baseclazz.kind == CLASS) {
- val index = clazz.closurePos(baseclazz);
- if (index < 0) return;
- if (seen(index) != null) {
- // check that only traits are inherited several times.
- if (!clazz.isCompoundSym() && !baseclazz.isTrait()) {
- unit.error(clazz.pos, "illegal inheritance;\n" + clazz +
- " inherits " + baseclazz + " twice");
- }
- // if there are two different type instances of same class
- // check that second is a subtype of first.
- if (!seen(index).isSubType(tp)) {
- val msg =
- if (clazz.isCompoundSym()) "illegal combination;\n compound type combines"
- else "illegal inheritance;\n " + clazz + " inherits";
- unit.error(clazz.pos, msg + " different type instances of " +
- baseclazz + ":\n" + tp + " and " + seen(index));
- }
- }
- // check that case classes do not inherit from case classes
- var caseSeen1 =
- if (baseclazz.isCaseClass()) {
- if (caseSeen.isCaseClass())
- unit.error(
- clazz.pos, "illegal combination of case " +
- caseSeen + " and case " + baseclazz + " in one object");
- baseclazz
- } else caseSeen;
-
- seen(index) = tp;
- validateTypes(tp.parents(), caseSeen1, start);
- }
- }
-
- validateTypes(clazz.getType().parents(), clazz, 0);
- }
-
-// Variance Checking --------------------------------------------------------
-
- private val ContraVariance = -1;
- private val NoVariance = 0;
- private val CoVariance = 1;
- private val AnyVariance = 2;
-
- private def varianceString(variance: int): String =
- if (variance == 1) "covariant"
- else if (variance == -1) "contravariant"
- else "invariant";
-
- /** The variance of symbol `base' relative to the class which defines `tvar'.
- */
- private def flip(base: Symbol, tvar: Symbol): int = {
- val clazz = tvar.owner().constructorClass();
- var sym = base;
- var flip = CoVariance;
- while (sym != clazz && flip != AnyVariance) {
- //System.out.println("flip: " + sym + " " + sym.isParameter());//DEBUG
- if (sym.isParameter()) flip = -flip;
- else if (sym.owner().kind != CLASS) flip = AnyVariance;
- else if (sym.kind == ALIAS) flip = NoVariance;
- sym = sym.owner();
- }
- flip
- }
-
- /** Check variance of type variables in this type
- */
- private def validateVariance(base: Symbol, all: Type, variance: int): unit = {
-
- def validateVariance(tp: Type, variance: int): unit = tp match {
- case Type.ErrorType | Type.AnyType | Type.NoType | Type.NoPrefix | Type$ThisType(_) | Type$ConstantType(_, _) =>
-
- case Type$SingleType(pre, sym) =>
- validateVariance(pre, variance)
-
- case Type$TypeRef(pre, sym, args) =>
- if (sym.variance() != 0) {
- val f = flip(base, sym);
- if (f != AnyVariance && sym.variance() != f * variance) {
- //System.out.println("flip(" + base + "," + sym + ") = " + f);//DEBUG
- unit.error(base.pos,
- varianceString(sym.variance()) + " " + sym +
- " occurs in " + varianceString(f * variance) +
- " position in type " + all + " of " + base);
- }
- }
- validateVariance(pre, variance);
- validateVarianceArgs(args, variance, sym.typeParams());
-
- case Type$CompoundType(parts, members) =>
- validateVariances(parts, variance);
-
- case Type$MethodType(vparams, result) =>
- validateVariance(result, variance);
-
- case Type$PolyType(tparams, result) =>
- validateVariance(result, variance);
-
- case Type$OverloadedType(alts, alttypes) =>
- validateVariances(alttypes, variance);
-
- case _ => throw new ApplicationError("unexpected type: " + tp);
- }
-
- def validateVariances(tps: Array[Type], variance: int): unit = {
- var i = 0; while (i < tps.length) {
- validateVariance(tps(i), variance);
- i = i + 1
- }
- }
-
- def validateVarianceArgs(tps: Array[Type], variance: int, tparams: Array[Symbol]): unit = {
- var i = 0; while (i < tps.length) {
- validateVariance(tps(i), variance * tparams(i).variance());
- i = i + 1
- }
- }
-
- validateVariance(all, variance)
- }
-
-
-// Forward reference checking ---------------------------------------------------
-
- case class LevelInfo(outer: LevelInfo) {
- val scope: Scope = if (outer == null) new Scope() else new Scope(outer.scope);
- var maxindex: int = Integer.MIN_VALUE;
- var refpos: int = _;
- var refsym: Symbol = _;
- }
-
- private def pushLevel(): unit =
- levels = new LevelInfo(levels);
-
- private def popLevel(): unit =
- levels = levels.outer;
-
- private def enterSyms(stats: Array[Tree]): unit = {
-
- def enterSym(stat: Tree, index: int): unit = {
-
- def enterSym(sym: Symbol): unit =
- if (sym.isLocal()) {
- levels.scope.enter(new Scope.Entry(sym, levels.scope));
- symIndex.update(sym, index);
- }
-
- stat match {
- case Tree$ClassDef(_, _, _, _, _, _) =>
- enterSym(stat.symbol().primaryConstructor())
-
- case DefDef(_, _, _, _, _, _) | ModuleDef(_, _, _, _) | ValDef(_, _, _, _) =>
- enterSym(stat.symbol())
-
- case _ =>
- }
- }
-
- var i = 0; while (i < stats.length) {
- enterSym(stats(i), i);
- i = i + 1
- }
- }
-
-// Module eliminiation -----------------------------------------------------------
-
- private def transformModule(tree: Tree, mods: int, name: Name, tpe: Tree, templ: Tree.Template): Array[Tree] = {
- val sym = tree.symbol();
- val cdef = gen.ClassDef(sym.moduleClass(), templ);
- if (sym.isStatic()) return NewArray.Tree{cdef};
- val alloc =
- gen.New(
- gen.mkApply__(
- gen.mkPrimaryConstructorLocalRef(tree.pos, sym.moduleClass())));
-
- // var m$: T = null;
- val varname = Name.fromString(name.toString() + "$");
- val mvar = sym.owner().newFieldOrVariable(
- tree.pos, PRIVATE | MUTABLE | SYNTHETIC, varname)
- .setInfo(sym.getType());
- if (sym.owner().isClassType())
- sym.owner().members().enterOrOverload(mvar);
- val vdef = gen.ValDef(mvar, gen.mkNullLit(tree.pos));
-
- // { if (null == m$) m$ = new m$class; m$ }
- val eqMethod: Symbol = getUnaryMemberMethod(
- sym.getType(), Names.EQEQ, defs.ANY_TYPE());
- val body: Tree =
- gen.mkBlock(
- gen.If(
- gen.Apply(
- gen.Select(gen.mkNullLit(tree.pos), eqMethod),
- NewArray.Tree{gen.mkLocalRef(tree.pos, mvar)}),
- gen.Assign(gen.mkLocalRef(tree.pos, mvar), alloc),
- gen.mkUnitLit(tree.pos)),
- gen.mkLocalRef(tree.pos, mvar));
-
- // def m: T = { if (m$ == null(T)) m$ = new m$class; m$ }
- sym.flags = sym.flags | STABLE;
- val ddef: Tree = gen.DefDef(sym, body);
-
- // def m_eq(m: T): Unit = { m$ = m }
- val m_eqname = Name.fromString(name.toString() + Names._EQ);
- val m_eq: Symbol = sym.owner().newMethodOrFunction(
- tree.pos, PRIVATE | SYNTHETIC, m_eqname);
- val m_eqarg: Symbol = m_eq.newVParam(tree.pos, SYNTHETIC, name, sym.getType());
- m_eq.setInfo(
- Type.MethodType(NewArray.Symbol{m_eqarg}, defs.void_TYPE()));
- val m_eqdef: Tree = gen.DefDef(
- m_eq,
- gen.Assign(gen.mkLocalRef(tree.pos, mvar), gen.Ident(tree.pos, m_eqarg)));
- if (sym.owner().isClassType())
- sym.owner().members().enterOrOverload(m_eq);
-
- NewArray.Tree(cdef, vdef, ddef, m_eqdef)
- }
-
-// Adding case methods --------------------------------------------------------------
-
- private def hasImplementation(clazz: Symbol, name: Name): boolean = {
- val sym = clazz.info().lookupNonPrivate(name);
- sym.kind == VAL &&
- (sym.owner() == clazz ||
- !defs.OBJECT_CLASS.isSubClass(sym.owner()) &&
- (sym.flags & DEFERRED) == 0);
- }
-
- private def getMember(site: Type, name: Name): Symbol = {
- val sym = site.lookupNonPrivate(name);
- if (sym.kind != VAL)
- throw new ApplicationError("getMember failed for " + Debug.show(sym) + "; " + Debug.show(site) + "::" + name);
- sym
- }
-
- private def getMethod(site: Type, name: Name, p: Type => boolean): Symbol = {
- val sym = getMember(site, name);
- sym.getType() match {
- case Type$OverloadedType(alts, alttypes) =>
- var i = 0; while (i < alts.length) {
- if (p(alttypes(i))) return alts(i);
- i = i + 1
- }
- case _ =>
- }
- if (p(sym.getType())) return sym;
- throw new ApplicationError(
- " no method " + name + " of required kind among " + sym.getType() + " at " + site);
- }
-
- private def getNullaryMemberMethod(site: Type, name: Name): Symbol =
- getMethod(site, name,
- tp => tp.paramSectionCount() == 1 && tp.firstParams().length == 0);
-
-/*
- private def getUnaryMemberMethod(site: Type, name: Name, paramtype: Type): Symbol =
- getMethod(site, name,
- tp => { val params = tp.firstParams();
- params.length == 1 && paramtype.isSubType(params(0).getType()) });
-*/
-
- private def getUnaryMemberMethod(site: Type, name: Name, paramtype: Type): Symbol = {
- val sym = getMember(site, name);
- sym.getType() match {
- case Type$OverloadedType(alts, alttypes) => {
- var member: Symbol = null;
- var memberparamtype: Type = null;
- var i = 0; while (i < alts.length) {
- val params = alttypes(i).firstParams();
- if (params.length == 1) {
- val altparamtype = params(0).getType();
- if (paramtype.isSubType(altparamtype)) {
- if (member == null || altparamtype.isSubType(memberparamtype)) {
- member = alts(i);
- memberparamtype = altparamtype;
- }
- }
- }
- i = i + 1
- }
- if (member != null) return member;
- }
- case _ =>
- val params = sym.getType().firstParams();
- if (params.length == 1 && paramtype.isSubType(params(0).getType())) return sym;
- }
- System.out.println(paramtype.widen());//debug
- throw new ApplicationError(
- " no method " + name + " of required kind among " + sym.getType() + " at " + site.widen());
- }
-
-
- private def caseFields(clazz: ClassSymbol): Array[Tree] = {
- var ct = clazz.primaryConstructor().getType();
- ct match {
- case Type$PolyType(tparams, restp) =>
- ct = infer.skipViewParams(tparams, restp);
- case _ =>
- }
- val vparams: Array[Symbol] = ct.firstParams();
- val fields: Array[Tree] = new Array[Tree](vparams.length);
- var i = 0; while (i < fields.length) {
- fields(i) = gen.mkRef(clazz.pos, clazz.thisType(), clazz.caseFieldAccessor(i));
- i = i + 1
- }
- fields
- }
-
- private def toStringMethod(clazz: ClassSymbol): Tree = {
- val toStringSym = clazz.newMethod(
- clazz.pos, OVERRIDE, Names.toString)
- .setInfo(defs.ANY_TOSTRING.getType());
- clazz.info().members().enter(toStringSym);
- val fields: Array[Tree] = caseFields(clazz);
- var body: Tree = null;
- if (fields.length == 0) {
- body = gen.mkStringLit(
- clazz.pos, NameTransformer.decode(clazz.name));
- } else {
- body = gen.mkStringLit(
- clazz.pos, NameTransformer.decode(clazz.name) + "(");
- var i = 0; while (i < fields.length) {
- val str = if (i == fields.length - 1) ")" else ",";
- body = gen.Apply(
- gen.Select(body, defs.STRING_PLUS), NewArray.Tree(fields(i)));
- body = gen.Apply(
- gen.Select(body, defs.STRING_PLUS), NewArray.Tree(gen.mkStringLit(clazz.pos, str)));
- i = i + 1
- }
- }
- gen.DefDef(toStringSym, body)
- }
-
- private def caseElementMethod(clazz: ClassSymbol): Tree = {
- val method =
- clazz.newMethod(clazz.pos, FINAL | OVERRIDE, Names.caseElement);
- val seParam =
- method.newVParam(clazz.pos, 0, Names.n, defs.int_TYPE());
- method.setInfo(
- Type.MethodType(NewArray.Symbol(seParam), defs.ANY_TYPE()));
- clazz.info().members().enter(method);
- val fields: Array[Tree] = caseFields(clazz);
- var body: Tree = null;
- if (fields.length > 0) { // switch< n >
- val tags: Array[int] = new Array[int](fields.length);
- var i = 0; while (i < fields.length) { tags(i) = i; i = i + 1 }
- body = gen.Switch(
- gen.mkLocalRef(clazz.pos, seParam),
- tags,
- fields,
- gen.mkNullLit(clazz.pos),
- defs.ANY_TYPE());
- } else
- body = gen.mkNullLit(clazz.pos);
- gen.DefDef(method, body)
- }
-
- private def caseArityMethod(clazz: ClassSymbol): Tree = {
- val method =
- clazz.newMethod(clazz.pos, FINAL | OVERRIDE, Names.caseArity);
- method.setInfo(
- Type.PolyType(Symbol.EMPTY_ARRAY, defs.int_TYPE()));
- clazz.info().members().enter(method);
- val fields: Array[Tree] = caseFields(clazz);
- gen.DefDef(method, gen.mkIntLit(clazz.pos, fields.length))
- }
-
- private def readResolveMethod(clazz: ClassSymbol): Tree = {
- // !!! the synthetic method "readResolve" should be private,
- // but then it is renamed !!!
- val method =
- clazz.newMethod(clazz.pos, PROTECTED | SYNTHETIC, Names.readResolve);
- method.setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, defs.OBJECT_TYPE()));
- clazz.info().members().enter(method);
- gen.DefDef(method, gen.mkLocalRef(clazz.pos, clazz.sourceModule()))
- }
-
- private def equalsMethod(clazz: ClassSymbol): Tree = {
- val equalsSym = clazz.newMethod(clazz.pos, OVERRIDE, Names.equals);
- val equalsParam = equalsSym.newVParam(
- clazz.pos, 0, Names.that, defs.ANY_TYPE());
- equalsSym.setInfo(
- Type.MethodType(NewArray.Symbol(equalsParam), defs.boolean_TYPE()));
- clazz.info().members().enter(equalsSym);
- val fields = caseFields(clazz);
- var testtp = clazz.getType();
- {
- val tparams = clazz.typeParams();
- if (tparams.length != 0) {
- val targs = new Array[Type](tparams.length);
- var i = 0; while (i < targs.length) {
- targs(i) = defs.ANY_TYPE();
- i = i + 1
- }
- testtp = testtp.subst(tparams, targs);
- }
- }
-
- // if (that is C) {...}
- val cond = gen.TypeApply(
- gen.Select(gen.mkLocalRef(clazz.pos, equalsParam), defs.ANY_IS),
- NewArray.Tree(gen.mkType(clazz.pos, testtp)));
-
- val thenpart =
- if (fields.length == 0) {
- gen.mkBooleanLit(clazz.pos, true)
- } else {
- // val that1 = that.asInstanceOf[C];
- val cast =
- gen.TypeApply(
- gen.Select(
- gen.mkLocalRef(clazz.pos, equalsParam),
- defs.ANY_AS_ERASED),
- NewArray.Tree(gen.mkType(clazz.pos, testtp)));
- val that1sym = equalsSym.newVariable(clazz.pos, 0, Names.that1)
- .setType(testtp);
- val that1def = gen.ValDef(that1sym, cast);
-
- def eqOp(l: Tree, r: Tree): Tree = {
- val eqMethod = getUnaryMemberMethod(l.getType(), Names.EQEQ, r.getType());
- gen.Apply(gen.Select(l, eqMethod), NewArray.Tree(r))
- }
-
- def qualCaseField(qual: Tree, i: int): Tree =
- gen.Select(qual, clazz.caseFieldAccessor(i));
-
- // this.elem_1 == that1.elem_1 && ... && this.elem_n == that1.elem_n
- var cmp: Tree =
- eqOp(
- fields(0),
- qualCaseField(gen.mkLocalRef(clazz.pos, that1sym), 0));
- var i = 1; while (i < fields.length) {
- cmp =
- gen.Apply(
- gen.Select(cmp, defs.BOOLEAN_AND()),
- NewArray.Tree(
- eqOp(
- fields(i),
- qualCaseField(gen.mkLocalRef(clazz.pos, that1sym), i))));
- i = i + 1
- }
- gen.mkBlock(that1def, cmp)
- }
-
- val body = gen.If(cond, thenpart, gen.mkBooleanLit(clazz.pos, false));
-
- gen.DefDef(equalsSym, body)
- }
-
- private def getTypeMethod(clazz: ClassSymbol): Tree = {
- val flags =
- SYNTHETIC
- | (if (clazz.isSubClass(defs.SCALAOBJECT_CLASS)) OVERRIDE else 0);
- val getTypeSym = clazz
- .newMethod(clazz.pos, flags, Names.getScalaType)
- .setInfo(Type.MethodType(Symbol.EMPTY_ARRAY,
- defs.SCALACLASSTYPE_TYPE()));
- clazz.info().members().enter(getTypeSym);
- // Use "null" for the RHS for now, this will get fixed by
- // TypesAsValuePhase.
- gen.DefDef(getTypeSym, gen.mkNullLit(clazz.pos));
- }
-
- private def hashCodeMethod(clazz: ClassSymbol): Tree = {
- val hashCodeSym = clazz.newMethod(clazz.pos, OVERRIDE, Names.hashCode)
- .setInfo(defs.ANY_HASHCODE.getType());
- clazz.info().members().enter(hashCodeSym);
- val fields: Array[Tree] = caseFields(clazz);
- val name: Name = if (globl.target == scalac_Global.TARGET_MSIL) Names.GetType
- else Names.getClass;
- val getClassMethod = getNullaryMemberMethod(clazz.getType(), name);
- val addMethod = getUnaryMemberMethod(defs.int_TYPE(), Names.ADD, defs.int_TYPE());
- val mulMethod = getUnaryMemberMethod(defs.int_TYPE(), Names.MUL, defs.int_TYPE());
- var body: Tree =
- gen.Apply(
- gen.Select(
- gen.Apply(
- gen.mkRef(clazz.pos, clazz.thisType(), getClassMethod),
- Tree.EMPTY_ARRAY),
- getNullaryMemberMethod(getClassMethod.getType().resultType(), Names.hashCode)),
- Tree.EMPTY_ARRAY);
- var i = 0; while (i < fields.length) {
- val operand: Tree =
- gen.Apply(
- gen.Select(
- fields(i),
- getNullaryMemberMethod(fields(i).getType(), Names.hashCode)),
- Tree.EMPTY_ARRAY);
- body =
- gen.Apply(
- gen.Select(
- gen.Apply(
- gen.Select(body, mulMethod),
- NewArray.Tree(gen.mkIntLit(clazz.pos, 41))),
- addMethod),
- NewArray.Tree(operand));
- i = i + 1
- }
- gen.DefDef(hashCodeSym, body)
- }
-
- private def isTrueSubClassOfCaseClass(clazz: Symbol): boolean = {
- val cl = clazz.closure();
- var i = 1; while (i < cl.length) {
- if (cl(i).symbol().isCaseClass() && !cl(i).symbol().isJava()) return true;
- i = i + 1
- }
- false
- }
-
- private def addSyntheticMethods(templ: Template, clazz: ClassSymbol): Template = {
- val ts = new TreeList();
- if (clazz.isCaseClass()) {
- global.addAttribute(clazz, defs.SCALA_SERIALIZABLE_CONSTR);
- if (!hasImplementation(clazz, Names.toString)) {
- ts.append(toStringMethod(clazz));
- }
- if (!clazz.isModuleClass()) {
- if (!hasImplementation(clazz, Names.equals))
- ts.append(equalsMethod(clazz));
- if (!hasImplementation(clazz, Names.hashCode))
- ts.append(hashCodeMethod(clazz));
- }
-
- // the following report error if impl exists
- ts.append(caseElementMethod(clazz));
- ts.append(caseArityMethod(clazz));
- ts.append(gen.mkTagMethod(clazz));
- if (global.target != Global.TARGET_MSIL)
- ts.append(getTypeMethod(clazz));
- } else if ((clazz.flags & ABSTRACT) == 0) {
- if (!isTrueSubClassOfCaseClass(clazz)) {
- ts.append(gen.mkTagMethod(clazz));
- }
- if (global.target != Global.TARGET_MSIL)
- ts.append(getTypeMethod(clazz));
- }
- if (clazz.isModuleClass()) {
- val serializable =
- global.getAttrArguments(clazz, defs.SCALA_SERIALIZABLE_CONSTR) != null;
- if (serializable) {
- // If you serialize a singleton and then deserialize it twice,
- // you will have two instances of your singleton, unless you implement
- // the readResolve() method (see http://www.javaworld.com/javaworld/
- // jw-04-2003/jw-0425-designpatterns_p.html)
- ts.append(readResolveMethod(clazz));
- }
- }
- copy.Template(
- templ, templ.parents,
- if (ts.length() > 0) {
- val body1 = new Array[Tree](templ.body.length + ts.length());
- System.arraycopy(templ.body, 0, body1, 0, templ.body.length);
- ts.copyTo(body1, templ.body.length);
- body1
- } else templ.body);
- }
-
-// Convert case factory calls to constructor calls ---------------------------
-
- /** Tree represents an application of a constructor method of a case class
- * (whose name is a term name). Convert this tree to application of
- * the case classe's primary constructor `constr'.
- */
- private def toConstructor(tree: Tree, constr: Symbol): Tree = {
-
- def applyNesting(tree: Tree): int = tree match {
- case Apply(fn, _) => applyNesting(fn) + 1
- case _ => 0
- }
-
- val missing: int = constr.getType().paramSectionCount() - applyNesting(tree);
- assert(missing >= 0 && missing <= 1);
-
- def addEmptyParams(tp: Type): Type = tp match {
- case Type$MethodType(vparams, restp) =>
- Type.MethodType(vparams, addEmptyParams(restp))
- case Type$PolyType(tparams, restp) =>
- Type.PolyType(tparams, addEmptyParams(restp))
- case _ =>
- Type.MethodType(Symbol.EMPTY_ARRAY, tp)
- }
-
- def toConstructor1(tree: Tree): Tree = {
- val tree1 = toConstructor2(tree);
- if (missing > 0)
- tree1.duplicate().setType(addEmptyParams(tree1.getType()))
- else tree1
- }
-
- def toConstructor2(tree: Tree): Tree = tree match {
- case Tree$Apply(fn, args) =>
- copy.Apply(tree, toConstructor1(fn), args)
- case Tree$TypeApply(fn, args) =>
- copy.TypeApply(tree, toConstructor1(fn), args)
- case Tree$Ident(_) =>
- copy.Ident(tree, constr)
- case Tree$Select(qual, _) =>
- copy.Select(tree, constr, qual)
- }
-
- val tree1 = toConstructor1(tree);
- if (missing > 0) gen.Apply(tree1, Tree.EMPTY_ARRAY) else tree1
- }
- //where
-
-// Bounds checking -----------------------------------------------------------
-
- private def checkBounds(pos: int, tparams: Array[Symbol], argtypes: Array[Type]): unit =
- if (tparams.length == argtypes.length) {
- try {
- infer.checkBounds(tparams, argtypes, "");
- } catch {
- case ex: Type.Error => unit.error(pos, ex.msg);
- }
- }
-
-// Tree node simplification---------------------------------------------------
-
- private def elimTypeNode(tree: Tree): Tree = {
- def checkLegal(tp: Type): unit = tp match {
- case Type.TypeRef(pre, sym, args) =>
- sym.kind match {
- case ALIAS | TYPE =>
- checkLegal(sym.info().asSeenFrom(pre, sym.owner()));
- case CLASS =>
- if (sym == defs.ANY_CLASS)
- unit.error(tree.pos, "Array[Any] not supported");
- else if (sym == defs.ANYVAL_CLASS)
- unit.error(tree.pos, "Array[AnyVal] not supported");
- case _ =>
- }
- case _ =>
- }
- if (tree.isType()) {
- val resultType = tree.getType().deconst();
- val resultArgs = resultType.typeArgs();
- if (resultType.symbol() == defs.ARRAY_CLASS && resultArgs.length == 1 && global.runTimeTypes) {
- checkLegal(resultArgs(0))
- }
- gen.mkType(tree.pos, resultType);
- } else tree
- }
-
-// Transformation ------------------------------------------------------------
-
- def transformStats(stats: Array[Tree]): Array[Tree] = {
- pushLevel();
- enterSyms(stats);
- var stats1 = stats;
- var i = 0;
- while (i < stats1.length) {
- transformStat(stats1(i), i) match {
- case newstat: Tree =>
- stats1(i) = newstat;
- i = i + 1;
- case newstats: Array[Tree] =>
- val stats2 = new Array[Tree](stats1.length - 1 + newstats.length);
- System.arraycopy(stats1, 0, stats2, 0, i);
- System.arraycopy(newstats, 0, stats2, i, newstats.length);
- System.arraycopy(stats1, i + 1, stats2, i + newstats.length,
- stats1.length - i - 1);
- stats1 = stats2;
- i = i + newstats.length;
- }
- }
- popLevel();
- stats1
- }
-
- def transformStat(tree: Tree, index: int): Any = tree match {
- case Tree$ModuleDef(mods, name, tpe, templ) =>
- transform(transformModule(tree, mods, name, tpe, templ))
-
- case Tree$ValDef(mods, name, tpe, rhs) =>
- val sym = tree.symbol();
- validateVariance(
- sym, sym.getType(),
- if ((sym.flags & MUTABLE) != 0) NoVariance else CoVariance);
- val tree1 = transform(tree);
- //todo: handle variables
- if (sym.isLocal() && !sym.isModule() && index <= levels.maxindex) {
- if (globl.debug)
- System.out.println(levels.refsym.toString() + ":" + levels.refsym.getType());
- val kind = if ((sym.flags & MUTABLE) != 0) "variable" else "value";
- unit.error(
- levels.refpos,
- "forward reference extends over definition of " + kind + " " +
- normalizeName(name));
- }
- tree1
-
- case _ =>
- transform(tree)
- }
-
- override def transform(tree: Tree): Tree = try {
- val sym = tree.symbol();
- tree match {
- case Tree.Empty =>
- tree
-
- case Tree$ClassDef(_, _, tparams, vparams, tpe, templ) =>
- val enclClassPrev = enclClass;
- enclClass = sym;
- validateVariance(sym, sym.info(), CoVariance);
- validateVariance(sym, sym.typeOfThis(), CoVariance);
- val tree1 = super.transform(
- copy.ClassDef(
- tree, tree.symbol(), tparams, vparams, tpe,
- addSyntheticMethods(
- templ, tree.symbol().asInstanceOf[ClassSymbol])));
- enclClass = enclClassPrev;
- tree1
-
- case Tree$DefDef(_, _, _, _, _, _) =>
- validateVariance(sym, sym.getType(), CoVariance);
- super.transform(tree)
-
- case Tree$ValDef(_, _, _, _) =>
- validateVariance(
- sym, sym.getType(),
- if ((sym.flags & MUTABLE) != 0) NoVariance else CoVariance);
- super.transform(tree)
-
- case Tree$AbsTypeDef(_, _, _, _) =>
- validateVariance(sym, sym.info(), CoVariance);
- validateVariance(sym, sym.loBound(), ContraVariance);
- validateVariance(sym, sym.vuBound(), CoVariance);
- super.transform(tree)
-
- case Tree$AliasTypeDef(_, _, _, _) =>
- validateVariance(sym, sym.info(), CoVariance);
- super.transform(tree)
-
- case Tree$Template(bases, body) =>
- val bases1 = transform(bases);
- val body1 = transformStats(body);
- if (sym.kind == VAL) {
- val owner = tree.symbol().owner();
- validateBaseTypes(owner);
- checkAllOverrides(tree.pos, owner);
- }
- copy.Template(tree, bases1, body1)
-
- case Tree$Block(stats, value) =>
- val stats1 = transformStats(stats);
- val value1 = transform(value);
- copy.Block(tree, stats1, value1)
-
- case Tree$This(_) =>
- tree
-
- case Tree$PackageDef(pkg, packaged) =>
- copy.PackageDef(tree, pkg, super.transform(packaged))
-
- case Tree$TypeApply(fn, args) =>
- fn.getType() match {
- case Type$PolyType(tparams, _) =>
- checkBounds(tree.pos, tparams, Tree.typeOf(args));
- case _ =>
- }
- super.transform(tree)
-
- /*
- // oops, might not work because of forward value references(test?)
- // optimized, buraq 2005-02-21 [RefCheck is identity on patterns]
- case Tree.CaseDef(pat, guard, body)=>
- copy.CaseDef(tree, pat, transform(guard), transform(body));
- */
- case Tree$Apply(fn, args) =>
- // convert case methods to new's
- val fsym = TreeInfo.methSymbol(fn);
- assert(fsym != Symbol.NONE, tree);
- if (fsym != null && fsym.isMethod() && !fsym.isConstructor() && (fsym.flags & CASE) != 0) {
- val constr = fsym.getType().resultType().symbol().primaryConstructor();
- super.transform(gen.New(toConstructor(tree, constr)))
- } else
- super.transform(tree);
-
- case Tree$AppliedType(tpe, args) =>
- val tparams = tpe.getType().symbol().typeParams();
- checkBounds(tree.pos, tparams, Tree.typeOf(args));
- elimTypeNode(super.transform(tree))
-
- case Tree$CompoundType(_, _) =>
- val clazz = tree.getType().symbol();
- validateBaseTypes(clazz);
- checkAllOverrides(tree.pos, clazz);
- elimTypeNode(super.transform(tree))
-
- case Tree$Ident(name) =>
- if (name == TypeNames.WILDCARD_STAR)
- tree
- else if( sym == defs.PATTERN_WILDCARD )
- elimTypeNode(tree)
- else {
- //System.out.println("name: "+name);
- val e = levels.scope.lookupEntry(name);
- //System.out.println("sym: "+sym);
- if (sym.isLocal() && sym == e.sym) {
- var l = levels;
- while (l.scope != e.owner) l = l.outer;
- val symindex = symIndex(tree.symbol());
- if (l.maxindex < symindex) {
- l.refpos = tree.pos;
- l.refsym = e.sym;
- l.maxindex = symindex;
- }
- }
- sym.flags = sym.flags | ACCESSED;
- elimTypeNode(tree)
- }
-
- case Tree$Select(qual, name) =>
- sym.flags = sym.flags | ACCESSED;
- if (!TreeInfo.isSelf(qual, enclClass))
- sym.flags = sym.flags | SELECTOR;
- if ((sym.flags & DEFERRED) != 0) {
- qual match {
- case Tree$Super(qualifier, mixin) =>
- val sym1 = enclClass.thisSym().info().lookup(sym.name);
- if (mixin != TypeNames.EMPTY || !isIncomplete(sym1))
- unit.error(
- tree.pos,
- "symbol accessed from super may not be abstract");
- case _ =>
- }
- }
- elimTypeNode(super.transform(tree))
-
- case _ =>
- elimTypeNode(super.transform(tree))
- }
- } catch {
- case ex: Type$Error =>
- if (global.debug) ex.printStackTrace();
- unit.error(tree.pos, ex.msg);
- tree
- }
-
- override def transform(trees: Array[Tree]): Array[Tree] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree$CaseDef]): Array[Tree$CaseDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree$AbsTypeDef]): Array[Tree$AbsTypeDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Tree$ValDef]): Array[Tree$ValDef] =
- super.transform(trees);
-
- override def transform(trees: Array[Array[Tree$ValDef]]): Array[Array[Tree$ValDef]] =
- super.transform(trees);
-
-}}
-
diff --git a/sources/scala/tools/scalac/typechecker/RefCheckPhase.scala b/sources/scala/tools/scalac/typechecker/RefCheckPhase.scala
deleted file mode 100644
index accf608d0b..0000000000
--- a/sources/scala/tools/scalac/typechecker/RefCheckPhase.scala
+++ /dev/null
@@ -1,30 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac._;
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.{Global => scalac_Global}
-
-package scala.tools.scalac.typechecker {
-
-import scalac.util.NewArray;
-
-class RefCheckPhase(global: scalac_Global, descriptor: PhaseDescriptor)
- extends Phase(global, descriptor) {
-
- /** Applies this phase to the given compilation unit. */
- override def apply(unit: CompilationUnit): Unit =
- new RefCheck(global.asInstanceOf[scalac.Global]).apply(unit);
-
- override def transformInfo(sym: Symbol, tp: Type): Type =
- if (sym.isModule() && !sym.isStatic()) new Type$PolyType(Symbol.EMPTY_ARRAY, tp);
- else tp;
-
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/Substituter.scala b/sources/scala/tools/scalac/typechecker/Substituter.scala
deleted file mode 100644
index cb358af63a..0000000000
--- a/sources/scala/tools/scalac/typechecker/Substituter.scala
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global};
-import scalac.symtab._;
-import scalac.ApplicationError;
-import scalac.util._;
-import scalac.ast._;
-
-package scala.tools.scalac.typechecker {
-
-// Tree Substitution -------------------------------------------------------------
-
-class Substituter(global: scalac_Global, gen: TreeGen) extends Transformer(global) {
-
- var tparams: Array[Symbol] = _;
- var targs: Array[Type] = _;
- var typeSubstituter: Type$SubstTypeMap = _;
-
- def apply(tree: Tree, tparams: Array[Symbol], targs: Array[Type]): Tree = {
- this.tparams = tparams;
- this.targs = targs;
- this.typeSubstituter = new Type$SubstTypeMap(tparams, targs) {
- override def matches(sym1: Symbol, sym2: Symbol): boolean = {
- sym1.name == sym2.name && sym1.owner() == sym2.owner();
- }
- }
- transform(tree);
- }
-
- val elimInferredPolyMap: Type$Map = new Type$Map() {
- def apply(t: Type): Type = {
- t match {
- case Type$PolyType(tparams1: Array[Symbol], restp: Type) =>
- if (tparams1.length == tparams.length && tparams1(0) == tparams(0)) {
- for (val i <- Iterator.range(1, tparams.length))
- assert(tparams1(i) == tparams(i));
- return apply(restp);
- }
- case _ =>
- }
- map(t)
- }
- };
-
- override def transform(trees: Array[Tree]): Array[Tree] =
- super.transform(trees);
-
- override def transform(tree: Tree): Tree = {
- // System.out.println("[" + ArrayApply.toString(targs,"",",","") + "/" + ArrayApply.toString(tparams,"",",","") + "]" + tree + "@" + tree.symbol());//DEBUG
- if (tree.getType() != null) {
- tree.setType(
- typeSubstituter.apply(elimInferredPolyMap.apply(tree.getType())));
- }
- tree match {
- case Tree$Ident(name) =>
- if (name.isTypeName()) {
- val sym: Symbol = tree.symbol();
- var i = 0;
- while (i < tparams.length) {
- if (sym != null && typeSubstituter.matches(tparams(i), sym)) {
- return gen.mkType(tree.pos, targs(i));
- }
- i = i + 1;
- }
- }
- tree
-
- case Tree$TypeApply(fun, targs) =>
- var proceed: boolean = true;
- fun.getType() match {
- case Type$PolyType(tparams1, _) =>
- if (tparams1.length == tparams.length && tparams1(0) == tparams(0) && targs.length == tparams.length) {
- proceed = false;
- for (val i <- Iterator.range(0, tparams.length))
- if (!typeSubstituter.matches(targs(i).getType().symbol(), tparams(i)))
- proceed = true;
- }
- case _ =>
- }
- val fun1: Tree = if (proceed) transform(fun) else fun;
- val targs1: Array[Tree] = transform(targs);
- copy.TypeApply(tree, fun1, targs1);
-
- case _ =>
- super.transform(tree);
- }
- }
-}
-}
diff --git a/sources/scala/tools/scalac/typechecker/View.scala b/sources/scala/tools/scalac/typechecker/View.scala
deleted file mode 100644
index 12006c292c..0000000000
--- a/sources/scala/tools/scalac/typechecker/View.scala
+++ /dev/null
@@ -1,19 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-**
-** $Id$
-\* */
-import scalac.symtab._;
-import scalac.ast._;
-
-package scala.tools.scalac.typechecker {
-
-
-
-case class View(sym: Symbol, symtype: Type, qual: Tree, context: Context) {
- var locked = false;
-}
-
-}
diff --git a/sources/scala/tools/scalac/util/NewArray.scala b/sources/scala/tools/scalac/util/NewArray.scala
deleted file mode 100644
index 6c55656a17..0000000000
--- a/sources/scala/tools/scalac/util/NewArray.scala
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.ast._;
-import scalac.symtab._;
-import scalac.util.Name;
-
-package scala.tools.scalac.util {
-
-object NewArray {
-
- def Tree(xs: Tree*): Array[Tree] = {
- val arr = new Array[Tree](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def TreeArray(xs: Array[Tree]*): Array[Array[Tree]] = {
- val arr = new Array[Array[Tree]](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def ValDef(xs: Tree$ValDef*): Array[Tree$ValDef] = {
- val arr = new Array[Tree$ValDef](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def ValDefArray(xs: Array[Tree$ValDef]*): Array[Array[Tree$ValDef]] = {
- val arr = new Array[Array[Tree$ValDef]](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def CaseDef(xs: Tree$CaseDef*): Array[Tree$CaseDef] = {
- val arr = new Array[Tree$CaseDef](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def Name(xs: Name*): Array[Name] = {
- val arr = new Array[Name](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def Symbol(xs: Symbol*): Array[Symbol] = {
- val arr = new Array[Symbol](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def SymbolArray(xs: Array[Symbol]*): Array[Array[Symbol]] = {
- val arr = new Array[Array[Symbol]](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
- def Type(xs: Type*): Array[Type] = {
- val arr = new Array[Type](xs.length);
- xs.elements.copyToArray(arr, 0);
- arr
- }
-
-}
-}
diff --git a/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala b/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala
deleted file mode 100644
index 77f22e356c..0000000000
--- a/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala
+++ /dev/null
@@ -1,525 +0,0 @@
-// $Id$
-
-import scalac.{Global => scalac_Global}
-import scalac.CompilationUnit;
-import scalac.atree._;
-import scalac.symtab._;
-import scalac.util.Name;
-import scalac.util._;
-import scala.collection.mutable._;
-import scalac.ast._;
-
-package scala.tools.scalac.wholeprog {
-
-
-
-/**
- * This class builds the set of classes included in the Application (whole
- * program), starting with a root class, given from the outside (usually
- * the user).
- *
- */
-class ApplicationBuilder(globall: scalac_Global) {
-
- private val global = globall;
- var rootClassName: Name = Name.fromString("");
- //var map: SymbolMap = null;
-
- // algorithm data
- var worklist: Set[Symbol] = new HashSet[Symbol];
- var app: Set[Symbol] = new HashSet[Symbol];
-
- def finalClasses(app: Set[Symbol], units: Array[CompilationUnit]): Unit = {
- val m = new MonomorphicCallSites(global, app);
- m.buildClassHierarchy;
-
- m.hierarchy.visitDFS( (n) => {
- if (m.hierarchy.inEdges(n.id).length == 0) {
-// Console.println("Final class: " + n.info.name.toString());
- n.info.flags = n.info.flags | Modifiers.FINAL;
- }
- });
-
-// val transf: GenTransformer = new GenTransformer(global);
-
-// units.foreach( (u) => {
-// u.body.foreach( (b) => transf.transform(b) );
-// });
-
- m.monomorphicCallsites(units);
- }
-
-
- /** find the whole application that is referenced by the root class */
- def buildApplication(root: String, units: Array[CompilationUnit]): unit = {
- rootClassName = Name.fromString(root);
-
- var rootClass: Symbol = null;
- try {
- rootClass = global.definitions.getModule(root).moduleClass();
- } catch {
- case _ => global.error(root + " is not the name of an object");
- }
-
- if (rootClass == Symbol.NONE)
- global.error(root + " is not an object");
-
- // build the map from Symbol's to AST nodes
- buildCodeMap(units);
-// Console.println(SymbolMap);
-
- worklist += rootClass;
-
- while (!worklist.isEmpty)
- visitClass(worklist.toList.head);
-
- dumpApplication;
-
- // now we call from here the final-classes analysis,
- // but we should really move it to a more sensible place, like a
- // whole-program anlysis controller, or "plan", the same way the
- // compiler phases are structured
- finalClasses(app, units);
- }
- // where
- def buildCodeMap(units: Array[CompilationUnit]): Unit = {
- //val map = new SymbolMap();
-
- def mapTree(t: Tree): unit = {
- t match {
- case Tree$PackageDef(pack, impl) => {
- mapTree(pack);
- mapTree(impl);
- }
-
- case Tree$ClassDef(mods, name, tparams, vparams, tpe, impl) => {
- SymbolMap.addSymbol(t.symbol(), t);
- mapTree(impl);
- }
-
- case Tree$Template(parents, body) => {
- body.foreach( (b) => mapTree(b) );
- }
-
- case _ => ;
- };
- }
-
- units.foreach( (u: CompilationUnit) =>
- u.body.foreach( (b) => mapTree(b) ));
- }
-
- def dumpApplication: Unit = {
- val outputFile = new java.io.File(global.args.XappFile.value);
- val writer: java.io.Writer = new java.io.FileWriter(outputFile);
-
- app.foreach( (s: Symbol) => {
- writer.write(s.name.toString() + "\n");
- });
- // if we don't flush, nothing gets written?!!
- writer.flush();
- }
-
- def visitClass(clsSym: Symbol): unit = {
- if (clsSym.isExternal())
- visitExternalClass(clsSym);
- else
- visitInternalClass(clsSym);
- }
-
- def visitExternalClass(clsSym: Symbol): unit = {
- assert(clsSym.isClass(), "Not a class symbol? " + clsSym);
-
- app += clsSym;
- worklist -= clsSym;
-
- // parents
- addTypesToWorklist(List.fromArray(clsSym.parents(), 0, clsSym.parents().length));
-
-// updateClassHierarchy(clsSym);
-
- // members
- clsSym.members().elements().foreach( (s: Symbol) => {
- if (s.isClass())
- visitClass(s);
- else if (s.isValue() || s.isVariable()) {
- // a field
- } else if (s.isMethod()) {
- // a method
- }
- });
- }
-
- /**
- * Visit a class declaration.. Walk all its methods and add to the Application set
- * all classes referenced by a method call, instantiation or assignment. We have to
- * have a source represenation of this class (it is not Java code/or external class).
- *
- * What we include for each class:
- * - superclasses
- * - field types (actually their classes)
- * - return and argument types for methods (actually their classes)
- * - receiver type for method calls (actually its class)
- * - receiver and field type for foreign field accesses (same obs as before)
- */
- def visitInternalClass(clsSym: Symbol): unit = {
- var cls: Tree = null;
-
- app += clsSym;
- worklist -= clsSym;
-
- SymbolMap.getDefinition(clsSym) match {
- case Some(c) => cls = c;
- case None => {
- Console.println("Could not find symbol " + clsSym + " in code map");
- return;
- }
- }
-
- val parents = clsSym.parents();
-
-// updateClassHierarchy(clsSym);
-
- // superclasses
- addTypesToWorklist(List.fromArray(parents, 0, parents.length));
-
- addReferences(cls);
- }
- // where
-/* def updateClassHierarchy(cls: Symbol): Unit = {
- val parents = cls.parents();
- var i = 1;
- val subclass: Node = chGraph.getNode(cls);
-
- def typeToSymbol(t: Type): Symbol = {
- t match {
- case Type$TypeRef(_, s, _) => s;
- case _ => { global.error("Cannot handle base type " + t + " for " + cls ); null }
- }
- }
-
-
- if (parents.length > 0) {
- chGraph.addBaseClass(subclass, chGraph.getNode(typeToSymbol(parents(0))));
- while (i < parents.length) {
- chGraph.addMixin(subclass, chGraph.getNode(typeToSymbol(parents(i))));
- i = i + 1;
- }
- }
- }
-
-*/
- /**
- * Walk the tree and add to the worklist any class symbol that is
- * referenced from this tree.
- */
- def addReferences(t: Tree): unit = {
- t match {
- case Tree$ClassDef(mods, name, tparams, vparams, tpe, impl) => {
- tparams.foreach( (tpar) => addReferences(tpar) );
- vparams.foreach( (varray) => varray.foreach( (v) => addReferences(v) ) );
-
- addReferences(tpe);
- addReferences(impl);
- }
-
- case Tree$PackageDef(packaged, impl) => {
- addReferences(packaged);
- addReferences(impl);
- }
-
- case Tree$ModuleDef(mods, name, tpe, impl) => {
- addReferences(tpe);
- addReferences(impl);
- }
-
- case Tree$ValDef(mods, name, tpe, rhs) => {
- assert(t.hasSymbol());
-
- val s = t.symbol().getType();
- addTypesToWorklist(s :: Nil);
-
- addReferences(tpe);
- addReferences(rhs);
- }
-
- case Tree$PatDef(mods, pat, rhs) => {
- assert(t.hasSymbol());
-
- val s = t.symbol().getType();
- addTypesToWorklist(s :: Nil);
-
- addReferences(pat);
- addReferences(rhs);
- }
-
- case Tree$DefDef(mods, name, tparams, vparams, tpe, impl) => {
- assert(t.hasSymbol());
-
- val s = t.symbol().getType();
- addTypesToWorklist(s :: Nil);
-
- tparams.foreach( (tpar) => addReferences(tpar) );
- vparams.foreach( (varray) => varray.foreach( (v) => addReferences(v) ) );
-
- addReferences(tpe);
- addReferences(impl);
- }
-
- case Tree$AbsTypeDef(mods, name, rhs, lobound) => {
- addReferences(rhs);
- addReferences(lobound);
- if (t.hasSymbol())
- addTypesToWorklist(t.symbol().getType() :: Nil);
- }
-
- case Tree$AliasTypeDef(mods, name, tparams, rhs) => {
- tparams.foreach( (tt) => addReferences(tt) );
- addReferences(rhs);
- }
-
- case Tree$Import(expr, selectors) => ;
-
- case Tree$CaseDef(pat, guard, body) => {
- addReferences(pat);
- addReferences(guard);
- addReferences(body);
- }
-
- case Tree$Template(parents, body) => {
- body.foreach( (b) => addReferences(b) );
- }
-
- case Tree$LabelDef(name, params, rhs) => {
- params.foreach( (p) => addReferences(p) );
- addReferences(rhs);
- }
-
- case Tree$Block(stats, expr) => {
- stats.foreach( (stat) => addReferences(stat) );
- addReferences(expr);
- }
-
- case Tree$Sequence(trees) => {
- trees.foreach( (t) => addReferences(t) );
- }
-
- case Tree$Function(vparams, body) => {
- vparams.foreach( (vpar) => addReferences(vpar) );
- addReferences(body);
- }
-
- case Tree$Assign(lhs, rhs) => {
- addReferences(lhs);
- addReferences(rhs);
- }
-
- case Tree$If(cond, thenp, elsep) => {
- addReferences(cond);
- addReferences(thenp);
- addReferences(elsep);
- }
-
- case Tree$Switch(test, tags, bodies, otherwise) => {
- addReferences(test);
- bodies.foreach( (b) => addReferences(b) );
- addReferences(otherwise);
- }
-
- case Tree$Return(expr) => addReferences(expr);
-
- case Tree$Throw(expr) => addReferences(expr);
-
- // the only place where new references can be added
- case Tree$New(template) => {
- addReferences(template);
-
-// Console.println("<new> template with type! " + template.getType());
- addTypesToWorklist(template.getType() :: Nil);
- }
-
- case Tree$Typed(expr, tpe) => {
- addReferences(expr);
- addReferences(tpe);
- }
-
- case Tree$TypeApply(fun, args) => {
- addReferences(fun);
- args.foreach( (a) => addReferences(a) );
- }
-
- case Tree$Apply(fun, args) => {
- addReferences(fun);
- addTypesToWorklist(fun.getType() :: Nil);
-
- args.foreach( (a) => addReferences(a) );
- }
-
- case Tree$Super(qualifier, mixin) => ;
-
- case Tree$This(qualifier) => ;
-
- case Tree$Select(qualifier, selector) => {
- addTypesToWorklist(qualifier.getType() :: Nil);
-
- addReferences(qualifier);
- }
-
- case Tree$Ident(name) => ;
-
- case Tree$Literal(value) => ;
-
- case Tree$TypeTerm() => {
- addTypesToWorklist(t.getType() :: Nil);
- }
-
- case Tree$SingletonType(ref) => {
- addReferences(ref);
- }
-
- case Tree$SelectFromType(qualifier, selector) => addReferences(qualifier);
-
- case Tree$FunType(argTypes, restpe) => {
- argTypes.foreach( (a) => addReferences(a) );
- addReferences(restpe);
- }
-
- case Tree$CompoundType(parents, refinements) => {
- parents.foreach( (p) => addReferences(p) );
- refinements.foreach( (r) => addReferences(r) );
- }
-
- case Tree$AppliedType(tpe, args) => {
- addReferences(tpe);
- args.foreach( (a) => addReferences(a) );
- }
-
- case Tree$Try(block, catcher, finalizer) => {
- addReferences(block);
- addReferences(catcher);
- addReferences(finalizer);
- }
-
- case _ => ;
- }
- }
-
- def addReferencesList(trees: List[Tree]) = {
- trees.foreach( (t) => addReferences(t));
- }
-
- def typeToSymbol(t: Type): Symbol = {
- t match {
- case Type$TypeRef(_, s, _) => if (s.isAbstractType()) typeToSymbol(t.bound()) else s;
- case Type$SingleType(pre, sym) => typeToSymbol(sym.getType());
- case Type$ThisType(sym) => sym;
- case Type$PolyType(tparams, result) => typeToSymbol(result); // attention!
- case Type$ConstantType(base, value) => typeToSymbol(base);
- case Type$MethodType(vparams, result) => typeToSymbol(result);
- case Type$CompoundType(_, _) => t.symbol();
- case _ => { global.error("Cannot handle base type " + t); null }
- }
- }
-
- def addTypesToWorklist(types: List[Type]): unit = {
- types.foreach( (t) => addSymbolToWorklist(typeToSymbol(t)) );
- }
-
-/*
- // where
- def addTypesToWorklist2(types: List[Type]): unit = {
- // types have to be TypeRef really, actually class types so that we
- // can identify the corresponding class and add it to our processing list
- types.foreach( (t: Type) => {
- t.match {
- case Type$TypeRef(pre, s, args) => {
- addTypesToWorklist(List.fromArray[Type](args, 0, args.length));
- addSymbolToWorklist(s);
- }
-
- case Type$CompoundType(parts, members) => Console.println("CompoundType " + t);
-
- case Type$ThisType(sym) => Console.println("ThisType " + t);
-
- case Type$SingleType(pre, sym) => Console.println("SingleType " + t);
-
- case Type$ConstantType(base, value) => Console.println("ConstantType " + t);
-
- case Type$MethodType(vparams, result) => {
- val xs = List.fromArray[Symbol](vparams, 0, vparams.length);
- addTypesToWorklist(xs map { (s) => s.getType() });
- addTypesToWorklist(result :: Nil);
- }
-
- case Type$PolyType(tparams, result) => {
- val xs = List.fromArray[Symbol](tparams, 0, tparams.length);
- addTypesToWorklist(xs map { (s) => s.getType() });
- addTypesToWorklist(result :: Nil);
- }
-
- case Type$OverloadedType(alts, alttypes) => Console.println("OverloadedType " + t);
-
- case Type$LazyType() => Console.println("LazyType " + t);
-
- case Type$TypeVar(origin, constr) => Console.println("TypeVar " + t);
-
- case Type$UnboxedType(tag) => Console.println("UnboxedType " + t);
-
- case Type$UnboxedArrayType(elempt) => Console.println("UnboxedArrayType " + t);
-
- case _ => Console.println("[worklist] Could not handle type " + t.toString());
- }
- });
- }
-*/
- /** the specified symbol has to be a class symbol. It adds its corresponding
- * Class symbol to the worklist if the necessary conditions are met */
- def addSymbolToWorklist(sym: Symbol): Unit = {
- if (sym != null && sym.isClass())
- if (!app.contains(sym) && !worklist.contains(sym)) {
- global.log("Adding type " + sym + " to worklist");
- worklist += sym;
- }
- }
-}
-
-/**
- * A map from Symbol values to AClass values. It is used by the ApplicationBuilder
- * in order to resolve class name symbols (to find their definition)
- */
-object SymbolMap {
- private var map: Map[Symbol, Tree] = new HashMap[Symbol, Tree]();
-
- def addSymbol(s: Symbol, definition: Tree): unit =
- map.update(s, definition);
-
- /** Return the atree for the class definition of this symbol, if
- * there is one, or None otherwise */
- def getDefinition(s: Symbol): Option[Tree] = {
- map.get(s);
- }
-
- def getDefinition1(s: Symbol): Tree = {
- getDefinition(s) match {
- case Some(t) => t;
- case _ => null;
- }
- }
-
- def elements = map.elements;
-
- override def toString(): String = {
- var str: String = "";
-
- elements.foreach( (tuple: Tuple2[Symbol, Tree]) => {
- str = str.concat(SymbolPrinter.fullName(tuple._1));
- str = str.concat(" -> ");
- //str = str.concat(tuple._2.toString());
- str = str.concat("\n");
- });
- str;
- }
-}
-
-} // package scala.tools.scalac.globalanalysis
-
diff --git a/sources/scala/tools/scalac/wholeprog/Inline.scala b/sources/scala/tools/scalac/wholeprog/Inline.scala
deleted file mode 100644
index 2216064bd4..0000000000
--- a/sources/scala/tools/scalac/wholeprog/Inline.scala
+++ /dev/null
@@ -1,235 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-/*
-** Inline methods in monomoprhic callsites
-**
-** [iuli] 12.05.2004 */
-
-import scalac.{Global => scalac_Global}
-import scalac.{CompilationUnit => scalac_CompilationUnit}
-import scalac.symtab._;
-import scalac.util._;
-import scala.collection.mutable._;
-import scalac.ast._;
-import scala.tools.scalac.wholeprog.graph.{Node => GNode};
-import scala.tools.scalac.wholeprog.graph._;
-import scala.tools.util._;
-
-package scala.tools.scalac.wholeprog {
-
-
-
-/** Perform inlining of the sites passed as parameter */
-class InlineMethods(sites: MonomorphicCallSites#InlinableCollection,
- global: scalac_Global)
- extends Transformer(global) {
- var inlines: int = 0;
- var inlinedThis: Symbol = null;
-
-
- override def transform(tree: Tree): Tree = {
- tree match {
- case Tree$Apply(fun, args) => {
-
- sites.get(tree) match {
- case Some(Tuple3(cl, ce, s)) => expand(tree, cl, ce);
- case _ => super.transform(tree);
- }
- }
-
- case _ => super.transform(tree);
- }
- }
-
- def expand(tree: Tree, caller: GNode[Symbol, MethodNode], callee: GNode[Symbol, MethodNode]): Tree = {
- val expr: Tree = null;
- val Tree$DefDef(_, name, _, vparams, _, rhs) = callee.info.code;
- val subst = new HashMap[Symbol, Symbol];
-
- def createLocals(tree: Tree, calleeDef: Tree): Array[Tree] = {
- val Tree$Apply(fun, args) = tree;
- val Tree$DefDef(_, name, _, vparams, _, rhs) = calleeDef;
-
- val res: Array[Tree] = new Array[Tree](args.length + 1); // make room for $this
- assert(args.length == vparams(0).length,
- "Call site has different nr. of arguments than def " + fun.symbol());
-
- res(0) = makeThisDef(fun);
- var i: int = 1;
- while (i < res.length) {
- // duplicate the formal parameter of the method and create a symbol for this def
- val arg = vparams(0)(i-1).duplicate().asInstanceOf[Tree$ValDef];
- val sym = caller.info.method.newVariable(fun.pos, 0, Name.fromString("$" + i));
-
- // set the type of the parameter to the type of the *actual* argument
-// sym.setType(args(i-1).getType());
- // or the formals?
- sym.setType(arg.tpe.getType());
-
-// Console.println("Type: actual " + sym.getType() + " : formal "
-// + arg);
-
- arg.tpe.setType(sym.getType());
- // add the mapping to the substitution table of symbols
- subst += arg.symbol() -> sym;
-
- // set the initial value to the actual parameter
- arg.rhs = args(i - 1).duplicate();
- arg.setSymbol(sym);
- arg.rhs.setType(sym.getType());
-
- res(i) = arg;
- i = i + 1;
- }
-
- res
- }
-
- def makeThisDef(fun: Tree): Tree = {
- val Tree$Select(qualifier, selector) = fun;
-
-// val tpe = make.TypeTerm(fun.pos);
- val sym = caller.info.method.newVariable(fun.pos, 0, Name.fromString("inthis"));
-// sym.setType(qualifier.getType().singleDeref()); // it was .singleDeref() but unneded?
- sym.setType(callee.info.classz.getType());
- Logger.log("[inthis] Set type to " + sym.getType());
-
-// val t = make.ValDef(fun.pos, 0, Name.fromString("inthis"), tpe, qualifier.duplicate());
- val t = gen.ValDef(sym, qualifier.duplicate());
-
-// tpe.setType(qualifier.getType().deconst());
-// t.setSymbol(sym);
- inlinedThis = sym;
-
- t
- }
-
- val locals = createLocals(tree, callee.info.code);
- val updater = new UpdateAccesses(subst, caller.info.method);
- val newRhs = updater.transform(rhs.duplicate());
-
- Logger.log("[inline] expand reached");
-
- if (updater.touchedPrivate)
- tree
- else {
- Logger.log("Inlining at " +
- caller.info.classz.name + "." +
- caller.info.method.name + " [" + Position.toString(tree.pos) + "] with " +
- callee.info.classz.name + "." +
- callee.info.method.name);
- inlines = inlines + 1;
-
- gen.mkBlock(locals, newRhs);
- }
- }
-
- /** Update accesses to symbols that have been replaced according to the map */
- class UpdateAccesses(subst: HashMap[Symbol, Symbol], hostMethod: Symbol)
- extends GenTransformer(global) {
-
- var touchedPrivate: boolean = false;
-
- override def transform(tree: Tree): Tree = {
- tree match {
- case Tree$This(qualifier) => {
- assert(inlinedThis != null, "<this> is null for " + tree);
- gen.Ident(tree.pos, inlinedThis);
- }
-
- // create a new symbol for the new declaration in this method
- case Tree$ValDef(mods, name, tpe, rhs) => {
- val newSym = hostMethod.newVariable(tree.pos, mods, name);
-
- newSym.setType(tpe.getType());
- subst += tree.symbol() -> newSym;
-
- tree.setSymbol(newSym);
-
- gen.ValDef(newSym, transform(rhs));
- }
-
- case Tree$Super(_, _) => {
- Logger.log("[inline] Touched super.");
- touchedPrivate = true; // not private, but still we cannot inline this function
- super.transform(tree);
- }
-
- case Tree$Return(_) => {
- Logger.log("[inline] Touched return.");
- touchedPrivate = true; // not private, but still we cannot inline this function
- super.transform(tree);
- }
-
- case Tree$LabelDef(name, params, rhs) => {
- val newSym = hostMethod.newLabel(tree.pos, name);
-
- newSym.setInfo(tree.symbol().info());
- subst += tree.symbol() -> newSym;
-
- gen.LabelDef(newSym, super.transform(params), transform(rhs));
- }
-
- case Tree$PatDef(mods, pat, rhs) => {
- Console.println("new pattern definition in inlined class");
- tree
- }
-
- case Tree$DefDef(_, _, _, _, _, _) => {
- assert(false, "We should be after lambda lift, so no inner function allowed");
- tree;
- }
-
- case _ => super.transform(tree);
-
- }
-
- }
-
- override def getSymbolFor(tree: Tree): Symbol = {
- if (!tree.symbol().isPublic() ||
- (tree.symbol().flags & Modifiers.PACKAGE) > 0 ) { // attention, was isPrivate()
- touchedPrivate = true;
- Logger.log("[inline] touched private symbol " +
- SymbolPrinter.fullName(tree.symbol()));
- }
-
- if (subst.contains(tree.symbol())) {
- Logger.log("[inline] Substituted " + tree.symbol() + " with " + subst(tree.symbol()));
- subst(tree.symbol());
- }
- else
- super.getSymbolFor(tree);
- //tree.symbol();
- }
-
- }
-}
-
-object Logger {
- var file: java.io.Writer = null;
-
- def setFile(name: String): Unit = {
- file = new java.io.FileWriter(name);
- }
-
- def log(s: String): Unit = {
- file.write(s + "\n");
- }
-
- def log(s1: String, s2: String): Unit = {
- file.write(s1 + " " + "\n");
- }
-
- def flush: unit = {
- file.flush();
- }
-}
-
-} // package scala.tools.scalac.wholeprog
diff --git a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala
deleted file mode 100644
index e71fdd2004..0000000000
--- a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala
+++ /dev/null
@@ -1,443 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-/*
-** The Whole Program analysis phase.
-**
-** Identify monomorphic call sites in classes (where the receiver
-** can always be statically determined).
-**
-** [iuli] 2.05.2004 */
-
-import scalac.{Global => scalac_Global}
-import scalac.CompilationUnit;
-import scalac.symtab._;
-import scalac.util._;
-import scala.collection.mutable._;
-import scalac.ast._;
-import scala.tools.scalac.wholeprog.graph.{Node => GNode};
-import scala.tools.scalac.wholeprog.graph._;
-
-package scala.tools.scalac.wholeprog {
-
-
-
-class MonomorphicCallSites(globall: scalac_Global, application: Set[Symbol]) {
- type CallGraph = Graph[Symbol, MethodNode, CallEdge];
- type CallGraphNode = GNode[Symbol, MethodNode];
- type CallGraphEdge = Edge[Symbol, CallEdge];
-
- type InlinableCollection = HashMap[Tree, Tuple3[CallGraphNode, CallGraphNode, CallSite]];
-
- private val global = globall;
- val hierarchy = new Graph[Symbol, Symbol, String];
- val callGraph = new CallGraph;
-
- var instantiatedClasses = new HashSet[Symbol];
-
- var inlinable: InlinableCollection = new InlinableCollection;
-
-
- /** create the class inheritance hierarchy */
- def buildClassHierarchy: Unit = {
- application.foreach( (sym) => {
- hierarchy.addNode(new GNode(sym, sym));
- });
-
- application.foreach( (sym) => {
- val parents = sym.parents();
-
- // the first "parent" is always the superclass? seems to be like that
- val superclass = if (parents.length > 0) parents(0) else null;
-
- parents.foreach( (p) => {
- val e = new Edge[Symbol, String](sym, typeToSymbol(p));
-
- e.info = if (p == superclass) "extends" else "with";
- hierarchy.addEdge(e);
- });
- });
-
- if (!global.args.XdotFile.value.equals("$")) {
- val file: java.io.Writer = new java.io.FileWriter("ch.dot");
- file.write(hierarchy.toDotString);
- file.flush();
- }
- }
-
-
- def typeToSymbol(t: Type): Symbol = {
- t match {
- case Type$TypeRef(_, s, _) => if (s.isAbstractType()) typeToSymbol(t.bound()) else s;
- case Type$SingleType(pre, sym) => typeToSymbol(sym.getType());
- case Type$ThisType(sym) => sym;
- case Type$PolyType(tparams, result) => typeToSymbol(result); // attention!
- case Type$ConstantType(base, value) => typeToSymbol(base);
- case Type$MethodType(vparams, result) => typeToSymbol(result);
- case Type$CompoundType(_, _) => t.symbol();
- case _ => { global.error("* Cannot handle base type " + t); null }
- }
- }
-
- /** Identify and print monomoprhic callsites */
- def monomorphicCallsites(units: Array[CompilationUnit]): Unit = {
- val cg = callGraph;
- var nr: int = 0;
- var views: Int = 0;
- var closures: Int = 0;
-
- def logStatistics(e: CallGraphEdge): Unit = {
- if (cg.getNode(e.to).info.method.name.toString().equals("apply")) {
- closures = closures + 1;
-// Console.println("[closure] " + cg.getNode(e.from).info.classz.name + "." +
-// cg.getNode(e.from).info.method.name + " -> " +
-// cg.getNode(e.to).info.classz.name + "." +
-// cg.getNode(e.to).info.method.name);
- }
- if (cg.getNode(e.to).info.method.name.toString().equals("view"))
- views = views + 1;
- }
-
- def inlineCallSite(e: CallGraphEdge): Unit = {
- val caller = cg.getNode(e.from);
- val callee = cg.getNode(e.to);
-
- if (canInline(caller, callee))
- inlinable += e.info.site.t -> new Tuple3(caller, callee, e.info.site);
- }
-
- def canInline(caller: CallGraphNode, callee: CallGraphNode): boolean =
- !callee.info.method.isInitializer() &&
- caller.info.code != null &&
- callee.info.code != null &&
- !callee.info.method.isDeferred() &&
- application.contains(caller.info.classz) &&
- application.contains(callee.info.classz);
-
- Logger.setFile("inlining.log");
-
- Console.println("[start build callgraph]"); StopWatch.start;
- buildCallGraph(units);
- Console.println("[end build callgraph] " + StopWatch.stop + " ms");
-
- if (global.args.Xrta.value) {
- // perform additional pruning
- Console.println("[start RTA]");
- rapidTypeAnalysis(instantiatedClasses);
- Console.println("[end RTA] " + StopWatch.stop + " ms");
- }
-
- if (!global.args.XdotFile.value.equals("$"))
- dumpCallGraph;
-
- Console.println("[start Monomorphic call site identification]"); StopWatch.start;
- cg.nodes.foreach( (id: Symbol, n: CallGraphNode) => {
- n.info.callSites.foreach( (site) => {
- val mcs = cg.getOutEdges(id).filter( e => e.info.site == site );
-
- if (mcs.length == 1) {
- inlineCallSite(mcs.head);
-// Console.println("Monomorphic call-site: " + mcs.head.from + " " + mcs.head.to);
- logStatistics(mcs.head);
- nr = nr + 1;
- }
- });
- });
- Console.println("[end Monomorphic call site identification] " + StopWatch.stop + " ms");
-
- Console.println("We identified " + nr + " monomorphic call-sites. ("
- + inlinable.size + " inlinable).");
- Console.println("[closures = " + closures + " out of " + closuresTotal +
- ", views = " + views + "out of " + viewsTotal + "]");
-
- if (global.args.Xinline.value) {
- Console.println("[start inlining]"); StopWatch.start;
-
- doInline(units, inlinable);
- Console.println("[end inlining] " + StopWatch.stop + " ms");
- }
- }
-
- /** Perform a form of rapid type analysis, as described in Sundaresan 99
- The idea is that the call graph can be signifficanly pruned if all edges that go
- into a method of a class that was never instantiated in the program are removed.
-
- The assumption is that all "new" statements are known, and there is no other way to
- instantiate classes. While the first one may be true for whole-program analysis
- (and the -separate:no flag for scalac), the second might not hold: object classes
- (singletons) are created "magically", and no "new" statement is parsed.
- */
- def rapidTypeAnalysis(instances: Set[Symbol]): Unit = {
-
- /** instantiated classes include singleton classes */
- def isInstatiated(s: Symbol): boolean =
- instances.contains(s) ||
- s.getType().isSubType(global.definitions.ANYVAL_TYPE()) ||
- s.isModuleClass();
-
- Console.println("Printing instantiated classes");
- Logger.log("[RTA] Instantiated classes: ");
- instantiatedClasses.foreach( s => Logger.log("[RTA] " + SymbolPrinter.fullName(s)));
-
- Console.println("[Visiting call graph]");
-
- val it = callGraph.nodeIterator;
-
- while (it.hasNext) {
- val n = it.next;
-
- n.info.callSites.foreach( (site) => {
- val targets = callGraph.getOutEdges(n.id).filter( e => e.info.site == site );
-
- if (targets.length > 1) {
- // test for instantiation
- targets.foreach( (t: CallGraphEdge) => if ( !isInstatiated(callGraph.getNode(t.to).info.classz) ) {
- callGraph.removeEdge(t);
- Logger.log("[RTA] Removed edge to " + SymbolPrinter.fullName(t.to));
- });
- }
- });
- }
-
- }
-
- /** perform inlines */
- def doInline(units: Array[CompilationUnit], sites: InlinableCollection): Unit = {
- val transformer: Transformer = new InlineMethods(sites, global);
-
- units.foreach( (u) => {
- u.body = transformer.transform(u.body);
- });
-
- Console.println("We inlined " + transformer.asInstanceOf[InlineMethods].inlines + " callsites");
- Logger.flush;
- }
-
- var unknown = 0; // calls to "null" methods
- var closuresTotal = 0; // calls to "apply" methods
- var viewsTotal = 0; // calls to "view" methods
-
-
- def buildCallGraph(units: Array[CompilationUnit]): Unit = {
- createNodes(units, callGraph);
- createEdges(units, callGraph);
-
- // print call graph size
- var nodes = 0;
- var edges = 0;
- var callsites = 0;
-
- callGraph.nodes.foreach( (id: Symbol, n: CallGraphNode) => {
- nodes = nodes + 1;
- callsites = callsites + n.info.callSites.length;
- edges = edges + callGraph.getOutEdges(id).length;
- });
-
- Console.println("Call graph: " + nodes + " nodes, " +
- edges + " edges, [" /* + callGraph.edges.length */ + "]" +
- callsites + " callsites." + "(unknown = " + unknown + ")");
- }
-
- def dumpCallGraph: Unit = {
- val file: java.io.Writer = new java.io.FileWriter("callGraph.dot");
- file.write(callGraph.toDotString);
- file.flush();
- }
-
- def createNodes(units: Array[CompilationUnit], cg: CallGraph): Unit = {
- val trav: Traverser = new MethodNodeCreator(cg);
-
- units.foreach( (u) => trav.traverse(u.body) );
- }
-
- def createEdges(units: Array[CompilationUnit], cg: CallGraph): Unit = {
- val trav: Traverser = new CallGraphEdgeTraverser(cg);
-
- units.foreach( (u) => trav.traverse(u.body) );
- }
-
- /** Walk the nodes in the AST tree and creates nodes in the callgraph
- corresponding to each method */
- class MethodNodeCreator(cg: CallGraph) extends Traverser {
-
- override def traverse(tree: Tree): Unit = {
- tree match {
- case Tree$DefDef(_, name, _, _, _, _) => {
- val methSym = tree.symbol();
-
- cg.addNode(new CallGraphNode(methSym, new MethodNode(methSym, methSym.enclClass(), tree)));
- }
-
- case _ => ;
- }
-
- super.traverse(tree);
- }
- }
-
-
- /** Walk all source code and create the call graph edges. */
- class CallGraphEdgeTraverser(cg: CallGraph) extends Traverser {
- var enclMethod: Symbol = null;
-
- override def traverse(tree: Tree): Unit = {
- var oldMethod: Symbol = enclMethod;
-
- tree match {
- case Tree$DefDef(_, name, _, _, _, _) => {
- oldMethod = enclMethod;
- enclMethod = tree.symbol();
-
- super.traverse(tree);
- }
-
- case Tree$Create(qualifier, targs) => {
-// Console.println("Create: " + tree.symbol());
- assert(tree.symbol().isClass());
- instantiatedClasses += tree.symbol();
-
- traverse(qualifier);
- }
-
- case Tree$Apply(fun, args) => {
-
- if (enclMethod != null) {
- val targetMeth = fun.symbol();
-
- if (targetMeth != null) {
- if (targetMeth.name.toString().equals("apply"))
- closuresTotal = closuresTotal + 1;
- else if (targetMeth.name.toString().equals("view"))
- viewsTotal = viewsTotal + 1;
-
- createEdges(targetMeth, tree);
- }
- else
- unknown = unknown + 1;
-
-
-// fun match {
-// case Tree$Select(qualifier, selector) => {
-// val target = typeToSymbol(qualifier.getType());
-
-// if (target != null)
-// createEdges(target, qualifier, selector, tree);
-// }
-// case _ => ;
-// } /* else
-// Console.println("No f***ing enclosing method - " + fun); */
- }
-
- traverse(fun);
- args.foreach( a => traverse(a));
- };
-
- case _ => super.traverse(tree);
- }
-
- enclMethod = oldMethod;
- }
-
- /** Add edges between the callsite and all possible targets. Possible
- * targets are methods in the target class (or "nearest" superclass)
- * or subclasses that override the specific method */
- def createEdges(targetMeth: Symbol, t: Tree): Unit = {
- val site: CallSite = new CallSite(t);
-
- def createEdgesForSubclasses(cls: Symbol): Unit = {
- // walk all subclasses
- hierarchy.getInEdges(cls).foreach( (e) => {
- val c = hierarchy.nodes(e.from).info;
- val it = c.members().iterator();
-
- while (it.hasNext()) {
- val m = it.next();
- if (m.overrides(targetMeth)) {
- if (cg.getNode(m) == null)
- cg.addNode(new CallGraphNode(m, new MethodNode(m, c, null)));
-
- cg.addEdge(enclMethod, m).info = new CallEdge(t, site);
- }
- }
-
-// else Console.println("Found a subclass that is not a subtype: " +
-// SymbolPrinter.fullName(c) + "[" + c.getType() + "] not <: " +
-// targetCls + "[" + refType + "]");
-
- createEdgesForSubclasses(c);
- });
-
- }
-
- // add callsite to node
- if (cg.getNode(enclMethod) == null)
- cg.addNode(new CallGraphNode(enclMethod, new MethodNode(enclMethod, enclMethod.enclClass(), null)));
-
- cg.getNode(enclMethod).info.callSites = site :: cg.getNode(enclMethod).info.callSites;
-
- if (targetMeth != Symbol.NONE) {
- if (cg.getNode(targetMeth) == null)
- cg.addNode(new CallGraphNode(targetMeth, new MethodNode(targetMeth, targetMeth.enclClass(), null)));
-
- cg.addEdge(enclMethod, targetMeth).info = new CallEdge(t, site);
- }
-
- createEdgesForSubclasses(targetMeth.enclClass());
- }
- }
-
-}
-
-/** Class that maintains information about nodes in the callgraph */
-case class MethodNode(method: Symbol, classz: Symbol, code: Tree) {
- var callSites: List[CallSite] = Nil;
-
- override def toString(): String = SymbolPrinter.fullName(method);
-}
-
-case class CallSite(t: Tree) {
-}
-
-class CallEdge(code: Tree, s: CallSite) {
- val site = s;
- override def toString() = "\"" + s.hashCode() + "\"";
-}
-
-
-object SymbolPrinter {
- def fullName(s: Symbol): String = {
-
- def fullName2(post: String, s: Symbol): String =
- if (s.owner().isRoot())
- s.name.toString() + "." + post
- else
- fullName2(s.name.toString() + "." + post, s.owner());
-
- fullName2(s.name.toString(), s.owner())
- }
-
-}
-
-
-object StopWatch {
- var startTimeMillis: Long = 0;
-
- /** arm the stop watch */
- def start: Unit = {
- startTimeMillis = System.currentTimeMillis();
- }
-
- /** Retrieve the elapsed time and arm the stopwatch again */
- def stop: Long = {
- val time = System.currentTimeMillis() - startTimeMillis;
- start;
- time
- }
-}
-
-} // package wholeprog
diff --git a/sources/scala/tools/scalac/wholeprog/PrintDotFile.scala b/sources/scala/tools/scalac/wholeprog/PrintDotFile.scala
deleted file mode 100644
index 656de1b275..0000000000
--- a/sources/scala/tools/scalac/wholeprog/PrintDotFile.scala
+++ /dev/null
@@ -1,431 +0,0 @@
-// $Id$
-
-import scalac.{CompilationUnit => scalac_CompilationUnit}
-import scalac.ast._;
-import scalac.util.Name;
-
-package scala.tools.scalac.wholeprog {
-
-/**
- * Print the AST into a dot file, which can be used by
- * the graphviz "dot" tool to build a graph image. Useful for
- * understanding the Abstract Syntax Tree.
- */
-class PrintDotFile(_units: Array[scalac_CompilationUnit]) {
- private val units = _units;
- private var writer: java.io.Writer = null;
-
- def makeDotFile(output: String): unit = {
- val outputFile = new java.io.File(output);
- writer = new java.io.FileWriter(outputFile);
-
- writer.write("digraph tree {\nnode [style=filled, color=cadetblue2];\n");
-
- units.foreach( (u:scalac_CompilationUnit) =>
- u.body.foreach ( (t: Tree) => walk(t, null) ) );
-
- writer.write("}\n");
- writer.close();
- }
-
-
- def makeDotFile(output: String, tree: Tree): unit = {
- writer = new java.io.FileWriter(output);
-
- writer.write("digraph tree {\nnode [style=filled, color=cadetblue2];\n");
-
- walk(tree, null);
-
- writer.write("}\n");
- writer.close();
- }
-
- def printNode(t: Object, label: String): unit = {
- writer.write(t.hashCode().toString() + " [label = \"" + label + "\"];\n");
- }
-
-
- def printEdge(t1: Object, t2: Object, label: String): unit = {
- if (t1 != null)
- writer.write(t1.hashCode().toString() + " -> " + t2.hashCode().toString() +
- "[label= \"" + label + "\"];\n");
- }
-
- def printEdge(t1: Object, t2: Object): unit = printEdge(t1, t2, "");
-
- def walk(t: Tree, parent: Tree, l: String): unit = {
- t match {
-
-// case Tree$Empty => {
-// printNode(t, "Empty");
-// printEdge(parent, t);
-// }
-
- case Tree$DocDef(comment, definition) => {
- printNode(t, "DocDef");
- printEdge(parent, t);
-
- walk(definition, t);
- }
-
- case Tree$ClassDef(mods, name, tparams, vparams, tpe, template) => {
- printNode(t, "ClassDef: " + name.toString());
- printEdge(parent, t);
-
- tparams.foreach( (p: Tree) => {
- walk(p, t);
- });
-
- vparams.foreach( (arr) => {
- (p: Tree) => walk(p, t);
- });
-
- walk(tpe, t);
-
- walk(template, t);
- }
-
- case Tree$PackageDef(packaged, impl) => {
- printNode(t, "PackageDef");
- printEdge(parent, t);
-
- walk(packaged, t);
- walk(impl, t);
- }
-
- case Tree$ModuleDef(_, name, tpe, impl) => {
- printNode(t, "ModuleDef: " + name.toString());
- printEdge(parent, t);
-
- walk(tpe, t);
- walk(impl, t);
- }
-
- case Tree$ValDef(_, name, tpe, rhs) => {
- printNode(t, "ValDef: " + name.toString());
- printEdge(parent, t);
-
- walk(tpe, t);
- walk(rhs, t);
- }
-
- case Tree$PatDef(_, pat, rhs) => {
- printNode(t, "PatDef");
- printEdge(parent, t);
-
- walk(pat, t);
- walk(rhs, t);
- }
-
- case Tree$DefDef(_, name, tparams, vparams, tpe, rhs) => {
- printNode(t, "DefDef: " + name.toString());
- printEdge(parent, t);
-
- tparams.foreach( (tt) => walk(tt, t) );
-
- vparams.foreach( (at) => at.foreach( (tt) => walk(tt, t) ) );
- walk(tpe, t);
- walk(rhs, t);
- }
-
- case Tree$AbsTypeDef(_, name, rhs, lobound) => {
- printNode(t, "AbsTypeDef: " + name.toString());
- printEdge(parent, t);
-
- walk(rhs, t);
- walk(lobound, t);
- }
-
- case Tree$AliasTypeDef(_, name, tparams, rhs) => {
- printNode(t, "AliasTypeDef: " + name.toString());
- printEdge(parent, t);
-
- tparams.foreach( (tt) => walk(tt, t) );
- walk(rhs, t);
- }
-
- case Tree$Import(expr, selectors) => {
- printNode(t, "Import");
- printEdge(parent, t);
-
- walk(expr, t);
- selectors.foreach( (n: Name) => {
- printNode(n, "Name: " + n);
- printEdge(t, n);
- });
- }
-
- case Tree$CaseDef(pat, guard, body) => {
- printNode(t, "CaseDef");
- printEdge(parent, t);
-
- walk(pat, t);
- walk(guard, t);
- walk(body, t);
- }
-
- case Tree$Template(parents, body) => {
- printNode(t, "Template");
- printEdge(parent, t);
-
- parents.foreach( (tt) => {
- walk(tt, t, "parent");
- });
-
- body.foreach( (tt) => {
- walk(tt, t, "body");
- });
- }
-
- case Tree$LabelDef(name, params, rhs) => {
- printNode(t, "LabelDef: " + name.toString());
- printEdge(parent, t);
-
- params.foreach( (tt) => walk(tt, t) );
- walk(rhs, t);
- }
-
- case Tree$Block(stats, expr) => {
- printNode(t, "Block");
- printEdge(parent, t);
-
- stats.foreach( (tt) => walk(tt, t) );
- walk(expr, t);
- }
-
- case Tree$Sequence(trees) => {
- printNode(t, "Sequence");
- printEdge(parent, t);
-
- trees.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$Alternative(trees) => {
- printNode(t, "Alternative");
- printEdge(parent, t);
-
- trees.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$Bind(name, rhs) => {
- printNode(t, "Bind: " + name.toString());
- printEdge(parent, t);
-
- walk(rhs, t);
- }
-
- case Tree$Visitor(cases) => {
- printNode(t, "Visitor");
- printEdge(parent, t);
-
- cases.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$Function(vparams, body) => {
- printNode(t, "Function");
- printEdge(parent, t);
-
- vparams.foreach( (tt) => walk(tt, t) );
- walk(body, t);
- }
-
- case Tree$Assign(lhs, rhs) => {
- printNode(t, "Assign");
- printEdge(parent, t);
-
- walk(lhs, t);
- walk(rhs, t);
- }
-
- case Tree$If(cond, thenp, elsep) => {
- printNode(t, "If");
- printEdge(parent, t);
-
- walk(cond, t);
- walk(thenp, t);
- walk(elsep, t);
- }
-
- // we ignore the "tags" array...
- case Tree$Switch(test, _, bodies, otherwise) => {
- printNode(t, "Switch");
- printEdge(parent, t);
-
- walk(test, t);
- bodies.foreach( (tt) => walk(tt, t) );
- walk(otherwise, t);
- }
-
- case Tree$Return(expr) => {
- printNode(t, "Return");
- printEdge(parent, t);
-
- walk(expr, t);
- }
-
- case Tree$Throw(expr) => {
- printNode(t, "Throw");
- printEdge(parent, t);
-
- walk(expr, t);
- }
-
- case Tree$New(template) => {
- printNode(t, "New");
- printEdge(parent, t);
-
- walk(template, t);
- }
-
- case Tree$Create(qualifier, targs) => {
- printNode(t, "Create");
- printEdge(parent, t);
-
- walk(qualifier, t);
- targs.foreach( (a) => walk(a, t) );
- }
-
- case Tree$Typed(expr, tpe) => {
- printNode(t, "Typed");
- printEdge(parent, t);
-
- walk(expr, t);
- walk(tpe, t);
- }
-
- case Tree$TypeApply(fun, args) => {
- printNode(t, "TypeApply");
- printEdge(parent, t, l);
-
- walk(fun, t);
-
- args.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$Apply(fun, args) => {
- printNode(t, "Apply");
- printEdge(parent, t, l);
-
- walk(fun, t, "fun");
-
- args.foreach( (tt) => walk(tt, t, "arg") );
- }
-
- case Tree$Super(qualifier, mixin) => {
- printNode(t, "Super");
- printEdge(parent, t);
-
- printNode(qualifier, "Qualifier: " + qualifier.toString());
- printNode(mixin, "Mixin: " + mixin.toString());
-
- printEdge(t, qualifier);
- printEdge(t, mixin);
- }
-
- case Tree$This(qualifier) => {
- printNode(t, "This");
- printEdge(parent, t);
-
- printNode(qualifier, "Qualifier: " + qualifier);
- printEdge(t, qualifier);
- }
-
- case Tree$Select(qualifier, selector) => {
- printNode(t, "Select");
- printEdge(parent, t, l);
-
-// printNode(qualifier, "Qualifier: " + qualifier.toString());
-// printEdge(t, qualifier);
-// printNode(qualifier, "Qualifier");
-// Console.println("--qualifier: " + qualifier + " : " + selector);
- walk(qualifier, t);
-
- printNode(selector, "Selector: " + selector.toString());
- printEdge(t, selector);
- }
-
- case Tree$Ident(name) => {
- printNode(t, "Ident");
- printEdge(parent, t);
-
- printNode(name, "Name: " + name);
- printEdge(t, name);
- }
-
- case Tree$Literal(value) => {
- printNode(t, "Literal");
- printEdge(parent, t);
-
- printNode(value, "Value: " + value);
- printEdge(t, value);
- }
-
- case Tree$TypeTerm() => {
- printNode(t, "TypeTerm: " + t.getType());
- printEdge(parent, t);
- }
-
- case Tree$SingletonType(ref) => {
- printNode(t, "SingletonType");
- printEdge(parent, t);
-
- walk(ref, t);
- }
-
- case Tree$SelectFromType(qual, selector) => {
- printNode(t, "SelectFromType");
- printEdge(parent, t);
-
- walk(qual, t);
- printNode(selector, "Selector: " + selector);
- printEdge(t, selector);
- }
-
- case Tree$FunType(argtypes, restpe) => {
- printNode(t, "FunType");
- printEdge(parent, t);
-
- argtypes.foreach( (tt) => walk(tt, t) );
- walk(restpe, t);
- }
-
- case Tree$CompoundType(parents, refinements) => {
- printNode(t, "CompoundType");
- printEdge(parent, t);
-
- parents.foreach( (tt) => walk(tt, t) );
- refinements.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$AppliedType(tpe, args) => {
- printNode(t, "AppliedType");
- printEdge(parent, t);
-
- walk(tpe, t);
- args.foreach( (tt) => walk(tt, t) );
- }
-
- case Tree$Try(block, catcher, finalizer) => {
- printNode(t, "Try");
- printEdge(parent, t);
-
- walk(block, t);
- walk(catcher, t);
- walk(finalizer, t);
- }
-
- case _ => {
-// Console.println(t.toString());
-// assert(false, t.toString());
-// printNode(t.symbol().name.toString(), "Unknown");
-// if (parent != null)
-// printEdge(parent.symbol().name.toString(), t.symbol().name.toString());
- }
- }
- }
-
- def walk(t: Tree, parent: Tree): unit = walk(t, parent, "");
-
-} // class PrintDotFile
-
-} // package scala.tools.scalac.wholeprog
diff --git a/sources/scala/tools/scalac/wholeprog/WholeProgPhase.scala b/sources/scala/tools/scalac/wholeprog/WholeProgPhase.scala
deleted file mode 100644
index 4666b577a1..0000000000
--- a/sources/scala/tools/scalac/wholeprog/WholeProgPhase.scala
+++ /dev/null
@@ -1,58 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-/*
-** The Global analysis phase.
-**
-** We add a new phase in the compiler, WholeProgPhase.
-**
-** [iuli] 3.03.2004 */
-
-import scalac.{Global => scalac_Global}
-import scalac.transformer.{WholeProgPhase => scalac_WholeProgPhase}
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.util.Debug;
-
-package scala.tools.scalac.wholeprog {
-
-/**
- * This phase analyzes the whole program and tries to derive some
- * useful facts about it: which classes can be marked final, what
- * methods, fields are never used, and monomorphic call-sites.
- */
-class WholeProgPhase(global: scalac_Global, descriptor: PhaseDescriptor)
- extends scalac_WholeProgPhase (global, descriptor) {
-
-
- /* Apply the global analysis phase to the given units */
- def applyAll(units: Array[CompilationUnit]): unit = {
-
- if (!global.args.XdotFile.value.equals("$")) {
- val dotFilePrinter = new PrintDotFile(units);
- dotFilePrinter.makeDotFile(global.args.XdotFile.value);
- }
-
- if (!global.args.XrootClass.value.equals("$")) {
-
- var builder: ApplicationBuilder = new ApplicationBuilder(global);
- builder.buildApplication(global.args.XrootClass.value, units);
- }
-
- if (!global.args.XdotFile.value.equals("$")) {
- val dotFilePrinter = new PrintDotFile(units);
- dotFilePrinter.makeDotFile(global.args.XdotFile.value + "2");
- }
- }
-
- override def apply(unit: CompilationUnit): Unit =
- throw Debug.abort("!!! Phase " + this + " is currently disabled");
-
-}
-
-}
diff --git a/sources/scala/tools/scalac/wholeprog/graph/Graph.scala b/sources/scala/tools/scalac/wholeprog/graph/Graph.scala
deleted file mode 100644
index 59c6f3ffdb..0000000000
--- a/sources/scala/tools/scalac/wholeprog/graph/Graph.scala
+++ /dev/null
@@ -1,189 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scala.collection.mutable._;
-
-package scala.tools.scalac.wholeprog.graph {
-
-
-/** Defualt implementation for Node objects, which can have any
- * identifier */
-class Node[id_t, info_t](i: id_t, nn: info_t) {
- var info: info_t = nn;
- val id: id_t = i;
-
- override def toString(): String = "\"" + id.hashCode() +
- "\"[ label = \"" + info + "\" ]";
-}
-
-/** Default implementation for edges. It takes two parameters, the
- * start and the end identifiers for the nodes it connects */
-class Edge[id_t, info_t](start: id_t, end: id_t) {
- val from = start;
- val to = end;
- var info: info_t = _;
-
- override def toString(): String = "\"" + start.hashCode() + "\" -> " + "\""
- + end.hashCode() + "\"[ label = \"" + info + "\" ]";
-}
-
-
-class InvalidEdgeException(from: String, to: String) extends java.lang.Exception {
- override def toString(): String = "Edge [" + from + " -> " + to +
- "] references non existent nodes";
-}
-
-
-/** The Graph class, parameterized with the node and edge types
- * The id_t is the type of the identifier of nodes. This is used
- * when retrieving nodes from the graph. The node_t is the type of
- nodes, which have to subtype the Node trait. edge_t is the type
- of edges, which again is a subtype of Edge. */
-
-class Graph[id_t, node_info_t, edge_info_t] {
- type node_t = Node[id_t, node_info_t];
- type edge_t = Edge[id_t, edge_info_t];
-
- var nodes: HashMap[id_t, node_t] = new HashMap[id_t, node_t];
- var edges: List[edge_t] = Nil;
-
- val inEdges: HashMap[id_t, List[edge_t]] = new HashMap[id_t, List[edge_t]];
- val outEdges: HashMap[id_t, List[edge_t]] = new HashMap[id_t, List[edge_t]];
-
-
- def addNode(n: node_t): Unit = {
- nodes += n.id -> n;
- inEdges += n.id -> Nil;
- outEdges += n.id -> Nil;
- }
-
- def addEdge(from: id_t, to: id_t): edge_t = addEdge(new Edge(from, to));
-
- def addEdge(e: edge_t): edge_t = {
- if ((nodes contains e.from) && (nodes contains e.to)) {
- edges = e :: edges;
- addEdgeToIncidenceMap(outEdges, e, getNode(e.from));
- addEdgeToIncidenceMap(inEdges, e, getNode(e.to));
- } //else
-// throw new InvalidEdgeException(e.start, e.end);
- e
- }
-
- def removeEdge(e: edge_t): edge_t = {
- edges = edges.remove( ee => e == ee );
- outEdges += e.from -> getOutEdges(e.from).remove( ee => e == ee);
- inEdges += e.to -> getInEdges(e.to).remove(ee => e == ee);
-
- e
- }
-
- def removeEdges(es: List[edge_t]): Unit = es match {
- case Nil => ();
- case e :: ee => { removeEdge(e); removeEdges(ee) }
- }
-
- def addEdgeToIncidenceMap(map: HashMap[id_t, List[edge_t]], e: edge_t, n: node_t): Unit = {
- map.get(n.id) match {
- case Some(l) => map += n.id -> (e :: l);
- case None => map += n.id -> (e :: Nil);
- }
- }
-
- def getOutEdges(node: id_t): List[edge_t] = outEdges.get(node) match {
- case Some(l) => l;
- case None => Nil;
- }
-
- def getInEdges(node: id_t): List[edge_t] = inEdges.get(node) match {
- case Some(l) => l;
- case None => Nil;
- }
-
- def visitDFS(f: (node_t) => Unit): Unit = {
- val visited = new HashSet[node_t];
- var i = nodeIterator;
-
- while (i.hasNext) {
- visitDFS(i.next, f, visited);
- }
- }
-
- private def visitDFS(currentNode: node_t, f: (node_t) => Unit, visited: Set[node_t]): Unit = {
- if (!visited.contains(currentNode)) {
- visited += currentNode;
- f(currentNode);
-
- getOutEdges(currentNode.id) foreach { (e) => {
- visitDFS(getNode(e.to), f, visited);
- }}
- }
- }
-
- def getNode(id: id_t): node_t = nodes.get(id) match {
- case Some(n) => n;
- case None => null;
- }
-
- def getRootNodes: Iterator[node_t] = {
- for (val elem <- nodes.elements; getInEdges(elem._2.id) == Nil)
- yield elem._2;
- }
-
- /** Remove all nodes with degree 0. Return the graph. */
- def prune: Graph[id_t, node_info_t, edge_info_t] = {
- nodes.filter( (id, n) => inEdges(id) != Nil || outEdges(id) != Nil );
-
- this
- }
-
- /* graph visualization */
-
- override def toString(): String = {
- var s = "";
-
- edges.foreach( (e) => s = s + e + "\n" );
- s
- }
-
- def toDotString: String = {
- var str = "digraph grph {\n";
-
- val it = nodeIterator;
- while (it.hasNext) {
- val node = it.next;
- str = str + node + "\n";// + " [label = \"" + node.id + "\"];\n";
- }
-
- // edges
- edges.foreach( (e) => str = str + e + "\n" );
- str + "}\n";
- }
-
- def nodeIterator: GraphIterator = new GraphIterator();
-
- /** Iterator for graph nodes */
- class GraphIterator extends Iterator[node_t] {
- val elem = nodes.elements;
-
- override def hasNext: Boolean = elem.hasNext;
- override def next: node_t = elem.next._2;
- }
-
-
- def consistencyCheck: Unit = {
- edges.foreach( (e) => {
- if ( !(getOutEdges(e.from) contains e) )
- Console.println("Edge " + e + " not found in out edges of " + e.from);
-
- if ( !(getInEdges(e.to) contains e) )
- Console.println("Edge " + e + " not found in in edges of " + e.to);
- });
- }
-}
-
-} // graph package
diff --git a/sources/scala/tools/scaladoc/Comment.java b/sources/scala/tools/scaladoc/Comment.java
deleted file mode 100644
index d5d71af13e..0000000000
--- a/sources/scala/tools/scaladoc/Comment.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.*;
-import java.util.regex.*;
-import ch.epfl.lamp.util.Pair;
-import scalac.symtab.Symbol;
-import scalac.CompilationUnit;
-
-import java.io.StringReader;
-import org.xml.sax.*;
-import org.xml.sax.helpers.DefaultHandler;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-
-/**
- * Class <code>Comment</code> contains all information in comment part.
- * It allows users to get first sentence of this comment, get comment
- * for different tags...
- */
-public class Comment extends DefaultHandler {
-
- /**
- * Holder of the comment.
- */
- public final Symbol holder;
-
- /**
- * CompilationUnit of the symbol associated with this comment.
- */
- CompilationUnit unit;
-
- /**
- * Raw text of the comment.
- */
- public final String rawText;
-
- /**
- * Text minus any tags.
- */
- public String text;
-
- /**
- * Tags minus text.
- */
- public Tag[] tags;
-
- /**
- * Constructor.
- *
- * @param holder
- * @param rawText
- */
- public Comment(String rawText, Symbol holder, CompilationUnit unit, HTMLValidator html) {
- this.holder = holder;
- this.rawText = cleanComment(rawText);
- this.unit = unit;
- if (!isEmpty())
- html.validate(this.rawText, this);
- parseComment();
- }
-
- /**
- * Returns true if this comment is empty.
- */
- public boolean isEmpty() {
- return "".equals(rawText);
- }
-
- /**
- * Tests if the comment contains a specified tag.
- */
- public boolean containsTag(String name) {
- name = name.startsWith("@") ? name : "@" + name;
- for(int i = 0; i < tags.length; i++)
- if (tags[i].name.equals(name))
- return true;
- return false;
- }
-
- /**
- * Removes the leading white spaces and asterixes.
- *
- * @param comment
- */
- public static String cleanComment(String s) {
- if (s == null)
- return "";
- s = s.substring(3, s.length() - 2);
- StringBuffer buf = new StringBuffer();
- String regexp = "^([ \\t]*)([\\*]*)(.*)$";
- Pattern p = Pattern.compile(regexp,
- Pattern.MULTILINE);
- Matcher m = p.matcher(s);
-
- while (m.find()) {
- if (m.group(2).length() == 0)
- buf.append(m.group(1) +
- m.group(2) +
- m.group(3));
- else
- buf.append(m.group(3));
- buf.append("\n");
- }
- return buf.toString();
- }
-
- /**
- * Parses the comment string separating the description
- * text from tags.
- */
- protected void parseComment() {
- String regexp = "\n[ ]*@|\\A[ ]*@";
- String[] parts = rawText.split(regexp);
- if (parts.length == 0) {
- text = "";
- tags = new Tag[0];
- }
- else {
- int startTag;
- if (parts[0].startsWith("@")) {
- text = "";
- startTag = 0;
- } else {
- text = parts[0];
- startTag = 1;
- }
- List tagList = new LinkedList();
- for(int i = startTag; i < parts.length; i++) {
- Pair fields = Tag.split(parts[i]);
- String name = (String) fields.fst;
- String description = (String) fields.snd;
- tagList.add(new Tag(holder, "@" + name, description));
- }
- tags = (Tag[]) tagList.toArray(new Tag[tagList.size()]);
- }
- }
-
- /**
- * Returns an array of tags with text and inline.
- *
- * @param holder
- * @param s
- * @see See Tags for a Doc comment.
- */
- public static Tag[] makeTags(Symbol holder, String s) {
- final List tagList = new LinkedList();
- Pattern p = Pattern.compile("\\{@([^\\}]*)\\}");
- Matcher m = p.matcher(s);
-
- int start = 0;
- while (m.find()) {
- String txt = s.substring(start, m.start());
- if (!txt.equals(""))
- tagList.add(new Tag(holder, "@text", txt));
- Pair fields = Tag.split(m.group(1));
- String name = (String) fields.fst;
- String description = (String) fields.snd;
- tagList.add(new Tag(holder, "@" + name, description));
- start = m.end();
- }
- String txt = s.substring(start, s.length());
- if (!txt.equals(""))
- tagList.add(new Tag(holder, "@text", txt));
- return (Tag[]) tagList.toArray(new Tag[tagList.size()]);
- }
-
- /**
- * Returns the first sentence of this comment.
- */
- public String firstSentence() {
- Pattern p = Pattern.compile("\\.(\\s)");
- Matcher m = p.matcher(text);
- if (m.find()) {
- return text.substring(0, m.start(1));;
- } else
- return text;
- }
-
- // Implementation methods for the SAX error handler.
-
- public void warning(SAXParseException e) {
- //showHtmlError(e);
- }
-
- public void error(SAXParseException e) {
- showHtmlError(e);
- }
-
- public void fatalError(SAXParseException e) {
- showHtmlError(e);
- }
-
- void showHtmlError(SAXParseException e) {
- String msg = "";
- msg += "documentation comments should be written in XHTML" + "\n";
- msg += e.getMessage() + "\n";
- msg += rawText;
- if (unit != null)
- unit.warning(holder.pos, msg);
- }
-
-}
-
-public class HTMLValidator {
-
- /** The URL of the file containing the DTD. */
- String dtd;
-
- /** HTML parser. */
- XMLReader xmlReader;
-
- public HTMLValidator(String dtd) {
- this.dtd = dtd;
- // parser
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- factory.setValidating(true);
- factory.setNamespaceAware(true);
- SAXParser saxParser = factory.newSAXParser();
- xmlReader = saxParser.getXMLReader();
- }
- catch(ParserConfigurationException e) { System.err.println(e.toString()); }
- catch(SAXException e) { System.err.println(e.toString()); }
- }
-
- public String makeDoc(String s) {
- String doc = "";
- // specify the DTD
- doc += "<?xml version=\"1.0\"?>" + "\n";
- doc += "<!DOCTYPE html SYSTEM \"" + dtd + "\">" + "\n";
- // enclose the string into a valid HTML skeletton
- doc += "<html><head><title>notitle</title></head><body>" + "\n";
- doc += s + "\n";
- doc += "</body></html>" + "\n";
- return doc;
- }
-
- public void validate(String s, ErrorHandler errorHandler) {
- // source to parse
- String doc = makeDoc(s);
- InputSource source = new InputSource(new StringReader(doc));
- try {
- xmlReader.setErrorHandler(errorHandler);
- xmlReader.parse(source);
- }
- catch(SAXException e) { }
- catch(Exception e) { System.err.println(e.toString()); }
- }
-}
-
diff --git a/sources/scala/tools/scaladoc/DocModule.java b/sources/scala/tools/scaladoc/DocModule.java
deleted file mode 100644
index 7a55a4b9bb..0000000000
--- a/sources/scala/tools/scaladoc/DocModule.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import ch.epfl.lamp.util.Position;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import scalac.Global;
-import scalac.util.Debug;
-import scalac.util.Reporter;
-
-/**
- * This class is used to dynamically load a documentation module.
- */
-public class DocModule {
-
- /** Name of the method to be called (convention).
- */
- protected static final String METHOD_NAME = "apply";
-
- /**
- * Complete the given path with standard class paths.
- *
- * @param path
- */
- public static String completePath(String path) {
- String completePath = path;
- String path1 = System.getProperty("env.class.path");
- String path2 = System.getProperty("java.class.path");
- if (path1 != null)
- completePath += File.pathSeparator + path1;
- if (path2 != null)
- completePath += File.pathSeparator + path2;
- return completePath;
- }
-
- /**
- * Get class loader from a given path.
- *
- * @param path
- */
- public static ClassLoader getClassLoader(String path) {
- List urlList = new LinkedList();
- StringTokenizer st = new StringTokenizer(path, File.pathSeparator);
- try {
- while (st.hasMoreTokens())
- urlList.add(new File(st.nextToken()).toURI().toURL());
- } catch(java.net.MalformedURLException e) {
- throw Debug.abort(e);
- }
- URL[] urls = (URL[]) urlList.toArray(new URL[urlList.size()]);
- return new URLClassLoader(urls);
- }
-
- /**
- * Loads the class with the specified name.
- *
- * @param className the name of the class
- * @param classLoader the class loader responsible for loading the class
- * @return the resulting <code>Class</code> object
- */
- public static Class getClass(String className, ClassLoader classLoader) {
- Class cls = null;
- try {
- cls = classLoader.loadClass(className);
- } catch (ClassNotFoundException exc) {
- throw Debug.abort("Class not found", className);
- }
- return cls;
- }
-
- /**
- * Get the method.
- *
- * @param methodName the name of the method
- * @param cls the class containing the method
- * @return the resulting <code>Method</code> object
- */
- public static Method getMethod(String methodName, Class cls) {
- Method meth = null;
- try {
- meth = cls.getMethod(methodName,
- new Class[] { Class.forName("scalac.Global") });
- } catch (Exception e) {
- throw Debug.abort(e);
- }
- return meth;
- }
-
- /**
- * ..
- *
- * @param global
- */
- public static void apply(Global global) {
- assert global.args instanceof HTMLGeneratorCommand;
- HTMLGeneratorCommand args = (HTMLGeneratorCommand) global.args;
-
- // complete path
- String path = completePath(args.docmodulePath.value);
- // class loader
- ClassLoader classLoader = getClassLoader(args.docmodulePath.value);
- // module class
- Class cls = getClass(args.docmodule.value, classLoader);
- // method
- Method meth = getMethod(METHOD_NAME, cls);
- // call method
- Thread.currentThread().setContextClassLoader(classLoader);
- try {
- meth.invoke(null, new Object[] { global });
- } catch (Exception e) {
- throw Debug.abort(e);
- }
- }
-
-}
diff --git a/sources/scala/tools/scaladoc/HTMLGenerator.java b/sources/scala/tools/scaladoc/HTMLGenerator.java
deleted file mode 100644
index 80a49184f4..0000000000
--- a/sources/scala/tools/scaladoc/HTMLGenerator.java
+++ /dev/null
@@ -1,2145 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scala.tools.scaladoc;
-
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.StringWriter;
-import java.io.Reader;
-import java.io.InputStreamReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Stack;
-import java.util.regex.*;
-
-import ch.epfl.lamp.util.XMLAttribute;
-import ch.epfl.lamp.util.HTMLPrinter;
-import ch.epfl.lamp.util.HTMLRepresentation;
-import ch.epfl.lamp.util.Pair;
-import ch.epfl.lamp.util.XHTMLPrinter;
-
-import scala.tools.util.Position;
-
-import scalac.Global;
-import scalac.CompilationUnit;
-import scalac.symtab.Kinds;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.symtab.Type.*;
-import scalac.symtab.SymbolTablePrinter;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Strings;
-import SymbolBooleanFunction;
-import scalac.util.ScalaProgramArgumentParser;
-
-/**
- * The class <code>HTMLGenerator</code> generates
- * the HTML documentation for a given Scala library.
- */
-public abstract class HTMLGenerator {
-
- /*
- * Names of predefined page names and page sections.
- */
- protected final String FRAME_PAGE = "index.html";
- protected final String ROOT_PAGE = Location.ROOT_NAME + ".html";
- protected final String PACKAGE_INDEX_PAGE = "package-index-page.html";
- protected final String HELP_PAGE = "help-page.html";
- protected final String SEARCH_SECTION = "search-section";
- protected final String INDEX_PAGE = "index-page.html";
- protected final String PACKAGE_PAGE = "package-page.html";
-
- /*
- * Names of frames.
- */
- protected final String ROOT_FRAME = "rootFrame";
- protected final String PACKAGES_FRAME = "packagesFrame";
- protected final String CLASSES_FRAME = "classesFrame";
- protected final String SELF_FRAME = "_self";
-
- /**
- * HTML DTD
- */
- protected final String[] HTML_DTD = new String[] { "xhtml1-transitional.dtd",
- "xhtml-lat1.ent",
- "xhtml-special.ent",
- "xhtml-symbol.ent" };
-
- /**
- * HTML validator.
- */
- protected HTMLValidator xhtml;
-
- /*
- * XML attributes.
- */
- protected final XMLAttribute[] ATTRS_DOCTAG =
- new XMLAttribute[]{
- new XMLAttribute("style", "margin-top:10px;")
- };
- protected final XMLAttribute[] ATTRS_ENTITY =
- new XMLAttribute[]{ new XMLAttribute("class", "entity") };
-
- protected final XMLAttribute[] ATTRS_LIST =
- new XMLAttribute[] { new XMLAttribute("class", "list")};
-
- protected final XMLAttribute[] ATTRS_MEMBER =
- new XMLAttribute[]{
- new XMLAttribute("cellpadding", "3"),
- new XMLAttribute("class", "member")
- };
- protected final XMLAttribute[] ATTRS_MEMBER_DETAIL =
- new XMLAttribute[]{
- new XMLAttribute("cellpadding", "3"),
- new XMLAttribute("class", "member-detail")
- };
-
- protected final XMLAttribute[] ATTRS_MEMBER_TITLE =
- new XMLAttribute[]{ new XMLAttribute("class", "member-title") };
-
- protected final XMLAttribute[] ATTRS_MODIFIERS =
- new XMLAttribute[]{
- new XMLAttribute("valign", "top"),
- new XMLAttribute("class", "modifiers")
- };
- protected final XMLAttribute[] ATTRS_NAVIGATION =
- new XMLAttribute[]{ new XMLAttribute("class", "navigation") };
-
- protected final XMLAttribute[] ATTRS_NAVIGATION_LINKS =
- new XMLAttribute[]{
- new XMLAttribute("valign", "top"),
- new XMLAttribute("class", "navigation-links")
- };
- protected final XMLAttribute[] ATTRS_NAVIGATION_ENABLED =
- new XMLAttribute[]{
- new XMLAttribute("class", "navigation-enabled")
- };
- protected final XMLAttribute[] ATTRS_NAVIGATION_SELECTED =
- new XMLAttribute[]{
- new XMLAttribute("class", "navigation-selected")
- };
- protected final XMLAttribute[] ATTRS_NAVIGATION_PRODUCT =
- new XMLAttribute[]{
- new XMLAttribute("align", "right"),
- new XMLAttribute("valign", "top"),
- new XMLAttribute("style", "white-space:nowrap;"),
- new XMLAttribute("rowspan", "2")
- };
- protected final XMLAttribute[] ATTRS_PAGE_TITLE = new XMLAttribute[]{
- new XMLAttribute("class", "page-title")
- };
- protected final XMLAttribute[] ATTRS_SIGNATURE =
- new XMLAttribute[]{ new XMLAttribute("class", "signature") };
-
- protected final XMLAttribute[] ATTRS_TITLE_SUMMARY =
- new XMLAttribute[]{
- new XMLAttribute("colspan", "2"),
- new XMLAttribute("class", "title")
- };
- protected final XMLAttribute[] ATTRS_VALIDATION =
- new XMLAttribute[]{
- new XMLAttribute("style", "margin-top:5px; text-align:center; font-size:9pt;")
- };
-
- /** HTML meta information.
- */
- public static final String PRODUCT =
- System.getProperty("scala.product", "scaladoc");
- public static final String VERSION =
- System.getProperty("scala.version", "unknown version");
- protected final String GENERATOR = PRODUCT + " (" + VERSION + ")";
- protected final SimpleDateFormat df =
- new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");
- protected final XMLAttribute[] ATTRS_META =
- new XMLAttribute[]{ new XMLAttribute("generator", GENERATOR) };
- protected String getGenerator() {
- return "Generated by " + GENERATOR + " on " + df.format(new Date());
- }
-
- /** Global compiler environment.
- */
- protected final Global global;
-
- /** Directory where to put generated HTML pages.
- */
- protected File directory;
-
- /** Comments associated with symbols.
- */
- protected Map/*<Symbol, Comment>*/ comments = new HashMap();
-
- /** The underlying HTML printer.
- */
- public Page page;
-
- /** The current URI.
- */
- protected URI uri;
-
- /**
- * The underlying symbol table printer.
- */
- protected MySymbolTablePrinter symtab;
-
- /**
- * The underlying document representation of the generated documentation.
- */
- protected HTMLRepresentation representation;
-
- /**
- * The command option settings.
- */
- protected String windowtitle;
- protected String doctitle;
- protected String stylesheet;
- protected boolean noindex;
- protected boolean validate;
- protected boolean launchServer;
- protected int port;
-
- /**
- * HTML pages may be generated recursively,
- * so we need to save active printers.
- */
- protected final Stack stack = new Stack();
-
- /**
- * Navigation context.
- */
- private final int ROOT_NAV_CONTEXT = 0; // on the root page
- private final int INDEX_NAV_CONTEXT = 1; // on the index page
- private final int HELP_NAV_CONTEXT = 2; // on the help page
- private final int CONTAINER_NAV_CONTEXT = 3; // on a container page different from the root.
-
- /**
- * Variables used when loading this documentation generator.
- */
- public static final String DEFAULT_DOCTITLE = "";
- public static final String DEFAULT_WINDOWTITLE = "Generated Documentation";
-
- /** Root scope.
- */
- protected final Symbol root;
-
- /** Documented Symbols.
- */
- protected SymbolBooleanFunction isDocumented;
-
- /** ML module factory.
- */
- public abstract TypeIsomorphism newTypeIso(Global global);
-
- /** Page promises.
- */
- public Map/*<String, Promise>*/ promises;
-
- /**
- * Creates a new instance.
- *
- * @param global
- */
- protected HTMLGenerator(Global global) {
- this.global = global;
- this.root = global.definitions.ROOT_CLASS;
- this.uri = Location.makeURI(".");
- this.promises = new HashMap();
-
- assert global.args instanceof HTMLGeneratorCommand;
- HTMLGeneratorCommand args = (HTMLGeneratorCommand) global.args;
- this.representation = new HTMLRepresentation(
- args.doctype.value,
- args.docencoding.value,
- HTMLRepresentation.DEFAULT_DOCLANGUAGE);
- this.windowtitle = args.windowtitle.value;
- this.doctitle = args.doctitle.value;
- this.stylesheet = args.stylesheet.value;
- this.noindex = args.noindex.value;
- this.validate = args.validate.value;
- this.launchServer = args.server.value;
- try {
- this.port = Integer.parseInt(args.port.value);
- }
- catch (NumberFormatException e) {
- this.port = 1280;
- }
- Symbol[] packages = getPackages(args.packages);
- final DocSyms docSyms = new DocSyms(global, packages);
- this.isDocumented = new SymbolBooleanFunction() {
- public boolean apply(Symbol sym) {
- return docSyms.contains(sym) && ScalaSearch.isRelevant(sym)
- && !getComment(sym).containsTag("@ignore");
- }
- };
- }
-
- /**
- * Adapt the URI to the use context. If the usage context is the
- * server, then the URI for the page <code>index.html</code> has
- * the following shape: <pre>pageServlet?page=index.html</pre>. If
- * the usage context is a static page, then the URI is given
- * relative to the given page: <pre>../../index.html</pre>
- */
- public URI adaptURI(URI uri, URI pageUri) {
- if (launchServer)
- return Location.mkURI(PAGE_SERVLET_NAME + "?" +"page=" + uri.getPath() + "#" + uri.getFragment());
- else
- return Location.asSeenFrom(uri, pageUri);
- }
-
- /**
- * Compute the URI for a symbol page. The URI is expressed
- * relatively to the given page.
- */
- protected URI definitionURI(Symbol sym, Page page) {
- URI defUri = Location.getURI(sym);
- return adaptURI(defUri, page.uri);
- }
-
- /**
- * Compute the URI for a symbol page. The URI is expressed
- * relatively to the current page.
- */
- protected URI definitionURI(Symbol sym) {
- return definitionURI(sym, page);
- }
-
- /** Get the list pf packages to be documented.
- */
- protected Symbol[] getPackages(ScalaProgramArgumentParser option) {
- if (option.main != null) {
- Symbol[] packages = new Symbol[option.args.length + 1];
- packages[0] = global.definitions.getModule(option.main);
- for (int i = 0; i < option.args.length; i++)
- packages[i+1] = global.definitions.getModule(option.args[i]);
- return packages;
- }
- else
- return new Symbol[] { root };
- }
-
- /** Get a file writer to a page.
- */
- protected static Writer fileWriter(File rootDirectory, String uri) {
- try {
- File f = new File(rootDirectory, uri);
- f.getParentFile().mkdirs();
- return new BufferedWriter(new FileWriter(f));
- }
- catch (IOException e) {
- throw Debug.abort(e);
- }
- }
-
- /**
- * Open a new documentation page and make it the current page.
- * @param uri URL of the page
- * @param title Title of the page
- */
- protected void createPrinters(Writer writer, URI uri, String title, String destinationFrame) {
- stack.push(page);
- stack.push(symtab);
-
- // Create a new page.
- page = new Page(writer, uri, destinationFrame,
- title, representation,
- adaptURI(Location.mkURI(HTMLPrinter.DEFAULT_STYLESHEET), uri).toString(),
- adaptURI(Location.mkURI(HTMLPrinter.DEFAULT_JAVASCRIPT), uri).toString());
- // Create a printer to print symbols and types.
- symtab = SymbolTablePrinterFactory.makeHTML(this, page, isDocumented);
- page.open();
- }
-
- /**
- * Close the current page.
- */
- protected void closePrinters() {
- //page.close();
- symtab = (MySymbolTablePrinter) stack.pop();
- page = (Page) stack.pop();
- }
-
- /**
- * Check if the outpath is valid.
- */
- private boolean checkOutpath() {
- String text = "Output path \"" + global.outpath + "\" ";
- boolean ok = false;
- try {
- directory = new File(global.outpath);
- if (! directory.exists())
- global.reporter.error(null, text + "does not exist");
- else if (! directory.isDirectory())
- global.reporter.error(null, text + "is not a directory");
- else if (! directory.canWrite())
- global.reporter.error(null, text + "cannot be modified");
- else
- ok = true;
- } catch (NullPointerException e) {
- global.reporter.error(null, e.getMessage());
- }
- return ok;
- }
-
- /**
- * Main function.
- */
- public void apply() {
-
- if (!launchServer) {
- if (! checkOutpath())
- return;
- }
-
- this.xhtml = new HTMLValidator(getResourceURL(HTML_DTD[0]));
-
- // Page with list of packages
- Promise packageIndexPage = new PackageIndexPromise();
- promises.put(packageIndexPage.name(), packageIndexPage);
-
- // Class and object pages
- ScalaSearch.foreach(root,
- new ScalaSearch.SymFun() {
- public void apply(Symbol sym) {
- if (ScalaSearch.isContainer(sym) &&
- isDocumented.apply(sym)) {
- Promise containerPage = new ContainerPromise(sym);
- promises.put(containerPage.name(), containerPage);
- if (sym.isPackage() || sym.isPackageClass()) {
- Promise containerIndexPage = new ContainerIndexPromise(sym);
- promises.put(containerIndexPage.name(), containerIndexPage);
- }
- }
- }
- }
- );
-
- if (!noindex) {
- // Page with index of Scala documented entities
- Promise indexPage = new IndexPromise();
- promises.put(indexPage.name(), indexPage);
- }
-
- // Help page
- Promise helpPage = new HelpPromise();
- promises.put(helpPage.name(), helpPage);
-
- // Frame description page
- Promise framePage = new FramePromise();
- promises.put(framePage.name(), framePage);
-
- // Style sheet
- Promise styleSheetPage = new ResourcePromise(HTMLPrinter.DEFAULT_STYLESHEET, null);
- promises.put(styleSheetPage.name(), styleSheetPage);
-
- // Script
- Promise javaScriptPage = new ResourcePromise(HTMLPrinter.DEFAULT_JAVASCRIPT, null);
- promises.put(javaScriptPage.name(), javaScriptPage);
-
- if (launchServer) {
- // Launch HTTP server
- launchServer();
- }
- else {
- // Generate statically all the pages
- Iterator i = promises.values().iterator();
- while(i.hasNext()) {
- Promise pagePromise = (Promise) i.next();
- Writer writer = fileWriter(directory, pagePromise.name());
- pagePromise.writeOn(writer);
- try {
- writer.close();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- /**
- * Launch the HTTP server.
- */
- protected void launchServer() {
- Servlet pageServlet = new PageServlet();
- Servlet searchServlet = new SearchServlet();
- Servlet[] servlets = new Servlet[]{ pageServlet, searchServlet };
- try {
- HTTPServer webServer = new HTTPServer(directory, port, servlets);
- webServer.start();
- }
- catch (IOException e) {
- System.out.println("Server could not start because of an "
- + e.getClass());
- System.out.println(e);
- }
- // to prevent going to the next phase (implies checking
- // errors when parsing a type after RefCheck)
- try {
- synchronized(this) { wait(); }
- }
- catch(InterruptedException e) {
- System.err.println("Error while waiting.");
- System.exit(0);
- }
- }
-
- /**
- * Returns the comment associated with a given symbol.
- *
- * @param sym
- */
- protected Comment getComment(Symbol sym) {
- Comment comment = (Comment) comments.get(sym);
- if (comment == null) {
- Pair p = (Pair) global.mapSymbolComment.get(sym);
- if (p != null) {
- String s = (String) p.fst;
- CompilationUnit unit = (CompilationUnit) p.snd;
- comment = new Comment(s, sym, unit, xhtml);
- }
- else { // comment inheritance
- Symbol overriden = ScalaSearch.overridenBySymbol(sym);
- if (overriden == Symbol.NONE)
- comment = new Comment(null, sym, null, xhtml);
- else
- comment = getComment(overriden);
- //s = "/** (Inherited comment) " + getComment(overriden).rawText + "*/";
- }
- comments.put(sym, comment);
- }
- return comment;
- }
-
- /**
- * Filters modifiers so that modifiers added by the analyzer are
- * not printed.
- */
- protected String filterModifiers(Symbol sym) {
- int flags = sym.flags;
- if (sym.isPackage() || sym.isPackageClass()) {
- if ((flags & Modifiers.FINAL) != 0)
- flags = flags - Modifiers.FINAL;
- }
- if (sym.isModule()) {
- if ((flags & Modifiers.FINAL) != 0)
- flags = flags - Modifiers.FINAL;
- }
- if (sym.isTrait()) {
- if ((flags & Modifiers.ABSTRACT) != 0)
- flags = flags - Modifiers.ABSTRACT;
- if ((flags & Modifiers.INTERFACE) != 0)
- flags = flags - Modifiers.INTERFACE;
- }
- return Modifiers.Helper.toString(flags);
- }
-
- /**
- * Generates a HTML page for a class or object definition.
- */
- class ContainerPromise extends Promise {
-
- protected Symbol sym;
-
- public ContainerPromise(Symbol sym) {
- this.sym = sym;
- }
-
- public String name() { return Location.getURI(sym).toString(); }
-
- protected void computeIn(Writer writer) {
- String title = Location.getName(sym);
- createPrinters(writer, Location.getURI(sym), title, SELF_FRAME);
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
-
- if (sym.isRoot())
- addNavigationBar(ROOT_NAV_CONTEXT);
- else
- addNavigationBar(CONTAINER_NAV_CONTEXT);
- page.printlnHLine();
-
- addTitle(sym);
- addDocumentationComment(sym);
- page.printlnHLine();
-
- String[] titles = new String[]{ "Field", "Method", "Object",
- "Trait", "Class", "Package" }; // "Constructor"
- String[] inherited = new String[]{ "Fields", "Methods", "Objects",
- "Traits", "Classes", "Packages" };
- Symbol[][] members =
- ScalaSearch.splitMembers(ScalaSearch.members(sym, isDocumented));
- for (int i = 0; i < members.length; i++) {
- addMemberSummary(members[i], titles[i] + " Summary");
- if (i == 1) addInheritedMembers(sym, inherited[i]);
- }
- for (int i = 0; i < titles.length; i++)
- addMemberDetail(members[i], titles[i] + " Detail");
-
- page.printlnHLine();
- if (sym.isRoot())
- addNavigationBar(ROOT_NAV_CONTEXT);
- else
- addNavigationBar(CONTAINER_NAV_CONTEXT);
- if (validate)
- addValidationBar();
-
- page.printFootpage();
- closePrinters();
- }
- }
-
- /**
- * Writes the product name and version to the current page.
- *
- * @param attrs
- */
- protected void addDocumentationTitle(XMLAttribute[] attrs, Page page) {
- page.printlnOTag("div", attrs).indent();
- page.println(doctitle).undent();
- page.printlnCTag("div");
- }
-
- protected void addDocumentationTitle(XMLAttribute[] attrs) {
- addDocumentationTitle(attrs, page);
- }
-
- protected void addSearchSection(Page page) {
- page.printlnOTag("form", new XMLAttribute[] {
- new XMLAttribute("action", "/" + SEARCH_SERVLET_NAME),
- new XMLAttribute("method", "get") }).indent();
-
- page.printlnOTag("table", new XMLAttribute[] {
- new XMLAttribute("border", "0") }).indent();
-
- // Text field
- page.printlnOTag("tr").indent();
- page.printlnOTag("td").indent();
- page.printlnSTag("input", new XMLAttribute[] {
- new XMLAttribute("name", "searchString"),
- new XMLAttribute("id", "word"),
- new XMLAttribute("size", "100%"),
- // new XMLAttribute("maxlength", "30"),
- new XMLAttribute("type", "text"),
- });
- // Button
- page.printlnSTag("input", new XMLAttribute[] {
- new XMLAttribute("type", "submit"),
- new XMLAttribute("value", "Search"),
- }).undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr");
-
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", new XMLAttribute[] {
- new XMLAttribute("align", "center") }).indent();
- // by name
- page.printlnSTag("input", new XMLAttribute[] {
- new XMLAttribute("type", "radio"),
- new XMLAttribute("checked", "true"),
- new XMLAttribute("name", "searchKind"),
- new XMLAttribute("id", "byName"),
- new XMLAttribute("value", "byName")
- });
- page.println("By name");
- // by comment
- page.printlnSTag("input", new XMLAttribute[] {
- new XMLAttribute("type", "radio"),
- new XMLAttribute("name", "searchKind"),
- new XMLAttribute("id", "byComment"),
- new XMLAttribute("value", "byComment")
- });
- page.println("By comment");
- // by type
- page.printlnSTag("input", new XMLAttribute[] {
- new XMLAttribute("type", "radio"),
- new XMLAttribute("name", "searchKind"),
- new XMLAttribute("id", "byType"),
- new XMLAttribute("value", "byType")
- });
- page.println("By type").undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table").undent();
- page.printlnCTag("form");
- }
-
- protected void addSearchSection() {
- addSearchSection(page);
- }
-
- /**
- * Writes the navigation bar to the current page.
- *
- * @param sym
- */
- protected void addNavigationBar(int navigationContext, Page page) {
- try {
- String overviewLink = adaptURI(Location.mkURI(ROOT_PAGE), page.uri).toString();
- String indexLink = adaptURI(Location.mkURI(INDEX_PAGE), page.uri).toString();
- String helpLink = adaptURI(Location.mkURI(HELP_PAGE), page.uri).toString();
-
- page.printlnOTag("table", ATTRS_NAVIGATION).indent();
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", ATTRS_NAVIGATION_LINKS).indent();
- page.printlnOTag("table").indent();
- page.printlnOTag("tr").indent();
-
- // overview link
- if (navigationContext == ROOT_NAV_CONTEXT)
- page.printlnTag("td", ATTRS_NAVIGATION_SELECTED, "Overview");
- else {
- page.printOTag("td", ATTRS_NAVIGATION_ENABLED);
- page.printAhref(overviewLink, SELF_FRAME, "Overview");
- page.printlnCTag("td");
- }
- // index link
- if (navigationContext == INDEX_NAV_CONTEXT)
- page.printlnTag("td", ATTRS_NAVIGATION_SELECTED, "Index");
- else {
- page.printOTag("td", ATTRS_NAVIGATION_ENABLED);
- page.printAhref(indexLink, SELF_FRAME, "Index");
- page.printlnCTag("td");
- }
- // help link
- if (navigationContext == HELP_NAV_CONTEXT)
- page.printlnTag("td", ATTRS_NAVIGATION_SELECTED, "Help");
- else {
- page.printOTag("td", ATTRS_NAVIGATION_ENABLED);
- page.printAhref(helpLink, SELF_FRAME, "Help");
- page.printlnCTag("td");
- }
-
- page.undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table").undent();
- page.printlnCTag("td");
-
- // product & version
- page.printlnOTag("td", ATTRS_NAVIGATION_PRODUCT).indent();
- addDocumentationTitle(new XMLAttribute[]{
- new XMLAttribute("class", "doctitle")}, page);
- page.undent();
- page.printlnCTag("td").undent();
-
- page.printlnCTag("tr");
-
- page.printlnOTag("tr").indent();
- page.printlnTag("td", "&nbsp;").undent();
- page.printlnCTag("tr").undent();
- if (launchServer) {
- page.printlnOTag("tr").indent();
- addSearchSection(page);
- page.undent();
- page.printlnCTag("tr");
- }
- page.printlnCTag("table");
- } catch(Exception e) { throw Debug.abort(e); }
- }
-
- protected void addNavigationBar(int navigationContext) {
- addNavigationBar(navigationContext, page);
- }
-
- /**
- * Writes the validation bar to the current page.
- */
- protected void addValidationBar() {
- page.printlnOTag("div", ATTRS_VALIDATION);
- page.indent();
- page.printlnAhref(
- "http://validator.w3.org/check/referer", SELF_FRAME,
- "validate html");
- page.undent();
- page.printlnCTag("div");
- }
-
- /**
- * Writes the signature of the class or object to the current page.
- *
- * @param sym
- */
- protected void addTitle(Symbol sym) {
- if (sym.isRoot()) {
- page.printlnOTag("div", ATTRS_PAGE_TITLE).indent();
- page.println(doctitle.replaceAll("<.*>", " "));
- page.printlnSTag("br");
- page.println("API Specification").undent();
- page.printlnCTag("div");
- page.println("This document is the API specification for "
- + doctitle.replaceAll("<.*>", " ") + ".");
- page.printlnSTag("p");
- } else {
- // in
- page.print("in ");
- printPath(sym.owner(), SELF_FRAME);
-
- // kind and name
- page.printlnOTag("div", ATTRS_ENTITY).indent();
- page.print(symtab.getSymbolKeywordForDoc(sym) + " ");
- page.printlnTag("span", ATTRS_ENTITY, sym.nameString()).undent();
- page.printlnCTag("div");
- page.printlnHLine();
-
- // complete signature
- // !!! page.println(printer().printTemplateHtmlSignature(sym, false).toString());
- printTemplateHtmlSignature(sym, false);
-
- // implementing classes or modules
- // Maps classes to their direct implementing classes or modules
- Map subs = ScalaSearch.subTemplates(root, isDocumented);
-
- if (sym.isClass()) {
- List subList = (List) subs.get(sym);
- if (subList != null && subList.size() != 0) {
- page.printlnOTag("dl").indent();
- page.printlnOTag("dt");
- page.printlnBold("Implementing classes or objects:");
- page.printlnCTag("dt");
- Iterator it = subList.iterator();
- while (it.hasNext()) {
- Pair p = (Pair) it.next();
- Symbol sub = (Symbol) p.fst;
- Type tipe = (Type) p.snd;
- page.printlnOTag("dd");
-
- symtab.defString(sub, true /*addLink*/);
- if (sub.owner() != sym.owner()) {
- page.print(" in ");
- printPath(sub.owner(), SELF_FRAME);
- }
- page.printlnCTag("dd");
- }
- page.undent();
- page.printlnCTag("dl");
- }
- }
- }
- }
-
- /**
- * Writes a documentation comment to the current page.
- *
- * @param sym
- */
- protected void addDocumentationComment(Symbol sym) {
- Comment comment = getComment(sym);
- if (!comment.isEmpty()) {
- page.printlnHLine();
- addComments(comment);
- }
- }
-
- /**
- * Writes a sorted list of all members with a short summary
- * for each one.
- *
- * @param members
- * @param title
- */
- protected void addMemberSummary(Symbol[] members, String title) {
- if (members.length > 0) {
- Symbol[] sortedMembers = new Symbol[members.length];
- for (int i = 0; i < members.length; i++) {
- assert members[i] != null : "HA ENFIN !";
- sortedMembers[i] = members[i];
- }
- Arrays.sort(sortedMembers, ScalaSearch.symAlphaOrder);
-
- // open table
- page.printlnOTag("table", ATTRS_MEMBER).indent();
-
- // title
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", ATTRS_TITLE_SUMMARY).indent();
- page.println(title).undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr");
-
- // members
- for (int i = 0; i < members.length; i++)
- addMemberSummary(sortedMembers[i]);
-
- // close table
- page.undent();
- page.printlnCTag("table");
- page.printlnSTag("br");
- }
- }
-
- /**
- * Writes the summary of a member symbol to the current page.
- *
- * @param sym
- */
- protected void addMemberSummary(Symbol sym) {
- page.printlnOTag("tr").indent();
-
- // modifiers
- String mods = filterModifiers(sym);
- page.printlnOTag("td", ATTRS_MODIFIERS).indent();
- if (mods.length() > 0)
- page.printlnTag("code", mods);
- else
- page.printlnNbsp(1);
- page.undent();
- page.printlnCTag("td");
-
- // signature
- page.printlnOTag("td", ATTRS_SIGNATURE).indent();
- page.printOTag("code");
- symtab.defString(sym, true /*addLink*/);
- page.printlnCTag("code");
-
- // short description
- String firstSentence = firstSentence(getComment(sym));
- if (! firstSentence.equals("")) {
- page.printlnSTag("br");
- page.printNbsp(4);
- page.println(firstSentence);
- }
- page.undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr");
- }
-
- /**
- * Adds a list of all members with all details.
- *
- * @param members
- */
- protected void addMemberDetail(Symbol[] members, String title) {
- boolean first = true;
- for (int i = 0; i < members.length; i++) {
- Symbol sym = members[i];
- if (!ScalaSearch.isContainer(sym)) {
- if (first) {
- page.printlnOTag("table", ATTRS_MEMBER_DETAIL).indent();
- page.printlnOTag("tr").indent();
- page.printlnTag("td", ATTRS_MEMBER_TITLE, title).undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table");
- first = false;
- } else
- page.printlnHLine();
- addMemberDetail(sym);
- }
- }
- }
-
- /**
- * Writes the detail of a member symbol to the page, but create
- * instead a separate page for a class or an object.
- *
- * @param sym
- */
- protected void addMemberDetail(Symbol sym) {
- // title with label
- // page.printlnAname(Page.asSeenFrom(Location.getURI(sym), uri).getFragment(), "");
- page.printlnAname(Location.getURI(sym).getFragment(), "");
- page.printTag("h3", sym.nameString());
-
- // signature
- page.printlnOTag("pre");
- String mods = filterModifiers(sym);
- // String mods = Modifiers.Helper.toString(sym.flags);
- if (mods.length() > 0) page.print(mods + " ");
- symtab.printSignature(sym, false /*addLink*/);
- page.printlnCTag("pre");
-
- // comment
- addComments(getComment(sym));
- }
-
- /**
- * Add for each "strict" base type of this class or object symbol
- * the members that are inherited by this class or object.
- *
- * @param sym
- */
- protected void addInheritedMembers(Symbol sym, String inheritedMembers) {
- Symbol[] syms = ScalaSearch.collectMembers(sym);
- Pair grouped = ScalaSearch.groupSymbols(syms);
- Symbol[] owners = (Symbol[]) grouped.fst;
- Map/*<Symbol, Symbol[]>*/ group = (Map) grouped.snd;
- for (int i = 0; i < owners.length; i++) {
- if (owners[i] != (sym.isModule() ? sym.moduleClass() : sym)) {
- page.printlnOTag("table", ATTRS_MEMBER).indent();
-
- // owner
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", new XMLAttribute[]{
- new XMLAttribute("class", "inherited-owner")}).indent();
- page.print(inheritedMembers + " inherited from ");
- printPath(owners[i], SELF_FRAME);
- page.undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr");
-
- // members
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", new XMLAttribute[]{
- new XMLAttribute("class", "inherited-members")}).indent();
- Symbol[] members = (Symbol[]) group.get(owners[i]);
- for (int j = 0; j < members.length; j++) {
- if (j > 0) page.print(", ");
- symtab.printSymbol(members[j], true);
- }
- page.undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table");
- page.printlnSTag("br");
- }
- }
- }
-
- /**
- * Prints the signature of a class symbol.
- *
- * @param symbol
- * @param addLink
- */
- public void printTemplateHtmlSignature(Symbol symbol, boolean addLink) {
- // modifiers
- String mods = filterModifiers(symbol);
- // String mods = Modifiers.Helper.toString(symbol.flags);
- page.printlnOTag("dl");
- page.printlnOTag("dt");
- symtab.print(mods).space();
-
- // kind
- String keyword = symtab.getSymbolKeywordForDoc(symbol);
- if (keyword != null) symtab.print(keyword).space();
- String inner = symtab.getSymbolInnerString(symbol);
-
- // name
- symtab.printDefinedSymbolName(symbol, addLink);
- if (symbol.isClass()) {
- // type parameters
- Symbol[] tparams = symbol.typeParams();
- if (tparams.length != 0 || global.debug) {
- symtab.print('[');
- for (int i = 0; i < tparams.length; i++) {
- if (i > 0) symtab.print(",");
- symtab.printSignature(tparams[i], false);
- }
- symtab.print(']');
- }
- // value parameters
- symtab.printValueParams(symbol.valueParams());
- }
-
- // parents
- Type[] parts = (symbol.isModule() ? symbol.moduleClass() : symbol).parents();
- page.printlnCTag("dt");
- for (int i = 0; i < parts.length; i++) {
- page.printOTag("dd");
- symtab.print((i == 0) ? "extends " : "with ");
- symtab.printType(parts[i]);
- page.printlnCTag("dd");
- }
- page.printCTag("dl");
- }
-
- /**
- * Creates the page describing the different frames.
- *
- * @param title The page title
- */
- class FramePromise extends Promise {
-
- public String name() { return FRAME_PAGE; }
-
- protected void computeIn(Writer writer) {
- createPrinters(writer, Location.makeURI(FRAME_PAGE), windowtitle, "");
- page.printHeader(ATTRS_META, getGenerator());
-
- page.printlnOTag("frameset", new XMLAttribute[] {
- new XMLAttribute("cols", "25%, 75%")}).indent();
- page.printlnOTag("frameset", new XMLAttribute[] {
- new XMLAttribute("rows", "50%, 50%")}).indent();
-
- page.printlnOTag("frame", new XMLAttribute[] {
- new XMLAttribute("src", adaptURI(Location.mkURI(PACKAGE_INDEX_PAGE), page.uri).toString()),
- new XMLAttribute("name", PACKAGES_FRAME)});
- page.printlnOTag("frame", new XMLAttribute[] {
- new XMLAttribute("src", adaptURI(Location.mkURI(PACKAGE_PAGE), page.uri).toString()),
- new XMLAttribute("name", CLASSES_FRAME)}).undent();
- page.printlnCTag("frameset");
- page.printlnOTag("frame", new XMLAttribute[] {
- new XMLAttribute("src", adaptURI(Location.mkURI(ROOT_PAGE), page.uri).toString()),
- new XMLAttribute("name", ROOT_FRAME)});
-
- page.printlnOTag("noframes").indent();
- page.printlnSTag("p");
- page.print("Here is the ");
- page.printAhref(adaptURI(Location.mkURI(ROOT_PAGE), page.uri).toString(),
- "non-frame based version");
- page.println(" of the documentation.").undent();
- page.printlnCTag("noframes").undent();
-
- page.printlnCTag("frameset");
- page.printlnCTag("html");
-
- closePrinters();
- }
- }
-
- /**
- * Get the URL (as a string) of a resource located in the
- * directory "resources" relative to the classfile of this class.
- */
- protected String getResourceURL(String name) {
- String rsc = HTMLGenerator.class
- .getResource("resources/" + name)
- .toString();
- return rsc;
- }
-
- /**
- * Generates a resource file.
- *
- * @param name The name of the resource file
- */
- class ResourcePromise extends Promise {
-
- protected String name;
-
- protected String dir;
-
- ResourcePromise(String name, String dir) {
- this.name = name;
- this.dir = dir;
- }
-
- public String name() { return name; }
-
- protected void computeIn(Writer writer) {
- String rsrcName = "resources/" + name;
- Reader reader = new InputStreamReader(HTMLGenerator.class.getResourceAsStream(rsrcName));
- if (reader == null)
- throw Debug.abort("Resource file \"" + rsrcName + "\" not found");
- try {
- char[] buf = new char[1024];
- int len;
- while (true) {
- len = reader.read(buf, 0, buf.length);
- if (len <= 0) break;
- writer.write(buf, 0, len);
- }
-
- reader.close();
- // writer.close();
- } catch (IOException exception) {
- throw Debug.abort(exception); // !!! reporting an error would be wiser
- }
- }
- }
-
- private String removeHtmlSuffix(String url) {
- return url.substring(0, url.length() - 5);
- }
-
- /** Returns the summary page attached to a package symbol. */
- private String packageSummaryPage(Symbol sym) {
- if (sym.isRoot())
- return PACKAGE_PAGE;
- else {
- String packagePage = Location.getURI(sym).toString();
- // !!! separator character in URI paths is '/'
- return removeHtmlSuffix(packagePage) + "/" + PACKAGE_PAGE;
- }
- }
-
- /**
- * Writes a table containing a list of packages to the current page.
- *
- * @param syms The package list
- * @param title The title of the package list
- */
- private void printPackagesTable(Symbol[] syms, String title) {
- if (syms.length > 0) {
- page.printlnBold(title);
- page.printlnOTag("table", ATTRS_LIST).indent();
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", new XMLAttribute[] {
- new XMLAttribute("style", "white-space:nowrap;")}).indent();
- for (int i = 1; i < syms.length; i++) {
- Symbol sym = syms[i];
- page.printAhref(
- adaptURI(Location.mkURI(packageSummaryPage(sym)), page.uri).toString(),
- CLASSES_FRAME,
- removeHtmlSuffix(Location.getURI(sym).toString()));
- page.printlnSTag("br");
- }
- page.undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table");
- page.printlnSTag("p");
- }
- }
-
- /**
- * Writes a table containing a list of symbols to the current page.
- *
- * @param syms
- * @param title
- */
- private void addSymbolTable(Symbol[] syms, String title, boolean useFullName) {
- if (syms.length > 0) {
- page.printlnBold(title);
- page.printlnOTag("table", ATTRS_LIST).indent();
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", new XMLAttribute[] {
- new XMLAttribute("style", "white-space:nowrap;")}).indent();
- for (int i = 0; i < syms.length; i++) {
- Symbol sym = syms[i];
- if (! sym.isRoot()) {
- String name = sym.nameString();
- if (sym.isPackage() || sym.isPackageClass())
- page.printAhref(definitionURI(sym).toString(), CLASSES_FRAME, name);
- else {
- Symbol user = (useFullName) ? global.definitions.ROOT_CLASS : Symbol.NONE;
- page.printAhref(definitionURI(sym).toString(), ROOT_FRAME, name);
- }
- page.printlnSTag("br");
- }
- }
- page.undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table");
- page.printlnSTag("p");
- }
- }
-
- /**
- * Creates a page with the list of packages.
- *
- * @param title
- */
- class PackageIndexPromise extends Promise {
-
- public String name() { return PACKAGE_INDEX_PAGE; }
-
- protected void computeIn(Writer writer) {
- createPrinters(writer, Location.makeURI(PACKAGE_INDEX_PAGE), "List of packages", CLASSES_FRAME);
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
-
- Symbol[] packages = ScalaSearch.getSortedPackageList(root, isDocumented);
-
- addDocumentationTitle(new XMLAttribute[]{
- new XMLAttribute("class", "doctitle-larger")});
- page.printAhref(adaptURI(Location.mkURI(PACKAGE_PAGE), page.uri).toString(),
- CLASSES_FRAME, "All objects, traits and classes");
- page.printlnSTag("p");
- printPackagesTable(packages, "Packages");
- if (validate)
- addValidationBar();
-
- page.printFootpage();
- closePrinters();
- }
- }
-
- /**
- * Creates a page with a list of classes or objects.
- *
- * @param sym
- */
- class ContainerIndexPromise extends Promise {
-
- protected Symbol sym;
-
- ContainerIndexPromise(Symbol sym) {
- this.sym = sym;
- }
-
- public String name() { return packageSummaryPage(sym); }
-
- protected void computeIn(Writer writer) {
- createPrinters(writer, Location.makeURI(packageSummaryPage(sym)), Location.getName(sym), ROOT_FRAME);
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
-
- page.printlnOTag("table", ATTRS_NAVIGATION).indent();
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", ATTRS_NAVIGATION_LINKS).indent();
- printPath(sym, ROOT_FRAME);
- page.printlnCTag("td");
- page.printlnCTag("tr");
- page.printlnCTag("table");
- page.printlnSTag("p");
-
- String[] titles = new String[]{ "Objects", "Traits", "Classes" };
- if (sym.isRoot()) {
- Symbol[][] members = ScalaSearch.getSubContainerMembers(root, isDocumented);
- for (int i = 0; i < titles.length; i++)
- addSymbolTable(members[i], "All " + titles[i], true);
- } else {
- Symbol[][] members = ScalaSearch.splitMembers(ScalaSearch.members(sym, isDocumented));
- for (int i = 0; i < titles.length; i++) {
- Arrays.sort(members[i + 2], ScalaSearch.symAlphaOrder);
- addSymbolTable(members[i + 2], titles[i], false);
- }
- }
-
- if (validate)
- addValidationBar();
-
- page.printFootpage();
- closePrinters();
- }
- }
-
- /**
- * Creates the index page.
- *
- * @param title The page title
- */
- class IndexPromise extends Promise {
-
- public String name() { return INDEX_PAGE; }
-
- protected void computeIn(Writer writer) {
- String title = "Scala Library Index";
- createPrinters(writer, Location.makeURI(INDEX_PAGE), title, SELF_FRAME);
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
-
- addNavigationBar(INDEX_NAV_CONTEXT);
- page.printlnHLine();
-
- page.printlnOTag("table", ATTRS_MEMBER).indent();
- page.printlnOTag("tr").indent();
- page.printlnOTag("td", ATTRS_MEMBER_TITLE).indent();
- page.println("Index").undent();
- page.printlnCTag("td").undent();
- page.printlnCTag("tr").undent();
- page.printlnCTag("table");
- page.printlnSTag("br");
-
- Pair index = ScalaSearch.index(root, isDocumented);
- Character[] chars = (Character[]) index.fst;
- Map map = (Map) index.snd;
- for (int i = 0; i < chars.length; i++)
- page.printlnAhref("#" + i, SELF_FRAME, HTMLPrinter.encode(chars[i]));
- page.printlnHLine();
- for (int i = 0; i < chars.length; i++) {
- Character car = chars[i];
- page.printlnAname(String.valueOf(i), "");
- page.printlnOTag("h2");
- page.printBold(HTMLPrinter.encode(car));
- page.printlnCTag("h2");
- page.printlnOTag("dl").indent();
- Symbol[] syms = (Symbol[]) map.get(car);
- for (int j = 0; j < syms.length; j++) {
- page.printOTag("dt");
- addIndexEntry(syms[j]);
- page.printlnCTag("dt");
- page.printlnTag("dd", firstSentence(getComment(syms[j])));
- }
- page.undent().printlnCTag("dl");
- }
-
- page.printlnHLine();
- addNavigationBar(INDEX_NAV_CONTEXT);
- if (validate)
- addValidationBar();
-
- page.printFootpage();
- closePrinters();
- }
- }
-
- /**
- * Creates the help page.
- *
- * @param title The page title
- */
- class HelpPromise extends Promise {
-
- public String name() { return HELP_PAGE; }
-
- protected void computeIn(Writer writer) {
- String title = "API Help";
- createPrinters(writer, Location.makeURI(HELP_PAGE), title, ROOT_PAGE);
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
-
- addNavigationBar(HELP_NAV_CONTEXT);
- page.printlnHLine();
-
- XMLAttribute[] h3 = new XMLAttribute[]{
- new XMLAttribute("style", "margin:15px 0px 0px 0px; "
- + "font-size:large; font-weight: bold;")
- };
- XMLAttribute[] em = new XMLAttribute[]{
- new XMLAttribute("style", "margin:15px 0px 15px 0px; "
- + "font-size:small; font-style: italic;")
- };
- page.printlnTag("div", ATTRS_PAGE_TITLE, "How This API Document Is Organized");
- page.println("This API (Application Programming Interface) document "
- + "has pages corresponding to the items in the navigation bar, "
- + "described as follows.");
-
- page.printlnTag("div", h3, "Overview");
- page.printlnOTag("blockquote").indent();
- page.print("The ");
- page.printAhref(adaptURI(Location.mkURI(ROOT_PAGE), page.uri).toString(), SELF_FRAME, "Overview");
- page.println(" page is the front page of this API document and "
- + "provides a list of all top-level packages, classes, traits "
- + "and objects with a summary for each. "
- + "This page can also contain an overall description of the "
- + "set of packages.").undent();
- page.printlnCTag("blockquote");
-
- page.printlnTag("div", h3, "Package");
- page.printlnOTag("blockquote").indent();
- page.println("Each package has a page that contains a list of "
- + "its objects, traits and classes, with a summary for each. "
- + "This page can contain three categories:");
- page.printlnOTag("ul").indent();
- page.printlnTag("li", "Objects");
- page.printlnTag("li", "Traits");
- page.printlnTag("li", "Classes").undent();
- page.printlnCTag("ul").undent();
- page.printlnCTag("blockquote");
-
- page.printlnTag("div", h3, "Object/Trait/Class");
- page.printlnOTag("blockquote").indent();
- page.println("Each object, trait, class, nested object, nested "
- + "trait and nested class has its own separate page. Each "
- + "of these pages has three sections consisting of a object"
- + "/trait/class description, summary tables, and detailed "
- + "member descriptions:");
- page.printlnOTag("ul").indent();
- page.printlnTag("li", "Class inheritance diagram");
- page.printlnTag("li", "Direct Subclasses");
- page.printlnTag("li", "All Known Subinterfaces");
- page.printlnTag("li", "All Known Implementing Classes");
- page.printlnTag("li", "Class/interface declaration");
- page.printlnTag("li", "Class/interface description<p/>");
- page.printlnTag("li", "Nested Class Summary");
- page.printlnTag("li", "Field Summary");
- page.printlnTag("li", "Constructor Summary");
- page.printlnTag("li", "Method Summary<p/>");
- page.printlnTag("li", "Field Detail");
- page.printlnTag("li", "Constructor Detail");
- page.printlnTag("li", "Method Detail").undent();
- page.printlnCTag("ul").undent();
- page.println("Each summary entry contains the first sentence from "
- + "the detailed description for that item. The summary entries "
- + "are alphabetical, while the detailed descriptions are in "
- + "the order they appear in the source code. This preserves "
- + "the logical groupings established by the programmer.");
- page.printlnCTag("blockquote");
-
-
- page.printlnTag("div", h3, "Index");
- page.printlnOTag("blockquote").indent();
- page.print("The ");
- page.printAhref(adaptURI(Location.mkURI(INDEX_PAGE), page.uri).toString(), SELF_FRAME, "Index");
- page.print(" contains an alphabetic list of all classes, interfaces, "
- + "constructors, methods, and fields.");
- page.printlnCTag("blockquote");
-
- if (launchServer) {
- page.printlnTag("div", h3, "Searching a definition");
- page.printlnOTag("blockquote").indent();
- page.printlnSTag("a",
- new XMLAttribute[] {
- new XMLAttribute("name", SEARCH_SECTION) });
- page.printlnOTag("p");
- page.println("At the top and and at the bottom of each page, there is a form that "
- + "allows to search the definition of a <em>symbol</em> (field, method, "
- + "package, object, type, trait or class).");
- page.printlnCTag("p");
-
- page.printlnOTag("p");
- page.println("There are three ways of specifying the symbols of interest:");
- page.printlnOTag("dl");
- page.printOTag("dt");
- page.printlnTag("b", "By name");
- page.printOTag("dd");
- page.println("The search string must be a ");
- page.printlnTag("a",
- new XMLAttribute[] {
- new XMLAttribute("href",
- "http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html") },
- "regular expression");
- page.print(" that has to match a substring in the name of the searched symbol.");
- page.printOTag("dt");
- page.printlnTag("b", "By comment");
- page.printOTag("dd");
- page.println("The search string must be a ");
- page.printlnTag("a",
- new XMLAttribute[] {
- new XMLAttribute("href",
- "http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html") },
- "regular expression");
- page.print(" that has to match a substring in the comments associated to the searched symbol.");
- page.printOTag("dt");
- page.printlnTag("b", "By type");
- page.printOTag("dd");
- page.println("The search string must represent a Scala type. Any string ");
- page.printlnTag("code", "S");
- page.println(" such that ");
- page.printlnTag("pre", "def foo S;");
- page.println(" is a valid function definition is accepted. Here are some examples:");
- page.printlnOTag("ul");
- page.printOTag("li");
- page.printlnTag("code", ": int => int");
- page.printOTag("li");
- page.printlnTag("code", "[a,b]: List[a] => (a => b) => List[b]");
- page.printOTag("li");
- page.printlnTag("code", "(x: int, y: int): unit");
- page.printlnCTag("ul");
- page.println("The searched symbols must conform to the entered type modulo ");
- page.printlnTag("a",
- new XMLAttribute[] {
- new XMLAttribute("href",
- "http://www.pps.jussieu.fr/~dicosmo/Publications/ISObook.html") },
- "type isomorphism");
- page.println(". This concept allows to unify types that differ by their exact "
- + "representation but not by their meaning. The order of parameters is "
- + "for instance irrelevant when looking for a function. Note finally that "
- + "methods of classes are interpreted as functions that would take an "
- + "extra argument of the type of the class.");
- page.printlnCTag("dl");
- page.printlnCTag("p");
- page.printlnCTag("blockquote");
- }
-
- page.printlnOTag("div", em);
- page.println("This help file applies to API documentation generated "
- + "using the standard doclet.");
- page.printlnCTag("div");
-
- page.printlnHLine();
- addNavigationBar(HELP_NAV_CONTEXT);
- if (validate)
- addValidationBar();
-
- page.printFootpage();
- closePrinters();
- }
- }
-
- /**
- * Adds to the current page an hyperlinked path leading to a given
- * symbol (including itself).
- */
- protected void printPath(Symbol sym, String destinationFrame, Page page) {
- String name = removeHtmlSuffix(Location.getURI(sym).toString());
- if (isDocumented.apply(sym)) {
- String target = definitionURI(sym, page).toString();
- page.printlnAhref(target, destinationFrame, name);
- }
- else
- page.println(name);
- }
-
- protected void printPath(Symbol sym, String destinationFrame) {
- printPath(sym, destinationFrame, page);
- }
-
- /**
- * Writes the string representation of a symbol entry in the index.
- *
- * @param symbol
- */
- protected void addIndexEntry(Symbol symbol, Page page, MySymbolTablePrinter symtab) {
- // kind
- String keyword = symtab.getSymbolKeywordForDoc(symbol);
-
- if (keyword != null) page.print(keyword).space();
- // name
- symtab.printDefinedSymbolName(symbol, true);
- // owner
- if (!symbol.isRoot()) {
- page.print(" in ");
- printPath(symbol.owner(), SELF_FRAME, page);
- }
- }
-
- protected void addIndexEntry(Symbol symbol) {
- addIndexEntry(symbol, page, symtab);
- }
-
- /**
- * Writes documentation comments to the current page.
- *
- * @param comment
- */
- protected void addComments(Comment comment) {
- if (!comment.isEmpty()) {
- page.printlnOTag("dl").indent();
- // text with inlined links
- page.printlnTag("dd", inlineLinkTags(comment.holder, comment.text));
- page.undent().printlnCTag("dl");
-
- // tags
- addTags(comment.tags);
- }
- }
-
- /** Inline all the {@link ...} tags inside the text.
- */
- protected String inlineLinkTags(Symbol holder, String text) {
- StringBuffer buff = new StringBuffer();
- Tag[] tags = Comment.makeTags(holder, text);
- for (int i = 0; i < tags.length; i++) {
- if (tags[i].isText())
- buff.append(tags[i].text);
- else if (tags[i].isReference())
- buff.append(inlineRefTag(tags[i]));
- }
- return buff.toString();
- }
-
- /**
- * Returns the first sentence of a documentation comment where all
- * links {@link ...} have been inlined.
- *
- * @param comment
- */
- protected String firstSentence(Comment comment) {
- return
- inlineLinkTags(comment.holder, comment.firstSentence());
- }
-
- // TODO: remove this !
- private static String ahref(String dest, String target, String text) {
- return "<a href=\"" + dest + "\" target=\"" + target + "\">" +
- text + "/a>";
- }
-
- /** Inline a @see documentation tag.
- */
- protected String inlineRefTag(Tag tag) {
- switch(Tag.parseReference(tag)) {
- case Bad(String ref):
- return ref;
- case Url(String ref):
- return ref;
- case Literal(String ref):
- return ref;
- case Scala(String container, String member, String label):
- Symbol sym = findSymbolFromString(tag.holder, container, member);
- if (sym == Symbol.NONE) {
- System.err.println("Warning: not found " + tag);
- return tag.text;
- }
- else if (!isDocumented.apply(sym)) {
- System.err.println("Warning: not referenced " + tag);
- return tag.text;
- }
- else {
- String labl = label.equals("") ? sym.nameString() : label;
- return ahref(definitionURI(sym).toString(), ROOT_FRAME, labl);
- }
- default:
- throw Debug.abort("illegal case", tag);
- }
- }
-
- /**
- * Writes a set of Scaladoc tags to a page.
- *
- * @param tags
- */
- protected void addTags(Tag[] tags) {
- if (tags.length > 0) {
- Tag returnTag = null;
- Tag sinceTag = null;
- Tag versionTag = null;
- final List paramTagList = new LinkedList();;
- final List seeTagList = new LinkedList();
- final List throwsTagList = new LinkedList();
- final List authorTagList = new LinkedList();
- final List otherTagList = new LinkedList();
-
- // partitioning the tags
- for (int i = 0; i < tags.length; i++) {
- if ("@return".equals(tags[i].name))
- returnTag = tags[i];
- else if ("@since".equals(tags[i].name))
- sinceTag = tags[i];
- else if ("@version".equals(tags[i].name))
- versionTag = tags[i];
- else if ("@param".equals(tags[i].name))
- paramTagList.add(tags[i]);
- else if ("@see".equals(tags[i].name))
- seeTagList.add(tags[i]);
- else if (tags[i].isException())
- throwsTagList.add(tags[i]);
- else if ("@author".equals(tags[i].name))
- authorTagList.add(tags[i]);
- else
- otherTagList.add(tags[i]);
- }
-
- page.printlnOTag("dl");
-
- // Author.
- if (authorTagList.size() > 0) {
- addTagSection("Author");
- page.printlnOTag("dd").indent();
- Iterator it = authorTagList.iterator();
- Tag authorTag = (Tag) it.next();
- page.print(authorTag.text);
- while (it.hasNext()) {
- authorTag = (Tag) it.next();
- page.print(", " + authorTag.text);
- }
- page.println().undent();
- page.printlnCTag("dd");
- }
- // Since.
- if (sinceTag != null) {
- addTagSection("Since");
- page.printlnTag("dd", sinceTag.text);
- }
- // Version.
- if (versionTag != null) {
- addTagSection("Version");
- page.printlnTag("dd", versionTag.text);
- }
- // Parameters.
- if (paramTagList.size() > 0) {
- addTagSection("Parameters");
- Iterator it = paramTagList.iterator();
- Tag paramTag = null;
- while (it.hasNext()) {
- paramTag = (Tag) it.next();
- Pair fields = Tag.split(paramTag.text);
- String paramName = (String) fields.fst;
- String paramDesc = (String) fields.snd;
- page.printOTag("dd");
- page.printTag("code", paramName);
- page.println(" - ");
- page.println(inlineLinkTags(paramTag.holder, paramDesc));
- page.printlnCTag("dd");
- }
- }
- // Returns.
- if (returnTag != null) {
- addTagSection("Returns");
- page.printlnTag("dd", returnTag.text);
- }
- // Throws.
- if (throwsTagList.size() > 0) {
- addTagSection("Throws");
- Iterator it = throwsTagList.iterator();
- Tag throwsTag = null;
- while (it.hasNext()) {
- throwsTag = (Tag) it.next();
- Pair fields = Tag.split(throwsTag.text);
- String exceptionName = (String) fields.fst;
- String exceptionDesc = (String) fields.snd;
- page.printOTag("dd");
- page.printTag("code", exceptionName);
- page.println(" - "); // TODO: hypertext link
- page.println(inlineLinkTags(throwsTag.holder, exceptionDesc));
- page.printlnCTag("dd");
- }
- }
- // See Also.
- if (seeTagList.size() > 0) {
- addTagSection("See Also");
- page.printlnOTag("dd");
- Iterator it = seeTagList.iterator();
- Tag seetag = (Tag) it.next();
- page.println(inlineRefTag(seetag));
- while (it.hasNext()) {
- seetag = (Tag) it.next();
- page.print(", ");
- page.println(inlineRefTag(seetag));
- }
- page.printlnCTag("dd");
- }
- // Others.
- if (otherTagList.size() > 0) {
- Iterator it = otherTagList.iterator();
- while (it.hasNext())
- addStandardTag((Tag) it.next());
- }
-
- page.printlnCTag("dl");
- }
- }
-
- /**
- * Returns the HTML representation of a documentation tag.
- *
- * @param tagName
- */
- protected void addTagSection(String tagName) {
- page.printOTag("dt", ATTRS_DOCTAG);
- page.printBold(tagName + ":");
- page.printlnCTag("dt");
- }
-
- /**
- * Returns the HTML representation of a standard documentation tag.
- *
- * @param tag
- */
- protected void addStandardTag(Tag tag) {
- String sectionName = "";
- if (tag.name.length() > 1) {
- sectionName += Character.toUpperCase(tag.name.charAt(1));
- if (tag.name.length() > 2)
- sectionName += tag.name.substring(2);
- }
- addTagSection(sectionName);
- page.printTag("dd", inlineLinkTags(tag.holder, tag.text));
- }
-
- /**
- * Returns the symbol contained in a specified class or object and
- * described by its label or its name. Return Symbol.NONE if not
- * found.
- *
- * @param context
- * @param classOrObject
- * @param label
- */
- protected Symbol findSymbolFromString(Symbol context, String classOrObject, String label) {
- /*
- String path;
- // absolute path
- if (classOrObject.startsWith(new Character(ScalaSearch.classChar).toString()) ||
- classOrObject.startsWith(new Character(ScalaSearch.objectChar).toString()))
- path = classOrObject;
- else // relative path
- path = ScalaSearch.getOwnersString(context.owner()) + classOrObject;
- path = path.substring(1);
- Symbol sym = ScalaSearch.lookup(global.definitions.ROOT_CLASS, path);
- if (sym == Symbol.NONE)
- return Symbol.NONE;
- else {
- if (label == null)
- return sym;
- else {
- // look for a member in the scope that has a tag
- // @label with the given label
- Scope scope = sym.moduleClass().members();
- SymbolIterator it = scope.iterator();
- while (it.hasNext()) {
- Symbol member = (Symbol) it.next();
- Tag[] tags = getComment(member).tags;
- for (int i = 0; i < tags.length; i++)
- if ("@label".equals(tags[i].name) &&
- label.equals(tags[i].text))
- return member;
- }
- // look for the first term with label as name
- return sym.moduleClass().lookup(Name.fromString(label).toTermName());
- }
- }
- */
- return Symbol.NONE;
- }
-
- protected void addCategory(Symbol[] symbols, String title, Page page, MySymbolTablePrinter symtab) {
- if (symbols.length > 0) {
- page.printlnTag("h3", title);
- page.printlnOTag("dl").indent();
- for(int i = 0; i < symbols.length; i++) {
- page.printOTag("dt");
- addIndexEntry(symbols[i], page, symtab);
- page.printlnCTag("dt");
- page.printlnTag("dd", firstSentence(getComment(symbols[i])));
- }
- page.undent().printlnCTag("dl");
- }
- }
-
- protected void addFoundSymbols(List symbols, Page page, MySymbolTablePrinter symtab) {
- // partition and sort
- List fields = new LinkedList();
- List modules = new LinkedList();
- List types = new LinkedList();
- ScalaSearch.categorizeSymbols(symbols, fields, modules, types);
- Symbol[] sortedFields = ScalaSearch.sortList(fields);
- Symbol[] sortedModules = ScalaSearch.sortList(modules);
- Symbol[] sortedTypes = ScalaSearch.sortList(types);
-
- addCategory(sortedFields, "val/def", page, symtab);
- addCategory(sortedModules, "package/object", page, symtab);
- addCategory(sortedTypes, "type/trait/class", page, symtab);
- }
-
- protected void addResultNumber(int number, Page page) {
- page.printOTag("p");
- page.printOTag("b");
- page.print("" + number + " result(s).");
- page.printCTag("b");
- page.printCTag("p");
- }
-
- public static String SEARCH_SERVLET_NAME = "scaladocServlet";
- public static String PAGE_SERVLET_NAME = "pageServlet";
-
- public class SearchServlet extends Servlet {
-
- public String name() {
- return SEARCH_SERVLET_NAME;
- }
-
- public synchronized void apply(Map req, Writer out) {
- // create page
- String pagename = "search-page";
- URI uri = Location.makeURI(pagename + ".html");
- String destinationFrame = SELF_FRAME;
- String title = pagename;
-
- final Page page = new Page(out, uri, destinationFrame,
- title, representation,
- HTMLGenerator.this.adaptURI(Location.mkURI(HTMLPrinter.DEFAULT_STYLESHEET),
- uri).toString(),
- HTMLGenerator.this.adaptURI(Location.mkURI(HTMLPrinter.DEFAULT_JAVASCRIPT),
- uri).toString());
- page.open();
- page.printHeader(ATTRS_META, getGenerator());
- page.printOpenBody();
- addNavigationBar(CONTAINER_NAV_CONTEXT, page);
- page.printlnHLine();
-
- // create symbol printer
- final MySymbolTablePrinter symtab =
- SymbolTablePrinterFactory.makeHTML(HTMLGenerator.this, page, isDocumented);
-
- // analyze the request
- String searchKind = (String) req.get("searchKind");
- String searchString = (String) req.get("searchString");
-
- // search summary
- String searchKindSummary = null;
- if (searchKind.equals("byName"))
- searchKindSummary = "in defined names";
- else if (searchKind.equals("byComment"))
- searchKindSummary = "in comments";
- else if (searchKind.equals("byType"))
- searchKindSummary = "by type";
- String searchSummary =
- "Scaladoc searched for the string (" + searchString + ") " + searchKindSummary + ".";
- page.printOTag("p");
- page.printOTag("b");
- page.print(searchSummary);
- page.printCTag("b");
- page.printCTag("p");
-
- // Search by name.
- if (searchKind.equals("byName")) {
- String regexp = searchString;
- final Pattern p = Pattern.compile(regexp);
-
- final List found = new LinkedList();
- //collect
- ScalaSearch.foreach(global.definitions.ROOT_CLASS,
- new ScalaSearch.SymFun() {
- public void apply(Symbol sym) {
- String name = sym.nameString();
- Matcher m = p.matcher(name);
- if (m.find())
- found.add(sym);
- }
- },
- isDocumented);
- addResultNumber(found.size(), page);
- addFoundSymbols(found, page, symtab);
- }
- // Search by comment.
- else if (searchKind.equals("byComment")) {
- String regexp = searchString;
- final Pattern p = Pattern.compile(regexp);
-
- final List found = new LinkedList();
- ScalaSearch.foreach(global.definitions.ROOT_CLASS,
- new ScalaSearch.SymFun() {
- public void apply(Symbol sym) {
- Pair c = (Pair) global.mapSymbolComment.get(sym);
- if (c != null) {
- String comment = (String) c.fst;
- Matcher m = p.matcher(comment);
- if (m.find())
- found.add(sym);
- }
- }
- },
- isDocumented);
- addResultNumber(found.size(), page);
- addFoundSymbols(found, page, symtab);
- }
- // Search by type.
- else if (searchKind.equals("byType")) {
- Type t = ScalaSearch.typeOfString(searchString, global);
- TypeIsomorphism ml = newTypeIso(global);
-
- List found = new LinkedList();
- Map searchResults = new HashMap();
- Iterator it = ml.searchType(t, isDocumented);
- while (it.hasNext()) {
- SearchResult result = (SearchResult) it.next();
- found.add(result.symbol);
- searchResults.put(result.symbol, result);
- }
- if (t == Type.NoType) {
- page.printOTag("p");
- page.println("Scaladoc could not recognize your search string as a type, "
- + "see the ");
- page.printlnTag("a",
- new XMLAttribute[] {
- new XMLAttribute("href", HELP_PAGE + "#" + SEARCH_SECTION) },
- "help page");
- page.println(" to know which syntax to use.");
- page.printCTag("p");
- }
- else {
- page.printOTag("p");
- page.print("You are searching for symbols with type: ");
- page.print(t.toString());
- page.printCTag("p");
-
- addResultNumber(found.size(), page);
-
- Symbol[] sortedSymbols = ScalaSearch.sortList(found);
-
- for(int i = 0; i < sortedSymbols.length; i++) {
- Symbol sym = sortedSymbols[i];
- SearchResult result = (SearchResult) searchResults.get(sym);
- Type adaptedType = result.getType;
- page.printOTag("dt");
- //page.printOTag("code");
- symtab.printShortSignature(sym, true);
- symtab.printSeqType(sym, adaptedType, symtab.getSymbolInnerString(sym));
- page.printlnCTag("dt");
- if (!sym.isRoot()) {
- page.printOTag("dd");
- page.print("in ");
- printPath(sym.owner(), SELF_FRAME, page);
- if (result.isInClass && (result.tparams.length > 0)) {
- page.print("[");
- for(int j = 0; j < result.tparams.length; j++) {
- if (j != 0) page.print(",");
- page.print(result.tparams[j].nameString());
- }
- page.print("]");
- }
- page.printCTag("dd");
- }
- String firstSent = firstSentence(getComment(sym));
- if (!firstSent.equals(""))
- page.printlnTag("dd", firstSent);
- //page.printlnCTag("code");
- }
- }
- }
- // close page
- page.printlnHLine();
- addNavigationBar(CONTAINER_NAV_CONTEXT, page);
- page.printFootpage();
- // page.close();
- // already done by the HTTP server when closing connection
- }
- }
-
- /**
- * A servlet that accepts requests for web pages registered in the
- * hastable <code>promises</code>.
- */
- public class PageServlet extends Servlet {
-
- public String name() {
- return PAGE_SERVLET_NAME;
- }
-
- public synchronized void apply(Map req, Writer out) {
- // analyze the request
- String pageName = (String) req.get("page");
- Promise promise = (Promise) promises.get(pageName);
- promise.writeOn(out);
- }
- }
-}
-
-public class SearchResult {
- Symbol symbol;
- Type getType;
- boolean isInClass;
- Symbol[] tparams;
- public SearchResult(Symbol symbol,
- Type getType,
- boolean isInClass,
- Symbol[] tparams) {
- this.symbol = symbol;
- this.getType = getType;
- this.isInClass = isInClass;
- this.tparams = tparams;
- }
-}
-
-/**
- * This class represents a web page not yet printed.
- */
-public abstract class Promise {
-
- protected StringWriter cache = null;
-
- /** Name of the web page. */
- public abstract String name();
-
- /**
- * Print the web page on the given writer. Do not forget to close
- * the writer afterwards. Cache the result for further reuse.
- */
- public void writeOn(Writer writer) {
- if (cache == null) {
- cache = new StringWriter();
- computeIn(cache);
- try {
- cache.close();
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- try {
- writer.write(cache.toString());
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- /** Print the web page on the given writer. */
- protected abstract void computeIn(Writer writer);
-}
diff --git a/sources/scala/tools/scaladoc/HTMLGeneratorCommand.java b/sources/scala/tools/scaladoc/HTMLGeneratorCommand.java
deleted file mode 100644
index 3ef4bc1261..0000000000
--- a/sources/scala/tools/scaladoc/HTMLGeneratorCommand.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import ch.epfl.lamp.util.HTMLPrinter;
-import ch.epfl.lamp.util.HTMLRepresentation;
-
-import scala.tools.util.ClassPath;
-import scala.tools.util.Reporter;
-
-import scalac.CompilerCommand;
-import scalac.CompilerPhases;
-import scalac.util.BooleanOptionParser;
-import scalac.util.OptionParser;
-import scalac.util.StringOptionParser;
-import scalac.util.ScalaProgramArgumentParser;
-import scalac.util.Strings;
-
-/**
- * The class <code>HTMLGeneratorCommand</code> describes the options
- * passed as arguments to the HTML generator command.
- */
-public class HTMLGeneratorCommand extends CompilerCommand {
-
- //########################################################################
- // Public Fields
-
- public final StringOptionParser docencoding;
- public final StringOptionParser docmodule;
- public final StringOptionParser docmodulePath;
- public final StringOptionParser doctitle;
- public final StringOptionParser doctype;
- public final StringOptionParser stylesheet;
- public final StringOptionParser windowtitle;
-
- public final BooleanOptionParser server;
- public final StringOptionParser port;
-
- public final BooleanOptionParser noindex;
- public final BooleanOptionParser validate;
-
- public final ScalaProgramArgumentParser packages;
-
- //########################################################################
- // Public Constructors
-
- /**
- * Creates an instance variable for an HTML generator command.
- *
- * @param product
- * @param version
- * @param reporter
- * @param phases
- */
- public HTMLGeneratorCommand(String product, String version,
- Reporter reporter, CompilerPhases phases)
- {
- this(product, version, "<source files> [-- <packages>]", reporter, phases);
- }
-
- /**
- * Creates an instance variable for an HTML generator command.
- *
- * @param product
- * @param version
- * @param syntax
- * @param reporter
- * @param phases
- */
- public HTMLGeneratorCommand(String product, String version, String syntax,
- Reporter reporter, CompilerPhases phases)
- {
- super(product, version, syntax, reporter, phases);
-
- this.docencoding = new StringOptionParser(this,
- "docencoding",
- "Output encoding name (" + HTMLRepresentation.DEFAULT_DOCENCODING + ", etc.)",
- "name",
- HTMLRepresentation.DEFAULT_DOCENCODING);
-
- this.docmodule = new StringOptionParser(this,
- "docmodule",
- "Specify module used by scaladoc",
- "class",
- "scala.tools.scaladoc.StandardDocModule");
-
- this.docmodulePath = new StringOptionParser(this,
- "docmodulepath",
- "Specify where to find doc module class files",
- "path",
- ClassPath.DEFAULT_CLASSPATH);
-
- this.doctitle = new StringOptionParser(this,
- "doctitle",
- "Include title for the overview page",
- "html-code",
- HTMLGenerator.DEFAULT_DOCTITLE);
-
- this.doctype = new StringOptionParser(this,
- "doctype",
- "Output type name (" + HTMLRepresentation.DEFAULT_DOCTYPE + ", etc.)",
- "name",
- HTMLRepresentation.DEFAULT_DOCTYPE);
-
- this.stylesheet = new StringOptionParser(this,
- "stylesheetfile",
- "File to change style of the generated documentation",
- "path",
- HTMLPrinter.DEFAULT_STYLESHEET);
-
- this.windowtitle = new StringOptionParser(this,
- "windowtitle",
- "Browser window title for the documentation",
- "text",
- HTMLGenerator.DEFAULT_WINDOWTITLE);
-
- this.server = new BooleanOptionParser(this,
- "server",
- "Launch an HTTP server for interactive search",
- false);
-
- this.port = new StringOptionParser(this,
- "port",
- "Port number for the HTTP server",
- "port",
- "1280");
-
- this.noindex = new BooleanOptionParser(this,
- "noindex",
- "Do not generate index",
- false);
-
- this.validate = new BooleanOptionParser(this,
- "validate",
- "Add a link at the bottom of each generated page",
- false);
-
- this.packages = new ScalaProgramArgumentParser(this);
-
- remove(nowarn);
- remove(verbose);
- remove(debug);
- remove(explaintypes);
- remove(uniqid);
- remove(types);
- remove(prompt);
- remove(separate);
- remove(classpath);
- remove(sourcepath);
- remove(bootclasspath);
- remove(extdirs);
- // outpath;
- remove(target);
- remove(noimports);
- remove(nopredefs);
- remove(skip);
- remove(check);
- remove(print);
- remove(printer);
- remove(printfile);
- remove(graph);
- remove(stop);
- remove(log);
- remove(Xshortname);
-
- // similar order as javadoc options
- add(2, windowtitle);
- add(3, doctitle);
- add(4, noindex);
- add(5, docmodule);
- add(6, docmodulePath);
- add(7, stylesheet);
- add(8, doctype);
- add(9, docencoding);
- add(10, validate);
- add(11, server);
- add(12, port);
- add(13, packages);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scaladoc/HTTPServer.java b/sources/scala/tools/scaladoc/HTTPServer.java
deleted file mode 100644
index 3943323d65..0000000000
--- a/sources/scala/tools/scaladoc/HTTPServer.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.net.*;
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-/**
- * A Java server that can be invoked via HTTP.
- */
-abstract class Servlet {
-
- /**
- * Name of the servlet.
- */
- public abstract String name();
-
- /**
- * Give the servlet a request and a place where to write its
- * answer.
- */
- public abstract void apply(Map req, Writer out);
-}
-
-/**
- * A servlet that echoes the query to its sender.
- */
-class EchoServlet extends Servlet {
-
- public String name() {
- return "echoServlet";
- }
-
- public void apply(Map req, Writer out) {
- printMap(req, out);
- }
-
- /** Print a map. */
- public static void printMap(Map map, Writer out) {
- Iterator i = map.keySet().iterator();
- while(i.hasNext()) {
- String key = (String) i.next();
- String value = (String) map.get(key);
- try {
- out.write(key + " -> " + value + "\n");
- } catch (IOException e) {}
- }
- }
-}
-
-/**
- * HTTP server. It is in fact an extension of an example found in the
- * book "Java Network Programming" by Elliotte Rusty Harold that can
- * handle servlet invokations.
- */
-public class HTTPServer extends Thread {
-
- private File documentRootDirectory;
- private String indexFileName = "index.html";
- private ServerSocket server;
- private int numThreads = 50;
-
- private Map/*<String,Servlet>*/ servletNamed;
-
- public HTTPServer(File documentRootDirectory,
- int port,
- String indexFileName) throws IOException {
-
- this.documentRootDirectory =
- documentRootDirectory == null ?
- new File(".") :
- documentRootDirectory;
-
- if (!this.documentRootDirectory.isDirectory()) {
- throw new IOException(this.documentRootDirectory
- + " does not exist as a directory");
- }
- this.indexFileName = indexFileName;
- this.server = new ServerSocket(port);
- }
-
- public HTTPServer(File documentRootDirectory, int port)
- throws IOException {
- this(documentRootDirectory, port, "index.html");
- }
-
- public HTTPServer(File documentRootDirectory) throws IOException {
- this(documentRootDirectory, 80, "index.html");
- }
-
- /**
- * Launch the server with a specified list of servlets.
- */
- public HTTPServer(File documentRootDirectory,
- int port,
- Servlet[] servlets) throws IOException {
- this(documentRootDirectory, port, "index.html");
- servletNamed = new HashMap();
- for (int i = 0; i < servlets.length; i++)
- servletNamed.put("/" + servlets[i].name(), servlets[i]);
- }
-
- public void run() {
-
- for (int i = 0; i < numThreads; i++) {
- Thread t = new Thread(
- new RequestProcessor(documentRootDirectory,
- indexFileName,
- servletNamed));
- t.start();
- }
- System.out.println("Accepting connections on port "
- + server.getLocalPort());
- System.out.println("Document Root: " + documentRootDirectory);
- while (true) {
- try {
- Socket request = server.accept();
- InetSocketAddress addr = (InetSocketAddress) request.getRemoteSocketAddress();
- if (addr != null)
- System.out.println("Connection from: " + addr.getAddress().getCanonicalHostName());
- RequestProcessor.processRequest(request);
- }
- catch (IOException e) {
- }
- }
- }
-
- public static void main(String[] args) {
-
- // get the Document root
- File docroot;
- try {
- docroot = new File(args[0]);
- }
- catch (ArrayIndexOutOfBoundsException e) {
- System.out.println("Usage: java HTTPServer docroot port indexfile");
- return;
- }
-
- // set the port to listen on
- int port;
- try {
- port = Integer.parseInt(args[1]);
- if (port < 0 || port > 65535) port = 80;
- }
- catch (Exception e) {
- port = 80;
- }
-
- try {
- Servlet[] servlets = new Servlet[] { new EchoServlet() };
- HTTPServer webserver = new HTTPServer(docroot, port, servlets);
- webserver.start();
- }
- catch (IOException e) {
- System.out.println("Server could not start because of an "
- + e.getClass());
- System.out.println(e);
- }
- }
-}
-
-class RequestProcessor implements Runnable {
-
- private static final String MIME_APPLICATION_OCTET_STREAM =
- "application/octet-stream";
- private static final String MIME_APPLICATION_PDF =
- "application/pdf";
- private static final String MIME_APPLICATION_POSTSCRIPT =
- "application/postscript";
-
- private static final String MIME_IMAGE_GIF = "image/gif";
- private static final String MIME_IMAGE_JPEG = "image/jpeg";
- private static final String MIME_IMAGE_PNG = "image/png";
-
- private static final String MIME_TEXT_HTML = "text/html";
- private static final String MIME_TEXT_PLAIN = "text/plain";
-
- private final static String ENCODING_SCHEME = "iso-8859-1"; // "UTF-8"
-
- private static List pool = new LinkedList();
- private File documentRootDirectory;
- private String indexFileName = "index.html";
- private Map servletNamed;
-
- public RequestProcessor(File documentRootDirectory,
- String indexFileName,
- Map servletNamed) {
-
- if (documentRootDirectory.isFile()) {
- throw new IllegalArgumentException(
- "documentRootDirectory must be a directory, not a file");
- }
- this.documentRootDirectory = documentRootDirectory;
- try {
- this.documentRootDirectory
- = documentRootDirectory.getCanonicalFile();
- }
- catch (IOException e) {
- }
- if (indexFileName != null) this.indexFileName = indexFileName;
- this.servletNamed = servletNamed;
- }
-
- public static void processRequest(Socket request) {
- synchronized (pool) {
- pool.add(pool.size(), request);
- pool.notifyAll();
- }
- }
-
- /**
- * Parse a non-null query and put the bindings (key, value) into
- * the result map.
- */
- public static Map parseQuery(String query) {
- Map/*<String,String>*/ map = new HashMap();
- try {
- String[] bindings = query.split("\\&");
- String regexp = "([^=]*)=([^=]*)";
- Pattern p = Pattern.compile(regexp);
- for (int i = 0; i < bindings.length; i++) {
- Matcher m = p.matcher(bindings[i]);
- if (m.find()) {
- String key = URLDecoder.decode(m.group(1), ENCODING_SCHEME);
- String value = URLDecoder.decode(m.group(2), ENCODING_SCHEME);
- map.put(key, value);
- }
- }
- }
- catch (UnsupportedEncodingException e) {
- System.out.println("Une exception: " + e);
- }
- return map;
- }
-
- private static String mkMIMEHeader(int statusCode, String statusMessage,
- String contentType, int contentLength) {
- StringBuffer buf = new StringBuffer();
- buf.append("HTTP/1.0 " + statusCode + " " + statusMessage + "\r\n");
- buf.append("Date: " + new Date() + "\r\n");
- buf.append("Server: HTTPServer 1.0\r\n");
- buf.append("Content-length: " + contentLength + "\r\n");
- buf.append("Content-type: " + contentType + "\r\n\r\n");
- return buf.toString();
- }
-
- private static void write(Writer out, String version,
- int statusCode, String statusMessage,
- String contentType, String contentData) {
- try {
- if (version.startsWith("HTTP/")) { // send a MIME header
- String header = mkMIMEHeader(statusCode, statusMessage,
- contentType, contentData.length());
- out.write(header);
- }
- out.write(contentData);
- out.flush();
- }
- catch (IOException e) {
- }
- }
-
- private static void writeData(OutputStream out, String version,
- int statusCode, String statusMessage,
- String contentType, File theFile) {
- try {
- DataInputStream fis = new DataInputStream(new FileInputStream(theFile));
- byte[] theData = new byte[(int) theFile.length()];
- fis.readFully(theData);
- fis.close();
- if (version.startsWith("HTTP/")) { // send a MIME header
- String header = mkMIMEHeader(statusCode, statusMessage,
- contentType, theData.length);
- out.write(header.getBytes());
- }
- out.write(theData);
- out.flush();
- }
- catch (IOException e) {
- }
- }
-
- private static void writeError(Writer out, String version,
- int statusCode, String statusMessage) {
- StringBuffer buf = new StringBuffer();
- buf.append("<html>\r\n");
- buf.append("<head><title>" + statusMessage + "</title>\r\n");
- buf.append("</head>\r\n");
- buf.append("<body>");
- buf.append("<h1>HTTP Error " + statusCode + ": " + statusMessage + "</h1>\r\n");
- buf.append("</body></html>\r\n");
- write(out, version, statusCode, statusMessage, MIME_TEXT_HTML, buf.toString());
- }
-
- private static void writeServlet(Writer out, String version,
- Servlet servlet, URI uri) {
- String query = uri.getRawQuery();
- Map map = (query != null) ? parseQuery(query) : new HashMap();
- write(out, version, 200, "OK", MIME_TEXT_HTML, "<!-- generated with Scala Servlet -->\r\n");
- servlet.apply(map, out);
- try {
- out.write("\n");
- out.flush();
- }
- catch (IOException e) {
- }
- }
-
- // See http://www.oreilly.com/catalog/javanp2/chapter/ch11.html
- public void run() {
-
- // for security checks
- String root = documentRootDirectory.getPath();
-
- while (true) {
- Socket connection;
- synchronized (pool) {
- while (pool.isEmpty()) {
- try {
- pool.wait();
- }
- catch (InterruptedException e) {
- }
- }
- connection = (Socket) pool.remove(0);
- }
-
- try {
- String filename;
- String contentType;
- OutputStream raw =
- new BufferedOutputStream(
- connection.getOutputStream());
- Writer out = new OutputStreamWriter(raw);
- Reader in =
- new InputStreamReader(
- new BufferedInputStream(connection.getInputStream()),
- "ASCII");
- StringBuffer requestLine = new StringBuffer();
- int c;
- while (true) {
- c = in.read();
- if (c == '\r' || c == '\n') break;
- requestLine.append((char) c);
- }
-
- String get = requestLine.toString();
-
- // log the request
- System.out.println(get);
-
- StringTokenizer st = new StringTokenizer(get);
- String method = st.nextToken();
- String version = "";
- if (method.equals("GET")) {
- filename = st.nextToken();
-
- URI uri = new URI(filename);
- String resource = uri.getPath();
- Servlet servlet = (Servlet) servletNamed.get(resource);
-
- if (servlet != null) {
- // servlet invokation
- writeServlet(out, "HTTP/", servlet, uri);
- }
- else { // not a query
- if (filename.endsWith("/")) filename += indexFileName;
- contentType = guessContentTypeFromName(filename);
- if (st.hasMoreTokens()) {
- version = st.nextToken();
- }
-
- File theFile = new File(documentRootDirectory,
- filename.substring(1,filename.length()));
- if (theFile.canRead()
- // Don't let clients outside the document root
- && theFile.getCanonicalPath().startsWith(root)) {
- writeData(raw, version, 200, "OK", contentType, theFile);
- }
- else {
- // can't find the file
- writeError(out, version, 404, "File Not Found");
- }
- }
- }
- else {
- // method does not equal "GET"
- writeError(out, version, 501, "Not Implemented");
- }
- }
- catch (URISyntaxException e) {
- System.out.println("Une exception: " + e);
- }
- catch (IOException e) {
- System.out.println("Une exception: " + e);
- }
- finally {
- try {
- connection.close();
- }
- catch (IOException e) {}
- }
-
- } // end while
-
- } // end run
-
- public static String guessContentTypeFromName(String name) {
- int pos = name.lastIndexOf('.');
- if (pos >= 0) {
- String suffix = name.substring(pos + 1).toLowerCase();
- String mime = (String) mimes.get(suffix);
- return (mime == null) ? MIME_TEXT_PLAIN : mime;
- }
- return MIME_TEXT_PLAIN;
- }
-
- private static final Hashtable/*<String,String>*/ mimes = new Hashtable();
-
- static {
- // See http://www.webmaster-toolkit.com/mime-types.shtml
- mimes.put("c" , MIME_TEXT_PLAIN);
- mimes.put("cc" , MIME_TEXT_PLAIN);
- mimes.put("cpp" , MIME_TEXT_PLAIN);
- mimes.put("class", MIME_APPLICATION_OCTET_STREAM);
- mimes.put("gif" , MIME_IMAGE_GIF);
- mimes.put("h" , MIME_TEXT_PLAIN);
- mimes.put("htm" , MIME_TEXT_HTML);
- mimes.put("html" , MIME_TEXT_HTML);
- mimes.put("lst" , MIME_TEXT_PLAIN);
- mimes.put("java" , MIME_TEXT_PLAIN);
- mimes.put("jpe" , MIME_IMAGE_JPEG);
- mimes.put("jpg" , MIME_IMAGE_JPEG);
- mimes.put("jpeg" , MIME_IMAGE_JPEG);
- mimes.put("pdf" , MIME_APPLICATION_PDF);
- mimes.put("pl" , MIME_TEXT_PLAIN);
- mimes.put("ps" , MIME_APPLICATION_POSTSCRIPT);
- mimes.put("png" , MIME_IMAGE_PNG);
- mimes.put("scala", MIME_TEXT_PLAIN);
- mimes.put("text" , MIME_TEXT_PLAIN);
- mimes.put("txt" , MIME_TEXT_PLAIN);
- }
-
-} // end RequestProcessor
diff --git a/sources/scala/tools/scaladoc/Location.java b/sources/scala/tools/scaladoc/Location.java
deleted file mode 100644
index 0a2124a705..0000000000
--- a/sources/scala/tools/scaladoc/Location.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.net.URL;
-import java.net.URI;
-import java.io.File;
-import scalac.symtab.Symbol;
-import java.util.Map;
-import java.util.HashMap;
-import scalac.util.Debug;
-
-/**
- * This class manages the correspondance between a symbol and
- * its URL.
- */
-public class Location {
-
- static public final String ROOT_NAME = "root-page";
- static public final String HTML_SUFFIX = ".html";
- static public final String CLASS_SUFFIX = "-class";
- //static public final String CLASS_SUFFIX = "(class)";
-
- /////////////////// UNIQUE URL //////////////////////
-
- static public String get(Symbol sym) {
- return getURI(sym).toString();
- }
- /** Returns the URI of a given symbol. */
- static private final Map/*<Symbol, URI>*/ uris = new HashMap();
-// static public URI getURI(Symbol sym) {
-// if (uris.get(sym) == null) {
-// URI uri;
-// try {
-// if (sym.isModuleClass())
-// uri = getURI(sym.module());
-// else if (sym.isRoot() || sym.isClass() || sym.isModule() || sym.isPackage() || sym.isPackageClass())
-// uri = new URI(getPath(sym).toString() + HTML_SUFFIX);
-// else if (sym.isParameter())
-// uri = getURI(sym.classOwner());
-// else
-// uri = new URI(getURI(sym.owner()).toString() + "#" + nextFreeId(sym.owner()));
-// uris.put(sym, uri);
-// } catch(Exception e) { throw Debug.abort(sym.defString()); }
-// }
-// return (URI) uris.get(sym);
-// }
- static public URI getURI(Symbol sym) {
- if (uris.get(sym) == null) {
- URI uri = null;
- try {
- if (sym.isModule())
- uri = getURI(sym.moduleClass());
- else if (sym.isClassType())
- uri = new URI(getPath(sym).toString() + HTML_SUFFIX);
- else if (sym.isParameter())
- uri = getURI(sym.classOwner());
- else
- uri = new URI(getURI(sym.owner()).toString() + "#" + nextFreeId(sym.owner()));
- uris.put(sym, uri);
- } catch (Exception e) { throw Debug.abort(sym.defString()); }
- }
- return (URI) uris.get(sym);
- }
- // where
- static private URI getPath(Symbol sym) {
- assert sym.isClassType(): Debug.show(sym);
- try {
- if (sym.isRoot())
- return new URI(ROOT_NAME);
- else if (sym.owner().isRoot())
- return new URI(getName(sym));
- else {
- // !!! separator character in URI paths is '/'
- return new URI(getPath(sym.owner()).toString() + "/" + getName(sym));
- }
- } catch(Exception e) { return null; }
- }
- // where
- static public String getName(Symbol sym) {
- if (sym.isModule()) return getName(sym.moduleClass());
- assert sym.isClassType(): Debug.show(sym);
- String name = sym.simpleName().toString();
- if (!sym.isRoot() && !sym.isModuleClass()) name += CLASS_SUFFIX;
- return name;
- }
- // where
- static private final Map/*<Symbol, Integer>*/ ids = new HashMap();
- static private int nextFreeId(Symbol sym) {
- if (ids.get(sym) == null)
- ids.put(sym, new Integer(0));
- int i = ((Integer) ids.get(sym)).intValue();
- ids.put(sym, new Integer(i + 1));
- return i;
- }
-
- static protected URI makeURI(String uri) {
- try {
- return new URI(uri);
- }
- catch(Exception e) {
- throw Debug.abort(e);
- }
- }
-
- /////////////////// AS SEEN FROM //////////////////////
-
- /**
- * Returns a representation of the URL u1 relative to u2.
- * Examples:
- * "A/B/C" as seen from "A" is "A/B/C"
- * "A" as seen from "A/B/C" is "../../A"
- * "A/B#R" as seen from "A" is "A/B#R"
- */
-
- static public URI asSeenFrom(URI u, URI v) {
- File f_u = new File(u.getPath());
- File f_v = new File(v.getPath());
- try {
- /// !!! separator character in URI paths is '/'
- String uriPath = asSeenFrom(f_u, f_v).getPath().replace('\\', '/');
- return
- new URI(uriPath
- + (u.getFragment() != null ? "#" + u.getFragment() : ""))
- .normalize();
- }
- catch (Exception e) {
- throw Debug.abort(e);
- }
- }
- // where
- /** f must be of the form ('.' | ['.' '/' ] A/...) */
- static private File pathToRoot(File f) {
- if (f.equals(hereFile) || f.getParentFile() == null)
- return new File(".");
- else
- return new File(pathToRoot(f.getParentFile()), "..");
- }
- // where
- /*
- // where
- static private File asSeenFrom(File f1, File f2) {
- return new File(pathToRoot(f2), f1.getPath());
- }
- */
- /** Compute the minimal path from one file to another.
- * f1 and f2 should be of the form (A/...)
- */
- static private File asSeenFrom(File f1, File f2) {
- if (f1.equals(f2))
- return new File(f1.getName());
- else {
- File lcp = longestCommonPrefix(f1, f2);
- File relf1 = subtractPrefix(lcp, f1);
- File relf2 = subtractPrefix(lcp, f2);
- return new File(pathToRoot(relf2), relf1.getPath());
- }
- }
- // where
- /** p and q should be of the form (A/...) */
- static private File longestCommonPrefix(File p, File q) {
- if (prefixes(p, q))
- return p;
- else if (p.getParentFile() == null)
- return new File(".");
- else
- return longestCommonPrefix(p.getParentFile(), q);
- }
- // where
- /** Test if p is a prefix of q.
- * p and q should be of the form (A/...)
- */
- static private boolean prefixes(File p, File q) {
- if (p.equals(q))
- return true;
- else if (q.getParentFile() == null)
- return false;
- else
- return prefixes(p, q.getParentFile());
- }
- // and
- static private File hereFile = new File(".");
- static private File subtractPrefix(File p, File f) {
- if (p.equals(hereFile))
- return f;
- else
- return subtractPrefix(p, f, hereFile);
- }
- static private File subtractPrefix(File p, File f, File acc) {
- if (p.equals(f))
- return acc;
- else if (f.getParentFile() == null)
- return null;
- else
- return subtractPrefix(p, f.getParentFile(),
- (acc.equals(hereFile) ?
- new File(f.getName()) :
- new File(f.getName(), acc.getPath())));
- }
-
- static protected URI mkURI(String uri) {
- try {
- return new URI(uri);
- }
- catch (Exception e) {
- throw Debug.abort(e);
- }
- }
-
- public static void main(String[] args) {
- File p = new File("A", "B");
- File q = new File("A", new File("B", "C").getPath());
- File r = new File("C");
- System.out.println("" + longestCommonPrefix(p, q));
- System.out.println("" + longestCommonPrefix(p, r));
- System.out.println("" + subtractPrefix(longestCommonPrefix(p, r), p));
-
- System.out.println("" + asSeenFrom(q, p));
- System.out.println("" + asSeenFrom(p, r));
- }
-
-}
diff --git a/sources/scala/tools/scaladoc/MLType.scala b/sources/scala/tools/scaladoc/MLType.scala
deleted file mode 100644
index 3dc6c89a14..0000000000
--- a/sources/scala/tools/scaladoc/MLType.scala
+++ /dev/null
@@ -1,690 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{symtab => scalac_symtab}
-import scalac.Global;
-import scalac.util.Names;
-
-package scala.tools.scaladoc {
-
- import scalac_symtab._;
- import scala.collection.immutable._;
-
- /**
- * @author Vincent Cremet
- * @author Roland Tchakoute
- */
- abstract class ML {
-
- ////////////// TYPE CONSTRUCTORS ////////////////
-
- trait TypeConstructor[T <: TypeConstructor[T]] {
- def sameAs(that: T): boolean;
- }
- type TC <: TypeConstructor[TC];
-
- trait MLType {
- override def toString(): String = this match {
- case TypeVar(n) => "x" + n
- case UnitType => "unit"
- case AtomicType(c, args) => c.toString() + "[" + args.mkString("", ", ","") + "]"
- case ProdType(l, r) => "(" + l + " * " + r + ")"
- case FunType(arg, res) => "(" + arg.toString() + " -> " + res + ")"
- }
- def * (that: MLType) = ProdType(this, that);
- def -> (that: MLType) = FunType(this, that);
- }
- def x(n: int) = TypeVar(n);
- val unt = UnitType;
- def at(c: TC, args: MLType*) = AtomicType(c, args.asInstanceOf[List[MLType]]);
-
- case class TypeVar(n: int) extends MLType;
- case object UnitType extends MLType;
- case class AtomicType(c: TC, args: List[MLType]) extends MLType;
- case class ProdType(l: MLType, r: MLType) extends MLType;
- case class FunType(arg: MLType, res: MLType) extends MLType;
-
- val fullIso = true;
-
- ///////////////// NORMAL FORMS ////////////////////
-
- /** Transform a type into his normal form. */
- def normalForm(t: MLType): MLType = {
- def normalFormAux(t: MLType): MLType = t match {
- case FunType(arg, UnitType) => if (fullIso) UnitType else t
- case FunType(UnitType, res) => res
- case ProdType(l, UnitType) => l
- case ProdType(UnitType, r) => r
- case FunType(ProdType(l, r), res) =>
- normalFormAux(FunType(l, normalFormAux(FunType(r, res))))
- case FunType(arg, ProdType(l,r)) =>
- ProdType(normalFormAux(FunType(arg, l)), normalFormAux(FunType(arg, r)))
- case _ => t
- }
- t match {
- case ProdType(l, r) =>
- normalFormAux(ProdType(normalForm(l), normalForm(r)))
- case FunType (arg, res) =>
- normalFormAux(FunType(normalForm(arg), normalForm(res)))
- case _ => t
- }
- }
-
- type Type_coords = Pair[int, List[MLType]];
-
- def rewriteType(t: MLType): Type_coords = {
- def flatten(t: MLType): Type_coords = t match {
- case ProdType(l,r) => {
- val Pair(len1, l1) = flatten(l);
- val Pair(len2, l2) = flatten(r);
- Pair(len1 + len2, l1 ::: l2)
- }
- case _ => Pair(1, List(t))
- }
- flatten(normalForm(t))
- }
-
- /////////////////// RENAMINGS ////////////////////////
-
- type Renaming = Map[int,int];
-
- def rename_type(ren: Renaming): MLType => MLType = {
- if (ren.isEmpty)
- (x => x)
- else {
- case TypeVar(n) => TypeVar(ren(n))
- case UnitType => UnitType
- case AtomicType(c, args) => AtomicType(c, args map rename_type(ren))
- case ProdType(l, r) => ProdType(rename_type(ren)(l), rename_type(ren)(r))
- case FunType(arg, res) => FunType(rename_type(ren)(arg), rename_type(ren)(res))
- }
- }
-
- ///////////////// SPLIT NORMAL FORMS ///////////////////
-
-
- def fold[a,b](l: List[a], z: b, op: (b, a) => Pair[b,a]): Pair[b, List[a]] =
- l match {
- case List() => Pair(z, List())
- case x :: xs => {
- val Pair(z1, x1) = op(z, x);
- val Pair(z2, xs1) = fold(xs, z1, op);
- Pair(z2, x1 :: xs1)
- }
- }
-
- def containsProdType(t: MLType): boolean = t match {
- case ProdType(_, _) => true
- case TypeVar(_) => false
- case UnitType => false
- case AtomicType(_, _) => false
- case FunType(arg, res) => containsProdType(arg) || containsProdType(res)
- }
-
- def split_vars(start: int, t: Type_coords): Pair[Pair[int, Renaming], Type_coords] = {
- /**
- * Take a coordinate and return a copy with type variables renamed and
- * keeping track of the renaming.
- */
- def shift_compact_vars(p: Pair[int, Renaming], t: MLType) : Pair[Pair[int, Renaming], MLType] = {
- if (containsProdType(t))
- Console.println("SPLIT_VARS: " + t);
- val Pair(start, ren) = p;
- t match {
- case TypeVar(n) =>
- if (ren.contains(n))
- Pair(Pair(start, ren), TypeVar(ren(n)))
- else
- Pair(Pair(start + 1, ren.incl(Pair(n, start))), TypeVar(start))
- case UnitType => Pair(p, t)
- case FunType(arg, res) => {
- val Pair(Pair(new_start, new_ren), new_arg) = shift_compact_vars(Pair(start, ren), arg);
- val Pair(q, new_res) = shift_compact_vars(Pair(new_start, new_ren), res);
- Pair(q, FunType(new_arg, new_res))
- }
- case AtomicType(c, args) => {
- val Pair(p, new_args) = fold(args, Pair(start, ren), shift_compact_vars);
- Pair(p, AtomicType(c, new_args))
- }
- }
- }
- def shifter(p: Pair[int, Renaming], coord: MLType): Pair[Pair[int, Renaming], MLType] = {
- val Pair(start, ren) = p;
- val Pair(Pair(new_start, local_ren), new_coord) =
- shift_compact_vars(Pair(start, ListMap.Empty), coord);
- Pair(Pair(new_start, ren incl local_ren), new_coord)
- }
-
- val Pair(len, coords) = t;
- val Pair(p, ren_coords) = fold(coords, Pair(start, ListMap.Empty[int, int]), shifter);
- Pair(p, Pair(len , ren_coords))
- }
-
- def splitRewrite(start: int, t: MLType): Pair[Pair[int, Renaming], Type_coords] =
- split_vars(start, rewriteType(t));
-
- /////////////// FUNCTIONAL TYPE FLATENING ////////////////
-
- type Head_type = Pair[int, MLType];
- // type Flat_type = Pair[Head_type, List[Flat_type]];
- trait Flat_type ;
- case class Fl(res: Head_type, args: List[Flat_type]) extends Flat_type;
-
- def flatten (t: MLType): Flat_type = t match {
- case FunType(args1, FunType(args2, res)) => {
- val f1 = flatten(args1);
- val f2 = flatten(args2);
- val Fl(Pair(len, head), tail) = flatten(res);
- Fl(Pair(len + 2, head), f1 :: f2 :: tail)
- }
- case FunType(args,res) => Fl(Pair(1, res), List(flatten(args)))
- case _ => Fl(Pair(0, t), List());
- }
-
- ////////////// PERMUTATIONS ///////////////////
-
- def perms[a](l: List[a]): List[List[a]] = {
- def insert(y: a)(l: List[a]): List[List[a]] =
- l match {
- case List() => List(List(y))
- case x :: xs => (y :: l) :: (insert(y)(xs) map { ys => x :: ys })
- }
- l match {
- case List() => List(List())
- case x :: xs => perms(xs) flatMap insert(x)
- }
- }
-
- ///////////////// FUNCTIONAL TYPE UNIFICATION ////////////////
-
- /** Global renaming. */
- var globalRen: Renaming = ListMap.Empty;
-
- def rename_var(x1: int, x2: int): boolean =
- Pair(globalRen.get(x1), globalRen.get(x2)) match {
- case Pair(Some(y1), Some(y2)) => y1 == x2
- case Pair(None, None) => {
- globalRen = globalRen.incl(Pair(x1, x2), Pair(x2, x1));
- true
- }
- case _ => false
- }
-
- def unify_LC (f1: Flat_type, f2: Flat_type): boolean = {
- val Fl(Pair(len1, res1), args1) = f1;
- val Fl(Pair(len2, res2), args2) = f2;
- if(len1 != len2)
- false
- else {
- val saved_renaming = globalRen;
- if (unify_head(res1, res2))
- unify_list(args1, args2)
- else {
- globalRen = saved_renaming;
- false
- }
- }
- }
-
- case object UnifyHeadExc extends Exception;
-
- def unify_head(t1: MLType,t2: MLType): boolean = {
- def unify_rec(p: Pair[MLType, MLType]): unit = p match {
- case Pair(UnitType, UnitType) => ()
- case Pair(TypeVar(n), TypeVar(m)) =>
- if (rename_var(n,m))
- ()
- else
- throw UnifyHeadExc
- case Pair(_, TypeVar(_)) => throw UnifyHeadExc;
- case Pair(TypeVar(_), _) => throw UnifyHeadExc;
- case Pair(AtomicType(c1, args1), AtomicType(c2, args2)) =>
- if (c1 sameAs c2)
- (args1 zip args2) foreach unify_rec
- else
- throw UnifyHeadExc
- case _ => throw UnifyHeadExc
- }
- try{
- unify_rec(Pair(t1, t2));
- true
- }
- catch {
- case UnifyHeadExc => false
- }
- }
-
- case object FoundExc extends Exception;
-
- def unify_list(fs1: List[Flat_type], fs2: List[Flat_type]): boolean = {
- try{
- perms(fs1) foreach {
- fs => {
- val saved_renaming = globalRen;
- unify_map(fs, fs2);
- globalRen = saved_renaming;
- }
- }
- false
- }
- catch {
- case FoundExc => true;
- }
- }
-
- def unify_map (fs1: List[Flat_type], fs2: List[Flat_type]): boolean =
- Pair(fs1, fs2) match {
- case Pair(List(), List()) => throw FoundExc
- case Pair(a :: resta, b :: restb) =>
- if (unify_LC(a, b))
- unify_map (resta, restb)
- else
- false
- }
-
- def unify_left_commutative(f1: Flat_type, f2: Flat_type): Pair[boolean, Renaming] = {
- globalRen = ListMap.Empty;
- val unifiable = unify_LC(f1, f2);
- Pair(unifiable, globalRen)
- }
-
- def findiso(fs: List[Flat_type], f: Flat_type): Triple[Boolean, List[Flat_type], Renaming] =
- fs match {
- case List() => Triple(false, List(), ListMap.Empty)
- case g :: gs => {
- val Pair(unifiable, ren) = unify_left_commutative(f, g);
- if (unifiable)
- Triple(true, gs, ren)
- else {
- val Triple(b, rest, ren) = findiso(gs, f);
- Triple(b, g :: rest, ren)
- }
- }
- }
-
- def quadratic_test(a: List[Flat_type], b: List[Flat_type]): Option[Renaming] = {
- var renaming: Renaming = ListMap.Empty;
- def q_test(a: List[Flat_type], b: List[Flat_type]): Option[Renaming] =
- Pair(a,b) match {
- case Pair(List(), List()) => Some(renaming)
- case Pair(List(), _) => None
- case Pair(_, List()) => None
- case Pair(fs, g :: gs) => {
- val Triple(b, rest, ren) = findiso(fs, g);
- if (b) {
- renaming = ren incl renaming;
- q_test(rest, gs)
- }
- else
- None
- }
- }
- q_test(a, b)
- }
-
- def iso(a: MLType): MLType => Triple[Option[Renaming], Renaming, Renaming] = {
- val Pair(Pair(start_a, ren_a), Pair(len_a, coords_a)) = splitRewrite(1, a);
- val flat_coords_a = coords_a map flatten;
- {
- b => {
- val Pair(Pair(_, ren_b), Pair(len_b, coords_b)) = splitRewrite(start_a, b);
- if (len_a != len_b)
- Triple(None, ren_a, ren_b)
- else{
- val flat_coords_b = coords_b map flatten;
- Triple(quadratic_test(flat_coords_a, flat_coords_b), ren_a, ren_b)
- }
- }
- }
- }
-
- def build_renaming(ren_unif: Renaming, ren_a: Renaming, ren_b: Renaming): Renaming = {
- def ren_builder(r: Renaming, ren_a: Renaming)(key: int, value: int) = ren_a(r(value));
- def inverse(ren: Renaming): Renaming = (ren foldLeft (ListMap.Empty: Renaming)) {
- (ren_inv, p) => (ren_inv + p._2 -> p._1)
- }
- ren_b map (ren_builder(ren_unif, inverse(ren_a)))
- }
-
- def printIso(t: MLType,u: MLType): unit = {
- Console.println("TEST ISO");
- Console.println(t.toString());
- Console.println(u.toString());
- iso(t)(u) match {
- case Triple(None, _, _) =>
- Console.println("Not isomorphic.");
- case Triple(Some(ren_unif), ren_a, ren_b) => {
- Console.println("Isomorphic:");
- val response = rename_type(build_renaming(ren_unif, ren_a, ren_b))(u);
- Console.println(response.toString());
- }
- }
- }
-
- }
-
- class ScalaML(global: Global) extends ML with TypeIsomorphism {
-
- class ScalaTC(sym: Symbol) extends TypeConstructor[ScalaTC] {
- val symbol: Symbol = sym;
- def sameAs(that: ScalaTC): boolean = (symbol == that.symbol);
- override def toString(): String = symbol.nameString();
- }
-
- type TC = ScalaTC;
-
- /** Build a product type from a list of types. */
- def mkProd(l: List[MLType]): MLType = l match {
- case List() => UnitType
- case t :: List() => t
- case t :: ts => ProdType(t, mkProd(ts))
- }
-
- ////////////////////// TESTS /////////////////////
-
- /** Test if this type is "scala.Unit". */
- def is_scala_Unit(t: Type): boolean =
- t.symbol() == Global.instance.definitions.UNIT_CLASS;
-
- /** Test if this type is "scala.Tuple_n[T_1, ..., T_n]". */
- def is_scala_Tuple(t: Type): boolean = {
- val tuples = Global.instance.definitions.TUPLE_CLASS;
- val arity = t.typeArgs().length;
- arity < tuples.length && t.symbol() == tuples(arity);
- }
-
- /** Test if this type is "scala.Function_n[T_1, ..., T_n, T]". */
- def is_scala_Function(t: Type): boolean = {
- val functions = Global.instance.definitions.FUNCTION_CLASS;
- val arity = t.typeArgs().length - 1;
- 0 <= arity && arity < functions.length && t.symbol() == functions(arity);
- }
-
- /** Test if this type is a local variable */
- def is_localVariable(t: Type): boolean =
- t.symbol().isAbstractType() && t.symbol().isParameter();
-
- case object TranslateExc extends Exception;
-
- /** Try to translate a Scala type into an ML type. */
- def translate(t: Type): Option[Pair[MLType, Map[Symbol, int]]] = {
-
- // global renaming
- var renaming: Map[Symbol, int] = ListMap.Empty;
- def renamed(sym: Symbol) =
- if (renaming.contains(sym))
- renaming(sym)
- else {
- val len = renaming.size;
- renaming = renaming.incl(Pair(sym, len));
- len
- }
-
- def listOfArray[a](r: Array[a]): List[a] =
- List.fromArray(r, 0, r.length);
-
- def trans(t: Type): MLType =
- // scala.Unit
- if (is_scala_Unit(t))
- UnitType
- // scala.Tuple_n[T_1, ..., T_n]
- else if (is_scala_Tuple(t))
- t match {
- case Type$TypeRef(_, _, args) => mkProd(listOfArray(args) map trans)
- }
- // scala.Function_n[T_1, ..., T_n, T]
- else if (is_scala_Function(t))
- t match {
- case Type$TypeRef(_, _, args) => {
- val params = listOfArray(args);
- FunType(mkProd(params.init map trans), trans(params.last))
- }
- }
- // local variable
- else if (is_localVariable(t))
- TypeVar(renamed(t.symbol()))
- else
- t match {
- // ex: scala.List[int]
- case Type$TypeRef(_, sym, args) =>
- AtomicType(new TC(sym), listOfArray(args) map trans_atomic)
- // [a_1, ..., a_n] T
- case Type$PolyType(tparams, result) => trans(result)
- // (T_1, ..., T_n) => T
- case Type$MethodType(vparams, result) =>
- FunType(mkProd(listOfArray(vparams) map { x => trans(x.getType()) }), trans(result))
- // Types that do not have ML equivalents.
- case _ => throw TranslateExc
- }
- def trans_atomic(t: Type): MLType =
- if (is_localVariable(t))
- TypeVar(renamed(t.symbol()))
- else
- t match {
- // ex: scala.List[int]
- case Type$TypeRef(_, sym, args) =>
- AtomicType(new TC(sym), listOfArray(args) map trans_atomic)
- case _ => throw TranslateExc
- }
- try {
- val ml_t = trans(t);
- Some(Pair(ml_t, renaming))
- }
- catch {
- case e => {
- // Console.println(e.toString());
- None
- }
- }
- }
-
- def translateAndPrint(t: Type): String = translate(t).toString();
-
- def isMLType(t: Type): boolean = translate(t) match {
- case None => false
- case _ => true
- }
-
- def arrayOfList(l: List[Symbol]): Array[Symbol] = {
- val a = new Array[Symbol](l.length);
- (l foldLeft 0) { (i, x) => { a(i) = x; i + 1 } };
- a
- }
-
- def stringOfArray(a: Array[Symbol]): String = {
- val buf = new StringBuffer();
- for(val i <- List.range(0, a.length)) buf.append(a(i).toString() + ", ");
- buf.toString()
- }
-
- def foreach(a: Array[Symbol])(f: Symbol => Symbol): Array[Symbol] = {
- val b = new Array[Symbol](a.length);
- for(val i <- List.range(0, a.length)) b(i) = f(a(i));
- b
- }
-
- def subst(t: Type, ren: Map[Symbol, Symbol]): Type = {
- val Pair(from, to) = List.unzip(ren.toList);
- val from_array = arrayOfList(from);
- val to_array = arrayOfList(to);
- def subst_aux(t: Type): Type = t match {
- case Type$PolyType(tparams, result) => {
- val substTparams = foreach(tparams) { sym => ren(sym) };
- new Type$PolyType(substTparams, subst_aux(result))
- }
- case _ => t.subst(from_array, to_array)
- }
- val substType = subst_aux(t);
- substType
- }
-
- def searchIso(search: Type): Option[Type => Option[Map[Symbol, Symbol]]] =
- translate(search) match {
- case None => None
- case Some(Pair(search_ml, ren_search)) => {
- val iso_search = iso(search_ml);
- def comp(found: Type): Option[Map[Symbol, Symbol]] = translate(found) match {
- case None => None
- case Some(Pair(found_ml, ren_found)) =>
- iso_search(found_ml) match {
- case Triple(None, _, _) => None
- case Triple(Some(ren_unif), ren_a, ren_b) => {
- val ren_ml = build_renaming(ren_unif, ren_a, ren_b);
- val ren = scalaRenaming(ren_ml, ren_search, ren_found);
- Some(ren)
- }
- }
- }
- Some(comp)
- }
- }
-
- def inverseMap[a,b](map: Map[a,b]): Map[b,a] =
- (map foldLeft (ListMap.Empty: Map[b,a])) {
- (map_inv, p) => (map_inv + p._2 -> p._1)
- }
-
- def composeMap[a,b,c](map1: Map[a,b], map2: Map[b,c]): Map[a,c] =
- (map1 foldLeft (ListMap.Empty: Map[a,c])) {
- (map_inv, p) =>
- if (map2.contains(p._2))
- (map_inv + p._1 -> map2(p._2))
- else
- map_inv
- }
-
- /**
- * Build the renaming to represent the matching type with same
- * type variables as in the request type.
- */
- def scalaRenaming(ren_unif: Map[int, int], ren_search: Map[Symbol, int], ren_found: Map[Symbol, int]): Map[Symbol, Symbol] =
- composeMap(ren_found, composeMap(ren_unif, inverseMap(ren_search)));
-
- def mkTypeVar(sym: Symbol): Type =
- Type.typeRef(Type.NoPrefix, sym, Type.EMPTY_ARRAY);
-
- def addParamTypes(paramTypes: Array[Type], t: Type): Type = t match {
- case Type$PolyType(tparams, result) => new Type$PolyType(tparams, addParamTypes(paramTypes, result))
- case Type$MethodType(vparams, result) => new Type$MethodType(vparams, addParamTypes(paramTypes, result))
- case _ => global.definitions.FUNCTION_TYPE(paramTypes, t)
- }
-
- def addClassContext(clazz: Symbol, t: Type): Type = {
- val class_tparam_symbols: Array[Symbol] = clazz.typeParams();
- val class_tparams: Array[Type] = new Array[Type](class_tparam_symbols.length);
- for(val i <- List.range(0, class_tparams.length))
- class_tparams(i) = mkTypeVar(class_tparam_symbols(i));
- val class_type = Type.appliedType(clazz.typeConstructor(), class_tparams);
- val paramTypes = new Array[Type](1);
- paramTypes(0) = class_type;
- t match {
- case Type$PolyType(tparams, result) => {
- val all_tparams = new Array[Symbol](class_tparam_symbols.length + tparams.length);
- for(val i <- List.range(0, class_tparam_symbols.length)) all_tparams(i) = class_tparam_symbols(i);
- for(val i <- List.range(0, tparams.length)) all_tparams(i + class_tparam_symbols.length) = tparams(i);
- new Type$PolyType(all_tparams, addParamTypes(paramTypes, result))
- }
- case _ => new Type$PolyType(class_tparam_symbols, addParamTypes(paramTypes, t))
- }
- }
-
- /** Implement type isomorphism. */
- def searchType(t: Type, isDocumented: SymbolBooleanFunction): java.util.Iterator/*[Pair[Symbol, Type]]*/ = {
- val found = new java.util.LinkedList;
- searchIso(t) match {
- case None => {}
- case Some(test) => {
- val rootNode: node.T = node.make(isDocumented)(global.definitions.ROOT_CLASS).head;
- def searchInModule(m: node.T): unit = m.members foreach {
- member =>
- if (member.symbol.isClass())
- searchInClass(member)
- else if (member.symbol.isTerm()) {
- test(member.symbol.getType()) match {
- case None => {}
- case Some(ren) => {
- val adaptedType = subst(member.symbol.getType(), ren);
- val result = new SearchResult(member.symbol,
- adaptedType,
- false,
- null);
-
- found.add(result)
- }
- }
- if (member.symbol.isPackage() || member.symbol.isPackageClass() || member.symbol.isModule())
- searchInModule(member)
- }
- }
- def searchInClass(m: node.T): unit = m.members foreach {
- member =>
- if (member.symbol.isTerm()) {
- val extended_type = addClassContext(m.symbol, member.symbol.getType());
- test(extended_type) match {
- case None => {}
- case Some(ren) => {
- val adaptedType = subst(member.symbol.getType(), ren);
- val adaptedTparams = foreach(m.symbol.typeParams()) { sym => ren(sym) };
- val result = new SearchResult(member.symbol,
- adaptedType,
- true,
- adaptedTparams);
- found.add(result)
- }
- }
- }
- }
- searchInModule(rootNode);
- }
- };
- found.iterator()
- }
- }
-
- object node {
-
- def listOfArray[a](r: Array[a]): List[a] =
- List.fromArray(r, 0, r.length);
-
- /** Documentation node. */
- trait T {
- val symbol: Symbol;
- def members: List[T];
- }
-
- /** Build a node from a root symbol. */
- def make(isDocumented: SymbolBooleanFunction)(root: Symbol): List[T] =
- if (ScalaSearch.isRelevant(root) && isDocumented.apply(root))
- List(new T {
- val symbol = root;
- def members: List[T] = listOfArray(ScalaSearch.members(root, isDocumented)) flatMap make(isDocumented);
- })
- else
- List();
- }
-
-}
-
- /*
- object stringML extends ML with Application {
-
- class StringTC(s: String) extends TypeConstructor[StringTC] {
- val name: String = s;
- def sameAs(that: StringTC): boolean = name.equals(that.name);
- override def toString(): String = name;
- }
-
- type TC = StringTC;
-
- val list = new TC("List");
- val t = (at(list, x(11)) * (x(11) -> x(12))) -> at(list, x(12));
- val u = (x(13) -> x(14)) -> (at(list, x(13)) -> at(list, x(14)));
- printIso(t, u);
- }
- */
-
diff --git a/sources/scala/tools/scaladoc/Main.scala b/sources/scala/tools/scaladoc/Main.scala
deleted file mode 100644
index f05b86fd84..0000000000
--- a/sources/scala/tools/scaladoc/Main.scala
+++ /dev/null
@@ -1,61 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-import scalac.{Global => scalac_Global};
-import scala.tools.scalac.{Global, CompilerPhases};
-import scala.tools.util.ConsoleReporter;
-
-package scala.tools.scaladoc {
-
-/**
- * The main class for scaladoc, an HTML documentation generator
- * for the programming language Scala.
- *
- * @author Vincent Cremet, Stephane Micheloud
- * @version 1.0
- */
-object Main {
-
- val PRODUCT: String =
- System.getProperty("scala.product", "scaladoc");
- val VERSION: String =
- System.getProperty("scala.version", "1.0");
-
- def main(args: Array[String]): Unit = {
- val reporter = new ConsoleReporter();
- val phases = new CompilerPhases(); {
- // we skip all phases between ANALYZER and TERMINAL.
- val array = phases.phases();
- var i = 0;
- var skip = false;
- while (i < array.length - 1) {
- if (skip)
- array(i).addSkipFlag();
- else
- skip = array(i) == phases.ANALYZER;
- i = i + 1;
- }
- }
- val command = new HTMLGeneratorCommand(PRODUCT, VERSION, reporter, phases);
- if (command.parse(args) && command.files.list.size() > 0) {
- val global = new Global(command);
- global.compile(command.files.toArray(), false);
- if (reporter.errors() == 0) {
- val generator = new HTMLGenerator(global) {
- def newTypeIso(global: scalac_Global): TypeIsomorphism =
- new ScalaML(global);
- }
- generator.apply();
- }
- reporter.printSummary();
- }
- // System.exit(if (reporter.errors() > 0) 1 else 0);
- }
-
-}
-}
diff --git a/sources/scala/tools/scaladoc/Page.java b/sources/scala/tools/scaladoc/Page.java
deleted file mode 100644
index c9d4d2005c..0000000000
--- a/sources/scala/tools/scaladoc/Page.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.io.File;
-import java.net.URI;
-import java.io.Writer;
-import java.io.BufferedWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import ch.epfl.lamp.util.XMLAttribute;
-import ch.epfl.lamp.util.HTMLPrinter;
-import ch.epfl.lamp.util.HTMLRepresentation;
-import scalac.util.Debug;
-
-/**
- * This class represents a web page. The user of this class has to
- * call the method <code>open</code>, then fill the page and finally
- * call the method <code>close</code>.
- */
-class Page extends HTMLPrinter {
-
- /** Page URL relative to the root directory.
- */
- URI uri;
-
- /** Frame where to print the contents of links that appear on the
- * page.
- */
- public String destinationFrame;
-
- /** Build a page.
- */
- public Page(Writer writer, URI uri, String destinationFrame,
- String title, HTMLRepresentation representation,
- String stylesheet, String script) {
- super(writer, title, representation, stylesheet, script);
- this.uri = uri;
- this.destinationFrame = destinationFrame;
- }
-
- /** Open the page.
- */
- public void open() {}
-
- /** Close the page.
- */
- public void close() {
- try {
- getCodePrinter().getWriter().close();
- } catch (IOException e) {
- throw Debug.abort(e);
- }
- }
-}
diff --git a/sources/scala/tools/scaladoc/ScalaSearch.java b/sources/scala/tools/scaladoc/ScalaSearch.java
deleted file mode 100644
index 1d2f423eff..0000000000
--- a/sources/scala/tools/scaladoc/ScalaSearch.java
+++ /dev/null
@@ -1,603 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-
-import ch.epfl.lamp.util.Pair;
-
-import scala.tools.util.SourceFile;
-
-import scalac.Global;
-import scalac.symtab.Scope;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.symtab.Modifiers;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.NameTransformer;
-
-import java.io.*;
-import scala.tools.scalac.ast.parser.Parser$class;
-import scalac.CompilationUnit;
-
-/**
- * This class contains functions to retrieve information from a Scala
- * library.
- */
-public class ScalaSearch {
-
- /////////////////// SYMBOLS TESTERS ////////////////////////////
-
- /** Test if the given symbol is a class, a package, or an object.
- */
- static boolean isContainer(Symbol sym) {
- return sym.isClass() || sym.isModule() || sym.isPackage() || sym.isPackageClass();
- }
-
- /** Test if the given symbol has a lazy type.
- */
- static boolean isLazy(Symbol sym) {
- return
- (sym.rawInfo() instanceof Type.LazyType) ||
- ((sym.rawInfo() instanceof Type.TypeRef) &&
- (sym.rawInfo().symbol().rawInfo() instanceof Type.LazyType));
- }
-
- /** Test if the given symbol is private (without evaluating its type).
- */
- static boolean isPrivate(Symbol sym) {
- return (sym.flags & Modifiers.PRIVATE) != 0;
- }
-
- /** Test if the given symbol has been generated by the compiler.
- */
- public static boolean isGenerated(Symbol sym) {
- return
- (sym.isSynthetic() && !sym.isRoot()) ||
- (sym.name.indexOf('$') >= 0 &&
- NameTransformer.decode(sym.name).equals(sym.name.toString())) ||
- NameTransformer.decode(sym.name).endsWith("_=");
- }
-
- /** Test if the given symbol is an empty java module generated to
- * contain static fields and methods of a java class.
- */
- public static boolean isEmptyJavaModule(Symbol sym) {
- return sym.isModule() && sym.isJava() && !(sym.isPackage() || sym.isPackageClass()) && (members(sym).length == 0);
- }
-
- /** Test if the given symbol is access method for a val.
- */
- public static boolean isValMethod(Symbol sym) {
- return (sym.isInitializedMethod() && (sym.flags & Modifiers.STABLE) != 0);
- }
-
- /** Test if the given symbol is a phantom top-level class or object.
- */
- public static boolean isPhantom(Symbol sym) {
- return
- (sym.isClass() && sym.info().isError()) ||
- (sym.isModule() && sym.info() == Type.NoType);
- }
-
- /** Test if the given symbol is relevant for the documentation.
- */
- public static boolean isRelevant(Symbol sym) {
- return !isGenerated(sym) && !isLazy(sym) && !isPrivate(sym) &&
- !sym.isConstructor() &&
- !sym.isCaseFactory() && !isEmptyJavaModule(sym) &&
- !isPhantom(sym);
- }
-
- ////////////////////////// SCOPE ITERATOR ///////////////////////////////
-
- static class LazySymbolIterator extends SymbolIterator {
- private Symbol[] alternatives = Symbol.EMPTY_ARRAY;
- private int altindex = 0;
- private int elemindex = 0;
-
- private Scope scope;
-
- public LazySymbolIterator(Scope scope) {
- this.scope = scope;
- scope.elements();
- }
-
- public boolean hasNext() {
- return altindex < alternatives.length ||
- elemindex < scope.getElemsCache().length;
- }
-
- public Symbol next() {
- if (altindex < alternatives.length)
- return alternatives[altindex++];
- else {
- Symbol sym = scope.getElemsCache()[elemindex++];
- if (isLazy(sym))
- return sym;
- else {
- switch (sym.type()) {
- case OverloadedType(Symbol[] alts, _):
- alternatives = alts;
- altindex = 0;
- return next();
- default:
- return sym;
- }
- }
- }
- }
- }
-
- ////////////////////////// TRAVERSER ///////////////////////////////
-
- /** Function from Symbol to void.
- */
- public static abstract class SymFun {
- public abstract void apply(Symbol sym);
- }
-
- /** Apply a given function to all symbols below the given symbol
- * in the symbol table.
- */
- public static void foreach(Symbol sym, SymFun fun) {
- if (isRelevant(sym)) {
- fun.apply(sym);
- Symbol[] members = members(sym);
- for(int i = 0; i < members.length; i++)
- foreach(members[i], fun);
- }
- }
-
- /** Return all members of a container symbol.
- */
- public static Symbol[] members(Symbol sym) {
- if (isContainer(sym) && !isLazy(sym)) {
- List memberList = new LinkedList();
- SymbolIterator i =
- new LazySymbolIterator(sym.members());
- //sym.members().iterator();
- while (i.hasNext()) {
- Symbol member = i.next();
- if (isRelevant(member))
- memberList.add(member);
- }
- return (Symbol[]) memberList.toArray(new Symbol[memberList.size()]);
- }
- else
- return new Symbol[0];
- }
-
- /** Apply a given function to all symbols below the given symbol
- * in the symbol table.
- */
- public static void foreach(Symbol sym, SymFun fun,
- SymbolBooleanFunction isDocumented) {
- if (isDocumented.apply(sym) && isRelevant(sym)) {
- fun.apply(sym);
- Symbol[] members = members(sym, isDocumented);
- for(int i = 0; i < members.length; i++)
- foreach(members[i], fun, isDocumented);
- }
- }
-
- /** Return all members of a container symbol.
- */
- public static Symbol[] members(Symbol sym,
- SymbolBooleanFunction isDocumented) {
- if (isContainer(sym) && !isLazy(sym)) {
- List memberList = new LinkedList();
- SymbolIterator i =
- new LazySymbolIterator(sym.members());
- //sym.members().iterator();
- while (i.hasNext()) {
- Symbol member = i.next();
- if (isDocumented.apply(member) && isRelevant(sym))
- memberList.add(member);
- }
- return (Symbol[]) memberList.toArray(new Symbol[memberList.size()]);
- }
- else
- return new Symbol[0];
- }
-
- ///////////////////////// COMPARATORS ///////////////////////////////
-
- /**
- * Use the simple name of symbols to order them.
- */
- public static Comparator symAlphaOrder = new Comparator() {
- public int compare(Object o1, Object o2) {
- Symbol symbol1 = (Symbol) o1;
- Symbol symbol2 = (Symbol) o2;
- String name1 = symbol1.nameString();
- String name2 = symbol2.nameString();
- return name1.compareTo(name2);
- }
- public boolean equals(Object o) {
- return false;
- }
- };
-
- /**
- * Use the fully qualified name of symbols to order them.
- */
- public static Comparator symPathOrder = new Comparator() {
- public int compare(Object o1, Object o2) {
- int c = compare0(o1, o2);
- return c;
- }
- public int compare0(Object o1, Object o2) {
- LinkedList l1 = getOwners((Symbol)o1);
- LinkedList l2 = getOwners((Symbol)o2);
- for (int i = 0; true; i++) {
- if (i == l1.size() || i == l2.size())
- return l1.size() - l2.size();
- Symbol s1 = (Symbol)l1.get(i);
- Symbol s2 = (Symbol)l2.get(i);
- if (s1 == s2) continue;
- int c = s1.nameString().compareTo(s2.nameString());
- if (c != 0) return c;
- if (s1.isTerm() && s2.isType()) return -1;
- if (s1.isType() && s2.isTerm()) return +1;
- return s1.id - s2.id;
- }
- }
- public boolean equals(Object o) {
- return false;
- }
- public LinkedList getOwners(Symbol symbol) {
- LinkedList owners = new LinkedList();
- while (true) {
- assert !symbol.isNone() && !symbol.isError();
- owners.addFirst(symbol);
- if (symbol.isRoot()) break;
- if (symbol.isNone()) break;
- if (symbol.isError()) break;
- symbol = symbol.owner();
- }
- return owners;
- }
- };
-
- ///////////////////////// COLLECTORS ////////////////////////////
-
- /**
- * Returns the sorted list of packages from the root symbol.
- *
- * @param root
- */
- public static Symbol[] getSortedPackageList(Symbol root, SymbolBooleanFunction isDocumented) {
- final List packagesAcc = new LinkedList();
- foreach(root,
- new SymFun() {
- public void apply(Symbol sym) {
- if (sym.isPackage() || sym.isPackageClass())
- packagesAcc.add(sym);
- }
- }, isDocumented);
- Symbol[] packages = (Symbol[]) packagesAcc.toArray(new Symbol[packagesAcc.size()]);
- Arrays.sort(packages, symPathOrder);
- return packages;
- }
-
- public static Symbol[][] getSubContainerMembers(Symbol root, SymbolBooleanFunction isDocumented) {
- final List objectsAcc = new LinkedList();
- final List traitsAcc = new LinkedList();
- final List classesAcc = new LinkedList();
- foreach(root,
- new SymFun() {
- public void apply(Symbol sym) {
- if (sym.isTrait() && !sym.isModuleClass())
- traitsAcc.add(sym);
- else if (sym.isClass() && !sym.isModuleClass())
- classesAcc.add(sym);
- else if (sym.isModule() && !(sym.isPackage() || sym.isPackageClass()))
- objectsAcc.add(sym);
- }
- }, isDocumented
- );
- Symbol[] objects = (Symbol[]) objectsAcc.toArray(new Symbol[objectsAcc.size()]);
- Symbol[] traits = (Symbol[]) traitsAcc.toArray(new Symbol[traitsAcc.size()]);
- Symbol[] classes = (Symbol[]) classesAcc.toArray(new Symbol[classesAcc.size()]);
- Arrays.sort(objects, symAlphaOrder);
- Arrays.sort(traits, symAlphaOrder);
- Arrays.sort(classes, symAlphaOrder);
- return new Symbol[][]{ objects, traits, classes };
- }
-
- public static Symbol[][] splitMembers(Symbol[] syms) {
- List fields = new LinkedList();
- List methods = new LinkedList();
- List objects = new LinkedList();
- List traits = new LinkedList();
- List classes = new LinkedList();
- List packages = new LinkedList();
- for (int i = 0; i < syms.length; i++) {
- Symbol sym = syms[i];
- if (sym.isTrait()) traits.add(sym);
- else if (sym.isClass()) classes.add(sym);
- else if (sym.isPackage() || sym.isPackageClass()) packages.add(sym);
- else if (sym.isModule()) objects.add(sym);
- else if (sym.isMethod() && !isValMethod(sym)) methods.add(sym);
- else fields.add(sym);
- }
- return new Symbol[][] {
- (Symbol[]) fields.toArray(new Symbol[fields.size()]),
- (Symbol[]) methods.toArray(new Symbol[methods.size()]),
- (Symbol[]) objects.toArray(new Symbol[objects.size()]),
- (Symbol[]) traits.toArray(new Symbol[traits.size()]),
- (Symbol[]) classes.toArray(new Symbol[classes.size()]),
- (Symbol[]) packages.toArray(new Symbol[packages.size()])
- };
- }
-
- public static void categorizeSymbols(List symbols, List fields, List modules, List types) {
- Iterator i = symbols.iterator();
- while (i.hasNext()) {
- Symbol sym = (Symbol) i.next();
- if (sym.isPackage() || sym.isPackageClass() || sym.isModule())
- modules.add(sym);
- else if (sym.isTerm())
- fields.add(sym);
- else
- types.add(sym);
- }
- }
-
- public static Symbol[] sortList(List symbols) {
- Symbol[] array = (Symbol[]) symbols.toArray(new Symbol[symbols.size()]);
- Arrays.sort(array, symAlphaOrder);
- return array;
- }
-
- /////////////////// IMPLEMENTING CLASSES OR OBJECTS //////////////////////
-
- /**
- * Returns a hashtable which maps each class symbol to the list of
- * its direct sub-classes or sub-modules. We also keep track of
- * the exact involved type.
- * Result type = Map<Symbol, List<Pair<Symbol, Type>>
- *
- * @param root
- */
- public static Map subTemplates(Symbol root, SymbolBooleanFunction isDocumented) {
- final Map subs = new HashMap();
- foreach(root, new SymFun() { public void apply(Symbol sym) {
- if (sym.isClass() || sym.isModule()) {
- Type[] parents = (sym.isModule() ? sym.moduleClass(): sym).parents();
- for (int i = 0; i < parents.length; i++) {
- Symbol parentSymbol = parents[i].symbol();
- List subList = (List) subs.get(parentSymbol);
- if (subList == null) {
- subList = new LinkedList();
- subs.put(parentSymbol, subList);
- }
- subList.add(new Pair(sym, parents[i]));
- }
- }
- }
- }, isDocumented);
- return subs;
- }
-
- //////////////////////// INDEX BUILDER /////////////////////////////
-
- /**
- * Returns the list of characters with the sorted list of
- * members starting with a character.
- * Result type = Pair<Character[], Map<Character, Symbol[]>>
- *
- * @param root
- */
- public static Pair index(Symbol root, final SymbolBooleanFunction isDocumented) {
- final Map index = new HashMap();
- // collecting
- foreach(root, new SymFun() { public void apply(Symbol sym) {
- String name = sym.nameString();
- if (name.length() > 0) {
- char ch = Character.toUpperCase(name.charAt(0));
- Character unicode = new Character(ch);
- List symList = (List) index.get(unicode);
- if (symList == null) {
- symList = new LinkedList();
- index.put(unicode, symList);
- }
- symList.add(sym);
- }
- }
- }, isDocumented);
- // sorting
- Character[] chars = (Character[]) index.keySet()
- .toArray(new Character[index.keySet().size()]);
- Arrays.sort(chars);
- for (int i = 0; i < chars.length; i++) {
- Character car = chars[i];
- List symList = (List) index.get(car);
- Symbol[] syms = (Symbol[]) symList.toArray(new Symbol[symList.size()]);
- Arrays.sort(syms, symAlphaOrder);
- index.put(car, syms);
- }
- return new Pair(chars, index);
- }
-
- //////////////////////////// INHERITED MEMBERS //////////////////////////////
-
- /**
- * Finds all local and inherited members of a given class or
- * object.
- *
- * @param sym
- */
- public static Symbol[] collectMembers(Symbol sym) {
- Type thistype = sym.thisType();
- Name[] names = collectNames(thistype);
- List/*<Symbol>*/ members = new LinkedList();
- for (int i = 0; i < names.length; i++) {
- Symbol member = thistype.lookup(names[i]);
- if (member != Symbol.NONE)
- members.add(member);
- }
- List unloadedMembers = new LinkedList();
- Iterator it = members.iterator();
- while (it.hasNext()) {
- Symbol[] alts = ((Symbol) it.next()).alternativeSymbols();
- for (int i = 0; i < alts.length; i++)
- if (isRelevant(alts[i]))
- unloadedMembers.add(alts[i]);
- }
- return (Symbol[]) unloadedMembers.toArray(new Symbol[unloadedMembers.size()]);
- }
-
- // where
- protected static Name[] collectNames(Type tpe) {
- List names = new LinkedList();
- collectNames(tpe, names);
- return (Name[]) names.toArray(new Name[names.size()]);
- }
-
- // where
- protected static void collectNames(Type tpe, List/*<Name>*/ names) {
- // local members
- SymbolIterator it =
- new LazySymbolIterator(tpe.members());
- //tpe.members().iterator();
- while (it.hasNext()) {
- Name name = ((Symbol) it.next()).name;
- if (!names.contains(name))
- names.add(name);
- }
- // inherited members
- Type[] parents = tpe.parents();
- for (int i = 0; i < parents.length; i++)
- collectNames(parents[i], names);
- }
-
- /**
- * Groups symbols with respect to their owner and sort the owners
- * by name.
- *
- * @param syms
- */
- public static Pair/*<Symbol[], Map<Symbol, Symbol[]>>*/ groupSymbols(Symbol[] syms) {
- Map/*<Symbol, List>*/ groups = new HashMap();
- for (int i = 0; i < syms.length; i++) {
- List group = (List) groups.get(syms[i].owner());
- if (group == null) {
- group = new LinkedList();
- groups.put(syms[i].owner(), group);
- }
- group.add(syms[i]);
- }
- Symbol[] owners =
- (Symbol[]) groups.keySet().toArray(new Symbol[groups.keySet().size()]);
- Arrays.sort(owners, symPathOrder);
- for (int i = 0; i < owners.length; i++) {
- List groupList = (List) groups.get(owners[i]);
- Symbol[] group =
- (Symbol[]) groupList.toArray(new Symbol[groupList.size()]);
- Arrays.sort(group, symAlphaOrder);
- groups.put(owners[i], group);
- }
- return new Pair(owners, groups);
- }
-
- //////////////////////////// OVERRIDEN SYMBOL //////////////////////////////
-
- public static Symbol overridenBySymbol(Symbol sym) {
- Symbol owner = sym.owner();
- if (owner.isRoot() || owner.isPackageClass())
- return Symbol.NONE;
- else {
- Type base = Type.compoundTypeWithOwner(owner,
- sym.owner().info().parents(),
- Scope.EMPTY);
- return sym.overriddenSymbol(base);
- }
- }
-
- ////////////////////////// POST TYPECHECKING ////////////////////////
-
- public static int queryCounter = 0;
-
- /**
- * Parse a string representing a Scala type and resolve its
- * symbols. This function must be called after the typechecking
- * phase. If parsing or type checking fails, return Type.NoType.
- */
- public static Type typeOfString(String typeString, Global global) {
- int errorNumber = global.reporter.errors();
- String unitString = "trait tmp$" + queryCounter +
- " extends Option[unit] { def f" + typeString + "; }";
- // Rem: we use a dummy extends clause, otherwise the compiler
- // complains.
- queryCounter = queryCounter + 1;
- SourceFile sourceFile = global.getSourceFile("tmp.scala", unitString);
- CompilationUnit tmpUnit = new CompilationUnit(global, sourceFile, false);
- tmpUnit.body = new Parser$class(tmpUnit).parse();
- global.PHASE.NAMER.phase().apply(tmpUnit);
- global.PHASE.ANALYZER.phase().apply(tmpUnit);
- if (global.reporter.errors() == errorNumber) {
- Scope tmpScope = tmpUnit.body[0].symbol().members();
- Type res = tmpScope.lookup(Name.fromString("f")).type();
- return res;
- }
- else
- return Type.NoType;
- }
-
-}
-
-//////////////////////////// DOCUMENTED SYMBOLS //////////////////////////////
-
-/** Compute documented symbols. */
-public class DocSyms {
-
- Set syms;
-
- DocSyms(Global global, Symbol[] packages) {
- syms = new HashSet();
- for(int i = 0; i < packages.length; i++) {
- Symbol pack = packages[i];
- // add all sub-members.
- ScalaSearch.foreach(pack,
- new ScalaSearch.SymFun() {
- public void apply(Symbol sym) {
- syms.add(sym.isModule() ? sym.moduleClass() : sym);
- }
- }
- );
- // add all super packages.
- while (!pack.isRoot()) {
- pack = pack.owner();
- syms.add(pack);
- }
- }
- }
-
- public boolean contains(Symbol sym) {
- if (sym.isParameter()) return contains(sym.classOwner());
- if (sym.isModule()) return contains(sym.moduleClass());
- return syms.contains(sym);
- }
-}
-
-public abstract class SymbolBooleanFunction {
- public abstract boolean apply(Symbol sym);
-}
diff --git a/sources/scala/tools/scaladoc/StandardDocModule.java b/sources/scala/tools/scaladoc/StandardDocModule.java
deleted file mode 100644
index 7b77f3f000..0000000000
--- a/sources/scala/tools/scaladoc/StandardDocModule.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import scalac.Global;
-import scalac.CompilationUnit;
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-/**
- * Phase which generates HTML documentation.
- */
-public class StandardDocModule {
-
- private final Global global;
-
- /**
- * Constructor
- *
- * @param globlal
- */
- public StandardDocModule(Global global) {
- super();
- this.global = global;
- }
-
- /**
- * ..
- */
- public void apply() {
- HTMLGenerator.apply(global);
- }
-
- /**
- * ..
- *
- * @param global
- */
- public static void apply(Global global) {
- new StandardDocModule(global).apply();
- }
-
-}
diff --git a/sources/scala/tools/scaladoc/SymbolTablePrinter.java b/sources/scala/tools/scaladoc/SymbolTablePrinter.java
deleted file mode 100644
index cfce384d9d..0000000000
--- a/sources/scala/tools/scaladoc/SymbolTablePrinter.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.io.StringWriter;
-
-import ch.epfl.lamp.util.CodePrinter;
-import ch.epfl.lamp.util.HTMLPrinter;
-
-import scalac.Global;
-import scalac.atree.AConstant;
-import scalac.symtab.*;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.Type.Constraint;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.NameTransformer;
-
-// Lines modified or added by Vincent are marked "vincent".
-
-/**
- * This class provides methods to print symbols and types.
- */
-public abstract class MySymbolTablePrinter extends SymbolTablePrinter {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- protected final Global global;
-
- //########################################################################
- // Public Constructors
-
- /**
- * Creates a new instance.
- *
- * @param page
- */
- public MySymbolTablePrinter(CodePrinter printer) {
- super(printer);
- this.global = Global.instance;
- }
-
- public abstract void printSymbol(Symbol sym, boolean addLink);
-
- //########################################################################
- // Public Methods - Printing symbols
-
- /**
- * Prints the name of the given symbol usage.
- *
- * @param symbol
- */
- public SymbolTablePrinter printSymbolName(Symbol symbol) {
- printSymbol(symbol, true);
- printSymbolUniqueId(symbol);
- return this;
- }
-
- /**
- * Prints the name of the given symbol definition.
- *
- * @param symbol
- * @param addLink
- */
- public SymbolTablePrinter printDefinedSymbolName(Symbol symbol, boolean addLink) {
- printSymbol(symbol, addLink);
- printSymbolUniqueId(symbol);
- return this;
- }
-
- public SymbolTablePrinter printSeqType(Symbol symbol, Type t, String inner) {
- Type type = t;
- boolean star = false;
- if ((symbol.flags & Modifiers.REPEATED) != 0 &&
- type.symbol() == global.definitions.SEQ_CLASS &&
- type.typeArgs().length == 1)
- {
- type = type.typeArgs()[0];
- star = true;
- }
- printType(type, inner);
- if (star) print("*");
- return this;
- }
-
- /**
- * Writes the string representation of the signature of a definition.
- *
- * @param sym
- * @param addLink Generates an hypertext reference if the parameter
- * <code>addLink</code> is <code>true</code>
- */
- public void defString(Symbol sym, boolean addLink) {
- if (sym.isRoot())
- print("Root class");
- else if (sym.isClass() || sym.isModule())
- printTemplateSignature(sym, addLink);
- else if (sym.isType() && !sym.isParameter())
- printShortSignature(sym, addLink);
- else
- printSignature(sym, addLink);
- }
-
- public SymbolTablePrinter printSignature(Symbol symbol) {
- return printSignature(symbol, false);
- }
-
- /**
- * Prints the signature of the given symbol.
- *
- * @param symbol
- * @param addLink
- */
- public SymbolTablePrinter printSignature(Symbol symbol, boolean addLink) {
- return printShortSignature(symbol, addLink)
- .printSymbolType(symbol, getSymbolInnerString(symbol));
- }
-
- public SymbolTablePrinter printValueParams(Symbol[] vparams) {
- print('(');
- for (int i = 0; i < vparams.length; i++) {
- if (i > 0) print(", ");
- defString(vparams[i], false);
- }
- return print(')');
- }
-
- /** The keyword of a symbol from the user side. */
- public String getSymbolKeywordForDoc(Symbol symbol) {
- String keyword = getSymbolKeyword(symbol);
- // accessor function for a val
- if (symbol.isInitializedMethod() && symbol.hasStableFlag())
- keyword = "val";
- return keyword;
- }
-
- /**
- * Prints the signature of the given symbol.
- *
- * @param symbol
- * @param addLink
- */
- public SymbolTablePrinter printShortSignature(Symbol symbol, boolean addLink) {
- String keyword = getSymbolKeywordForDoc(symbol);
- if (keyword != null) print(keyword).space();
- // variance
- if (symbol.variance() > 0)
- print("+");
- else if (symbol.variance() < 0)
- print("-");
- printSymbol(symbol, addLink);
- return printType(symbol.loBound(), " >: ");
- }
-
- /**
- * Prints the signature of a class symbol.
- *
- * @param symbol
- * @param addLink
- * @return the current symbol table printer
- */
- public SymbolTablePrinter printTemplateSignature(Symbol symbol, boolean addLink) {
- // kind
- String keyword = getSymbolKeywordForDoc(symbol);
- if (keyword != null) print(keyword).space();
- String inner = getSymbolInnerString(symbol);
-
- // name
- printDefinedSymbolName(symbol, addLink);
- if (symbol.isClass()) {
- // type parameters
- Symbol[] tparams = symbol.typeParams();
- if (tparams.length != 0 || global.debug) printTypeParams(tparams);
- // value parameters
- Symbol[] vparams = symbol.valueParams();
- printValueParams(vparams);
- }
-
- // parents
-// Type[] parts = symbol.moduleClass().parents();
-// if (parts.length != 0) space().print(inner).space();
-// printTypes(parts," with ");
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing constants
-
- /** Prints the given constant value. */
- public SymbolTablePrinter printConstantValue(AConstant value) {
- return this;
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scaladoc/SymbolTablePrinterFactory.java b/sources/scala/tools/scaladoc/SymbolTablePrinterFactory.java
deleted file mode 100644
index c00dc1db77..0000000000
--- a/sources/scala/tools/scaladoc/SymbolTablePrinterFactory.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import scalac.Global;
-import scalac.symtab.Kinds;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.symtab.Type.*;
-import scalac.symtab.SymbolTablePrinter;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Strings;
-import SymbolBooleanFunction;
-
-class SymbolTablePrinterFactory {
-
- public static MySymbolTablePrinter makeHTML(final HTMLGenerator htmlGenerator,
- final Page page,
- final SymbolBooleanFunction isDocumented) {
-
- return new MySymbolTablePrinter(page.getCodePrinter()) {
-
- public void printSymbol(Symbol sym, boolean addLink) {
- String name = sym.nameString();
- // remove the leading "?" for names that come from attributes
- if (name.startsWith("?"))
- name = name.substring(1);
- if (global.debug) name = sym.name.toString();
- if (isDocumented.apply(sym))
- if (addLink)
- page.printAhref(htmlGenerator.definitionURI(sym, page).toString(),
- page.destinationFrame, name);
- else {
- page.printOTag("em");
- page.print(name);
- page.printCTag("em");
- }
- else
- page.print(name);
- }
-
- public Type getTypeToPrintForPrefix(Type prefix/*, sym*/) {
- while (true) {
- Type result = getTypeToPrintForPrefix0(prefix);
- if (result == prefix || result == null) {
- return
- cleanPrefix(result, global, isDocumented);
- }
- prefix = result;
- }
- }
-
- protected String INNER_LT = "&lt;:";
-
- public String getSymbolInnerString(Symbol symbol) {
- if (symbol.kind == Kinds.TYPE)
- return INNER_LT; // HTML encoded "<:" symbol
- else
- return super.getSymbolInnerString(symbol);
- }
-
- public SymbolTablePrinter printType(Type type, String inner) {
- if ((INNER_LT.equals(inner) && type.symbol() == global.definitions.ANY_CLASS) ||
- (" >: ".equals(inner) && type.symbol() == global.definitions.ALL_CLASS))
- return this;
- else {
- printType0(getTypeToPrintForType(type), inner);
- return this;
- }
- }
- };
- }
-
- /**
- * Removes the longest prefix of this type which corresponds to a
- * nested of class and object definitions. The idea is that this
- * prefix is redondant and can be recovered directly from the tree
- * itself.
- *
- * @param prefix
- */
- static protected Type cleanPrefix(Type prefix, Global global, SymbolBooleanFunction isDocumented) {
- if (prefix == null) return null;
- if (prefix.symbol().kind == Kinds.NONE) return null;
- if (prefix.symbol().isRoot()) return null;
-
- // Next line should be removed in theory.
- if (prefix.symbol() == global.definitions.JAVALANG) return null;
-
- switch(prefix) {
- case ThisType(Symbol sym):
- if (sym.isPackageClass() && isDocumented.apply(sym))
- return null;
- else if (isDocumented.apply(sym))
- return null;
- else
- return prefix;
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Type pre1 = cleanPrefix(pre, global, isDocumented);
- if (pre1 == null && args.length == 0 && isDocumented.apply(sym))
- return null;
- else {
- pre1 = pre1 == null ? global.definitions.ROOT_CLASS.thisType() : pre1;
- return Type.typeRef(pre1, sym, args);
- }
- case SingleType(Type pre, Symbol sym):
- Type pre1 = cleanPrefix(pre, global, isDocumented);
- if (pre1 == null) {
- if (sym.isClass() || sym.isModule())
- if (isDocumented.apply(sym)) {
- return null;
- }
- else
- return Type.singleType(global.definitions.ROOT_CLASS.thisType(), sym);
- else
- return Type.singleType(global.definitions.ROOT_CLASS.thisType(), sym);
- }
- else
- return Type.singleType(pre1, sym);
- default:
- return prefix;
- }
- }
-
-
-
-}
diff --git a/sources/scala/tools/scaladoc/Tag.java b/sources/scala/tools/scaladoc/Tag.java
deleted file mode 100644
index 4e71031001..0000000000
--- a/sources/scala/tools/scaladoc/Tag.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.regex.*;
-
-import ch.epfl.lamp.util.Pair;
-
-import scalac.ast.Tree;
-import scalac.symtab.Symbol;
-
-import scaladoc.*;
-
-/**
- * Documentation tag.
- */
-public class Tag {
-
- /**
- * Symbol whose comment contains the tag.
- */
- public final Symbol holder;
-
- /**
- * Name of the tag.
- */
- public final String name;
-
- /**
- * Value of the tag.
- */
- public final String text;
-
- /**
- * Constructor
- *
- * @param name
- * @param text
- */
- public Tag(Symbol holder, String name, String text) {
- this.holder = holder;
- this.name = name;
- this.text = text;
- }
-
- /** String representation.
- */
- public String toString() {
- return "Tag(" + name + ", " + text + ")";
- }
-
- /**
- * Is this tag a param tag ?
- */
- public boolean isParam() {
- return name.equals("@param");
- }
-
- /**
- * Is this tag an exception tag ?
- */
- public boolean isException() {
- return name.equals("@param") || name.equals("@exception");
- }
-
- /**
- * Is this tag a reference tag ?
- */
- public boolean isReference() {
- return name.equals("@see") || name.equals("@link");
- }
-
- /**
- * Is this tag a text tag ?
- */
- public boolean isText() {
- return name.equals("@text");
- }
-
- /**
- * Splits a string containing spaces into two parts.
- *
- * @param text
- */
- public static Pair split(String text) {
- int length = text.length();
- int endFst = length;
- int startSnd = length;
- int current = 0;
- while (current < length && startSnd >= length) {
- char c = text.charAt(current);
- if (Character.isWhitespace(c) && endFst == length)
- endFst = current;
- else if (!Character.isWhitespace(c) && endFst != length)
- startSnd = current;
- current++;
- }
- return new Pair(text.substring(0, endFst),
- text.substring(startSnd, length));
- }
-
- /**
- * Kind of a reference tag.
- */
- public static class RefKind {
-
- /** Bad reference. */
- public case Bad(String ref);
-
- /** Reference to an URL. */
- public case Url(String ref);
-
- /** String literal reference. */
- public case Literal(String ref);
-
- /** Reference to a scala entity. */
- public case Scala(String container, String member, String label);
- }
-
- /**
- * Parses a reference tag.
- *
- * @param tag
- */
- protected static RefKind parseReference(Tag tag) {
- if (tag.text.startsWith("\""))
- return RefKind.Literal(tag.text);
- else if (tag.text.startsWith("<"))
- return RefKind.Url(tag.text);
- else {
- Pattern p = Pattern.compile("(([^#\\s]*)(#([^\\s]+))?)\\s*(.+)?");
- Matcher m = p.matcher(tag.text);
- if (m.find()) {
- String container = m.group(2) == null ? "" : m.group(2);
- String member = m.group(3);
- String label = m.group(4) == null ? "" : m.group(4);
- return RefKind.Scala(container, member, label);
- } else {
- System.err.println("Warning: Fail to parse see tag:" + tag + " in " + tag.holder);
- return RefKind.Bad(tag.text);
- }
- }
- }
-
-}
diff --git a/sources/scala/tools/scaladoc/TypeIsomorphism.java b/sources/scala/tools/scaladoc/TypeIsomorphism.java
deleted file mode 100644
index bfbd80a3eb..0000000000
--- a/sources/scala/tools/scaladoc/TypeIsomorphism.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scaladoc;
-
-import java.util.Iterator;
-import scalac.symtab.Type;
-import scalac.Global;
-
-public interface TypeIsomorphism {
-
- Iterator/*[Pair[Symbol, Type]]*/ searchType(Type type, SymbolBooleanFunction isDocumented);
-
-}
diff --git a/sources/scala/tools/scaladoc/resources/script.js b/sources/scala/tools/scaladoc/resources/script.js
deleted file mode 100644
index 94093ecc50..0000000000
--- a/sources/scala/tools/scaladoc/resources/script.js
+++ /dev/null
@@ -1,5 +0,0 @@
-<!--
-function setWindowTitle(title) {
- parent.document.title = title;
-}
--->
diff --git a/sources/scala/tools/scaladoc/resources/style.css b/sources/scala/tools/scaladoc/resources/style.css
deleted file mode 100644
index 5fecb9014e..0000000000
--- a/sources/scala/tools/scaladoc/resources/style.css
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Scaladoc style sheet */
-
-a:link {
- color: #0000ee;
-}
-
-a:visited {
- color: #551a8b;
-}
-
-a:active {
- color: #0000ee;
-}
-
-body {
- background-color: #ffffff;
-}
-
-div.entity {
- margin: 18px 0px 18px 0px;
- font-size: x-large;
- font-weight: bold;
-}
-
-div.doctitle {
- font-weight: bold;
- font-style: italic;
-}
-
-div.doctitle-larger {
- margin: 0px 0px 10px 0px;
- font-size: larger;
- font-weight: bold;
-}
-
-div.page-title {
- margin: 15px 0px 15px 0px;
- font-size: x-large;
- font-weight: bold;
- text-align: center;
-}
-
-span.entity {
- color: #ff6666;
-}
-
-table.member {
- border-collapse: collapse;
- border: 2px solid #888888;
- background-color: #ffffff;
- width: 100%;
-}
-
-table.member-detail {
- margin: 10px 0px 0px 0px;
- border-collapse: collapse;
- border: 2px solid #888888;
- background-color: #ffffff;
- width: 100%;
-}
-
-table.navigation {
- border-collapse: collapse;
- width: 100%;
- font-family: Arial,Helvetica,Sans-serif;
-}
-
-table.list {
- border-collapse: collapse;
- border-style: none;
- width: 100%;
-}
-
-td.inherited-members {
- border-top: 2px solid #888888;
- border-right: 0px;
-}
-
-td.inherited-owner {
- background-color: #eeeeff;
- font-weight: bold;
-}
-
-td.member-title {
- border: 2px solid #888888;
- background-color: #ccccff;
- font-size: x-large;
- font-weight: bold;
-}
-
-td.modifiers {
- border-top: 2px solid #888888;
- border-right: 2px solid #888888;
- width: 50px;
- text-align: right;
-}
-
-td.navigation-enabled {
- font-weight: bold;
- color: #000000;
- background-color: #eeeeff;
-}
-
-td.navigation-links {
- width: 100%;
- background-color: #eeeeff;
-}
-
-td.navigation-selected {
- font-weight: bold;
- color: #ffffff;
- background-color: #00008b;
-}
-
-td.signature {
- border-top: 2px solid #888888;
- width: 90%;
-}
-
-td.title {
- background-color: #ccccff;
- font-size: x-large;
- font-weight: bold;
-}
diff --git a/sources/scala/tools/scaladoc/resources/xhtml-lat1.ent b/sources/scala/tools/scaladoc/resources/xhtml-lat1.ent
deleted file mode 100644
index ffee223eb1..0000000000
--- a/sources/scala/tools/scaladoc/resources/xhtml-lat1.ent
+++ /dev/null
@@ -1,196 +0,0 @@
-<!-- Portions (C) International Organization for Standardization 1986
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
--->
-<!-- Character entity set. Typical invocation:
- <!ENTITY % HTMLlat1 PUBLIC
- "-//W3C//ENTITIES Latin 1 for XHTML//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
- %HTMLlat1;
--->
-
-<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
- U+00A0 ISOnum -->
-<!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
-<!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
-<!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
-<!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
-<!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
-<!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
- U+00A6 ISOnum -->
-<!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
-<!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
- U+00A8 ISOdia -->
-<!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
-<!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
-<!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
- = left pointing guillemet, U+00AB ISOnum -->
-<!ENTITY not "&#172;"> <!-- not sign = angled dash,
- U+00AC ISOnum -->
-<!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
- U+00AD ISOnum -->
-<!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
- U+00AE ISOnum -->
-<!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
- = APL overbar, U+00AF ISOdia -->
-<!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
-<!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
- U+00B1 ISOnum -->
-<!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
- = squared, U+00B2 ISOnum -->
-<!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
- = cubed, U+00B3 ISOnum -->
-<!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
- U+00B4 ISOdia -->
-<!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
-<!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
- U+00B6 ISOnum -->
-<!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
- = Greek middle dot, U+00B7 ISOnum -->
-<!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
-<!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
- U+00B9 ISOnum -->
-<!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
- U+00BA ISOnum -->
-<!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
- = right pointing guillemet, U+00BB ISOnum -->
-<!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
- = fraction one quarter, U+00BC ISOnum -->
-<!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
- = fraction one half, U+00BD ISOnum -->
-<!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
- = fraction three quarters, U+00BE ISOnum -->
-<!ENTITY iquest "&#191;"> <!-- inverted question mark
- = turned question mark, U+00BF ISOnum -->
-<!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
- = latin capital letter A grave,
- U+00C0 ISOlat1 -->
-<!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
- U+00C1 ISOlat1 -->
-<!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
- U+00C2 ISOlat1 -->
-<!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
- U+00C3 ISOlat1 -->
-<!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
- U+00C4 ISOlat1 -->
-<!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
- = latin capital letter A ring,
- U+00C5 ISOlat1 -->
-<!ENTITY AElig "&#198;"> <!-- latin capital letter AE
- = latin capital ligature AE,
- U+00C6 ISOlat1 -->
-<!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
- U+00C7 ISOlat1 -->
-<!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
- U+00C8 ISOlat1 -->
-<!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
- U+00C9 ISOlat1 -->
-<!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
- U+00CA ISOlat1 -->
-<!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
- U+00CB ISOlat1 -->
-<!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
- U+00CC ISOlat1 -->
-<!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
- U+00CD ISOlat1 -->
-<!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
- U+00CE ISOlat1 -->
-<!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
- U+00CF ISOlat1 -->
-<!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
-<!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
- U+00D1 ISOlat1 -->
-<!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
- U+00D2 ISOlat1 -->
-<!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
- U+00D3 ISOlat1 -->
-<!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
- U+00D4 ISOlat1 -->
-<!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
- U+00D5 ISOlat1 -->
-<!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
- U+00D6 ISOlat1 -->
-<!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
-<!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
- = latin capital letter O slash,
- U+00D8 ISOlat1 -->
-<!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
- U+00D9 ISOlat1 -->
-<!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
- U+00DA ISOlat1 -->
-<!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
- U+00DB ISOlat1 -->
-<!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
- U+00DC ISOlat1 -->
-<!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
- U+00DD ISOlat1 -->
-<!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
- U+00DE ISOlat1 -->
-<!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
- U+00DF ISOlat1 -->
-<!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
- = latin small letter a grave,
- U+00E0 ISOlat1 -->
-<!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
- U+00E1 ISOlat1 -->
-<!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
- U+00E2 ISOlat1 -->
-<!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
- U+00E3 ISOlat1 -->
-<!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
- U+00E4 ISOlat1 -->
-<!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
- = latin small letter a ring,
- U+00E5 ISOlat1 -->
-<!ENTITY aelig "&#230;"> <!-- latin small letter ae
- = latin small ligature ae, U+00E6 ISOlat1 -->
-<!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
- U+00E7 ISOlat1 -->
-<!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
- U+00E8 ISOlat1 -->
-<!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
- U+00E9 ISOlat1 -->
-<!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
- U+00EA ISOlat1 -->
-<!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
- U+00EB ISOlat1 -->
-<!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
- U+00EC ISOlat1 -->
-<!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
- U+00ED ISOlat1 -->
-<!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
- U+00EE ISOlat1 -->
-<!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
- U+00EF ISOlat1 -->
-<!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
-<!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
- U+00F1 ISOlat1 -->
-<!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
- U+00F2 ISOlat1 -->
-<!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
- U+00F3 ISOlat1 -->
-<!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
- U+00F4 ISOlat1 -->
-<!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
- U+00F5 ISOlat1 -->
-<!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
- U+00F6 ISOlat1 -->
-<!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
-<!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
- = latin small letter o slash,
- U+00F8 ISOlat1 -->
-<!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
- U+00F9 ISOlat1 -->
-<!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
- U+00FA ISOlat1 -->
-<!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
- U+00FB ISOlat1 -->
-<!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
- U+00FC ISOlat1 -->
-<!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
- U+00FD ISOlat1 -->
-<!ENTITY thorn "&#254;"> <!-- latin small letter thorn,
- U+00FE ISOlat1 -->
-<!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
- U+00FF ISOlat1 -->
diff --git a/sources/scala/tools/scaladoc/resources/xhtml-special.ent b/sources/scala/tools/scaladoc/resources/xhtml-special.ent
deleted file mode 100644
index ca358b2fec..0000000000
--- a/sources/scala/tools/scaladoc/resources/xhtml-special.ent
+++ /dev/null
@@ -1,80 +0,0 @@
-<!-- Special characters for XHTML -->
-
-<!-- Character entity set. Typical invocation:
- <!ENTITY % HTMLspecial PUBLIC
- "-//W3C//ENTITIES Special for XHTML//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
- %HTMLspecial;
--->
-
-<!-- Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
--->
-
-<!-- Relevant ISO entity set is given unless names are newly introduced.
- New names (i.e., not in ISO 8879 list) do not clash with any
- existing ISO 8879 entity names. ISO 10646 character numbers
- are given for each character, in hex. values are decimal
- conversions of the ISO 10646 values and refer to the document
- character set. Names are Unicode names.
--->
-
-<!-- C0 Controls and Basic Latin -->
-<!ENTITY quot "&#34;"> <!-- quotation mark, U+0022 ISOnum -->
-<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
-<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
-<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
-<!ENTITY apos "&#39;"> <!-- apostrophe = APL quote, U+0027 ISOnum -->
-
-<!-- Latin Extended-A -->
-<!ENTITY OElig "&#338;"> <!-- latin capital ligature OE,
- U+0152 ISOlat2 -->
-<!ENTITY oelig "&#339;"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
-<!-- ligature is a misnomer, this is a separate character in some languages -->
-<!ENTITY Scaron "&#352;"> <!-- latin capital letter S with caron,
- U+0160 ISOlat2 -->
-<!ENTITY scaron "&#353;"> <!-- latin small letter s with caron,
- U+0161 ISOlat2 -->
-<!ENTITY Yuml "&#376;"> <!-- latin capital letter Y with diaeresis,
- U+0178 ISOlat2 -->
-
-<!-- Spacing Modifier Letters -->
-<!ENTITY circ "&#710;"> <!-- modifier letter circumflex accent,
- U+02C6 ISOpub -->
-<!ENTITY tilde "&#732;"> <!-- small tilde, U+02DC ISOdia -->
-
-<!-- General Punctuation -->
-<!ENTITY ensp "&#8194;"> <!-- en space, U+2002 ISOpub -->
-<!ENTITY emsp "&#8195;"> <!-- em space, U+2003 ISOpub -->
-<!ENTITY thinsp "&#8201;"> <!-- thin space, U+2009 ISOpub -->
-<!ENTITY zwnj "&#8204;"> <!-- zero width non-joiner,
- U+200C NEW RFC 2070 -->
-<!ENTITY zwj "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
-<!ENTITY lrm "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
-<!ENTITY rlm "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
-<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub -->
-<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub -->
-<!ENTITY lsquo "&#8216;"> <!-- left single quotation mark,
- U+2018 ISOnum -->
-<!ENTITY rsquo "&#8217;"> <!-- right single quotation mark,
- U+2019 ISOnum -->
-<!ENTITY sbquo "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
-<!ENTITY ldquo "&#8220;"> <!-- left double quotation mark,
- U+201C ISOnum -->
-<!ENTITY rdquo "&#8221;"> <!-- right double quotation mark,
- U+201D ISOnum -->
-<!ENTITY bdquo "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
-<!ENTITY dagger "&#8224;"> <!-- dagger, U+2020 ISOpub -->
-<!ENTITY Dagger "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
-<!ENTITY permil "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
-<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
- U+2039 ISO proposed -->
-<!-- lsaquo is proposed but not yet ISO standardized -->
-<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
- U+203A ISO proposed -->
-<!-- rsaquo is proposed but not yet ISO standardized -->
-
-<!-- Currency Symbols -->
-<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
diff --git a/sources/scala/tools/scaladoc/resources/xhtml-symbol.ent b/sources/scala/tools/scaladoc/resources/xhtml-symbol.ent
deleted file mode 100644
index 63c2abfa6f..0000000000
--- a/sources/scala/tools/scaladoc/resources/xhtml-symbol.ent
+++ /dev/null
@@ -1,237 +0,0 @@
-<!-- Mathematical, Greek and Symbolic characters for XHTML -->
-
-<!-- Character entity set. Typical invocation:
- <!ENTITY % HTMLsymbol PUBLIC
- "-//W3C//ENTITIES Symbols for XHTML//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
- %HTMLsymbol;
--->
-
-<!-- Portions (C) International Organization for Standardization 1986:
- Permission to copy in any form is granted for use with
- conforming SGML systems and applications as defined in
- ISO 8879, provided this notice is included in all copies.
--->
-
-<!-- Relevant ISO entity set is given unless names are newly introduced.
- New names (i.e., not in ISO 8879 list) do not clash with any
- existing ISO 8879 entity names. ISO 10646 character numbers
- are given for each character, in hex. values are decimal
- conversions of the ISO 10646 values and refer to the document
- character set. Names are Unicode names.
--->
-
-<!-- Latin Extended-B -->
-<!ENTITY fnof "&#402;"> <!-- latin small letter f with hook = function
- = florin, U+0192 ISOtech -->
-
-<!-- Greek -->
-<!ENTITY Alpha "&#913;"> <!-- greek capital letter alpha, U+0391 -->
-<!ENTITY Beta "&#914;"> <!-- greek capital letter beta, U+0392 -->
-<!ENTITY Gamma "&#915;"> <!-- greek capital letter gamma,
- U+0393 ISOgrk3 -->
-<!ENTITY Delta "&#916;"> <!-- greek capital letter delta,
- U+0394 ISOgrk3 -->
-<!ENTITY Epsilon "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
-<!ENTITY Zeta "&#918;"> <!-- greek capital letter zeta, U+0396 -->
-<!ENTITY Eta "&#919;"> <!-- greek capital letter eta, U+0397 -->
-<!ENTITY Theta "&#920;"> <!-- greek capital letter theta,
- U+0398 ISOgrk3 -->
-<!ENTITY Iota "&#921;"> <!-- greek capital letter iota, U+0399 -->
-<!ENTITY Kappa "&#922;"> <!-- greek capital letter kappa, U+039A -->
-<!ENTITY Lambda "&#923;"> <!-- greek capital letter lamda,
- U+039B ISOgrk3 -->
-<!ENTITY Mu "&#924;"> <!-- greek capital letter mu, U+039C -->
-<!ENTITY Nu "&#925;"> <!-- greek capital letter nu, U+039D -->
-<!ENTITY Xi "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
-<!ENTITY Omicron "&#927;"> <!-- greek capital letter omicron, U+039F -->
-<!ENTITY Pi "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
-<!ENTITY Rho "&#929;"> <!-- greek capital letter rho, U+03A1 -->
-<!-- there is no Sigmaf, and no U+03A2 character either -->
-<!ENTITY Sigma "&#931;"> <!-- greek capital letter sigma,
- U+03A3 ISOgrk3 -->
-<!ENTITY Tau "&#932;"> <!-- greek capital letter tau, U+03A4 -->
-<!ENTITY Upsilon "&#933;"> <!-- greek capital letter upsilon,
- U+03A5 ISOgrk3 -->
-<!ENTITY Phi "&#934;"> <!-- greek capital letter phi,
- U+03A6 ISOgrk3 -->
-<!ENTITY Chi "&#935;"> <!-- greek capital letter chi, U+03A7 -->
-<!ENTITY Psi "&#936;"> <!-- greek capital letter psi,
- U+03A8 ISOgrk3 -->
-<!ENTITY Omega "&#937;"> <!-- greek capital letter omega,
- U+03A9 ISOgrk3 -->
-
-<!ENTITY alpha "&#945;"> <!-- greek small letter alpha,
- U+03B1 ISOgrk3 -->
-<!ENTITY beta "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
-<!ENTITY gamma "&#947;"> <!-- greek small letter gamma,
- U+03B3 ISOgrk3 -->
-<!ENTITY delta "&#948;"> <!-- greek small letter delta,
- U+03B4 ISOgrk3 -->
-<!ENTITY epsilon "&#949;"> <!-- greek small letter epsilon,
- U+03B5 ISOgrk3 -->
-<!ENTITY zeta "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
-<!ENTITY eta "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
-<!ENTITY theta "&#952;"> <!-- greek small letter theta,
- U+03B8 ISOgrk3 -->
-<!ENTITY iota "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
-<!ENTITY kappa "&#954;"> <!-- greek small letter kappa,
- U+03BA ISOgrk3 -->
-<!ENTITY lambda "&#955;"> <!-- greek small letter lamda,
- U+03BB ISOgrk3 -->
-<!ENTITY mu "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
-<!ENTITY nu "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
-<!ENTITY xi "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
-<!ENTITY omicron "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
-<!ENTITY pi "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
-<!ENTITY rho "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
-<!ENTITY sigmaf "&#962;"> <!-- greek small letter final sigma,
- U+03C2 ISOgrk3 -->
-<!ENTITY sigma "&#963;"> <!-- greek small letter sigma,
- U+03C3 ISOgrk3 -->
-<!ENTITY tau "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
-<!ENTITY upsilon "&#965;"> <!-- greek small letter upsilon,
- U+03C5 ISOgrk3 -->
-<!ENTITY phi "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
-<!ENTITY chi "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
-<!ENTITY psi "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
-<!ENTITY omega "&#969;"> <!-- greek small letter omega,
- U+03C9 ISOgrk3 -->
-<!ENTITY thetasym "&#977;"> <!-- greek theta symbol,
- U+03D1 NEW -->
-<!ENTITY upsih "&#978;"> <!-- greek upsilon with hook symbol,
- U+03D2 NEW -->
-<!ENTITY piv "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
-
-<!-- General Punctuation -->
-<!ENTITY bull "&#8226;"> <!-- bullet = black small circle,
- U+2022 ISOpub -->
-<!-- bullet is NOT the same as bullet operator, U+2219 -->
-<!ENTITY hellip "&#8230;"> <!-- horizontal ellipsis = three dot leader,
- U+2026 ISOpub -->
-<!ENTITY prime "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
-<!ENTITY Prime "&#8243;"> <!-- double prime = seconds = inches,
- U+2033 ISOtech -->
-<!ENTITY oline "&#8254;"> <!-- overline = spacing overscore,
- U+203E NEW -->
-<!ENTITY frasl "&#8260;"> <!-- fraction slash, U+2044 NEW -->
-
-<!-- Letterlike Symbols -->
-<!ENTITY weierp "&#8472;"> <!-- script capital P = power set
- = Weierstrass p, U+2118 ISOamso -->
-<!ENTITY image "&#8465;"> <!-- black-letter capital I = imaginary part,
- U+2111 ISOamso -->
-<!ENTITY real "&#8476;"> <!-- black-letter capital R = real part symbol,
- U+211C ISOamso -->
-<!ENTITY trade "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
-<!ENTITY alefsym "&#8501;"> <!-- alef symbol = first transfinite cardinal,
- U+2135 NEW -->
-<!-- alef symbol is NOT the same as hebrew letter alef,
- U+05D0 although the same glyph could be used to depict both characters -->
-
-<!-- Arrows -->
-<!ENTITY larr "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
-<!ENTITY uarr "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
-<!ENTITY rarr "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
-<!ENTITY darr "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
-<!ENTITY harr "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
-<!ENTITY crarr "&#8629;"> <!-- downwards arrow with corner leftwards
- = carriage return, U+21B5 NEW -->
-<!ENTITY lArr "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
-<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
- but also does not have any other character for that function. So lArr can
- be used for 'is implied by' as ISOtech suggests -->
-<!ENTITY uArr "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
-<!ENTITY rArr "&#8658;"> <!-- rightwards double arrow,
- U+21D2 ISOtech -->
-<!-- Unicode does not say this is the 'implies' character but does not have
- another character with this function so rArr can be used for 'implies'
- as ISOtech suggests -->
-<!ENTITY dArr "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
-<!ENTITY hArr "&#8660;"> <!-- left right double arrow,
- U+21D4 ISOamsa -->
-
-<!-- Mathematical Operators -->
-<!ENTITY forall "&#8704;"> <!-- for all, U+2200 ISOtech -->
-<!ENTITY part "&#8706;"> <!-- partial differential, U+2202 ISOtech -->
-<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
-<!ENTITY empty "&#8709;"> <!-- empty set = null set, U+2205 ISOamso -->
-<!ENTITY nabla "&#8711;"> <!-- nabla = backward difference,
- U+2207 ISOtech -->
-<!ENTITY isin "&#8712;"> <!-- element of, U+2208 ISOtech -->
-<!ENTITY notin "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
-<!ENTITY ni "&#8715;"> <!-- contains as member, U+220B ISOtech -->
-<!ENTITY prod "&#8719;"> <!-- n-ary product = product sign,
- U+220F ISOamsb -->
-<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
- the same glyph might be used for both -->
-<!ENTITY sum "&#8721;"> <!-- n-ary summation, U+2211 ISOamsb -->
-<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
- though the same glyph might be used for both -->
-<!ENTITY minus "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
-<!ENTITY lowast "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
-<!ENTITY radic "&#8730;"> <!-- square root = radical sign,
- U+221A ISOtech -->
-<!ENTITY prop "&#8733;"> <!-- proportional to, U+221D ISOtech -->
-<!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
-<!ENTITY ang "&#8736;"> <!-- angle, U+2220 ISOamso -->
-<!ENTITY and "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
-<!ENTITY or "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
-<!ENTITY cap "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
-<!ENTITY cup "&#8746;"> <!-- union = cup, U+222A ISOtech -->
-<!ENTITY int "&#8747;"> <!-- integral, U+222B ISOtech -->
-<!ENTITY there4 "&#8756;"> <!-- therefore, U+2234 ISOtech -->
-<!ENTITY sim "&#8764;"> <!-- tilde operator = varies with = similar to,
- U+223C ISOtech -->
-<!-- tilde operator is NOT the same character as the tilde, U+007E,
- although the same glyph might be used to represent both -->
-<!ENTITY cong "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
-<!ENTITY asymp "&#8776;"> <!-- almost equal to = asymptotic to,
- U+2248 ISOamsr -->
-<!ENTITY ne "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
-<!ENTITY equiv "&#8801;"> <!-- identical to, U+2261 ISOtech -->
-<!ENTITY le "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
-<!ENTITY ge "&#8805;"> <!-- greater-than or equal to,
- U+2265 ISOtech -->
-<!ENTITY sub "&#8834;"> <!-- subset of, U+2282 ISOtech -->
-<!ENTITY sup "&#8835;"> <!-- superset of, U+2283 ISOtech -->
-<!ENTITY nsub "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
-<!ENTITY sube "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
-<!ENTITY supe "&#8839;"> <!-- superset of or equal to,
- U+2287 ISOtech -->
-<!ENTITY oplus "&#8853;"> <!-- circled plus = direct sum,
- U+2295 ISOamsb -->
-<!ENTITY otimes "&#8855;"> <!-- circled times = vector product,
- U+2297 ISOamsb -->
-<!ENTITY perp "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
- U+22A5 ISOtech -->
-<!ENTITY sdot "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
-<!-- dot operator is NOT the same character as U+00B7 middle dot -->
-
-<!-- Miscellaneous Technical -->
-<!ENTITY lceil "&#8968;"> <!-- left ceiling = APL upstile,
- U+2308 ISOamsc -->
-<!ENTITY rceil "&#8969;"> <!-- right ceiling, U+2309 ISOamsc -->
-<!ENTITY lfloor "&#8970;"> <!-- left floor = APL downstile,
- U+230A ISOamsc -->
-<!ENTITY rfloor "&#8971;"> <!-- right floor, U+230B ISOamsc -->
-<!ENTITY lang "&#9001;"> <!-- left-pointing angle bracket = bra,
- U+2329 ISOtech -->
-<!-- lang is NOT the same character as U+003C 'less than sign'
- or U+2039 'single left-pointing angle quotation mark' -->
-<!ENTITY rang "&#9002;"> <!-- right-pointing angle bracket = ket,
- U+232A ISOtech -->
-<!-- rang is NOT the same character as U+003E 'greater than sign'
- or U+203A 'single right-pointing angle quotation mark' -->
-
-<!-- Geometric Shapes -->
-<!ENTITY loz "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
-
-<!-- Miscellaneous Symbols -->
-<!ENTITY spades "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
-<!-- black here seems to mean filled as opposed to hollow -->
-<!ENTITY clubs "&#9827;"> <!-- black club suit = shamrock,
- U+2663 ISOpub -->
-<!ENTITY hearts "&#9829;"> <!-- black heart suit = valentine,
- U+2665 ISOpub -->
-<!ENTITY diams "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
diff --git a/sources/scala/tools/scaladoc/resources/xhtml1-transitional.dtd b/sources/scala/tools/scaladoc/resources/xhtml1-transitional.dtd
deleted file mode 100644
index ba9be610a6..0000000000
--- a/sources/scala/tools/scaladoc/resources/xhtml1-transitional.dtd
+++ /dev/null
@@ -1,1201 +0,0 @@
-<!--
- Extensible HTML version 1.0 Transitional DTD
-
- This is the same as HTML 4 Transitional except for
- changes due to the differences between XML and SGML.
-
- Namespace = http://www.w3.org/1999/xhtml
-
- For further information, see: http://www.w3.org/TR/xhtml1
-
- Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
- All Rights Reserved.
-
- This DTD module is identified by the PUBLIC and SYSTEM identifiers:
-
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
-
- $Revision$
- $Date$
-
--->
-
-<!--================ Character mnemonic entities =========================-->
-
-<!ENTITY % HTMLlat1 PUBLIC
- "-//W3C//ENTITIES Latin 1 for XHTML//EN"
- "xhtml-lat1.ent">
-%HTMLlat1;
-
-<!ENTITY % HTMLsymbol PUBLIC
- "-//W3C//ENTITIES Symbols for XHTML//EN"
- "xhtml-symbol.ent">
-%HTMLsymbol;
-
-<!ENTITY % HTMLspecial PUBLIC
- "-//W3C//ENTITIES Special for XHTML//EN"
- "xhtml-special.ent">
-%HTMLspecial;
-
-<!--================== Imported Names ====================================-->
-
-<!ENTITY % ContentType "CDATA">
- <!-- media type, as per [RFC2045] -->
-
-<!ENTITY % ContentTypes "CDATA">
- <!-- comma-separated list of media types, as per [RFC2045] -->
-
-<!ENTITY % Charset "CDATA">
- <!-- a character encoding, as per [RFC2045] -->
-
-<!ENTITY % Charsets "CDATA">
- <!-- a space separated list of character encodings, as per [RFC2045] -->
-
-<!ENTITY % LanguageCode "NMTOKEN">
- <!-- a language code, as per [RFC3066] -->
-
-<!ENTITY % Character "CDATA">
- <!-- a single character, as per section 2.2 of [XML] -->
-
-<!ENTITY % Number "CDATA">
- <!-- one or more digits -->
-
-<!ENTITY % LinkTypes "CDATA">
- <!-- space-separated list of link types -->
-
-<!ENTITY % MediaDesc "CDATA">
- <!-- single or comma-separated list of media descriptors -->
-
-<!ENTITY % URI "CDATA">
- <!-- a Uniform Resource Identifier, see [RFC2396] -->
-
-<!ENTITY % UriList "CDATA">
- <!-- a space separated list of Uniform Resource Identifiers -->
-
-<!ENTITY % Datetime "CDATA">
- <!-- date and time information. ISO date format -->
-
-<!ENTITY % Script "CDATA">
- <!-- script expression -->
-
-<!ENTITY % StyleSheet "CDATA">
- <!-- style sheet data -->
-
-<!ENTITY % Text "CDATA">
- <!-- used for titles etc. -->
-
-<!ENTITY % FrameTarget "NMTOKEN">
- <!-- render in this frame -->
-
-<!ENTITY % Length "CDATA">
- <!-- nn for pixels or nn% for percentage length -->
-
-<!ENTITY % MultiLength "CDATA">
- <!-- pixel, percentage, or relative -->
-
-<!ENTITY % Pixels "CDATA">
- <!-- integer representing length in pixels -->
-
-<!-- these are used for image maps -->
-
-<!ENTITY % Shape "(rect|circle|poly|default)">
-
-<!ENTITY % Coords "CDATA">
- <!-- comma separated list of lengths -->
-
-<!-- used for object, applet, img, input and iframe -->
-<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
-
-<!-- a color using sRGB: #RRGGBB as Hex values -->
-<!ENTITY % Color "CDATA">
-
-<!-- There are also 16 widely known color names with their sRGB values:
-
- Black = #000000 Green = #008000
- Silver = #C0C0C0 Lime = #00FF00
- Gray = #808080 Olive = #808000
- White = #FFFFFF Yellow = #FFFF00
- Maroon = #800000 Navy = #000080
- Red = #FF0000 Blue = #0000FF
- Purple = #800080 Teal = #008080
- Fuchsia= #FF00FF Aqua = #00FFFF
--->
-
-<!--=================== Generic Attributes ===============================-->
-
-<!-- core attributes common to most elements
- id document-wide unique id
- class space separated list of classes
- style associated style info
- title advisory title/amplification
--->
-<!ENTITY % coreattrs
- "id ID #IMPLIED
- class CDATA #IMPLIED
- style %StyleSheet; #IMPLIED
- title %Text; #IMPLIED"
- >
-
-<!-- internationalization attributes
- lang language code (backwards compatible)
- xml:lang language code (as per XML 1.0 spec)
- dir direction for weak/neutral text
--->
-<!ENTITY % i18n
- "lang %LanguageCode; #IMPLIED
- xml:lang %LanguageCode; #IMPLIED
- dir (ltr|rtl) #IMPLIED"
- >
-
-<!-- attributes for common UI events
- onclick a pointer button was clicked
- ondblclick a pointer button was double clicked
- onmousedown a pointer button was pressed down
- onmouseup a pointer button was released
- onmousemove a pointer was moved onto the element
- onmouseout a pointer was moved away from the element
- onkeypress a key was pressed and released
- onkeydown a key was pressed down
- onkeyup a key was released
--->
-<!ENTITY % events
- "onclick %Script; #IMPLIED
- ondblclick %Script; #IMPLIED
- onmousedown %Script; #IMPLIED
- onmouseup %Script; #IMPLIED
- onmouseover %Script; #IMPLIED
- onmousemove %Script; #IMPLIED
- onmouseout %Script; #IMPLIED
- onkeypress %Script; #IMPLIED
- onkeydown %Script; #IMPLIED
- onkeyup %Script; #IMPLIED"
- >
-
-<!-- attributes for elements that can get the focus
- accesskey accessibility key character
- tabindex position in tabbing order
- onfocus the element got the focus
- onblur the element lost the focus
--->
-<!ENTITY % focus
- "accesskey %Character; #IMPLIED
- tabindex %Number; #IMPLIED
- onfocus %Script; #IMPLIED
- onblur %Script; #IMPLIED"
- >
-
-<!ENTITY % attrs "%coreattrs; %i18n; %events;">
-
-<!-- text alignment for p, div, h1-h6. The default is
- align="left" for ltr headings, "right" for rtl -->
-
-<!ENTITY % TextAlign "align (left|center|right|justify) #IMPLIED">
-
-<!--=================== Text Elements ====================================-->
-
-<!ENTITY % special.extra
- "object | applet | img | map | iframe">
-
-<!ENTITY % special.basic
- "br | span | bdo">
-
-<!ENTITY % special
- "%special.basic; | %special.extra;">
-
-<!ENTITY % fontstyle.extra "big | small | font | basefont">
-
-<!ENTITY % fontstyle.basic "tt | i | b | u
- | s | strike ">
-
-<!ENTITY % fontstyle "%fontstyle.basic; | %fontstyle.extra;">
-
-<!ENTITY % phrase.extra "sub | sup">
-<!ENTITY % phrase.basic "em | strong | dfn | code | q |
- samp | kbd | var | cite | abbr | acronym">
-
-<!ENTITY % phrase "%phrase.basic; | %phrase.extra;">
-
-<!ENTITY % inline.forms "input | select | textarea | label | button">
-
-<!-- these can occur at block or inline level -->
-<!ENTITY % misc.inline "ins | del | script">
-
-<!-- these can only occur at block level -->
-<!ENTITY % misc "noscript | %misc.inline;">
-
-<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
-
-<!-- %Inline; covers inline or "text-level" elements -->
-<!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
-
-<!--================== Block level elements ==============================-->
-
-<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
-<!ENTITY % lists "ul | ol | dl | menu | dir">
-<!ENTITY % blocktext "pre | hr | blockquote | address | center | noframes">
-
-<!ENTITY % block
- "p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
-
-<!-- %Flow; mixes block and inline and is used for list items etc. -->
-<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
-
-<!--================== Content models for exclusions =====================-->
-
-<!-- a elements use %Inline; excluding a -->
-
-<!ENTITY % a.content
- "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
-
-<!-- pre uses %Inline excluding img, object, applet, big, small,
- font, or basefont -->
-
-<!ENTITY % pre.content
- "(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
- %inline.forms; | %misc.inline;)*">
-
-<!-- form uses %Flow; excluding form -->
-
-<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
-
-<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
-
-<!ENTITY % button.content
- "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
- table | br | span | bdo | object | applet | img | map |
- %fontstyle; | %phrase; | %misc;)*">
-
-<!--================ Document Structure ==================================-->
-
-<!-- the namespace URI designates the document profile -->
-
-<!ELEMENT html (head, body)>
-<!ATTLIST html
- %i18n;
- id ID #IMPLIED
- xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
- >
-
-<!--================ Document Head =======================================-->
-
-<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
-
-<!-- content model is %head.misc; combined with a single
- title and an optional base element in any order -->
-
-<!ELEMENT head (%head.misc;,
- ((title, %head.misc;, (base, %head.misc;)?) |
- (base, %head.misc;, (title, %head.misc;))))>
-
-<!ATTLIST head
- %i18n;
- id ID #IMPLIED
- profile %URI; #IMPLIED
- >
-
-<!-- The title element is not considered part of the flow of text.
- It should be displayed, for example as the page header or
- window title. Exactly one title is required per document.
- -->
-<!ELEMENT title (#PCDATA)>
-<!ATTLIST title
- %i18n;
- id ID #IMPLIED
- >
-
-<!-- document base URI -->
-
-<!ELEMENT base EMPTY>
-<!ATTLIST base
- id ID #IMPLIED
- href %URI; #IMPLIED
- target %FrameTarget; #IMPLIED
- >
-
-<!-- generic metainformation -->
-<!ELEMENT meta EMPTY>
-<!ATTLIST meta
- %i18n;
- id ID #IMPLIED
- http-equiv CDATA #IMPLIED
- name CDATA #IMPLIED
- content CDATA #REQUIRED
- scheme CDATA #IMPLIED
- >
-
-<!--
- Relationship values can be used in principle:
-
- a) for document specific toolbars/menus when used
- with the link element in document head e.g.
- start, contents, previous, next, index, end, help
- b) to link to a separate style sheet (rel="stylesheet")
- c) to make a link to a script (rel="script")
- d) by stylesheets to control how collections of
- html nodes are rendered into printed documents
- e) to make a link to a printable version of this document
- e.g. a PostScript or PDF version (rel="alternate" media="print")
--->
-
-<!ELEMENT link EMPTY>
-<!ATTLIST link
- %attrs;
- charset %Charset; #IMPLIED
- href %URI; #IMPLIED
- hreflang %LanguageCode; #IMPLIED
- type %ContentType; #IMPLIED
- rel %LinkTypes; #IMPLIED
- rev %LinkTypes; #IMPLIED
- media %MediaDesc; #IMPLIED
- target %FrameTarget; #IMPLIED
- >
-
-<!-- style info, which may include CDATA sections -->
-<!ELEMENT style (#PCDATA)>
-<!ATTLIST style
- %i18n;
- id ID #IMPLIED
- type %ContentType; #REQUIRED
- media %MediaDesc; #IMPLIED
- title %Text; #IMPLIED
- xml:space (preserve) #FIXED 'preserve'
- >
-
-<!-- script statements, which may include CDATA sections -->
-<!ELEMENT script (#PCDATA)>
-<!ATTLIST script
- id ID #IMPLIED
- charset %Charset; #IMPLIED
- type %ContentType; #REQUIRED
- language CDATA #IMPLIED
- src %URI; #IMPLIED
- defer (defer) #IMPLIED
- xml:space (preserve) #FIXED 'preserve'
- >
-
-<!-- alternate content container for non script-based rendering -->
-
-<!ELEMENT noscript %Flow;>
-<!ATTLIST noscript
- %attrs;
- >
-
-<!--======================= Frames =======================================-->
-
-<!-- inline subwindow -->
-
-<!ELEMENT iframe %Flow;>
-<!ATTLIST iframe
- %coreattrs;
- longdesc %URI; #IMPLIED
- name NMTOKEN #IMPLIED
- src %URI; #IMPLIED
- frameborder (1|0) "1"
- marginwidth %Pixels; #IMPLIED
- marginheight %Pixels; #IMPLIED
- scrolling (yes|no|auto) "auto"
- align %ImgAlign; #IMPLIED
- height %Length; #IMPLIED
- width %Length; #IMPLIED
- >
-
-<!-- alternate content container for non frame-based rendering -->
-
-<!ELEMENT noframes %Flow;>
-<!ATTLIST noframes
- %attrs;
- >
-
-<!--=================== Document Body ====================================-->
-
-<!ELEMENT body %Flow;>
-<!ATTLIST body
- %attrs;
- onload %Script; #IMPLIED
- onunload %Script; #IMPLIED
- background %URI; #IMPLIED
- bgcolor %Color; #IMPLIED
- text %Color; #IMPLIED
- link %Color; #IMPLIED
- vlink %Color; #IMPLIED
- alink %Color; #IMPLIED
- >
-
-<!ELEMENT div %Flow;> <!-- generic language/style container -->
-<!ATTLIST div
- %attrs;
- %TextAlign;
- >
-
-<!--=================== Paragraphs =======================================-->
-
-<!ELEMENT p %Inline;>
-<!ATTLIST p
- %attrs;
- %TextAlign;
- >
-
-<!--=================== Headings =========================================-->
-
-<!--
- There are six levels of headings from h1 (the most important)
- to h6 (the least important).
--->
-
-<!ELEMENT h1 %Inline;>
-<!ATTLIST h1
- %attrs;
- %TextAlign;
- >
-
-<!ELEMENT h2 %Inline;>
-<!ATTLIST h2
- %attrs;
- %TextAlign;
- >
-
-<!ELEMENT h3 %Inline;>
-<!ATTLIST h3
- %attrs;
- %TextAlign;
- >
-
-<!ELEMENT h4 %Inline;>
-<!ATTLIST h4
- %attrs;
- %TextAlign;
- >
-
-<!ELEMENT h5 %Inline;>
-<!ATTLIST h5
- %attrs;
- %TextAlign;
- >
-
-<!ELEMENT h6 %Inline;>
-<!ATTLIST h6
- %attrs;
- %TextAlign;
- >
-
-<!--=================== Lists ============================================-->
-
-<!-- Unordered list bullet styles -->
-
-<!ENTITY % ULStyle "(disc|square|circle)">
-
-<!-- Unordered list -->
-
-<!ELEMENT ul (li)+>
-<!ATTLIST ul
- %attrs;
- type %ULStyle; #IMPLIED
- compact (compact) #IMPLIED
- >
-
-<!-- Ordered list numbering style
-
- 1 arabic numbers 1, 2, 3, ...
- a lower alpha a, b, c, ...
- A upper alpha A, B, C, ...
- i lower roman i, ii, iii, ...
- I upper roman I, II, III, ...
-
- The style is applied to the sequence number which by default
- is reset to 1 for the first list item in an ordered list.
--->
-<!ENTITY % OLStyle "CDATA">
-
-<!-- Ordered (numbered) list -->
-
-<!ELEMENT ol (li)+>
-<!ATTLIST ol
- %attrs;
- type %OLStyle; #IMPLIED
- compact (compact) #IMPLIED
- start %Number; #IMPLIED
- >
-
-<!-- single column list (DEPRECATED) -->
-<!ELEMENT menu (li)+>
-<!ATTLIST menu
- %attrs;
- compact (compact) #IMPLIED
- >
-
-<!-- multiple column list (DEPRECATED) -->
-<!ELEMENT dir (li)+>
-<!ATTLIST dir
- %attrs;
- compact (compact) #IMPLIED
- >
-
-<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
-<!ENTITY % LIStyle "CDATA">
-
-<!-- list item -->
-
-<!ELEMENT li %Flow;>
-<!ATTLIST li
- %attrs;
- type %LIStyle; #IMPLIED
- value %Number; #IMPLIED
- >
-
-<!-- definition lists - dt for term, dd for its definition -->
-
-<!ELEMENT dl (dt|dd)+>
-<!ATTLIST dl
- %attrs;
- compact (compact) #IMPLIED
- >
-
-<!ELEMENT dt %Inline;>
-<!ATTLIST dt
- %attrs;
- >
-
-<!ELEMENT dd %Flow;>
-<!ATTLIST dd
- %attrs;
- >
-
-<!--=================== Address ==========================================-->
-
-<!-- information on author -->
-
-<!ELEMENT address (#PCDATA | %inline; | %misc.inline; | p)*>
-<!ATTLIST address
- %attrs;
- >
-
-<!--=================== Horizontal Rule ==================================-->
-
-<!ELEMENT hr EMPTY>
-<!ATTLIST hr
- %attrs;
- align (left|center|right) #IMPLIED
- noshade (noshade) #IMPLIED
- size %Pixels; #IMPLIED
- width %Length; #IMPLIED
- >
-
-<!--=================== Preformatted Text ================================-->
-
-<!-- content is %Inline; excluding
- "img|object|applet|big|small|sub|sup|font|basefont" -->
-
-<!ELEMENT pre %pre.content;>
-<!ATTLIST pre
- %attrs;
- width %Number; #IMPLIED
- xml:space (preserve) #FIXED 'preserve'
- >
-
-<!--=================== Block-like Quotes ================================-->
-
-<!ELEMENT blockquote %Flow;>
-<!ATTLIST blockquote
- %attrs;
- cite %URI; #IMPLIED
- >
-
-<!--=================== Text alignment ===================================-->
-
-<!-- center content -->
-<!ELEMENT center %Flow;>
-<!ATTLIST center
- %attrs;
- >
-
-<!--=================== Inserted/Deleted Text ============================-->
-
-<!--
- ins/del are allowed in block and inline content, but its
- inappropriate to include block content within an ins element
- occurring in inline content.
--->
-<!ELEMENT ins %Flow;>
-<!ATTLIST ins
- %attrs;
- cite %URI; #IMPLIED
- datetime %Datetime; #IMPLIED
- >
-
-<!ELEMENT del %Flow;>
-<!ATTLIST del
- %attrs;
- cite %URI; #IMPLIED
- datetime %Datetime; #IMPLIED
- >
-
-<!--================== The Anchor Element ================================-->
-
-<!-- content is %Inline; except that anchors shouldn't be nested -->
-
-<!ELEMENT a %a.content;>
-<!ATTLIST a
- %attrs;
- %focus;
- charset %Charset; #IMPLIED
- type %ContentType; #IMPLIED
- name NMTOKEN #IMPLIED
- href %URI; #IMPLIED
- hreflang %LanguageCode; #IMPLIED
- rel %LinkTypes; #IMPLIED
- rev %LinkTypes; #IMPLIED
- shape %Shape; "rect"
- coords %Coords; #IMPLIED
- target %FrameTarget; #IMPLIED
- >
-
-<!--===================== Inline Elements ================================-->
-
-<!ELEMENT span %Inline;> <!-- generic language/style container -->
-<!ATTLIST span
- %attrs;
- >
-
-<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
-<!ATTLIST bdo
- %coreattrs;
- %events;
- lang %LanguageCode; #IMPLIED
- xml:lang %LanguageCode; #IMPLIED
- dir (ltr|rtl) #REQUIRED
- >
-
-<!ELEMENT br EMPTY> <!-- forced line break -->
-<!ATTLIST br
- %coreattrs;
- clear (left|all|right|none) "none"
- >
-
-<!ELEMENT em %Inline;> <!-- emphasis -->
-<!ATTLIST em %attrs;>
-
-<!ELEMENT strong %Inline;> <!-- strong emphasis -->
-<!ATTLIST strong %attrs;>
-
-<!ELEMENT dfn %Inline;> <!-- definitional -->
-<!ATTLIST dfn %attrs;>
-
-<!ELEMENT code %Inline;> <!-- program code -->
-<!ATTLIST code %attrs;>
-
-<!ELEMENT samp %Inline;> <!-- sample -->
-<!ATTLIST samp %attrs;>
-
-<!ELEMENT kbd %Inline;> <!-- something user would type -->
-<!ATTLIST kbd %attrs;>
-
-<!ELEMENT var %Inline;> <!-- variable -->
-<!ATTLIST var %attrs;>
-
-<!ELEMENT cite %Inline;> <!-- citation -->
-<!ATTLIST cite %attrs;>
-
-<!ELEMENT abbr %Inline;> <!-- abbreviation -->
-<!ATTLIST abbr %attrs;>
-
-<!ELEMENT acronym %Inline;> <!-- acronym -->
-<!ATTLIST acronym %attrs;>
-
-<!ELEMENT q %Inline;> <!-- inlined quote -->
-<!ATTLIST q
- %attrs;
- cite %URI; #IMPLIED
- >
-
-<!ELEMENT sub %Inline;> <!-- subscript -->
-<!ATTLIST sub %attrs;>
-
-<!ELEMENT sup %Inline;> <!-- superscript -->
-<!ATTLIST sup %attrs;>
-
-<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
-<!ATTLIST tt %attrs;>
-
-<!ELEMENT i %Inline;> <!-- italic font -->
-<!ATTLIST i %attrs;>
-
-<!ELEMENT b %Inline;> <!-- bold font -->
-<!ATTLIST b %attrs;>
-
-<!ELEMENT big %Inline;> <!-- bigger font -->
-<!ATTLIST big %attrs;>
-
-<!ELEMENT small %Inline;> <!-- smaller font -->
-<!ATTLIST small %attrs;>
-
-<!ELEMENT u %Inline;> <!-- underline -->
-<!ATTLIST u %attrs;>
-
-<!ELEMENT s %Inline;> <!-- strike-through -->
-<!ATTLIST s %attrs;>
-
-<!ELEMENT strike %Inline;> <!-- strike-through -->
-<!ATTLIST strike %attrs;>
-
-<!ELEMENT basefont EMPTY> <!-- base font size -->
-<!ATTLIST basefont
- id ID #IMPLIED
- size CDATA #REQUIRED
- color %Color; #IMPLIED
- face CDATA #IMPLIED
- >
-
-<!ELEMENT font %Inline;> <!-- local change to font -->
-<!ATTLIST font
- %coreattrs;
- %i18n;
- size CDATA #IMPLIED
- color %Color; #IMPLIED
- face CDATA #IMPLIED
- >
-
-<!--==================== Object ======================================-->
-<!--
- object is used to embed objects as part of HTML pages.
- param elements should precede other content. Parameters
- can also be expressed as attribute/value pairs on the
- object element itself when brevity is desired.
--->
-
-<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
-<!ATTLIST object
- %attrs;
- declare (declare) #IMPLIED
- classid %URI; #IMPLIED
- codebase %URI; #IMPLIED
- data %URI; #IMPLIED
- type %ContentType; #IMPLIED
- codetype %ContentType; #IMPLIED
- archive %UriList; #IMPLIED
- standby %Text; #IMPLIED
- height %Length; #IMPLIED
- width %Length; #IMPLIED
- usemap %URI; #IMPLIED
- name NMTOKEN #IMPLIED
- tabindex %Number; #IMPLIED
- align %ImgAlign; #IMPLIED
- border %Pixels; #IMPLIED
- hspace %Pixels; #IMPLIED
- vspace %Pixels; #IMPLIED
- >
-
-<!--
- param is used to supply a named property value.
- In XML it would seem natural to follow RDF and support an
- abbreviated syntax where the param elements are replaced
- by attribute value pairs on the object start tag.
--->
-<!ELEMENT param EMPTY>
-<!ATTLIST param
- id ID #IMPLIED
- name CDATA #REQUIRED
- value CDATA #IMPLIED
- valuetype (data|ref|object) "data"
- type %ContentType; #IMPLIED
- >
-
-<!--=================== Java applet ==================================-->
-<!--
- One of code or object attributes must be present.
- Place param elements before other content.
--->
-<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
-<!ATTLIST applet
- %coreattrs;
- codebase %URI; #IMPLIED
- archive CDATA #IMPLIED
- code CDATA #IMPLIED
- object CDATA #IMPLIED
- alt %Text; #IMPLIED
- name NMTOKEN #IMPLIED
- width %Length; #REQUIRED
- height %Length; #REQUIRED
- align %ImgAlign; #IMPLIED
- hspace %Pixels; #IMPLIED
- vspace %Pixels; #IMPLIED
- >
-
-<!--=================== Images ===========================================-->
-
-<!--
- To avoid accessibility problems for people who aren't
- able to see the image, you should provide a text
- description using the alt and longdesc attributes.
- In addition, avoid the use of server-side image maps.
--->
-
-<!ELEMENT img EMPTY>
-<!ATTLIST img
- %attrs;
- src %URI; #REQUIRED
- alt %Text; #REQUIRED
- name NMTOKEN #IMPLIED
- longdesc %URI; #IMPLIED
- height %Length; #IMPLIED
- width %Length; #IMPLIED
- usemap %URI; #IMPLIED
- ismap (ismap) #IMPLIED
- align %ImgAlign; #IMPLIED
- border %Length; #IMPLIED
- hspace %Pixels; #IMPLIED
- vspace %Pixels; #IMPLIED
- >
-
-<!-- usemap points to a map element which may be in this document
- or an external document, although the latter is not widely supported -->
-
-<!--================== Client-side image maps ============================-->
-
-<!-- These can be placed in the same document or grouped in a
- separate document although this isn't yet widely supported -->
-
-<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
-<!ATTLIST map
- %i18n;
- %events;
- id ID #REQUIRED
- class CDATA #IMPLIED
- style %StyleSheet; #IMPLIED
- title %Text; #IMPLIED
- name CDATA #IMPLIED
- >
-
-<!ELEMENT area EMPTY>
-<!ATTLIST area
- %attrs;
- %focus;
- shape %Shape; "rect"
- coords %Coords; #IMPLIED
- href %URI; #IMPLIED
- nohref (nohref) #IMPLIED
- alt %Text; #REQUIRED
- target %FrameTarget; #IMPLIED
- >
-
-<!--================ Forms ===============================================-->
-
-<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
-
-<!ATTLIST form
- %attrs;
- action %URI; #REQUIRED
- method (get|post) "get"
- name NMTOKEN #IMPLIED
- enctype %ContentType; "application/x-www-form-urlencoded"
- onsubmit %Script; #IMPLIED
- onreset %Script; #IMPLIED
- accept %ContentTypes; #IMPLIED
- accept-charset %Charsets; #IMPLIED
- target %FrameTarget; #IMPLIED
- >
-
-<!--
- Each label must not contain more than ONE field
- Label elements shouldn't be nested.
--->
-<!ELEMENT label %Inline;>
-<!ATTLIST label
- %attrs;
- for IDREF #IMPLIED
- accesskey %Character; #IMPLIED
- onfocus %Script; #IMPLIED
- onblur %Script; #IMPLIED
- >
-
-<!ENTITY % InputType
- "(text | password | checkbox |
- radio | submit | reset |
- file | hidden | image | button)"
- >
-
-<!-- the name attribute is required for all but submit & reset -->
-
-<!ELEMENT input EMPTY> <!-- form control -->
-<!ATTLIST input
- %attrs;
- %focus;
- type %InputType; "text"
- name CDATA #IMPLIED
- value CDATA #IMPLIED
- checked (checked) #IMPLIED
- disabled (disabled) #IMPLIED
- readonly (readonly) #IMPLIED
- size CDATA #IMPLIED
- maxlength %Number; #IMPLIED
- src %URI; #IMPLIED
- alt CDATA #IMPLIED
- usemap %URI; #IMPLIED
- onselect %Script; #IMPLIED
- onchange %Script; #IMPLIED
- accept %ContentTypes; #IMPLIED
- align %ImgAlign; #IMPLIED
- >
-
-<!ELEMENT select (optgroup|option)+> <!-- option selector -->
-<!ATTLIST select
- %attrs;
- name CDATA #IMPLIED
- size %Number; #IMPLIED
- multiple (multiple) #IMPLIED
- disabled (disabled) #IMPLIED
- tabindex %Number; #IMPLIED
- onfocus %Script; #IMPLIED
- onblur %Script; #IMPLIED
- onchange %Script; #IMPLIED
- >
-
-<!ELEMENT optgroup (option)+> <!-- option group -->
-<!ATTLIST optgroup
- %attrs;
- disabled (disabled) #IMPLIED
- label %Text; #REQUIRED
- >
-
-<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
-<!ATTLIST option
- %attrs;
- selected (selected) #IMPLIED
- disabled (disabled) #IMPLIED
- label %Text; #IMPLIED
- value CDATA #IMPLIED
- >
-
-<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
-<!ATTLIST textarea
- %attrs;
- %focus;
- name CDATA #IMPLIED
- rows %Number; #REQUIRED
- cols %Number; #REQUIRED
- disabled (disabled) #IMPLIED
- readonly (readonly) #IMPLIED
- onselect %Script; #IMPLIED
- onchange %Script; #IMPLIED
- >
-
-<!--
- The fieldset element is used to group form fields.
- Only one legend element should occur in the content
- and if present should only be preceded by whitespace.
--->
-<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
-<!ATTLIST fieldset
- %attrs;
- >
-
-<!ENTITY % LAlign "(top|bottom|left|right)">
-
-<!ELEMENT legend %Inline;> <!-- fieldset label -->
-<!ATTLIST legend
- %attrs;
- accesskey %Character; #IMPLIED
- align %LAlign; #IMPLIED
- >
-
-<!--
- Content is %Flow; excluding a, form, form controls, iframe
--->
-<!ELEMENT button %button.content;> <!-- push button -->
-<!ATTLIST button
- %attrs;
- %focus;
- name CDATA #IMPLIED
- value CDATA #IMPLIED
- type (button|submit|reset) "submit"
- disabled (disabled) #IMPLIED
- >
-
-<!-- single-line text input control (DEPRECATED) -->
-<!ELEMENT isindex EMPTY>
-<!ATTLIST isindex
- %coreattrs;
- %i18n;
- prompt %Text; #IMPLIED
- >
-
-<!--======================= Tables =======================================-->
-
-<!-- Derived from IETF HTML table standard, see [RFC1942] -->
-
-<!--
- The border attribute sets the thickness of the frame around the
- table. The default units are screen pixels.
-
- The frame attribute specifies which parts of the frame around
- the table should be rendered. The values are not the same as
- CALS to avoid a name clash with the valign attribute.
--->
-<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
-
-<!--
- The rules attribute defines which rules to draw between cells:
-
- If rules is absent then assume:
- "none" if border is absent or border="0" otherwise "all"
--->
-
-<!ENTITY % TRules "(none | groups | rows | cols | all)">
-
-<!-- horizontal placement of table relative to document -->
-<!ENTITY % TAlign "(left|center|right)">
-
-<!-- horizontal alignment attributes for cell contents
-
- char alignment char, e.g. char=':'
- charoff offset for alignment char
--->
-<!ENTITY % cellhalign
- "align (left|center|right|justify|char) #IMPLIED
- char %Character; #IMPLIED
- charoff %Length; #IMPLIED"
- >
-
-<!-- vertical alignment attributes for cell contents -->
-<!ENTITY % cellvalign
- "valign (top|middle|bottom|baseline) #IMPLIED"
- >
-
-<!ELEMENT table
- (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
-<!ELEMENT caption %Inline;>
-<!ELEMENT thead (tr)+>
-<!ELEMENT tfoot (tr)+>
-<!ELEMENT tbody (tr)+>
-<!ELEMENT colgroup (col)*>
-<!ELEMENT col EMPTY>
-<!ELEMENT tr (th|td)+>
-<!ELEMENT th %Flow;>
-<!ELEMENT td %Flow;>
-
-<!ATTLIST table
- %attrs;
- summary %Text; #IMPLIED
- width %Length; #IMPLIED
- border %Pixels; #IMPLIED
- frame %TFrame; #IMPLIED
- rules %TRules; #IMPLIED
- cellspacing %Length; #IMPLIED
- cellpadding %Length; #IMPLIED
- align %TAlign; #IMPLIED
- bgcolor %Color; #IMPLIED
- >
-
-<!ENTITY % CAlign "(top|bottom|left|right)">
-
-<!ATTLIST caption
- %attrs;
- align %CAlign; #IMPLIED
- >
-
-<!--
-colgroup groups a set of col elements. It allows you to group
-several semantically related columns together.
--->
-<!ATTLIST colgroup
- %attrs;
- span %Number; "1"
- width %MultiLength; #IMPLIED
- %cellhalign;
- %cellvalign;
- >
-
-<!--
- col elements define the alignment properties for cells in
- one or more columns.
-
- The width attribute specifies the width of the columns, e.g.
-
- width=64 width in screen pixels
- width=0.5* relative width of 0.5
-
- The span attribute causes the attributes of one
- col element to apply to more than one column.
--->
-<!ATTLIST col
- %attrs;
- span %Number; "1"
- width %MultiLength; #IMPLIED
- %cellhalign;
- %cellvalign;
- >
-
-<!--
- Use thead to duplicate headers when breaking table
- across page boundaries, or for static headers when
- tbody sections are rendered in scrolling panel.
-
- Use tfoot to duplicate footers when breaking table
- across page boundaries, or for static footers when
- tbody sections are rendered in scrolling panel.
-
- Use multiple tbody sections when rules are needed
- between groups of table rows.
--->
-<!ATTLIST thead
- %attrs;
- %cellhalign;
- %cellvalign;
- >
-
-<!ATTLIST tfoot
- %attrs;
- %cellhalign;
- %cellvalign;
- >
-
-<!ATTLIST tbody
- %attrs;
- %cellhalign;
- %cellvalign;
- >
-
-<!ATTLIST tr
- %attrs;
- %cellhalign;
- %cellvalign;
- bgcolor %Color; #IMPLIED
- >
-
-<!-- Scope is simpler than headers attribute for common tables -->
-<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
-
-<!-- th is for headers, td for data and for cells acting as both -->
-
-<!ATTLIST th
- %attrs;
- abbr %Text; #IMPLIED
- axis CDATA #IMPLIED
- headers IDREFS #IMPLIED
- scope %Scope; #IMPLIED
- rowspan %Number; "1"
- colspan %Number; "1"
- %cellhalign;
- %cellvalign;
- nowrap (nowrap) #IMPLIED
- bgcolor %Color; #IMPLIED
- width %Length; #IMPLIED
- height %Length; #IMPLIED
- >
-
-<!ATTLIST td
- %attrs;
- abbr %Text; #IMPLIED
- axis CDATA #IMPLIED
- headers IDREFS #IMPLIED
- scope %Scope; #IMPLIED
- rowspan %Number; "1"
- colspan %Number; "1"
- %cellhalign;
- %cellvalign;
- nowrap (nowrap) #IMPLIED
- bgcolor %Color; #IMPLIED
- width %Length; #IMPLIED
- height %Length; #IMPLIED
- >
-
diff --git a/sources/scala/tools/scalai/Code.java b/sources/scala/tools/scalai/Code.java
deleted file mode 100644
index ee4e3a1a88..0000000000
--- a/sources/scala/tools/scalai/Code.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Code.java,v 1.13 2002/09/06 13:04:01 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-public class Code {
-
- //########################################################################
- // Public Cases
-
- public case Block(Code[] stats, Code value);
-
- public case Label(Symbol symbol, Variable[] variables, Code expression);
-
- public case Create(ScalaTemplate template);
- public case CreateArray(Class component, Code size);
- public case Invoke(Code target, Function function, Code[] arguments, int pos);
- public case Load(Code target, Variable variable);
- public case Store(Code target, Variable variable, Code expression);
-
- public case Synchronized(Code object, Code expression);
- public case If(Code cond, Code thenp, Code elsep);
- public case Or(Code lf, Code rg);
- public case And(Code lf, Code rg);
- public case Switch(Code test, int[] tags, Code[] bodies, Code otherwise);
-
- public case IsAs(Code target, Type type, Class base, boolean cast);
-
- public case Literal(Object value);
- public case Self;
- public case Null;
-
- //########################################################################
- // Public Methods
-
- public String toString() {
- switch (this) {
-
- case Block(Code[] stats, Code value):
- StringBuffer buffer = new StringBuffer();
- buffer.append("Block([").append('\n');
- for (int i = 0; i < stats.length; i++) {
- if (i > 0) buffer.append(",\n");
- buffer.append(stats[i]);
- }
- buffer.append("], ").append(value).append(")");
- return buffer.toString();
-
- case Label(Symbol symbol, Variable[] variables, Code expression):
- StringBuffer buffer = new StringBuffer();
- buffer.append("Label(").append(symbol).append(",[");
- for (int i = 0; i < variables.length; i++) {
- if (i > 0) buffer.append(",\n");
- buffer.append(variables[i]);
- }
- buffer.append("],").append(expression).append(")");
- return buffer.toString();
-
- case Create(ScalaTemplate template):
- return "Create(" + template + ")";
-
- case CreateArray(Class component, Code size):
- return "CreateArray(" + component.getName() + "," + size + ")";
-
- case Invoke(Code target, Function function, Code[] arguments, int pos):
- StringBuffer buffer = new StringBuffer();
- buffer.append("Invoke(" + target + "," + function + "," + "[\n");
- for (int i = 0; i < arguments.length; i++) {
- if (i > 0) buffer.append(",\n");
- buffer.append(arguments[i]);
- }
- buffer.append("])");
- return buffer.toString();
-
- case Load(Code target, Variable variable):
- return "Load(" + target + "," + variable + ")";
-
- case Store(Code target, Variable variable, Code expression):
- return "Store(" + target + "," + variable + "," + expression + ")";
-
- case If(Code cond, Code thenp, Code elsep):
- return "If(" + cond + "," + thenp + "," + elsep + ")";
-
- case Or(Code lf, Code rg):
- return "Or(" + lf + "," + rg + ")";
-
- case And(Code lf, Code rg):
- return "And(" + lf + "," + rg + ")";
-
- case Switch(Code test, int[] tags, Code[] bodies, Code otherwise):
- StringBuffer buffer = new StringBuffer();
- buffer.append("Switch(" + test + ",\n");
- for (int i = 0; i < bodies.length; i++) {
- buffer.append(tags[i]).append(" => ").append(bodies[i]);
- buffer.append(",\n");
- }
- buffer.append("_ => ").append(otherwise);
- buffer.append(")");
- return buffer.toString();
-
- case IsAs(Code target, Type type, Class base, boolean cast):
- return "IsAs(" + type + "," + type + "," + base + "," + cast +")";
-
- case Literal(Object value):
- return "Literal(" + value + ")";
-
- case Self:
- return "Self";
-
- case Null:
- return "Null";
-
- default:
- throw Debug.abort("illegal code", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/CodeBuffer.java b/sources/scala/tools/scalai/CodeBuffer.java
deleted file mode 100644
index 243075e9ea..0000000000
--- a/sources/scala/tools/scalai/CodeBuffer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: CodeBuffer.java,v 1.3 2002/06/13 15:24:14 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-public class CodeBuffer {
-
- //########################################################################
- // Private Fields
-
- private Code[] buffer;
- private int size;
-
- //########################################################################
- // Public Constructors
-
- public CodeBuffer() {
- this.buffer = null;
- this.size = 0;
- }
-
- //########################################################################
- // Public Methods
-
- public CodeBuffer append(Code code) {
- switch (code) {
-
- case Block(Code[] stats, Code value):
- insure(stats.length + 1);
- for (int i = 0; i < stats.length; i++) buffer[size++] = stats[i];
- buffer[size++] = value;
- return this;
-
- default:
- insure(1);
- buffer[size++] = code;
- return this;
- }
- }
-
- public Code code(Code value) {
- if (size == 0) return value;
- Code[] stats = buffer;
- if (size != stats.length) {
- Code[] array = new Code[size];
- System.arraycopy(stats, 0, array, 0, size);
- stats = array;
- }
- return Code.Block(stats, value);
- }
-
- //########################################################################
- // Private Methods
-
- private void insure(int count) {
- if (buffer == null) {
- buffer = new Code[count];
- } else {
- if (size + count < buffer.length) return;
- Code[] array = new Code[size + Math.max(count, size)];
- System.arraycopy(buffer, 0, array, 0, size);
- buffer = array;
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/CodeContainer.java b/sources/scala/tools/scalai/CodeContainer.java
deleted file mode 100644
index cbbdc5a2e3..0000000000
--- a/sources/scala/tools/scalai/CodeContainer.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: CodeContainer.java,v 1.1 2002/06/06 11:42:25 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scala.tools.util.SourceFile;
-
-import scalac.symtab.Symbol;
-
-public class CodeContainer {
-
- //########################################################################
- // Public Constructors
-
- public CodeContainer(
- SourceFile source, Symbol symbol, Code code, int stacksize)
- {
- this.source = source;
- this.symbol = symbol;
- this.code = code;
- this.stacksize = stacksize;
- }
-
- //########################################################################
- // Public Fields
-
- public final SourceFile source;
- public final Symbol symbol;
- public final Code code;
- public final int stacksize;
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/CodeGenerator.java b/sources/scala/tools/scalai/CodeGenerator.java
deleted file mode 100644
index 2da6143da2..0000000000
--- a/sources/scala/tools/scalai/CodeGenerator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: CodeGenerator.java,v 1.1 2002/06/06 11:42:25 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-public abstract class CodeGenerator {
-
- //########################################################################
- // Public Methods
-
- public abstract CodeContainer generate();
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/CodePromise.java b/sources/scala/tools/scalai/CodePromise.java
deleted file mode 100644
index 362d765f64..0000000000
--- a/sources/scala/tools/scalai/CodePromise.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: CodePromise.java,v 1.1 2002/06/06 11:42:25 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-public final class CodePromise {
-
- //########################################################################
- // Private Fields
-
- private CodeGenerator generator;
- private CodeContainer container;
-
- //########################################################################
- // Public Constructors
-
- public CodePromise(CodeGenerator generator) {
- this.generator = generator;
- this.container = null;
- }
-
- public CodePromise(CodeContainer container) {
- this.generator = null;
- this.container = container;
- }
-
- //########################################################################
- // Public Methods
-
- public CodeContainer force() {
- if (container == null) {
- container = generator.generate();
- generator = null;
- }
- return container;
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Compiler.java b/sources/scala/tools/scalai/Compiler.java
deleted file mode 100644
index d51d957097..0000000000
--- a/sources/scala/tools/scalai/Compiler.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Compiler.java,v 1.19 2002/10/01 16:14:07 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-import scalac.CompilationUnit;
-import scalac.Global;
-import scalac.ast.Tree;
-import scalac.ast.Tree.ValDef;
-import scalac.ast.TreeGen;
-import scalac.symtab.Definitions;
-import scalac.symtab.Type;
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-
-import scala.runtime.RunTime;
-
-public class Compiler {
-
- //########################################################################
-
- private final Global global;
- private final Definitions definitions;
- private final Constants constants;
- private final ClassLoader loader;
- private final Environment environment;
- private final Map/*<Class,Set<ScalaTemplate>>*/ templates;
- private final Evaluator evaluator; // !!! remove
- private final Map any_methods;
- private final Map sources;
-
- public Compiler(Global global, Map templates, Evaluator evaluator) {
- this.global = global;
- this.definitions = global.definitions;
- this.constants = new Constants();
- this.loader = new PathClassLoader(global.classPath.getRoot());
- scala.runtime.RunTime.setClassLoader(loader);
- JavaMirror mirror = new JavaMirror(definitions, loader);
- this.environment = new Environment(this, mirror);
- this.templates = templates;
- this.evaluator = evaluator;
- this.any_methods = new HashMap();
- this.sources = new HashMap();
-
- SourceFile compiled = global.getSourceFile("<<compiled code>>", "");
-
- environment.insertFunction(definitions.STRING_PLUS, Function.StringPlus); // !!!
- // !!! ANY_PLUS_STRING is commented out in definitions
- // !!! environment.insertFunction(definitions.ANY_PLUS_STRING, Function.StringPlus); // !!!
- environment.insertFunction(definitions.THROWABLE_THROW, Function.Throw);
- // !!! environment.insertFunction(definitions.MATCH, ...);
- // !!! environment.insertFunction(definitions.IS, ...);
- // !!! environment.insertFunction(definitions.AS, ...);
-
- java.lang.reflect.Method getInvocationHandler_method = null;
- try {
- getInvocationHandler_method = Proxy.class.getMethod(
- "getInvocationHandler",
- new Class[] {Object.class});
- } catch (Exception exception) {
- throw Debug.abort("getInvocationHandler", exception);
- }
-
- // !!! method java.lang.Object.clone()
-
- java.lang.reflect.Method equals_method = null;
- try {
- equals_method = Object.class.getMethod("equals",
- new Class[] {Object.class});
- } catch (Exception exception) {
- throw Debug.abort("equals", exception);
- }
- // !!! should we have a symbol Any.equals as for hashcode and toString?
- Symbol equals_symbol =
- definitions.OBJECT_CLASS.lookup(Names.equals);
- assert equals_symbol != Symbol.NONE;
- CodePromise equals_code = new CodePromise(
- new CodeContainer(
- compiled,
- equals_symbol,
- Code.Invoke(
- Code.Invoke(
- Code.Null,
- Function.JavaMethod(getInvocationHandler_method),
- new Code[] {
- Code.Self},
- 0),
- Function.JavaMethod(equals_method),
- new Code[] {
- Code.Load(
- Code.Null, Variable.Argument(0))},
- 0),
- 0));
- any_methods.put(definitions.ANY_EQUALS, equals_code);
- any_methods.put(equals_method, equals_code);
- environment.insertFunction(definitions.ANY_EQUALS,
- Function.JavaMethod(equals_method));
- Override equals_override = Override.empty();
- equals_override.insert(equals_method).insert(definitions.ANY_EQUALS);
- environment.insertOverride(definitions.ANY_EQUALS, equals_override);
-
- // !!! method java.lang.Object.equals(Object)
- // !!! method java.lang.Object.finalize()
- // !!! method java.lang.Object.getClass()
-
- java.lang.reflect.Method hashCode_method = null;
- try {
- hashCode_method = Object.class.getMethod("hashCode", new Class[0]);
- } catch (Exception exception) {
- throw Debug.abort("hashCode", exception);
- }
- CodePromise hashCode_code = new CodePromise(
- new CodeContainer(
- compiled,
- definitions.ANY_HASHCODE,
- Code.Invoke(
- Code.Self, Function.HashCode, new Code[0],
- 0),
- 0));
- any_methods.put(definitions.ANY_HASHCODE, hashCode_code);
- any_methods.put(hashCode_method, hashCode_code);
- environment.insertFunction(definitions.ANY_HASHCODE,
- Function.JavaMethod(hashCode_method));
- Override hashCode_override = Override.empty();
- hashCode_override.insert(hashCode_method).insert(definitions.ANY_HASHCODE);
- environment.insertOverride(definitions.ANY_HASHCODE, hashCode_override);
-
- // !!! method java.lang.Object.notify()
- // !!! method java.lang.Object.notifyAll()
-
- java.lang.reflect.Method toString_method = null;
- try {
- toString_method = Object.class.getMethod("toString", new Class[0]);
- } catch (Exception exception) {
- throw Debug.abort("toString", exception);
- }
- CodePromise toString_code = new CodePromise(
- new CodeContainer(
- compiled,
- definitions.ANY_TOSTRING,
- Code.Invoke(
- Code.Self, Function.ToString, new Code[0],
- 0),
- 0));
- any_methods.put(definitions.ANY_TOSTRING, toString_code);
- any_methods.put(toString_method, toString_code);
- environment.insertFunction(definitions.ANY_TOSTRING,
- Function.JavaMethod(toString_method));
- Override toString_override = Override.empty();
- toString_override.insert(toString_method).insert(definitions.ANY_TOSTRING);
- environment.insertOverride(definitions.ANY_TOSTRING, toString_override);
-
- // !!! method java.lang.Object.wait()
- // !!! method java.lang.Object.wait(long)
- // !!! method java.lang.Object.wait(long, int)
-
- environment.insertFunction(definitions.OBJECT_EQ, Function.Eq);
- Override eq_override = Override.empty().insert(definitions.OBJECT_EQ);
- environment.insertOverride(definitions.OBJECT_EQ, eq_override);
-
- environment.insertFunction(definitions.OBJECT_NE, Function.Ne);
- Override ne_override = Override.empty().insert(definitions.OBJECT_NE);
- environment.insertOverride(definitions.OBJECT_NE, ne_override);
-
- environment.insertFunction(definitions.ANY_EQEQ, Function.EqEq);
- Override eqeq_override = Override.empty().insert(definitions.ANY_EQEQ);
- environment.insertOverride(definitions.ANY_EQEQ, eqeq_override);
-
- environment.insertFunction(definitions.ANY_BANGEQ, Function.BangEq);
- Override bangeq_override = Override.empty().insert(definitions.ANY_BANGEQ);
- environment.insertOverride(definitions.ANY_BANGEQ, bangeq_override);
- }
-
- //########################################################################
-
- public ScalaTemplate load(Symbol symbol, Tree.ClassDef tree) {
- SourceFile source = (SourceFile)sources.remove(tree);
- assert tree != null : Debug.show(symbol);
- return load(source, symbol, tree);
- }
-
- public ScalaTemplate load(SourceFile source, Symbol symbol, Tree.ClassDef tree) {
- assert tree.tparams .length == 0 : Debug.show(tree);
- assert tree.vparams .length == 1 : Debug.show(tree);
- assert tree.vparams[0].length == 0 : Debug.show(tree);
- return compileTemplate(source, symbol, tree.impl.body);
- }
-
- public ScalaTemplate compileTemplate(SourceFile source, Symbol symbol, Tree[] body) {
- Set supertypes = new HashSet();
- List interfaces = new ArrayList();
- getTypes(supertypes, interfaces, symbol);
- Class[] proxytype = new Class[interfaces.size()];
- interfaces.toArray(proxytype);
- Class proxy = Proxy.getProxyClass(loader, proxytype);
- Function constructor = getConstructor(proxy);
- Type[] bases = symbol.parents();
- Map methods;
- List fields;
- if (symbol.isInterface() || bases.length == 0) {
- methods = new HashMap(any_methods);
- fields = new ArrayList();
- } else {
- Template template = environment.lookupTemplate(bases[0].symbol());
- switch (template) {
-
- case Global(ScalaTemplate template_): // !!!
- methods = template_.getMethods();
- fields = template_.getFields();
- break;
-
- case JavaClass(_):
- methods = new HashMap(any_methods);
- fields = new ArrayList();
- break;
-
- default:
- throw Debug.abort("illegal case", template);
- }
- }
- for (int i = 0; i < body.length; i++) {
- addTemplateMember(source, methods, fields, body[i]);
- }
- ScalaTemplate template = new ScalaTemplate(
- evaluator, symbol, proxy, constructor, methods, fields.toArray());
- Set set = (Set)templates.get(proxy);
- if (set == null) templates.put(proxy, set = new HashSet());
- set.add(template);
- return template;
- }
-
- //########################################################################
-
- public Variable getModule(Symbol symbol) {
- return environment.lookupVariable(symbol);
- }
-
- public Function getMethod(Symbol symbol) {
- return environment.lookupFunction(symbol);
- }
-
- public CodePromise compile(SourceFile source, Symbol symbol, Tree.DefDef tree) {
- assert tree.tparams.length == 0 : Debug.show(tree);
- assert tree.vparams.length == 1 : Debug.show(tree);
- return new CodePromise(new ScalaFunction(this, source, symbol, tree.vparams[0],tree.rhs));
- }
-
- //########################################################################
- //
-
- public void compile(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) declare(units[i].source, units[i].body);
- }
-
- public CodeContainer compile(SourceFile source, Symbol owner, Tree tree, Symbol[] params) {
- ExpressionContext context = new ExpressionContext(environment, source, owner);
- ExpressionCompiler worker = new ExpressionCompiler(definitions, global.primitives, constants, context, params);
- return worker.compile(tree);
- }
-
- //########################################################################
- // Private Methods -
-
- private void declare(SourceFile source, Tree[] trees) {
- for (int i = 0; i < trees.length; i++) declare(source, trees[i]);
- }
-
- private void declare(SourceFile source, Tree tree) {
- Symbol symbol = tree.symbol();
- switch (tree) {
-
- case Empty:
- return;
-
- case ClassDef(_, _, _, _, _, _):
- sources.put(tree, source);
- environment.insertClassDef(symbol, (Tree.ClassDef)tree);
- return;
-
- // !!! these could be removed
- case PackageDef(Tree packaged, Tree.Template(Tree[] bases, Tree[] body)):
- assert packaged.symbol().isPackage() : Debug.show(tree); // !!! was isJavaPackage
- assert bases.length == 0 : Debug.show(tree);
- declare(source, body);
- return;
-
- default:
- throw Debug.abort("illegal case");
- }
- }
-
- //########################################################################
- // Private Methods -
-
- private Symbol newGlobalVariable(Type type, Object value) {
- Symbol symbol = definitions.ROOT_CLASS.newField(
- Position.NOPOS, 0, Name.fromString(value.toString()));
- symbol.setInfo(type);
- environment.insertVariable(symbol, Variable.Global(value));
- return symbol;
- }
-
- //########################################################################
- // Private Methods - template types
-
- private void getTypes(Set supertypes, List interfaces, Symbol type) {
- if (supertypes.contains(type)) return; else supertypes.add(type);
- if (!type.isExternal()) {
- Type[] basetypes = type.parents();
- for (int i = 0; i < basetypes.length; i++) {
- getTypes(supertypes, interfaces, basetypes[i].symbol());
- }
- return;
- } else {
- Template template = environment.lookupTemplate(type);
- switch (template) {
- case JavaClass(Class clasz):
- getTypes(supertypes, interfaces, clasz);
- return;
- default:
- Debug.abort("illegal template", template);
- }
- }
- }
-
- private void getTypes(Set supertypes, List interfaces, Class type) {
- if (supertypes.contains(type)) return; else supertypes.add(type);
- if (type.isInterface()) {
- interfaces.add(type);
- } else {
- Class supertype = type.getSuperclass();
- if (supertype != null) getTypes(supertypes, interfaces, supertype);
- Class[] basetypes = type.getInterfaces();
- for (int i = 0; i < basetypes.length; i++) {
- getTypes(supertypes, interfaces, basetypes[i]);
- }
- }
- }
-
- //########################################################################
- // Private Methods - template constructors
-
- private static final Class[] CSTR_PARAMS =
- new Class[] { InvocationHandler.class }; // !!! remove ?
-
- private Function getConstructor(Class proxy) {
- try {
- return Function.JavaConstructor(proxy.getConstructor(CSTR_PARAMS));
- } catch (NoSuchMethodException exception) {
- throw Debug.abort(exception);
- }
- }
-
- //########################################################################
- // Private Methods - template members
-
- private void addTemplateMember(SourceFile source, Map methods, List fields, Tree tree) {
- Symbol symbol = tree.symbol();
- switch (tree) {
-
- case Empty:
- return;
-
- case ClassDef(_, _, _, _, _, _):
- sources.put(tree, source);
- environment.insertClassDef(symbol, (Tree.ClassDef)tree);
- return;
-
- case ValDef(_, _, _, Tree body):
- assert body == Tree.Empty : Debug.show(tree);
- assert !symbol.isModule() : Debug.show(tree);
- int index = fields.size();
- fields.add(constants.zero(symbol.type()));
- environment.insertVariable(symbol, Variable.Member(index));
- return;
-
- case DefDef(_, _, _, _, _, _):
- assert !methods.containsKey(symbol) : Debug.show(symbol);
- CodePromise function = compile(source, symbol, (Tree.DefDef)tree);
- Override override = environment.lookupOverride(symbol);
- for (Iterator i = override.iterator(); i.hasNext(); ) {
- methods.put(i.next(), function);
- }
- environment.insertFunction(symbol, Function.Member(symbol));
- return;
-
- default:
- throw Debug.abort("illegal tree", tree);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Constants.java b/sources/scala/tools/scalai/Constants.java
deleted file mode 100644
index 7d87d3f6ab..0000000000
--- a/sources/scala/tools/scalai/Constants.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Constants.java,v 1.3 2002/07/09 08:35:02 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scala.runtime.RunTime;
-
-import scalac.symtab.Type;
-import scalac.symtab.TypeTags;
-import scalac.util.Debug;
-
-public class Constants {
-
- //########################################################################
- // Public Constants - kinds
-
- // !!! use literal constants ?
- public static final int UNIT = TypeTags.UNIT;
- public static final int BOOLEAN = TypeTags.BOOLEAN;
- public static final int BYTE = TypeTags.BYTE;
- public static final int SHORT = TypeTags.SHORT;
- public static final int INT = TypeTags.INT;
- public static final int LONG = TypeTags.LONG;
- public static final int FLOAT = TypeTags.FLOAT;
- public static final int DOUBLE = TypeTags.DOUBLE;
- public static final int CHAR = TypeTags.CHAR;
- public static final int STRING = TypeTags.STRING;
- public static final int OBJECT = TypeTags.STRING + 1;
-
- //########################################################################
- // Public Methods - literal
-
- // !!! remove ?
- public Object literal( ) { return RunTime.box_uvalue(); }
- public Object literal(boolean value) { return new Boolean (value); }
- public Object literal(byte value) { return new Byte (value); }
- public Object literal(short value) { return new Short (value); }
- public Object literal(char value) { return new Character(value); }
- public Object literal(int value) { return new Integer (value); }
- public Object literal(long value) { return new Long (value); }
- public Object literal(float value) { return new Float (value); }
- public Object literal(double value) { return new Double (value); }
- public Object literal(Object value) { return value ; }
-
- // !!! remove ?
- public Object literal(int kind, Object value) {
- switch (kind) {
- case UNIT : return literal();
- case BOOLEAN: return literal(((Boolean)value).booleanValue());
- case BYTE : return literal(((Number)value).byteValue());
- case SHORT : return literal(((Number)value).shortValue());
- case INT : return literal(((Number)value).intValue());
- case LONG : return literal(((Number)value).longValue());
- case FLOAT : return literal(((Number)value).floatValue());
- case DOUBLE : return literal(((Number)value).doubleValue());
- case CHAR : return literal((char)((Number)value).intValue());
- case STRING : return literal(value);
- case OBJECT : return literal(value);
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
- // Public Methods - zero
-
- public Object zero(Type type) {
- switch (type) {
- case TypeRef(_, _, _) : return literal(null);
- case UnboxedArrayType(_) : return literal(null);
- case UnboxedType(int kind): return zero(kind);
- default: throw Debug.abort("illegal type", type);
- }
- }
-
- public Object zero(int kind) {
- switch (kind) {
- case UNIT : return literal();
- case BOOLEAN: return literal(false);
- case BYTE : return literal((byte)0);
- case SHORT : return literal((short)0);
- case CHAR : return literal((char)0);
- case INT : return literal((int)0);
- case LONG : return literal((long)0);
- case FLOAT : return literal((float)0);
- case DOUBLE : return literal((double)0);
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Environment.java b/sources/scala/tools/scalai/Environment.java
deleted file mode 100644
index 0099bcff3f..0000000000
--- a/sources/scala/tools/scalai/Environment.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Environment.java,v 1.13 2002/10/01 16:14:07 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.ast.Tree.ClassDef;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.symtab.Scope;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.util.Names;
-import scalac.util.Debug;
-
-public class Environment {
-
- //########################################################################
- // Private Fields
-
- private final Compiler compiler;
- private final JavaMirror mirror;
- private final Map/*<Symbol,ClassDef>*/ classdefs;
- private final Map/*<Symbol,Template>*/ templates;
- private final Map/*<Symbol,Function>*/ functions;
- private final Map/*<Symbol,Variable>*/ variables;
- private final Map/*<Symbol,Override>*/ overrides;
-
- //########################################################################
- // Public Constructors
-
- public Environment(Compiler compiler, JavaMirror mirror) {
- this.compiler = compiler;
- this.mirror = mirror;
- this.classdefs = new HashMap();
- this.templates = new HashMap();
- this.functions = new HashMap();
- this.variables = new HashMap();
- this.overrides = new HashMap();
- }
-
- //########################################################################
- // Public Methods - translate
-
- public Class getClass(Symbol symbol) {
- assert symbol.isClass(): Debug.show(symbol);
- Template value = lookupTemplate(symbol);
- switch (value) {
- case Global(ScalaTemplate template):
- return template.getProxy();
- case JavaClass(Class clasz):
- return clasz;
- default:
- throw Debug.abort("illegal case", value);
- }
- }
-
- public Class getClass(Type type) {
- switch (type) {
- case TypeRef(_, Symbol symbol, _):
- return getClass(symbol);
- case UnboxedType(int kind):
- return mirror.getClass(kind);
- case UnboxedArrayType(Type element):
- return mirror.getArray(getClass(element));
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- //########################################################################
- // Public Methods - insert
-
- public ClassDef insertClassDef(Symbol symbol, ClassDef classdef) {
- assert symbol.isType() : Debug.show(symbol);
- assert Debug.log("insert classdef: ", symbol);
- Object value = classdefs.put(symbol, classdef);
- assert value == null : Debug.show(symbol) + " -> " + value;
- assert !templates.containsKey(symbol) : Debug.show(symbol);
- return classdef;
- }
-
- private Template insertTemplate(Symbol symbol, Template template) {
- assert symbol.isType() : Debug.show(symbol);
- assert Debug.log("insert template: ", symbol);
- Object value = templates.put(symbol, template);
- assert !classdefs.containsKey(symbol) : Debug.show(symbol);
- assert value == null : Debug.show(symbol) + " -> " + value;
- return template;
- }
-
- public Function insertFunction(Symbol symbol, Function function) {
- assert symbol.isTerm() : Debug.show(symbol);
- assert Debug.log("insert function: ", symbol);
- Object value = functions.put(symbol, function);
- assert value == null : Debug.show(symbol) + " -> " + value;
- return function;
- }
-
- public Variable insertVariable(Symbol symbol, Variable variable) {
- assert symbol.isTerm() : Debug.show(symbol);
- assert Debug.log("insert variable: ", symbol);
- Object value = variables.put(symbol, variable);
- assert value == null : Debug.show(symbol) + " -> " + value;
- return variable;
- }
-
- public Override insertOverride(Symbol symbol, Override override) {
- assert symbol.isTerm() : Debug.show(symbol);
- assert Debug.log("insert override: ", symbol);
- Object value = overrides.put(symbol, override);
- assert value == null : Debug.show(symbol) + " -> " + value;
- return override;
- }
-
- //########################################################################
- // Public Methods - lookup
-
- public Template lookupTemplate(Symbol symbol) {
- assert symbol.isType() : Debug.show(symbol);
- Object value = templates.get(symbol);
- if (value != null) return (Template)value;
- if (symbol.isExternal()) {
- Template template = Template.JavaClass(mirror.getClass(symbol));
- return insertTemplate(symbol, template);
- } else {
- return loadTemplate(symbol);
- }
- }
-
- public Function lookupFunction(Symbol symbol) {
- assert symbol.isTerm() : Debug.show(symbol);
- Object value = functions.get(symbol);
- if (value != null) return (Function)value;
- if (symbol.isExternal()) {
- Function function = (symbol.name == Names.CONSTRUCTOR) ?
- Function.JavaConstructor(mirror.getConstructor(symbol)) :
- Function.JavaMethod(mirror.getMethod(symbol));
- return insertFunction(symbol, function);
- } else {
- return (Function)loadOwnerThenGet("function", symbol, functions);
- }
- }
-
- public Variable lookupVariable(Symbol symbol) {
- assert symbol.isTerm() : Debug.show(symbol);
- Object value = variables.get(symbol);
- if (value != null) return (Variable)value;
- if (symbol.isJava() && symbol.isModule()) {
- // !!! This should never happen. This value will never be used.
- Class clasz = mirror.getClass(symbol.moduleClass());
- Variable variable = Variable.Global(clasz);
- return insertVariable(symbol, variable);
- } else if (symbol.isExternal()) {
- Variable variable = Variable.JavaField(mirror.getField(symbol));
- return insertVariable(symbol, variable);
- } else if (symbol.isModule() && symbol.isStatic()) {
- switch (lookupTemplate(symbol.moduleClass())) {
- case Global(ScalaTemplate template):
- Variable variable = Variable.Module(template, null);
- return insertVariable(symbol, variable);
- default:
- throw Debug.abort("illegal case", symbol);
- }
- } else {
- return (Variable)loadOwnerThenGet("variable", symbol, variables);
- }
- }
-
- public Override lookupOverride(Symbol symbol) {
- assert symbol.isTerm() : Debug.show(symbol);
- Object value = overrides.get(symbol);
- if (value != null) return (Override)value;
- return loadOwnerOverridesThenGet(symbol);
- }
-
- //########################################################################
- // Private Methods - template loading
-
- private Object loadOwnerThenGet(String what, Symbol symbol, Map table) {
- loadOwner(what, symbol);
- Object value = table.get(symbol);
- assert value != null : Debug.show(symbol) + " -> " + value;
- return value;
- }
-
- private void loadOwner(String what, Symbol symbol) {
- assert Debug.log("search ", what, ": ", symbol);
- assert symbol.owner().isType() : Debug.show(symbol);
- assert!symbol.owner().isExternal() : Debug.show(symbol);
- loadTemplate(symbol.owner());
- }
-
- private Template loadTemplate(Symbol symbol) {
- Object test1 = classdefs.remove(symbol);
- if (test1 != null) return loadTemplate(symbol, (ClassDef)test1);
- loadOwner("template", symbol);
- Object test2 = classdefs.remove(symbol);
- if (test2 != null) return loadTemplate(symbol, (ClassDef)test2);
- Object value = templates.get(symbol);
- assert value != null : Debug.show(symbol) + " -> " + value;
- return (Template)value;
- }
-
- private Template loadTemplate(Symbol symbol, ClassDef classdef) {
- Template template = Template.Global(compiler.load(symbol, classdef));
- return insertTemplate(symbol, template);
- }
-
- //########################################################################
- // Private Methods - override loading
-
- private Override loadOwnerOverridesThenGet(Symbol symbol) {
- assert Debug.log("search override: ", symbol);
- assert symbol.owner().isType() : Debug.show(symbol);
- loadTemplateOverrides(symbol.owner());
- Object value = overrides.get(symbol);
- assert value != null : Debug.show(symbol) + " -> " + value;
- return (Override)value;
- }
-
- private void loadTemplateOverrides(Symbol symbol) {
- Type[] bases = symbol.parents();
- SymbolIterator i = symbol.members().iterator();
- while (i.hasNext()) loadMethodOverride(bases, i.next());
- }
-
- private void loadMethodOverride(Type[] bases, Symbol symbol) {
- if (!symbol.isMethod()) return;
- Override override = Override.empty().insert(symbol);
- if (!symbol.isInitializer()) {
- if (symbol.isExternal()) override.insert(mirror.getMethod(symbol));
- for (int i = 0; i < bases.length; i++) {
- Symbol overridden = symbol.overriddenSymbol(bases[i], true);
- if (overridden == Symbol.NONE) continue;
- assert Debug.log("update override: ",symbol," <- ",overridden);
- override.insert(lookupOverride(overridden));
- }
- }
- insertOverride(symbol, override);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Evaluator.java b/sources/scala/tools/scalai/Evaluator.java
deleted file mode 100644
index a96d60de69..0000000000
--- a/sources/scala/tools/scalai/Evaluator.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Evaluator.java,v 1.40 2002/10/04 15:37:10 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-import scala.runtime.RunTime;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolNameWriter;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Names;
-
-public class Evaluator {
-
- //########################################################################
- // Private Classes
-
- // !!! remove ?
- // !!! is it correct to extend EvaluatorException?
- private static class LabelException extends EvaluatorException {
-
- public final Symbol symbol;
- public final Object[] args;
-
- public LabelException(Symbol symbol, Object[] args) {
- this.symbol = symbol;
- this.args = args;
- }
- }
-
- public static class EvaluationStack {
-
- public final EvaluationStack stack;
- public final SourceFile source;
- public final Symbol symbol;
- public final Object self;
- public final Object[] args;
- public final Object[] vars;
-
- public int pos;
-
- public EvaluationStack(EvaluationStack stack, CodeContainer code,
- Object self, Object[] args)
- {
- this.stack = stack;
- this.source = code.source;
- this.symbol = code.symbol;
- this.self = self;
- this.args = args;
- this.vars = new Object[code.stacksize];
- }
-
- }
-
- //########################################################################
- // Private Fields
-
- private final Map/*<Class,Set<ScalaTemplate>>*/ templates;
- private final EvaluatorException trace;
- private EvaluationStack stack;
-
- //########################################################################
- // Public Constructors
-
- public Evaluator(Map templates) {
- this.templates = templates;
- this.trace = new EvaluatorException();
- this.stack = null;
- }
-
- //########################################################################
- // Public Methods
-
- public Object toString(Object object) {
- try {
- return String.valueOf(object);
- } catch (Throwable exception) {
- return throw_(exception);
- }
- }
-
- public Object evaluate(Variable module) {
- return load(null, module);
- }
-
- public Object evaluate(Variable module, Function method, Object[] args) {
- return invoke(load(null, module), method, args);
- }
-
- public Object evaluate(CodeContainer code) {
- return evaluate(code, null, new Object[0]);
- }
-
- public Object evaluate(CodePromise code, Object object, Object[] args) {
- return evaluate(code.force(), object, args);
- }
-
- public Object evaluate(CodeContainer code, Object object, Object[] args) {
- return trace(code, object, args);
- }
-
- //########################################################################
- // Private Methods - trace
-
- private Object trace(CodeContainer code, Object object, Object[] args) {
- try {
- try {
- stack = new EvaluationStack(stack, code, object, args);
- return evaluate(code.code);
- } catch (EvaluatorException exception) {
- throw exception;
- } catch (Throwable exception) {
- return throw_(exception, "trace");
- }
- } catch (EvaluatorException exception) {
- StringBuffer buffer = new StringBuffer();
- buffer.append(getClassName(stack.symbol.owner()));
- buffer.append('.');
- buffer.append(stack.symbol.nameString());
- buffer.append('(');
- buffer.append(stack.source.getFile().getName());
- int line = Position.line(stack.pos);
- if (line != 0) buffer.append(':').append(line);
- buffer.append(")");
- exception.addScalaCall(buffer.toString());
- throw exception;
- } finally {
- stack = stack.stack;
- }
- }
-
- //########################################################################
- // Private Methods - evaluate
-
- private Object evaluate(Code code) {
- switch (code) {
-
- case Block(Code[] stats, Code value):
- for (int i = 0; i < stats.length; i++) evaluate(stats[i]);
- return evaluate(value);
-
- case Label(Symbol symbol, Variable[] variables, Code expression):
- while (true)
- try {
- return evaluate(expression);
- } catch (LabelException exception) {
- if (exception.symbol != symbol) throw exception;
- for (int i = 0; i < variables.length; i++) {
- // !!! null
- store(null, variables[i], exception.args[i]);
- }
- }
-
- case Synchronized(Code object, Code expression):
- Object value = evaluate(object);
- synchronized (value) { return evaluate(expression); }
-
- case If(Code cond, Code thenp, Code elsep):
- Object value = evaluate(cond);
- assert value instanceof Boolean : value.getClass();
- return evaluate(((Boolean)value).booleanValue() ? thenp : elsep);
-
- case Switch(Code test, int[] tags, Code[] bodies, Code otherwise):
- Object value = evaluate(test);
- assert value instanceof Integer : value.getClass();
- int tag = ((Integer)value).intValue();
- for (int i = 0; i < tags.length; i++)
- if (tags[i] == tag) return evaluate(bodies[i]);
- return evaluate(otherwise);
-
- case Literal(Object value):
- return value;
-
- case Load(Code target, Variable variable):
- return load(evaluate(target), variable);
-
- case Store(Code target, Variable variable, Code expression):
- store(evaluate(target), variable, evaluate(expression));
- return RunTime.box_uvalue();
-
- case Invoke(Code target, Function function, Code[] arguments, int pos):
- Object object = evaluate(target);
- Object[] args = new Object[arguments.length];
- for (int i = 0; i < args.length; i++)
- args[i] = evaluate(arguments[i]);
- stack.pos = pos;
- return invoke(object, function, args);
-
- case Create(ScalaTemplate template):
- return invoke(null, template.getConstructor(),
- new Object[] {template.getHandler()});
-
- case CreateArray(Class component, Code size):
- Object length = evaluate(size);
- assert length instanceof Integer : length.getClass();
- return Array.newInstance(component, ((Integer)length).intValue());
-
- case IsAs(Code target, Type type, Class clasz, boolean cast):
- Object object = evaluate(target);
- if (object == null) return cast ? null : Boolean.FALSE;
- boolean test = isInstanceOf(object, type, clasz);
- return cast
- ? (test ? object : throw_(getCastException(object, type)))
- : (test ? Boolean.TRUE : Boolean.FALSE);
-
- case Or(Code lf, Code rg):
- Object object = evaluate(lf);
- assert object instanceof scala.Boolean : object.getClass();
- boolean value = ((scala.Boolean)object).value;
- if (value) return new Boolean(value);
- return evaluate(rg);
-
- case And(Code lf, Code rg):
- Object object = evaluate(lf);
- assert object instanceof scala.Boolean : object.getClass();
- boolean value = ((scala.Boolean)object).value;
- if (!value) return new Boolean(value);
- return evaluate(rg);
-
- case Null:
- return null;
-
- case Self:
- return stack.self;
-
- default:
- throw Debug.abort("illegal code", code);
- }
- }
-
- //########################################################################
- // Private Methods - invoke
-
- private Object invoke(Object object, Function function, Object[] args) {
- switch (function) {
-
- case Global(CodePromise code):
- return evaluate(code, object, args);
-
- case Member(Symbol symbol):
- return getScalaObject(object).invoke(object, symbol, args);
-
- case Label(Symbol symbol):
- throw new LabelException(symbol, args);
-
- case JavaConstructor(Constructor constructor):
- return invoke(object, constructor, args);
-
- case JavaMethod(Method method):
- return invoke(object, method, args);
-
- case Pos:
- if (object instanceof scala.Int) {
- int value = ((scala.Int)object).value;
- return new Integer(value);
- } else if (object instanceof scala.Long) {
- long value = ((scala.Long)object).value;
- return new Long(value);
- } else if (object instanceof scala.Float) {
- float value = ((scala.Float)object).value;
- return new Float(value);
- } else {
- double value = ((scala.Double)object).value;
- return new Double(value);
- }
-
- case Neg:
- if (object instanceof scala.Int) {
- int value = ((scala.Int)object).value;
- return new Integer(-value);
- } else if (object instanceof scala.Long) {
- long value = ((scala.Long)object).value;
- return new Long(-value);
- } else if (object instanceof scala.Float) {
- float value = ((scala.Float)object).value;
- return new Float(-value);
- } else {
- double value = ((scala.Double)object).value;
- return new Double(-value);
- }
-
- case Throw:
- assert args.length == 0 : Debug.show(args);
- assert object instanceof Throwable : object.getClass();
- return throw_((Throwable)object);
-
- case StringPlus:
- assert args.length == 1 : Debug.show(args);
- //assert object instanceof String : object.getClass().getName();
- return (String.valueOf(object)).concat(String.valueOf(args[0]));
-
- case Eq:
- assert args.length == 1 : Debug.show(args);
- return object == args[0] ? Boolean.TRUE : Boolean.FALSE;
-
- case Ne:
- assert args.length == 1 : Debug.show(args);
- return object != args[0] ? Boolean.TRUE : Boolean.FALSE;
-
- case EqEq:
- assert args.length == 1 : Debug.show(args);
- return object == null ? new Boolean(args[0] == null) : new Boolean(object.equals(args[0])); // !!!
-
- case BangEq:
- assert args.length == 1 : Debug.show(args);
- return object == null ? new Boolean(args[0] != null) : new Boolean(!object.equals(args[0])); // !!!
-
- case HashCode:
- assert args.length == 0 : Debug.show(args);
- return new Integer(getScalaObject(object).hashCode());
-
- case ToString:
- assert args.length == 0 : Debug.show(args);
- return getScalaObject(object).toString();
-
- default:
- throw Debug.abort("illegal function", function);
- }
- }
-
- private Object invoke(Object object, Constructor constructor,Object[]args){
- try {
- return constructor.newInstance(args);
- } catch (StackOverflowError exception) {
- return throw_(exception);
- } catch (ExceptionInInitializerError exception) {
- return throw_(exception);
- } catch (InvocationTargetException exception) {
- return throw_(exception);
- } catch (InstantiationException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n constr = " + Debug.show(constructor);
- String msg3 = "\n args = " + Debug.show(args);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- } catch (IllegalAccessException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n constr = " + Debug.show(constructor);
- String msg3 = "\n args = " + Debug.show(args);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- } catch (IllegalArgumentException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n constr = " + Debug.show(constructor);
- String msg3 = "\n args = " + Debug.show(args);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- }
- }
-
- private Object invoke(Object object, Method method, Object[] args) {
- try {
- return method.invoke(object, args);
- } catch (StackOverflowError exception) {
- return throw_(exception);
- } catch (NullPointerException exception) {
- return throw_(exception);
- } catch (ExceptionInInitializerError exception) {
- return throw_(exception);
- } catch (InvocationTargetException exception) {
- return throw_(exception);
- } catch (IllegalAccessException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n method = " + Debug.show(method);
- String msg3 = "\n args = " + Debug.show(args);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- } catch (IllegalArgumentException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n method = " + Debug.show(method);
- String msg3 = "\n args = " + Debug.show(args);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- }
- }
-
- //########################################################################
- // Private Methods - store
-
- private Object store(Object object, Variable variable, Object value) {
- switch (variable) {
-
- case Global(_):
- return ((Variable.Global)variable).value = value;
-
- case Module(_, _):
- return ((Variable.Module)variable).value = value;
-
- case Member(int index):
- return getScalaObject(object).variables[index] = value;
-
- case Argument(int index):
- return stack.args[index] = value;
-
- case Local(int index):
- return stack.vars[index] = value;
-
- case JavaField(Field field):
- return store(object, field, value);
-
- default:
- throw Debug.abort("illegal variable", variable);
- }
- }
-
- private Object store(Object object, Field field, Object value) {
- try {
- field.set(object, value);
- return value;
- } catch (NullPointerException exception) {
- return throw_(exception);
- } catch (ExceptionInInitializerError exception) {
- return throw_(exception);
- } catch (IllegalAccessException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n field = " + Debug.show(field);
- String msg3 = "\n value = " + Debug.show(value);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- } catch (IllegalArgumentException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n field = " + Debug.show(field);
- String msg3 = "\n value = " + Debug.show(value);
- throw Debug.abort(msg1 + msg2 + msg3, exception);
- }
- }
-
- //########################################################################
- // Private Methods - load
-
- private Object load(Object object, Variable variable) {
- switch (variable) {
-
- case Global(Object value):
- return value;
-
- case Module(ScalaTemplate template, Object value):
- if (value != null) return value;
- value = evaluate(Code.Create(template));
- ((Variable.Module)variable).template = null;
- ((Variable.Module)variable).value = value;
- Symbol clasz = template.getSymbol();
- Symbol initializer = clasz.lookup(Names.INITIALIZER);
- CodePromise promise = template.getMethod(initializer);
- assert promise != null: Debug.show(clasz, initializer);
- evaluate(promise, value, new Object[0]);
- return value;
-
- case Member(int index):
- return getScalaObject(object).variables[index];
-
- case Argument(int index):
- return stack.args[index];
-
- case Local(int index):
- return stack.vars[index];
-
- case JavaField(Field field):
- return load(object, field);
-
- default:
- throw Debug.abort("illegal variable", variable);
- }
- }
-
- private Object load(Object object, Field field) {
- try {
- return field.get(object);
- } catch (NullPointerException exception) {
- return throw_(exception);
- } catch (ExceptionInInitializerError exception) {
- return throw_(exception);
- } catch (IllegalAccessException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n field = " + Debug.show(field);
- throw Debug.abort(msg1 + msg2, exception);
- } catch (IllegalArgumentException exception) {
- String msg1 = "\n object = " + Debug.show(object);
- String msg2 = "\n field = " + Debug.show(field);
- throw Debug.abort(msg1 + msg2, exception);
- }
- }
-
- //########################################################################
- // Private Methods - throw
-
- private Object throw_(Throwable exception) {
- return throw_(exception, null);
- }
-
- private Object throw_(Throwable exception, String method) {
- if (exception.getCause() != null && (
- exception instanceof ExceptionInInitializerError ||
- exception instanceof InvocationTargetException))
- exception = exception.getCause();
- if (trace.getCause() != exception) trace.reset(exception);
- trace.addScalaLeavePoint(getClass().getName(), method);
- throw trace;
- }
-
- //########################################################################
- // Private Methods - !!!
-
- private ScalaObject getScalaObject(Object object) {
- assert object instanceof Proxy: object.getClass();
- Object handler = object == null
- ? throw_(new NullPointerException())
- : Proxy.getInvocationHandler(object);
- assert handler instanceof ScalaObject: handler.getClass();
- return (ScalaObject)handler;
- }
-
- private Symbol getScalaSymbol(Object object) {
- Class clasz = object.getClass();
- if (!(object instanceof Proxy)) return null;
- Object handler = Proxy.getInvocationHandler(object);
- if (!(handler instanceof ScalaObject)) return null;
- return ((ScalaObject)handler).template.getSymbol();
- }
-
- private boolean isInstanceOf(Object object, Type type, Class base) {
- Class clasz = object.getClass();
- switch (type) {
- case TypeRef(_, Symbol symbol, _):
- Symbol scala = getScalaSymbol(object);
- if (scala != null) return scala.isSubClass(symbol);
- return base.isAssignableFrom(clasz);
- case UnboxedArrayType(Type element):
- return base.isAssignableFrom(clasz);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- private String getClassNameOf(Object object) {
- Symbol symbol = getScalaSymbol(object);
- if (symbol != null) getClassName(symbol);
- Class clasz = object.getClass();
- if (!clasz.isArray()) return clasz.getName();
- return getClassName(clasz);
- }
-
- // !!! public
- public String getClassName(Symbol clasz) {
- SymbolNameWriter writer = new SymbolNameWriter().setNameDecoding(true);
- return writer.toString(clasz);
- }
-
- private String getClassName(Class clasz) {
- if (clasz.isArray())
- return getClassName(clasz.getComponentType()) + "[]";
- Set scalas = (Set)templates.get(clasz);
- if (scalas == null) return clasz.getName();
- StringBuffer buffer = new StringBuffer();
- boolean separator = false;
- if (scalas.size() != 1) buffer.append('(');
- for (Iterator i = scalas.iterator(); i.hasNext(); separator = true) {
- if (separator) buffer.append(" | ");
- ScalaTemplate scala = (ScalaTemplate)i.next();
- buffer.append(getClassName(scala.getSymbol()));
- }
- if (scalas.size() != 1) buffer.append(')');
- return buffer.toString();
- }
-
- private String getClassName(Type type) {
- switch (type) {
- case TypeRef(_, Symbol symbol, _):
- return getClassName(symbol);
- case UnboxedArrayType(Type element):
- return getClassName(element) + "[]";
- case UnboxedType(_):
- return type.toString();
- default:
- throw Debug.abort("illegal case");
- }
- }
-
- private ClassCastException getCastException(Object object, Type type) {
- String from = "class " + getClassNameOf(object);
- String to = "class " + getClassName(type);
- return new ClassCastException(from + " is not an instance of " + to);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/EvaluatorException.java b/sources/scala/tools/scalai/EvaluatorException.java
deleted file mode 100644
index f8c32cca8b..0000000000
--- a/sources/scala/tools/scalai/EvaluatorException.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scalai;
-
-import java.io.StringWriter;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.ArrayList;
-
-import scalac.Global;
-import scalac.symtab.Symbol;
-
-public class EvaluatorException extends RuntimeException {
-
- //########################################################################
- // Private Fields
-
- private final List stack;
-
- private Throwable cause;
- private StackTraceElement[] trace;
- private int entry;
-
- //########################################################################
- // Public Constructors
-
- public EvaluatorException() {
- this.stack = new ArrayList();
- }
-
- //########################################################################
- // Public Methods
-
- public void reset(Throwable cause) {
- this.stack.clear();
- this.cause = cause;
- this.trace = cause.getStackTrace();
- this.entry = 0;
- }
-
- public Throwable getCause() {
- return cause;
- }
-
- public void addScalaCall(String location) {
- stack.add(location);
- }
-
- public void addScalaEntryPoint() {
- // save new stack trace elements
- this.trace = getCurrentTrace();
- // skip calls through interpreter
- while (traceAtStartsWith(entry, "scalai.")) entry++;
- // skip calls through proxy class
- while (traceAtStartsWith(entry, "$Proxy")) entry++;
- }
-
- public void addScalaLeavePoint(String clasz, String method) {
- // find leave point
- int leave = entry;
- while (leave < trace.length && !traceAtEquals(leave, clasz, method))
- leave++;
- if (leave < trace.length) {
- // skip calls through reflection
- while (traceAtStartsWith(leave - 1, "java.lang.reflect.")) leave--;
- while (traceAtStartsWith(leave - 1, "sun.reflect.")) leave--;
- }
- // complete stack with java trace
- for (int i = entry; i < leave; i++) stack.add(trace[i]);
- if (leave == trace.length) stack.add("...");
- // free memory
- this.trace = null;
- this.entry = 0;
- }
-
- public Object[] getScalaStackTrace() {
- return stack.toArray();
- }
-
- public String getScalaErrorMessage(boolean withTrace) {
- StringWriter buffer = new StringWriter();
- PrintWriter writer = new PrintWriter(buffer);
- Throwable exception = getCause();
- writer.print(exception.toString());
- if (withTrace) {
- writer.println();
- for (int i = 0; i < stack.size(); i++) {
- writer.print(" at ");
- writer.println(stack.get(i));
- }
- Throwable cause = exception.getCause();
- if (cause != null) {
- writer.print("Caused by ");
- cause.printStackTrace(writer);
- }
- }
- writer.close();
- return buffer.toString();
- }
-
- //########################################################################
- // Private Methods
-
- private boolean traceAtEquals(int index, String clasz, String method) {
- if (index < 0 || trace.length <= index) return false;
- if (!trace[index].getClassName().equals(clasz)) return false;
- return method == null || trace[index].getMethodName().equals(method);
- }
-
- private boolean traceAtStartsWith(int index, String prefix) {
- if (index < 0 || trace.length <= index) return false;
- return trace[index].getClassName().startsWith(prefix);
- }
-
- private StackTraceElement[] getCurrentTrace() {
- return new RuntimeException().getStackTrace();
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/EvaluatorResult.java b/sources/scala/tools/scalai/EvaluatorResult.java
deleted file mode 100644
index 2cf6ff8e66..0000000000
--- a/sources/scala/tools/scalai/EvaluatorResult.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scalai;
-
-public class EvaluatorResult {
-
- //########################################################################
- // Public Cases
-
- public case Void;
- public case Value(Object value, String type);
- public case Error(EvaluatorException exception);
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/ExpressionCompiler.java b/sources/scala/tools/scalai/ExpressionCompiler.java
deleted file mode 100644
index 80dd874a3b..0000000000
--- a/sources/scala/tools/scalai/ExpressionCompiler.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ExpressionCompiler.java,v 1.16 2002/10/04 15:37:10 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Constructor;
-import java.util.ArrayList;
-
-import scalac.ast.Tree;
-import scalac.atree.AConstant;
-import scalac.backend.Primitives;
-import scalac.symtab.Definitions;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Name;
-
-public class ExpressionCompiler {
-
- //########################################################################
- // Private Fields
-
- private final Definitions definitions;
- private final Primitives primitives;
- private final Constants constants;
- private final ExpressionContext context;
-
- //########################################################################
- // Public Constructors
-
- public ExpressionCompiler(Definitions definitions, Primitives primitives, Constants constants, ExpressionContext context, Symbol[] params) {
- this.definitions = definitions;
- this.primitives = primitives;
- this.constants = constants;
- this.context = context;
- for (int i = 0; i < params.length; i++)
- context.insertVariable(params[i], Variable.Argument(i));
- }
-
- //########################################################################
- // Public Methods
-
- public CodeContainer compile(Tree tree) {
- Code code = compute(tree);
- return new CodeContainer(
- context.source(), context.owner(), code, context.stackmax());
- }
-
- public CodeContainer compile(ArrayList items) {
- Code value = Code.Literal(constants.literal());
- CodeBuffer buffer = new CodeBuffer();
- for (int i = 0, m = items.size(); i < m;) {
- if (i > 0) buffer.append(value);
- Object item = items.get(i++);
- value = compute((Tree)item);
- }
- Code code = buffer.code(value);
- return new CodeContainer(
- context.source(), context.owner(), code, context.stackmax());
- }
-
- //########################################################################
- // Private Methods - declare
-
- private void declare(Tree tree, CodeBuffer buffer) {
- switch (tree) {
-
- case Empty:
- return;
-
- case ValDef(_, _, _, Tree body):
- Symbol symbol = tree.symbol();
- Variable variable = Variable.Local(context.push());
- context.insertVariable(symbol, variable);
- // !!! this should be done in an earlier phase
- Code value = body != Tree.Empty ?
- compute(body) : Code.Literal(constants.zero(symbol.type()));
- buffer.append(Code.Store(Code.Self, variable, value));
- return;
-
- default:
- buffer.append(compute(tree));
- return;
- }
- }
-
- //########################################################################
- // Private Methods - compute
-
- private Code[] compute(Tree[] trees) {
- Code[] codes = new Code[trees.length];
- for (int i = 0; i < codes.length; i++) codes[i] = compute(trees[i]);
- return codes;
- }
-
- private Code compute(Tree tree) {
- switch (tree) {
-
- case LabelDef(_, Tree.Ident[] params, Tree body):
- Symbol symbol = tree.symbol();
- Variable[] vars = new Variable[params.length];
- for (int i = 0; i < params.length; i++) {
- vars[i] = context.lookupVariable(params[i].symbol());
- // !!!
- assert
- vars[i] instanceof Variable.Argument ||
- vars[i] instanceof Variable.Local :
- Debug.show(vars[i]);
- }
- context.insertLabel(symbol);
- return Code.Label(symbol, vars, compute(body));
-
- case Block(Tree[] stats, Tree value):
- if (stats.length == 0) return compute(value);
- CodeBuffer buffer = new CodeBuffer();
- int stacksize = context.stacksize();
- for (int i = 0; i < stats.length; i++) declare(stats[i], buffer);
- Code result = compute(value);
- context.stacksize(stacksize);
- return buffer.code(result);
-
- case Assign(Tree lhs, Tree rhs):
- return store(lhs, lhs.symbol(), compute(rhs));
-
- case If(Tree cond, Tree thenp, Tree elsep):
- return Code.If(compute(cond), compute(thenp),
- // !!! can we remove this test ?
- elsep == Tree.Empty ? Code.Literal(constants.literal()) : compute(elsep));
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- return Code.Switch(
- compute(test), tags, compute(bodies), compute(otherwise));
-
- case New(Tree init):
- switch (context.lookupTemplate(tree.getType().symbol())) {
- case Global(ScalaTemplate template):
- Variable local = Variable.Local(context.push());
- Code create = Code.Create(template);
- Code store = Code.Store(Code.Null, local, create);
- Code load = Code.Load(Code.Null, local);
- Code code = compute(init);
- switch (code) {
- case Invoke(Null, Function fun, Code[] args, int pos):
- Code initialize = Code.Invoke(load, fun, args, pos);
- return Code.Block(new Code[] {store, initialize}, load);
- default:
- throw Debug.abort("illegal case", code);
- }
- default:
- return compute(init);
- }
-
- case Apply(TypeApply(Tree tfun, Tree[] targs), Tree[] vargs):
- return tapply(tfun, tfun.symbol(), targs, vargs);
-
- case Apply(Tree vfun, Tree[] vargs):
- return vapply(vfun, vfun.symbol(), vargs);
-
- case This(_):
- return Code.Self;
-
- case Literal(AConstant constant):
- switch (constant) {
- case UNIT:
- return Code.Literal(constants.literal());
- case BOOLEAN(boolean value):
- return Code.Literal(new Boolean(value));
- case BYTE(byte value):
- return Code.Literal(new Byte(value));
- case SHORT(short value):
- return Code.Literal(new Short(value));
- case CHAR(char value):
- return Code.Literal(new Character(value));
- case INT(int value):
- return Code.Literal(new Integer(value));
- case LONG(long value):
- return Code.Literal(new Long(value));
- case FLOAT(float value):
- return Code.Literal(new Float(value));
- case DOUBLE(double value):
- return Code.Literal(new Double(value));
- case STRING(String value):
- return Code.Literal(new String(value));
- case NULL:
- return Code.Null;
- default:
- throw Debug.abort("illegal case", constant);
- }
-
- default:
- return load(tree, tree.symbol());
- }
- }
-
- private Code object(Tree tree) {
- switch (tree) {
-
- case Select(Super(_, _), _):
- return Code.Self;
-
- case Select(Create(_, _), _):
- return Code.Null;
-
- case Select(Tree expr, _):
- return compute(expr);
-
- case Ident(_):
- return Code.Null;
-
- default:
- throw Debug.abort("illegal tree", tree);
- }
- }
-
- //########################################################################
- // Private Methods - apply
-
- private Code tapply(Tree target, Symbol symbol, Tree[] targs, Tree[]vargs){
- Code object = object(target);
- if (symbol == definitions.ANY_IS_ERASED
- || symbol == definitions.ANY_AS_ERASED) {
- assert targs.length == 1: Debug.show(targs);
- assert vargs.length == 0 : Debug.show(vargs);
- boolean cast = symbol == definitions.ANY_AS_ERASED;
- Type type = targs[0].type();
- return Code.IsAs(object, type, context.getClass(type), cast);
- }
- if (symbol == primitives.NEW_OARRAY) {
- assert object == Code.Null: object;
- assert targs.length == 1: Debug.show(targs);
- assert vargs.length == 1 : Debug.show(vargs);
- Type arraytype = Type.UnboxedArrayType(targs[0].type());
- Class component = context.getClass(arraytype).getComponentType();
- return Code.CreateArray(component, compute(vargs[0]));
- }
- throw Debug.abort("unknown method", symbol);
- }
-
- // !!! only used for the hack in vapply => remove !
- private static final Name plus_N = Name.fromString("$plus");
- private static final Name minus_N = Name.fromString("$minus");
-
- private Code vapply(Tree target, Symbol symbol, Tree[] trees) {
- // !!! optimize ?
- Code object = object(target);
- if (symbol == definitions.BOOLEAN_OR()) {
- return Code.Or(object, compute(trees[0]));
- }
- if (symbol == definitions.BOOLEAN_AND()) {
- return Code.And(object, compute(trees[0]));
- }
- if (symbol == definitions.OBJECT_SYNCHRONIZED) {
- return Code.Synchronized(object, compute(trees[0]));
- }
- // !!! System.out.println("!!! method: " + Debug.show(symbol));
- // !!! System.out.println("!!! -owner: " + Debug.show(symbol.owner()));
- Function function = context.lookupFunction(symbol);
- if (trees.length == 0
- && (symbol.name == plus_N || symbol.name == minus_N)
- // !!! the following line does not work. why? (because of erasure?)
- // !!! symbol.owner().isSubClass(definitions.DOUBLE_CLASS))
- && (
- symbol.owner().isSubClass(definitions.INT_CLASS) ||
- symbol.owner().isSubClass(definitions.LONG_CLASS) ||
- symbol.owner().isSubClass(definitions.FLOAT_CLASS) ||
- symbol.owner().isSubClass(definitions.DOUBLE_CLASS)))
- {
- function = symbol.name == plus_N ? Function.Pos : Function.Neg;
- }
- switch (target) {
- case Select(Super(_, _), _):
- Template template = context.lookupTemplate(symbol.owner());
- switch (template) {
- case Global(ScalaTemplate template_):
- function = Function.Global(template_.getMethod(symbol));
- break;
-
- case JavaClass(Class clasz):
- if (symbol.isInitializer()) break;
- throw Debug.abort("!!! illegal super on java class", symbol);
-
- default:
- throw Debug.abort("illegal template", template);
- }
- }
- Code[] args = compute(trees);
- return Code.Invoke(object, function, args, target.pos);
- }
-
- //########################################################################
- // Private Methods - load & store
-
- private Code load(Tree target, Symbol symbol) {
- return Code.Load(object(target), context.lookupVariable(symbol));
- }
-
- private Code store(Tree target, Symbol symbol, Code value) {
- return Code.Store(object(target),context.lookupVariable(symbol),value);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/ExpressionContext.java b/sources/scala/tools/scalai/ExpressionContext.java
deleted file mode 100644
index 0dcc4f22f1..0000000000
--- a/sources/scala/tools/scalai/ExpressionContext.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ExpressionContext.java,v 1.2 2002/06/05 09:05:56 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import scala.tools.util.SourceFile;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-public class ExpressionContext {
-
- //########################################################################
- // Private Fields
-
- private final Environment environment;
- private final Map functions;
- private final Map variables;
- private final SourceFile source;
- private final Symbol owner;
-
- private int current;
- private int maximum;
-
- //########################################################################
- // Public Constructors
-
- public ExpressionContext(
- Environment environment, SourceFile source, Symbol owner)
- {
- this.environment = environment;
- this.functions = new HashMap();
- this.variables = new HashMap();
- this.source = source;
- this.owner = owner;
- this.current = 0;
- this.maximum = 0;
- }
-
- //########################################################################
- // Public Methods - translate
-
- public Class getClass(Symbol symbol) {
- return environment.getClass(symbol);
- }
-
- public Class getClass(Type type) {
- return environment.getClass(type);
- }
-
- //########################################################################
- // Public Methods - insert
-
- public Function insertLabel(Symbol symbol) {
- Function function = Function.Label(symbol);
- assert Debug.log("insert label : ", symbol);
- assert !functions.containsKey(symbol) : Debug.show(symbol);
- functions.put(symbol, function);
- return function;
- }
-
- public Variable insertVariable(Symbol symbol, Variable variable) {
- assert Debug.log("insert variable: ", symbol);
- assert !variables.containsKey(symbol) : Debug.show(symbol);
- variables.put(symbol, variable);
- return variable;
- }
-
- //########################################################################
- // Public Methods - lookup
-
- public Template lookupTemplate(Symbol symbol) {
- return environment.lookupTemplate(symbol);
- }
-
- public Function lookupFunction(Symbol symbol) {
- Object value = functions.get(symbol);
- if (value != null) return (Function)value;
- return environment.lookupFunction(symbol);
- }
-
- public Variable lookupVariable(Symbol symbol) {
- Object value = variables.get(symbol);
- if (value != null) return (Variable)value;
- return environment.lookupVariable(symbol);
- }
-
- //########################################################################
- // Public Methods - origin
-
- public SourceFile source() {
- return source;
- }
-
- public Symbol owner() {
- return owner;
- }
-
- //########################################################################
- // Public Methods - stack
-
- public void stacksize(int size) {
- assert size >= 0 : size;
- maximum = Math.max(current, maximum);
- current = size;
- }
-
- public int stacksize() {
- return current;
- }
-
- public int stackmax() {
- return maximum = Math.max(current, maximum);
- }
-
- public int push() {
- return current++;
- }
-
- public int pop() {
- maximum = Math.max(current, maximum);
- return --current;
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Function.java b/sources/scala/tools/scalai/Function.java
deleted file mode 100644
index f799e6d30a..0000000000
--- a/sources/scala/tools/scalai/Function.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Function.java,v 1.5 2002/07/01 13:16:39 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Constructor;
-
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-public class Function {
-
- //########################################################################
- // Public Cases
-
- public case Global(CodePromise code);
- public case Member(Symbol symbol);
- public case Label(Symbol symbol);
-
- public case JavaConstructor(Constructor constructor);
- public case JavaMethod(Method method);
-
- public case Pos;
- public case Neg;
- public case Throw;
- public case StringPlus;
- public case Eq;
- public case Ne;
- public case EqEq;
- public case BangEq;
- public case HashCode;
- public case ToString;
-
- //########################################################################
- // Public Methods
-
- public String toString() {
- switch (this) {
-
- case Global(CodePromise code):
- return "Global(" + code + ")";
-
- case Member(Symbol symbol):
- return "Member(" + Debug.show(symbol) + ")";
-
- case Label(Symbol symbol):
- return "Label(" + Debug.show(symbol) + ")";
-
- case JavaMethod(Method method):
- return "JavaMethod(" + method + ")";
-
- case JavaConstructor(Constructor constructor):
- return "JavaConstructor(" + constructor + ")";
-
- case Pos:
- return "Pos";
-
- case Neg:
- return "Neg";
-
- case Throw:
- return "Throw";
-
- case StringPlus:
- return "StringPlus";
-
- case Eq:
- return "Eq";
-
- case Ne:
- return "Ne";
-
- case EqEq:
- return "EqEq";
-
- case BangEq:
- return "BangEq";
-
- case HashCode:
- return "HashCode";
-
- case ToString:
- return "ToString";
-
- default:
- throw Debug.abort("illegal function", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Interpreter.java b/sources/scala/tools/scalai/Interpreter.java
deleted file mode 100644
index 066e865454..0000000000
--- a/sources/scala/tools/scalai/Interpreter.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Interpreter.java,v 1.63 2002/09/13 01:50:30 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import scala.runtime.InterpreterSupport;
-import scala.runtime.InterpreterSupport.EvaluationResult;
-import scala.tools.util.Position;
-
-import scalac.CompilationUnit;
-import scalac.Global;
-import scalac.Phase;
-import scalac.symtab.Definitions;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Name;
-
-
-public class Interpreter {
-
- //########################################################################
- // Public Constants
-
- public static final Name MAIN_N = Name.fromString("main");
- public static final Name ARGS_N = Name.fromString("args");
-
- //########################################################################
- // Private Fields
-
- private final Global global;
- private final Compiler compiler;
- private final Evaluator evaluator;
-
- //########################################################################
- // Public Constructors
-
- public Interpreter(Global global) {
- this.global = global;
- Map/*<Class,Set<ScalaTemplate>>*/ templates = new HashMap();
- this.evaluator = new Evaluator(templates);
- this.compiler = new Compiler(global, templates, evaluator); // !!!
- }
-
- //########################################################################
- // Public Methods
-
- public EvaluatorResult invoke(String main, String[]args) {
- Symbol module = getMainModule(main);
- if (module == null) return EvaluatorResult.Void;
- Symbol method = getMainMethod(main, module);
- if (method == null) return EvaluatorResult.Void;
- Variable variable = compiler.getModule(module);
- Function function = compiler.getMethod(method);
- try {
- evaluator.evaluate(variable, function, new Object[] {args});
- return EvaluatorResult.Void;
- } catch (EvaluatorException exception) {
- return EvaluatorResult.Error(exception);
- }
- }
-
- public EvaluatorResult interpret(String input, boolean interactive) {
- return interpret("<console>", input, interactive);
- }
-
- public EvaluatorResult interpret(String file, String input,
- boolean interactive)
- {
- if (input.trim().length() == 0) return EvaluatorResult.Void;
- return interpret(
- global.compile(file, input + ";", interactive),
- interactive);
- }
-
- public EvaluatorResult interpret(String[] files, boolean interactive) {
- if (files.length == 0) return EvaluatorResult.Void;
- return interpret(global.compile(files, interactive), interactive);
- }
-
- public EvaluatorResult toString(Object object, String type) {
- try {
- return EvaluatorResult.Value(evaluator.toString(object), type);
- } catch (EvaluatorException exception) {
- return EvaluatorResult.Error(exception);
- }
- }
-
- //########################################################################
- // Private Methods
-
- private EvaluatorResult interpret(CompilationUnit[] units,
- boolean interactive)
- {
- compiler.compile(units);
- int errors = global.reporter.errors();
- global.reporter.resetCounters();
- if (errors != 0) return EvaluatorResult.Void;
- try {
- if (interactive) {
- Variable console = compiler.getModule(global.console);
- evaluator.evaluate(console);
- }
- EvaluationResult result =
- InterpreterSupport.getAndResetEvaluationResult();
- if (result == null) return EvaluatorResult.Void;
- return EvaluatorResult.Value(result.value, result.type);
- } catch (EvaluatorException exception) {
- return EvaluatorResult.Error(exception);
- }
- }
-
- //########################################################################
- // Private Methods - Finding main module
-
- private Symbol getMainModule(String main) {
- String names = main.replace('/', '.') + (main.length() > 0 ? "." : "");
- if (names.length() > 0 && names.charAt(0) == '.') {
- error("illegal module name '" + main + "'");
- return null;
- }
- Symbol module = global.definitions.ROOT_CLASS;
- for (int i = 0, j; (j = names.indexOf('.', i)) >= 0; i = j + 1) {
- Name name = Name.fromString(names.substring(i, j));
- Symbol symbol = module.lookup(name);
- if (symbol.isNone()) {
- error("could not find module '" + main.substring(0, j) + "'");
- return null;
- }
- if (symbol.isModule()) { module = symbol; continue; }
- switch (symbol.type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int k = 0; k < alts.length; k++)
- if (alts[k].isModule()) { module = alts[k]; continue; }
- }
- error("term '" + main.substring(0, j) + "' is not a module");
- return null;
- }
- return module;
- }
-
- //########################################################################
- // Private Methods - Finding main method
-
- private Type getMainMethodType(boolean erased) {
- Phase current = global.currentPhase;
- if (!erased) global.currentPhase = global.PHASE.ANALYZER.phase();
- Definitions definitions = global.definitions;
- Type argument = definitions.array_TYPE(definitions.STRING_TYPE());
- Type result = definitions.void_TYPE();
- Symbol formal = Symbol.NONE.newTerm( // !!! should be newVParam
- Position.NOPOS, Modifiers.PARAM, ARGS_N);
- formal.setInfo(argument);
- global.currentPhase = current;
- return Type.MethodType(new Symbol[] {formal}, result);
- }
-
- private Symbol getMainMethod(String main, Symbol module) {
- Symbol symbol = module.moduleClass().lookup(MAIN_N);
- if (symbol.isNone()) {
- error("module '" + main + "' has no method '" + MAIN_N + "'");
- return null;
- }
- Type type = getMainMethodType(true);
- if (symbol.type().equals(type)) return symbol;
- switch (symbol.type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int k = 0; k < alts.length; k++)
- if (alts[k].type().equals(type)) return alts[k];
- }
- error("module '" + main + "' has no method '" + MAIN_N +
- "' with type '" + getMainMethodType(false) + "'");
- return null;
- }
-
- //########################################################################
- // Private Methods - Signaling errors
-
- private void error(String message) {
- global.reporter.error(null, message);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/InterpreterCommand.java b/sources/scala/tools/scalai/InterpreterCommand.java
deleted file mode 100644
index 9e8907a499..0000000000
--- a/sources/scala/tools/scalai/InterpreterCommand.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: InterpreterCommand.java,v 1.3 2002/09/02 12:58:22 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scalac.CompilerPhases;
-import scalac.CompilerCommand;
-import scala.tools.util.Reporter;
-import scalac.util.StringOptionParser;
-import scalac.util.BooleanOptionParser;
-import scalac.util.ScalaProgramArgumentParser;
-
-public class InterpreterCommand extends CompilerCommand {
-
- //########################################################################
- // Public Fields
-
- public final StringOptionParser script;
- public final BooleanOptionParser interactive;
- public final BooleanOptionParser nologo;
- public final BooleanOptionParser emacs;
- public final ScalaProgramArgumentParser program;
-
- //########################################################################
- // Public Constructors
-
- public InterpreterCommand(String product, String version,
- Reporter reporter, CompilerPhases phases)
- {
- this(product, version, "<source files> [-- <module> <args>]",
- reporter, phases);
- }
-
- public InterpreterCommand(String product, String version, String syntax,
- Reporter reporter, CompilerPhases phases)
- {
- super(product, version, syntax, reporter, phases);
-
- this.script = new StringOptionParser(this,
- "c", "Evaluate <string> and print result",
- "string", null);
-
- this.interactive = new BooleanOptionParser(this,
- "interactive", "Start interpreter in interactive mode",
- false);
-
- this.nologo = new BooleanOptionParser(this,
- "nologo", "Print no logo at interactive interpreter start",
- false);
-
- this.emacs = new BooleanOptionParser(this,
- "emacs", "Use Emacs editing mode",
- false);
-
- this.program = new ScalaProgramArgumentParser(this);
-
- remove(outpath);
- remove(target);
-
- add(0, script);
- add(1, interactive);
- add(2, nologo);
- add(3, emacs);
- add(parsers().indexOf(unknown_options), program);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/InterpreterPrinter.java b/sources/scala/tools/scalai/InterpreterPrinter.java
deleted file mode 100644
index c42afde879..0000000000
--- a/sources/scala/tools/scalai/InterpreterPrinter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scalai;
-
-import java.io.PrintWriter;
-
-import scala.runtime.InterpreterSupport.DefinitionPrinter;
-
-import scalac.util.Debug;
-
-public class InterpreterPrinter implements DefinitionPrinter {
-
- //########################################################################
- // Private Fields
-
- private final Interpreter interpreter;
- private final PrintWriter writer;
-
- //########################################################################
- // Public Constructors
-
- public InterpreterPrinter(Interpreter interpreter, PrintWriter writer) {
- this.interpreter = interpreter;
- this.writer = writer;
- }
-
- //########################################################################
- // Public Methods
-
- public void showDefinition(String signature) {
- writer.println(signature);
- }
-
- public void showValueDefinition(String signature, Object value) {
- EvaluatorResult result = interpreter.toString(value, null);
- switch (result) {
- case Value(Object string, _):
- writer.println(signature + " = " + string);
- writer.flush();
- return;
- case Error(EvaluatorException exception):
- writer.print(signature + " = ");
- writer.print(exception.getScalaErrorMessage(true));
- writer.flush();
- return;
- default:
- throw Debug.abort("illegal case", result);
- }
- }
-
- public void showResult(EvaluatorResult result, boolean interactive) {
- switch (result) {
- case Void:
- return;
- case Value(Object value, String type):
- if (interactive)
- if (value instanceof String)
- writer.println(value + ": " + type);
- else
- showResult(interpreter.toString(value, type), interactive);
- writer.flush();
- return;
- case Error(EvaluatorException exception):
- String name = Thread.currentThread().getName();
- writer.print("Exception in thread \"" + name + "\" ");
- writer.print(exception.getScalaErrorMessage(true));
- writer.flush();
- return;
- default:
- throw Debug.abort("illegal case", result);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/InterpreterShell.java b/sources/scala/tools/scalai/InterpreterShell.java
deleted file mode 100644
index e032392b0d..0000000000
--- a/sources/scala/tools/scalai/InterpreterShell.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scala.tools.scalai;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.PushbackReader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.runtime.InterpreterSupport;
-
-import scalac.Global;
-import scalac.util.Debug;
-import scalac.util.PrefixMatcher;
-import scalac.util.Strings;
-
-
-public class InterpreterShell {
-
- //########################################################################
- // Public Constants
-
- public static final String PRODUCT = Main.PRODUCT;
- public static final String VERSION = Main.VERSION;
- public static final String COPYRIGHT = "(c) 2002-05, LAMP/EPFL";
-
- //########################################################################
- // Private Constants
-
- private static final int QUIT = 0;
- private static final int LOAD = 1;
- private static final int USE = 2;
- private static final int GC = 3;
- private static final int MEMORY = 4;
- private static final int SHOWVER = 5;
- private static final int HELP = 6;
-
- //########################################################################
- // Private Fields
-
- private final boolean interactive;
- private final boolean nologo;
- private final boolean emacs;
- private final BufferedReader reader;
- private final PrintWriter writer;
- private final PrefixMatcher matcher;
- private final Global global;
- private final Interpreter interpreter;
- private final InterpreterPrinter printer;
-
- private String[] lfiles;
- private String[] ufiles;
-
- //########################################################################
- // Public Constructors
-
- public InterpreterShell(InterpreterCommand command) {
- this(command, new BufferedReader(new InputStreamReader(System.in)),
- new PrintWriter(System.out, true));
- }
-
- public InterpreterShell(InterpreterCommand command, BufferedReader reader,
- PrintWriter writer)
- {
- this.interactive = command.interactive.value;
- this.nologo = command.nologo.value;
- this.emacs = command.emacs.value;
- this.reader = reader;
- this.writer = writer;
- this.matcher = matcher();
- this.global = new scala.tools.scalac.Global$class(command, true);
- this.interpreter = new Interpreter(global);
- this.printer = new InterpreterPrinter(interpreter, writer);
- this.lfiles = new String[0];
- this.ufiles = new String[0];
- }
-
- //########################################################################
- // Public Methods - shell
-
- public void main(String[] files, String script, String main, String[]args){
- if (interactive && !nologo) showBanner();
- if (files.length > 0) load(lfiles = files);
- if (global.reporter.errors() == 0 && script != null) eval(script);
- if (global.reporter.errors() == 0 && main != null) call(main, args);
- if (interactive) loop();
- }
-
- public void loop() {
- InterpreterSupport.setDefinitionPrinter(printer);
- while (handle(read()));
- InterpreterSupport.setDefinitionPrinter(null);
- }
-
- public boolean handle(String input) {
- if (input == null) return exec(QUIT);
- String trimed = input.trim();
- if (trimed.startsWith(":")) return exec(trimed);
- eval(input);
- return true;
- }
-
- public String read() {
- writer.print("> ");
- writer.flush();
- StringBuffer buffer = new StringBuffer();
- for (boolean stop = false; !stop; ) {
- String line;
- try {
- line = reader.readLine();
- } catch (IOException exception) {
- writer.println();
- error(exception.toString());
- System.exit(1);
- throw Debug.abort(exception);
- }
-
- if (line == null) { writer.println(); break; }
- if (emacs && line.equals("emacs:end")) break;
-
- if (!emacs) {
- line = Strings.trimTrailing(line);
- int lastChar = Strings.lastChar(line);
- stop = ",;:({=|\\".indexOf(lastChar) < 0;
- if (lastChar == '\\') line = line.substring(0,line.length()-1);
- }
-
- buffer.append(line).append('\n');
-
- if (!emacs && !stop) {
- writer.print("| ");
- writer.flush();
- }
- }
- return buffer.length() == 0 ? null : buffer.toString();
- }
-
- public void showBanner() {
- writer.println(" __ __ _ _");
- writer.println(" (_ / /_|| /_| INTERPRETER");
- writer.println("___)\\__/ ||__/ | " + COPYRIGHT);
- writer.println(" ");
- writer.println(" version: " + VERSION);
- writer.println(" type :? to get a list of all interpreter commands");
- writer.println(" ");
- }
-
- //########################################################################
- // Public Methods - command execution
-
- public boolean exec(String input) {
- int length = input.indexOf(' ');
- length = length < 0 ? input.length() : length;
- String command = input.substring(0, length);
- PrefixMatcher.Entry[] entries = matcher.lookup(command);
- if (entries.length != 1) {
- error(matcher.getErrorMessage(command, entries, "command"));
- return true;
- }
- try {
- String[] arguments = readArguments(input.substring(length));
- return exec(((Integer)entries[0].value).intValue(), arguments);
- } catch (IOException exception) {
- error(exception.getMessage());
- return true;
- }
- }
-
- public boolean exec(int command) {
- return exec(command, new String[0]);
- }
-
- public boolean exec(int command, String[] args) {
- switch (command) {
- case QUIT:
- writer.println("[Leaving " + PRODUCT + "]");
- return false;
-
- case LOAD:
- if (args.length != 0) lfiles = args;
- load(lfiles);
- return true;
-
- case USE:
- if (args.length != 0) ufiles = args;
- return exec(ufiles);
-
- case GC:
- System.gc();
- return true;
-
- case MEMORY:
- Runtime rt = Runtime.getRuntime();
- writer.println("total memory: " + rt.totalMemory());
- writer.println("free memory : " + rt.freeMemory());
- return true;
-
- case SHOWVER:
- writer.println(PRODUCT + " " + VERSION + " -- " + COPYRIGHT);
- return true;
-
- case HELP:
- writer.println("interpreter commands:");
- writer.println(Strings.format(matcher.getHelpStrings(" ","\t ")));
- return true;
-
- default:
- throw Debug.abort("unknown command " + command);
- }
- }
-
- public boolean exec(String[] files) {
- for (int i = 0; i < files.length; i++) {
- String file = files[i];
- StringBuffer blank = new StringBuffer();
- StringBuffer input = new StringBuffer();
- try {
- BufferedReader reader =
- new BufferedReader(new FileReader(file));
- while (true) {
- String line = reader.readLine();
- if (line == null || line.trim().startsWith(":")) {
- String code = input.toString();
- if (code.trim().length() > 0) eval(file, code);
- if (line == null) break;
- if (!exec(line.trim())) return false;
- blank.append('\n');
- input.setLength(0);
- input.append(blank);
- } else {
- blank.append('\n');
- input.append(line).append('\n');
- }
- }
- } catch (IOException exception) {
- error(exception.getMessage());
- }
- }
- return true;
- }
-
- //########################################################################
- // Public Methods - interpretation
-
- public void call(String main, String[] args) {
- show(interpreter.invoke(main, args), false);
- }
-
- public void load(String input) {
- show(interpreter.interpret(input, false), false);
- }
-
- public void load(String[] files) {
- show(interpreter.interpret(files, false), false);
- }
-
- public void eval(String input) {
- show(interpreter.interpret(input, true), true);
- }
-
- public void eval(String file, String input) {
- show(interpreter.interpret(file, input, true), true);
- }
-
- public void eval(String[] files) {
- show(interpreter.interpret(files, true), true);
- }
-
- public void show(EvaluatorResult result, boolean interactive) {
- printer.showResult(result, interactive);
- }
-
- //########################################################################
- // Private Methods - matcher initialization
-
- private PrefixMatcher matcher() {
- PrefixMatcher matcher = new PrefixMatcher();
- matcher.insert(":quit", new Integer(QUIT),
- "Quit interpreter");
- matcher.insert(":load", new Integer(LOAD), "<files>",
- "Load files (or repeat last load if no files are given)");
- matcher.insert(":use", new Integer(USE), "<files>",
- "Use files (or repeat last use if no files are given)");
- matcher.insert(":gc", new Integer(GC),
- "Run garbage collector");
- matcher.insert(":memory", new Integer(MEMORY),
- "Print out memory usage");
- matcher.insert(":help", new Integer(HELP),
- "Print out this command summary");
- matcher.insert(":version", new Integer(SHOWVER),
- "Print out product version");
- matcher.insert(":?", new Integer(HELP),
- "Same as :help");
- return matcher;
- }
-
- //########################################################################
- // Private Methods - error messages
-
- private void error(String message) {
- writer.println("error: " + message);
- }
-
- //########################################################################
- // Private Methods - argument parsing
-
- private String[] readArguments(String command) throws IOException {
- return readArguments(new PushbackReader(new StringReader(command)));
- }
-
- private String[] readArguments(PushbackReader reader) throws IOException {
- List arguments = new ArrayList();
- while (true) {
- int c = reader.read();
- if (c == -1) return (String[])arguments.toArray(new String[0]);
- if (!Character.isWhitespace((char)c)) {
- reader.unread(c);
- arguments.add(readArgument(reader));
- }
- }
- }
-
- private String readArgument(PushbackReader reader) throws IOException {
- StringBuffer value = new StringBuffer();
- StringBuffer token = new StringBuffer();
- while (true) {
- int c = read(reader, token);
- switch (c) {
- case '\"': value.append(readString(reader, token)); break;
- case '\\': value.append(readBackslashed(reader, token)); break;
- default :
- if (!Character.isWhitespace((char)c)) {
- value.append((char)c);
- break;
- } else {
- reader.unread(c);
- }
- case -1 : return value.toString();
- }
- token.delete(0, token.length());
- }
- }
-
- private String readBackslashed(PushbackReader reader, StringBuffer input)
- throws IOException
- {
- int c = read(reader, input);
- switch (c) {
- case ' ' : return " ";
- case '\"': return "\"";
- case '\\': return "\\";
- default : return input.toString();
- }
- }
-
- private String readString(PushbackReader reader, StringBuffer input)
- throws IOException
- {
- StringBuffer value = new StringBuffer();
- StringBuffer token = new StringBuffer();
- while (true) {
- int c = read(reader, token, "unterminated string '" + input + "'");
- switch (c) {
- case '\"': input.append((char)c); return value.toString();
- case '\\': value.append(readEscape(reader, token)); break;
- default : value.append((char)c); break;
- }
- input.append(token.toString());
- token.delete(0, token.length());
- }
- }
-
- private char readEscape(PushbackReader reader, StringBuffer input)
- throws IOException
- {
- int c = read(reader, input,
- "unterminated escape sequence '" + input + "'");
- switch (c) {
- case 'b' : return '\b';
- case 't' : return '\t';
- case 'n' : return '\n';
- case 'f' : return '\f';
- case 'r' : return '\r';
- case '\"': return '\"';
- case '\'': return '\'';
- case '\\': return '\\';
- case 'u' : return readUnicode(reader, input);
- case '0' :
- case '1' :
- case '2' :
- case '3' :
- case '4' :
- case '5' :
- case '6' :
- case '7' : return readOctal(reader, input, c);
- default : throw new IOException(
- "illegal escape sequence '" + input + "'");
- }
- }
-
- private char readUnicode(PushbackReader reader, StringBuffer input)
- throws IOException
- {
- int value = 0;
- boolean illegal = false;
- for (int i = 0; i < 4; i++) {
- int c = read(reader, input,
- "unterminated Unicode escape sequence '" + input + "'");
- switch (c) {
- case '0': case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- value = (value << 4) + (c - '0'); break;
- case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
- value = (value << 4) + (c - 'A' + 0x0A); break;
- case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
- value = (value << 4) + (c - 'a' + 0x0a); break;
- default:
- illegal = true; break;
- }
- }
- if (illegal) throw new IOException(
- "illegal Unicode escape sequence '" + input + "'");
- return (char)value;
- }
-
- private char readOctal(PushbackReader reader, StringBuffer input,int first)
- throws IOException
- {
- int value = first - '0';
- while (value < 32) {
- int c = read(reader, input);
- if (c < '0' || '7' < c) { reader.unread(c); break; }
- value = (value << 3) + (c - '0');
- }
- return (char)value;
- }
-
- private int read(PushbackReader reader, StringBuffer input, String error)
- throws IOException
- {
- int c = read(reader, input);
- if (c == -1) throw new IOException(error);
- return (char)c;
- }
-
- private int read(PushbackReader reader, StringBuffer input)
- throws IOException
- {
- int c = reader.read();
- if (c != -1) input.append((char)c);
- return c;
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/JavaMirror.java b/sources/scala/tools/scalai/JavaMirror.java
deleted file mode 100644
index e6039e1221..0000000000
--- a/sources/scala/tools/scalai/JavaMirror.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: JavaMirror.java,v 1.8 2002/10/01 16:14:07 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Proxy;
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.symtab.Kinds;
-import scalac.symtab.TypeTags;
-import scalac.symtab.Type;
-import scalac.symtab.Symbol;
-import scalac.symtab.Definitions;
-import scalac.util.Debug;
-
-public class JavaMirror {
-
- //########################################################################
- // Private Constants
-
- private static final Class void_class = Void.TYPE;
- private static final Class boolean_class = Boolean.TYPE;
- private static final Class byte_class = Byte.TYPE;
- private static final Class short_class = Short.TYPE;
- private static final Class char_class = Character.TYPE;
- private static final Class int_class = Integer.TYPE;
- private static final Class long_class = Long.TYPE;
- private static final Class float_class = Float.TYPE;
- private static final Class double_class = Double.TYPE;
- private static final Class Object_class = Object.class;
-
- //########################################################################
- // Private Fields
-
- private final ClassLoader loader;
-
- private final Map/*<Class ,Class >*/ arrays;
- private final Map/*<Symbol,Class >*/ classes;
- private final Map/*<Symbol,Field >*/ fields;
- private final Map/*<Symbol,Method >*/ methods;
- private final Map/*<Symbol,Constructor>*/ constructors;
-
- //########################################################################
- // Public Constructors
-
- public JavaMirror(Definitions definitions, ClassLoader loader) {
- this.loader = loader;
- this.arrays = new HashMap();
- this.classes = new HashMap();
- this.fields = new HashMap();
- this.methods = new HashMap();
- this.constructors = new HashMap();
- this.classes.put(definitions.ANY_CLASS, Object_class);
- this.classes.put(definitions.ANYREF_CLASS, Object_class);
- }
-
- //########################################################################
- // Public Methods - arrays
-
- public Class getArray(Class component) {
- if (Proxy.isProxyClass(component)) component = Object_class;
- Object value = arrays.get(component);
- if (value != null) return (Class)value;
- Class array = getArray0(component);
- arrays.put(component, array);
- return array;
- }
-
- private Class getArray0(Class component) {
- String classname = "[" + getArrayComponentName(component);
- try {
- return Class.forName(classname, false, loader);
- } catch (ClassNotFoundException exception) {
- throw Debug.abort("no such class", classname);
- }
- }
-
- private String getArrayComponentName(Class component) {
- if (component.isPrimitive()) {
- if (component == boolean_class) return "Z";
- if (component == byte_class) return "B";
- if (component == short_class) return "S";
- if (component == char_class) return "C";
- if (component == int_class) return "I";
- if (component == long_class) return "J";
- if (component == float_class) return "F";
- if (component == double_class) return "D";
- throw Debug.abort("unknown primitive class", component);
- }
- String classname = component.getName();
- return component.isArray() ? classname : "L" + classname + ";";
- }
-
- //########################################################################
- // Public Methods - classes
-
- public Class getClass(Type type) {
- switch (type) {
-
- case UnboxedType(int kind):
- return getClass(kind);
-
- case UnboxedArrayType(Type component):
- return getArray(getClass(component));
-
- case TypeRef(_, Symbol symbol, _):
- return getClass(symbol);
-
- default:
- throw Debug.abort("illegal type", type);
- }
- }
-
- public Class getClass(int kind) {
- switch (kind) {
- case TypeTags.UNIT : return void_class;
- case TypeTags.BOOLEAN: return boolean_class;
- case TypeTags.BYTE : return byte_class;
- case TypeTags.SHORT : return short_class;
- case TypeTags.CHAR : return char_class;
- case TypeTags.INT : return int_class;
- case TypeTags.LONG : return long_class;
- case TypeTags.FLOAT : return float_class;
- case TypeTags.DOUBLE : return double_class;
- default : throw Debug.abort("kind = " + kind);
- }
- }
-
- public Class getClass(Symbol symbol) {
- Object value = classes.get(symbol);
- if (value != null) return (Class)value;
- Class mirror = getClass0(symbol);
- assert Debug.log("java mirror: ", symbol, " -> ", mirror);
- classes.put(symbol, mirror);
- return mirror;
- }
-
- private Class getClass0(Symbol symbol) {
- String name = getClassName(symbol, false);
- try {
- return Class.forName(name, false, loader);
- } catch (ClassNotFoundException exception) {
- throw Debug.abort("no such class", Debug.show(symbol, name));
- }
- }
-
- private String getClassName(Symbol symbol, boolean asPrefix) {
- assert symbol.kind == Kinds.CLASS : Debug.show(symbol);
- String name = getPrefix(symbol.owner()) + symbol.name;
- if (!asPrefix && !symbol.isJava() && symbol.isModuleClass())
- name = name + '$';
- return name;
- }
-
- private String getPrefix(Symbol symbol) {
- assert symbol.kind == Kinds.CLASS : Debug.show(symbol);
- if (symbol.isRoot()) return "";
- String prefix = getClassName(symbol, true);
- return prefix + (symbol.isClass() ? '$' : '.');
- }
-
- //########################################################################
- // Public Methods - fields
-
- public Field getField(Symbol symbol) {
- Object value = fields.get(symbol);
- if (value != null) return (Field)value;
- Field mirror = getField0(symbol);
- assert Debug.log("java mirror: ", symbol, " -> ", mirror);
- fields.put(symbol, mirror);
- return mirror;
- }
-
- private Field getField0(Symbol symbol) {
- if (symbol.isModule()) {
- assert !symbol.isJava() : Debug.show(symbol);
- Class owner = getClass0(symbol.moduleClass());
- return getField0(symbol, owner, "MODULE$");
- } else {
- Class owner = getClass(symbol.owner());
- return getField0(symbol, owner, symbol.name.toString());
- }
- }
-
- private Field getField0(Symbol symbol, Class owner, String name) {
- try {
- return owner.getField(name);
- } catch (NoSuchFieldException exception) {
- throw Debug.abort("no such field", symbol);
- }
- }
-
- //########################################################################
- // Public Methods - methods
-
- public Method getMethod(Symbol symbol) {
- Object value = methods.get(symbol);
- if (value != null) return (Method)value;
- Method mirror = getMethod0(symbol);
- assert Debug.log("java mirror: ", symbol, " -> ", mirror);
- methods.put(symbol, mirror);
- return mirror;
- }
-
- private Method getMethod0(Symbol symbol) {
- Class owner = getClass(symbol.owner());
- Class[] params = getVParamsOf(symbol.type());
- try {
- return owner.getMethod(symbol.name.toString(), params);
- } catch (NoSuchMethodException exception) {
- throw Debug.abort("no such method", symbol);
- }
- }
-
- //########################################################################
- // Public Methods - constructors
-
- public Constructor getConstructor(Symbol symbol) {
- Object value = constructors.get(symbol);
- if (value != null) return (Constructor)value;
- Constructor mirror = getConstructor0(symbol);
- assert Debug.log("java mirror: ", symbol, " -> ", mirror);
- constructors.put(symbol, mirror);
- return mirror;
- }
-
- private Constructor getConstructor0(Symbol symbol) {
- Class owner = getClass(symbol.owner());
- Class[] params = getVParamsOf(symbol.type());
- try {
- return owner.getConstructor(params);
- } catch (NoSuchMethodException exception) {
- throw Debug.abort("no such constructor", symbol);
- }
- }
-
- //########################################################################
- // Public Methods - value parameters
-
- public Class[] getVParamsOf(Symbol symbol) {
- return getVParamsOf(symbol.type());
- }
-
- public Class[] getVParamsOf(Type type) {
- switch (type) {
-
- case MethodType(Symbol[] vparams, _):
- return getVParams(vparams);
-
- default:
- throw Debug.abort("illegal type", type);
- }
- }
-
- public Class[] getVParams(Symbol[] symbols) {
- Class[] vparams = new Class[symbols.length];
- for (int i = 0; i < vparams.length; i++) {
- vparams[i] = getClass(symbols[i].type());
- }
- return vparams;
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Main.java b/sources/scala/tools/scalai/Main.java
deleted file mode 100644
index 7be8114235..0000000000
--- a/sources/scala/tools/scalai/Main.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Main.java,v 1.2 2002/08/30 15:44:55 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scala.tools.scalac.CompilerPhases$class;
-import scala.tools.util.ConsoleReporter;
-
-public class Main {
-
- //########################################################################
- // Public Constants
-
- public static final String PRODUCT =
- System.getProperty("scala.product", "scala");
- public static final String VERSION =
- System.getProperty("scala.version", "1.0");
-
- //########################################################################
- // Public Methods
-
- public static void main(String[] args) {
- ConsoleReporter reporter = new ConsoleReporter();
- InterpreterCommand command = new InterpreterCommand(
- PRODUCT, VERSION, reporter, new CompilerPhases$class());
- if (command.parse(args)) {
- InterpreterShell shell = new InterpreterShell(command);
- shell.main(command.files.toArray(), command.script.value,
- command.program.main, command.program.args);
- reporter.printSummary();
- }
- System.exit((reporter.errors() > 0) ? 1 : 0);
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Override.java b/sources/scala/tools/scalai/Override.java
deleted file mode 100644
index b322004c5c..0000000000
--- a/sources/scala/tools/scalai/Override.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Override.java,v 1.2 2002/07/11 09:20:41 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Method;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-public class Override {
-
- //########################################################################
- // Private Fields
-
- private final Set/*<Method|Symbol>*/ methods;
-
- //########################################################################
- // Public Constructors
-
- private Override() {
- this.methods = new HashSet();
- }
-
- //########################################################################
- // Public Methods
-
- public static Override empty() {
- return new Override();
- }
-
- public Override insert(Method method) {
- methods.add(method);
- return this;
- }
-
- public Override insert(Symbol symbol) {
- methods.add(symbol);
- return this;
- }
-
- public Override insert(Override override) {
- methods.addAll(override.methods);
- return this;
- }
-
- public Iterator iterator() {
- return methods.iterator();
- }
-
- public String toString() {
- return "Override(" + Debug.show(methods.toArray()) + ")";
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/PathClassLoader.java b/sources/scala/tools/scalai/PathClassLoader.java
deleted file mode 100644
index 34aec40a59..0000000000
--- a/sources/scala/tools/scalai/PathClassLoader.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: PathClassLoader.java,v 1.1 2002/10/01 16:09:34 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.io.File;
-import java.io.IOException;
-
-import scala.tools.util.AbstractFile;
-
-public class PathClassLoader extends ClassLoader {
-
- //########################################################################
- // PathClassLoader state
-
- private final AbstractFile root;
-
- //########################################################################
- // PathClassLoader constructors
-
- public PathClassLoader(AbstractFile root) {
- this.root = root;
- }
-
- //########################################################################
- // ClassLoader interface
-
- public Class findClass(String name) throws ClassNotFoundException {
- String filename = name.replace('.', File.separatorChar) + ".class";
- AbstractFile file = root.lookupPath(filename, false);
- if (file == null) throw new ClassNotFoundException(name);
- try {
- byte[] bytes = file.read();
- return defineClass(name, bytes, 0, bytes.length);
- } catch (IOException exception) {
- throw new ClassFormatError(name+"(Failed to read file "+file+")");
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/ScalaFunction.java b/sources/scala/tools/scalai/ScalaFunction.java
deleted file mode 100644
index 37dc89f5e3..0000000000
--- a/sources/scala/tools/scalai/ScalaFunction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ScalaFunction.java,v 1.9 2002/07/03 16:08:00 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scala.tools.util.SourceFile;
-
-import scalac.ast.Tree;
-import scalac.ast.Tree.ValDef;
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-public class ScalaFunction extends CodeGenerator {
-
- //########################################################################
- // Private Fields
-
- private final Compiler compiler;
- private final SourceFile source;
- private final Symbol symbol;
- private final ValDef[] params;
- private final Tree body;
-
- //########################################################################
- // Public Constructors
-
- public ScalaFunction(Compiler compiler, SourceFile source, Symbol symbol, ValDef[] params, Tree body) {
- this.compiler = compiler;
- this.source = source;
- this.symbol = symbol;
- this.params = params;
- this.body = body;
- }
-
- //########################################################################
- // Public Methods - CodeGenerator interface
-
- public CodeContainer generate() {
- return compiler.compile(source, symbol, body, Tree.symbolOf(params));
- }
-
- //########################################################################
- // Public Methods - Object interface
-
- // !!!
- public String toString() {
- return "ScalaFunction(" + Debug.show(symbol) + ")";
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/ScalaObject.java b/sources/scala/tools/scalai/ScalaObject.java
deleted file mode 100644
index 9b8f093e5c..0000000000
--- a/sources/scala/tools/scalai/ScalaObject.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ScalaObject.java,v 1.7 2002/07/11 11:46:53 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-
-import scalac.symtab.Symbol;
-
-public class ScalaObject implements InvocationHandler {
-
- //########################################################################
- // Public Fields
-
- public final ScalaTemplate template;
- public final Object[] variables;
-
- //########################################################################
- // Public Constructors
-
- public ScalaObject(ScalaTemplate template, Object[] variables) {
- this.template = template;
- this.variables = variables;
- }
-
- //########################################################################
- // Public Methods - ScalaObject interface
-
- public Object invoke(Object self, Symbol symbol, Object[] args) {
- return template.invoke(self, symbol, args);
- }
-
- //########################################################################
- // Public Methods - InvocationHandler interface
-
- public Object invoke(Object self, Method method, Object[] args)
- throws Throwable
- {
- try {
- return template.invoke(self, method, args);
- } catch (EvaluatorException exception) {
- exception.addScalaEntryPoint();
- throw exception.getCause();
- }
- }
-
- //########################################################################
- // Public Methods - Object interface
-
- public boolean equals(Object that) {
- return that instanceof Proxy && Proxy.getInvocationHandler(that)==this;
- }
-
- public String toString() {
- return template.getName() + "@" + Integer.toHexString(hashCode());
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/ScalaTemplate.java b/sources/scala/tools/scalai/ScalaTemplate.java
deleted file mode 100644
index 3edb48e189..0000000000
--- a/sources/scala/tools/scalai/ScalaTemplate.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ScalaTemplate.java,v 1.8 2002/07/11 11:46:53 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.util.Name;
-import scalac.symtab.Symbol;
-import scalac.util.Debug;
-
-public class ScalaTemplate {
-
- //########################################################################
- // Private Fields
-
- private final Evaluator evaluator;
- private final Symbol symbol;
- private final Class proxy;
- private final Function constructor;
- private final Map/*<Method|Symbol,CodePromise>*/ vtable;
- private final Object[] fields;
-
- //########################################################################
- // Public Constructors
-
- public ScalaTemplate(Evaluator evaluator, Symbol symbol, Class proxy, Function constructor, Map vtable, Object[] fields) {
- this.evaluator = evaluator;
- this.symbol = symbol;
- this.proxy = proxy;
- this.constructor = constructor;
- this.vtable = vtable;
- this.fields = fields;
- }
-
- //########################################################################
- // Public Methods - ScalaTemplate interface
-
- public String getName() {
- return evaluator.getClassName(symbol);
- }
-
- public Symbol getSymbol() {
- return symbol;
- }
-
- public Class getProxy() {
- return proxy;
- }
-
- public Function getConstructor() {
- return constructor;
- }
-
- public Map getMethods() {
- return new HashMap(vtable);
- }
-
- public List getFields() {
- List list = new ArrayList(fields.length);
- for (int i = 0; i < fields.length; i++) list.add(fields[i]);
- return list;
- }
-
- public CodePromise getMethod(Symbol symbol) {
- return (CodePromise)vtable.get(symbol);
- }
-
- public ScalaObject getHandler() {
- Object[] fields = new Object[this.fields.length];
- System.arraycopy(this.fields, 0, fields, 0, fields.length);
- return new ScalaObject(this, fields);
- }
-
- public Object invoke(Object self, Symbol method, Object[] args) {
- CodePromise code = (CodePromise)vtable.get(method);
- if (code == null) {
- // !!! generalize use of overridingSymbol in interpreter
- code = (CodePromise)vtable.get(method.overridingSymbol(symbol.thisType(), true));
- }
- assert code != null : Debug.show(symbol) + "->" + Debug.show(method);
- return evaluator.evaluate(code, self, args);
- }
-
- public Object invoke(Object self, Method method, Object[] args) {
- CodePromise code = (CodePromise)vtable.get(method);
- assert code != null : Debug.show(symbol) + "->" + Debug.show(method);
- return evaluator.evaluate(code, self, args);
- }
-
- //########################################################################
- // Public Methods - Object interface
-
- public String toString() {
- return "template " + getName();
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Template.java b/sources/scala/tools/scalai/Template.java
deleted file mode 100644
index d9ffcf1a86..0000000000
--- a/sources/scala/tools/scalai/Template.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Template.java,v 1.2 2002/06/28 17:23:59 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import scalac.util.Debug;
-
-public class Template {
-
- //########################################################################
- // Public Cases
-
- public case Global(ScalaTemplate template);
- public case JavaClass(Class clasz);
-
- //########################################################################
- // Public Methods
-
- public String toString() {
- switch (this) {
-
- case Global(ScalaTemplate template):
- return "Global(" + template + ")";
-
- case JavaClass(Class clasz):
- return "JavaClass(" + clasz + ")";
-
- default:
- throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scala/tools/scalai/Variable.java b/sources/scala/tools/scalai/Variable.java
deleted file mode 100644
index 72b9f7c10f..0000000000
--- a/sources/scala/tools/scalai/Variable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Variable.java,v 1.4 2002/06/17 12:33:38 paltherr Exp $
-// $Id$
-
-package scala.tools.scalai;
-
-import java.lang.reflect.Field;
-
-import scalac.util.Debug;
-
-public class Variable {
-
- //########################################################################
- // Public Cases
-
- public case Global(Object value);
- public case Module(ScalaTemplate template, Object value);
- public case Member(int index);
- public case Argument(int index);
- public case Local(int index);
- public case JavaField(Field field);
-
- //########################################################################
- // Public Methods
-
- public String toString() {
- switch (this) {
-
- case Global(Object value):
- return "Global(" + Debug.show(value) + ")";
-
- case Module(ScalaTemplate template, Object value):
- return "Module(" + template + "," + Debug.show(value) + ")";
-
- case Member(int index):
- return "Member(" + index + ")";
-
- case Argument(int index):
- return "Context(" + index + ")";
-
- case Local(int index):
- return "Variable(" + index + ")";
-
- case JavaField(Field field):
- return "Java(" + field + ")";
-
- default:
- throw Debug.abort("illegal variable", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/ApplicationError.java b/sources/scalac/ApplicationError.java
deleted file mode 100644
index 5c00567d50..0000000000
--- a/sources/scalac/ApplicationError.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac;
-
-import scalac.util.Debug;
-
-public class ApplicationError extends Error {
-
- //########################################################################
- // Private interface
-
- private static String combine(String message, Object object) {
- String string = Debug.show(object);
- return message == null ? string : message + ": " + string;
- }
-
- //########################################################################
- // ApplicationError constructors
-
- public ApplicationError() {
- this((String)null, (Throwable)null);
- }
-
- public ApplicationError(String message) {
- this(message, (Throwable)null);
- }
-
- public ApplicationError(Object object) {
- this(null, object, null);
- }
-
- public ApplicationError(Throwable cause) {
- this((String)null, cause);
- }
-
- public ApplicationError(String message, Object object) {
- this(message, object, null);
- }
-
- public ApplicationError(String message, Throwable cause) {
- super(message, cause);
- }
-
- public ApplicationError(Object object, Throwable cause) {
- this(null, object, cause);
- }
-
- public ApplicationError(String message, Object object, Throwable cause) {
- this(combine(message, object), cause);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/CompilationLoop.java b/sources/scalac/CompilationLoop.java
deleted file mode 100644
index 94700d355d..0000000000
--- a/sources/scalac/CompilationLoop.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac;
-
-import java.util.ArrayList;
-
-import scalac.util.Debug;
-
-/** This class implements the scalac compilation loop. */
-public class CompilationLoop {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
- /** The list of active phases */
- private final Phase[] phases;
- /** The units currently associated to each active phase. */
- private final ArrayList/*<CompilationUnit>*/[] unitss;
- /** The indexes of the first units that are not yet processed. */
- private final int[] indexes;
-
- //########################################################################
- // Private Constructors
-
- /** Initializes this instance. */
- public CompilationLoop(Global global) {
- this.global = global;
- int count = 0;
- for (Phase p = global.PHASE.INITIAL.phase(); p != null; p = p.next)
- count++;
- this.phases = new Phase[count];
- this.unitss = new ArrayList[count];
- this.indexes = new int[count];
- Phase phase = global.PHASE.INITIAL.phase();
- for (int i = 0; i < count; i++) {
- phases[i] = phase;
- unitss[i] = new ArrayList();
- phase = phase.next;
- }
- }
-
- //########################################################################
- // Public Methods
-
- /**
- * Compiles the given units and returns list of all compiled units
- * including those loaded automatically.
- */
- public CompilationUnit[] compile(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) unitss[0].add(units[i]);
- int limit = phases.length - 1;
- loop(limit, true);
- return global.reporter.errors() != 0
- ? new CompilationUnit[0]
- : (CompilationUnit[])unitss[limit].toArray(
- new CompilationUnit[unitss[limit].size()]);
- }
-
- /**
- * Inserts the given unit and compiles it up to the current phase
- * excluded.
- */
- public void insert(CompilationUnit unit) {
- Phase backup = global.currentPhase;
- unitss[0].add(unit);
- // !!! This "false" may be dangerous; it may lead to crashes
- // because phases might work on trees/symbol-tables that
- // contain errors (however this occurs only if the newly
- // loaded code may contain errors). On the other hand "true",
- // might starve some phases; if a phase requests a compilation
- // unit, it may never receive it.
- loop(getPhaseIndex(backup), false);
- global.currentPhase = backup;
- }
-
- //########################################################################
- // Private Methods
-
- /** Compiles all units up to phase "phases[limit]" excluded. */
- private void loop(int limit, boolean main) {
- assert limit < phases.length: Debug.show(""+limit, phases);
- for (int current = getFirstNonEmptyIndex(); current < limit; ) {
- // !!! remove NAMER test ?
- if (main && global.reporter.errors() != 0
- && global.currentPhase != global.PHASE.NAMER.phase()) break;
- // Update the current phase pointer.
- Phase phase = global.currentPhase = phases[current];
- // If the phase is not yet started, start it.
- if (indexes[current] == 0) global.timer.start();
- // Apply the phase to all available units. It's important
- // to not cache the result of "size()" as new units may be
- // added during the loop.
- for (int i = indexes[current]; i < unitss[current].size(); i++)
- phase.apply((CompilationUnit)unitss[current].get(i));
- int next = getFirstNonEmptyIndex();
- // If no new units were introduced, stop the phase.
- if (next == current) {
- PhaseDescriptor descriptor = phase.descriptor;
- global.timer.stop(descriptor.taskDescription());
- CompilationUnit[] units =
- (CompilationUnit[])unitss[current].toArray(
- new CompilationUnit[unitss[current].size()]);
- if (descriptor.hasPrintFlag()) global.print(units);
- // if (descriptor.hasGraphFlag()); // !!!
- // if (descriptor.hasCheckFlag()); // !!!
- if (phase == global.PHASE.PARSER.phase()) global.fix1(units);
- if (phase == global.PHASE.ANALYZER.phase()) global.fix2(units);
- unitss[current + 1].addAll(unitss[current]);
- unitss[current].clear();
- next++;
- }
- indexes[current] = unitss[current].size();
- current = next;
- }
- }
-
- /**
- * Returns the first index with a non-empty unit list. If there is
- * no such index, returns "phases.length".
- */
- private int getFirstNonEmptyIndex() {
- int index = 0;
- while (index < phases.length && unitss[index].isEmpty()) index++;
- return index;
- }
-
- /** Returns the index of the given phase. */
- private int getPhaseIndex(Phase phase) {
- for (int index = 0; index < phases.length; index++)
- if (phases[index] == phase) return index;
- throw Debug.abort("phase not found", Debug.show(phase, phases));
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/CompilationUnit.java b/sources/scalac/CompilationUnit.java
deleted file mode 100644
index 44e131bed7..0000000000
--- a/sources/scalac/CompilationUnit.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac;
-
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-import scalac.ast.Tree;
-import scalac.atree.ARepository;
-import scalac.util.FreshNameCreator;
-import java.util.HashMap;
-
-
-/** A representation for a compilation unit in scala
- *
- * @author Matthias Zenger
- * @version 1.0
- */
-public class CompilationUnit {
-
- /** the global compilation environment
- */
- public final Global global;
-
- /** the associated source code file
- */
- public final SourceFile source;
-
- /** does this unit come from the interpreter console
- */
- public final boolean console;
-
- /** is this unit only there for mixin expansion?
- */
- public final boolean mixinOnly;
-
- /** the fresh name creator
- */
- public final FreshNameCreator fresh;
-
- /** the content of the compilation unit in tree form
- */
- public Tree[] body;
- public ARepository repository;
-
- public CompilationUnit(Global global, SourceFile source,
- boolean console, boolean mixinOnly) {
- this.global = global;
- this.source = source;
- this.console = console;
- this.mixinOnly = mixinOnly;
- this.fresh = new FreshNameCreator();
- }
-
- public CompilationUnit(Global global, SourceFile source, boolean console) {
- this(global, source, console, false);
- }
-
- /** return the position representing the given encoded position
- */
- public Position position(int pos) {
- return new Position(source, pos);
- }
-
- /** issue an error in this compilation unit at a specific location
- */
- public void error(int pos, String message) {
- global.reporter.error(position(pos), message);
- }
-
- /** issue a warning in this compilation unit at a specific location
- */
- public void warning(int pos, String message) {
- global.reporter.warning(position(pos), message);
- }
-
- /** return a string representation
- */
- public String toString() {
- return source.toString();
- }
-
-}
diff --git a/sources/scalac/CompilerCommand.java b/sources/scalac/CompilerCommand.java
deleted file mode 100644
index ba016b24e6..0000000000
--- a/sources/scalac/CompilerCommand.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import scala.tools.util.ClassPath;
-import scala.tools.util.Reporter;
-import scala.tools.util.ConsoleReporter;
-
-import scalac.util.CommandParser;
-import scalac.util.ArgumentParser;
-import scalac.util.OptionParser;
-import scalac.util.BooleanOptionParser;
-import scalac.util.StringOptionParser;
-import scalac.util.ChoiceOptionParser;
-import scalac.util.HelpOptionParser;
-import scalac.util.VersionOptionParser;
-//import scalac.util.OptimizeOptionParser;
-import scalac.util.PhaseSetOptionParser;
-import scalac.util.PrintOptionParser;
-import scalac.util.UnknownOptionParser;
-import scalac.util.ScalaFileArgumentParser;
-import scalac.util.UnknownArgumentParser;
-import scalac.util.Strings;
-
-/**
- * Class <code>CompilerCommand</code> describes the options
- * passed as arguments to the compiler command.
- */
-public class CompilerCommand extends CommandParser {
-
- //########################################################################
- // Public Fields
-
- public final CompilerPhases phases;
-
- public final BooleanOptionParser debuginfo;
- public final BooleanOptionParser nowarn;
- public final BooleanOptionParser verbose;
- public final BooleanOptionParser debug;
- public final BooleanOptionParser explaintypes;
- public final BooleanOptionParser uniqid;
- public final BooleanOptionParser types;
- public final BooleanOptionParser prompt;
- public final ChoiceOptionParser separate;
- //public final OptimizeOptionParser optimize;
- public final StringOptionParser classpath;
- public final StringOptionParser sourcepath;
- public final StringOptionParser bootclasspath;
- public final StringOptionParser extdirs;
- public final StringOptionParser outpath;
- public final StringOptionParser encoding;
- public final StringOptionParser assemrefs;
- public final StringOptionParser assemname;
- public final ChoiceOptionParser target;
- public final BooleanOptionParser noimports;
- public final BooleanOptionParser nopredefs;
- public final PhaseSetOptionParser skip;
- public final PhaseSetOptionParser check;
- public final PrintOptionParser print;
- public final ChoiceOptionParser printer;
- public final StringOptionParser printfile;
- public final PhaseSetOptionParser graph;
- public final PhaseSetOptionParser stop;
- public final PhaseSetOptionParser log;
- public final VersionOptionParser version;
- public final HelpOptionParser help;
- public final UnknownOptionParser unknown_options;
- public final ScalaFileArgumentParser files;
- public final UnknownArgumentParser unknown_arguments;
-
- /*
- * Non-standard options (starting with prefix "-X")
- * are subject to change without notice.
- */
- public final BooleanOptionParser Xshortname;
- public final BooleanOptionParser Xmarkup;
- public final BooleanOptionParser Xnewmatch;
- public final BooleanOptionParser XpreserveWS;
- public final BooleanOptionParser XrunTimeTypes;
-
- /*
- * Whole-program optimization options
- */
- public final StringOptionParser XrootClass;
- public final StringOptionParser XappFile;
- public final StringOptionParser XdotFile;
- public final BooleanOptionParser Xrta;
- public final BooleanOptionParser Xinline;
-
- //########################################################################
- // Public Constructors
-
- /**
- * Creates an instance variable.
- *
- * @param product
- * @param version
- * @param reporter
- * @param phases
- */
- public CompilerCommand(String product, String version,
- Reporter reporter, CompilerPhases phases)
- {
- this(product, version, "<source files>", reporter, phases);
- }
-
- protected CompilerCommand(String product, String version, String syntax,
- Reporter reporter, CompilerPhases phases)
- {
- super(product, version, syntax, reporter);
- this.phases = phases;
-
- ArgumentParser[] parsers = new ArgumentParser[] {
-
- this.debuginfo = new BooleanOptionParser(this,
- "g", "Generate debugging info", false),
-
- this.nowarn = new BooleanOptionParser(this,
- "nowarn", "Generate no warnings",
- false),
-
- this.verbose = new BooleanOptionParser(this,
- "verbose", "Output messages about what the compiler is doing",
- false),
-
- //this.optimize = new OptimizeOptionParser(this,
- // "optimize", "optimize bytecode (-optimize:help for option list)",
- // null /* todo: uncomment: phases.OPTIMIZE */),
-
- this.classpath = new StringOptionParser(this,
- "classpath", "Specify where to find user class files",
- "path", ClassPath.DEFAULT_CLASSPATH),
-
- this.sourcepath = new StringOptionParser(this,
- "sourcepath", "Specify where to find input source files",
- "path", ClassPath.DEFAULT_SOURCEPATH),
-
- this.bootclasspath = new StringOptionParser(this,
- "bootclasspath", "Override location of bootstrap class files",
- "path", ClassPath.DEFAULT_BOOTCLASSPATH),
-
- this.extdirs = new StringOptionParser(this,
- "extdirs", "Override location of installed extensions",
- "dirs", ClassPath.DEFAULT_EXTDIRS),
-
- this.outpath = new StringOptionParser(this,
- "d", "Specify where to place generated class files",
- "directory", "."),
-
- this.encoding = new StringOptionParser(this,
- "encoding", "Specify character encoding used by source files",
- "encoding", System.getProperty("file.encoding", "ISO-8859-1")),
-
- this.separate = new ChoiceOptionParser(this,
- "separate", "Read symbol files for separate compilation: (yes, no)",
- "separate", new String[]{"yes", "no"}, "default"),
-
- this.target = new ChoiceOptionParser(this,
- "target", "Specify which backend to use (jvm, msil)",
- "target", Global.TARGETS, Global.TARGET_JVM),
-
- this.assemrefs = new StringOptionParser(this, "r",
- "Assemblies referenced by the source program (only relevant with '-target:msil')",
- "assembly files", "."),
-
- this.assemname = new StringOptionParser(this, "o",
- "Name of the output assembly (only relevant with '-target:msil')",
- "assembly name", null),
-
- this.debug = new BooleanOptionParser(this,
- "debug", "Output debugging messages",
- false),
-
- this.explaintypes = new BooleanOptionParser(this,
- "explaintypes", "Explain type errors in more detail",
- false),
-
- this.uniqid = new BooleanOptionParser(this,
- "uniqid", "Print identifiers with unique names (debugging option)",
- false),
-
- this.types = new BooleanOptionParser(this,
- "types", "Print tree types (debugging option)",
- false),
-
- this.prompt = new BooleanOptionParser(this,
- "prompt", "Display a prompt after each error (debugging option)",
- false),
-
- this.noimports = new BooleanOptionParser(this,
- "noimports", "Compile without any implicit imports",
- false),
-
- this.nopredefs = new BooleanOptionParser(this,
- "nopredefs", "Compile without any implicit predefined values",
- false),
-
- this.skip = new PhaseSetOptionParser(this,
- "skip", "Skip <phases> (see below)",
- phases.phases(), PhaseDescriptor.SKIP),
-
- this.check = new PhaseSetOptionParser(this,
- "check", "Check the tree after <phases> (see below)",
- phases.phases(), PhaseDescriptor.CHECK),
-
- this.print = new PrintOptionParser(this,
- "print", "Print out program after <phases> (see below)",
- phases.phases(), PhaseDescriptor.PRINT),
-
- this.printer = new ChoiceOptionParser(this,
- "printer", "Printer to use",
- "printer", Global.PRINTERS, Global.PRINTER_TEXT),
-
- this.printfile = new StringOptionParser(this,
- "print-file", "Specify file in which to print trees",
- "file", "-"),
-
- this.graph = new PhaseSetOptionParser(this,
- "graph", "Graph the program after <phases> (see below)",
- phases.phases(), PhaseDescriptor.GRAPH),
-
- this.stop = new PhaseSetOptionParser(this,
- "stop", "Stop after first phase in <phases> (see below)",
- phases.phases(), PhaseDescriptor.STOP),
-
- this.log = new PhaseSetOptionParser(this,
- "log", "Log operations in <phases> (see below)",
- phases.phases(), PhaseDescriptor.LOG),
-
- this.version = new VersionOptionParser(this,
- "version", "Print product version and exit",
- product() + " " + version() + " -- (c) 2002-05 LAMP/EPFL"),
-
- this.help = new HelpOptionParser(this,
- "help", "Print a synopsis of standard options"),
-
- this.Xshortname = new BooleanOptionParser(this,
- "Xshortname", "Display short file names in error reports",
- false),
-
- this.Xmarkup = new BooleanOptionParser(this,
- "Xmarkup", "no effect, only for compatibility",
- false),
-
- this.Xnewmatch = new BooleanOptionParser(this,
- "Xnewmatch", "new pattern matching",
- false),
-
- this.XpreserveWS = new BooleanOptionParser(this,
- "XpreserveWS", "don't trim whitespace in XML literals",
- false),
-
- this.XrootClass = new StringOptionParser(this,
- "XrootClass", "Specify the root class of the global application",
- "class", "$"),
-
- this.XappFile = new StringOptionParser(this,
- "XappFile", "Specify the filename where to dump the whole-application inferred from the rootclass",
- "file", "app.txt"),
-
- this.XdotFile = new StringOptionParser(this,
- "XdotFile", "Specify the filename where to print the AST in graphviz dot format",
- "file", "$"),
-
- this.Xrta = new BooleanOptionParser(this,
- "Xrta", "Perform Rapid Type analysis for method call resolution",
- false),
-
- this.Xinline = new BooleanOptionParser(this,
- "Xinline", "Inline method calls that can be resolved statically",
- false),
-
- this.XrunTimeTypes = new BooleanOptionParser(this,
- "Xrtt", "Enable run-time types",
- false),
-
- this.unknown_options = new UnknownOptionParser(this),
-
- this.files = new ScalaFileArgumentParser(this),
-
- this.unknown_arguments = new UnknownArgumentParser(this),
-
- };
-
- for (int i = 0; i < parsers.length; i++) add(parsers[i]);
- }
-
- //########################################################################
- // Public Methods
-
- /**
- * ..
- *
- * @param args
- */
- public boolean parse(String[] args) {
- boolean result = super.parse(args);
- reporter().verbose(verbose.value);
- reporter().nowarn(nowarn.value);
- reporter().prompt(prompt.value);
- if (reporter() instanceof ConsoleReporter)
- ((ConsoleReporter)reporter()).shortname = Xshortname.value;
- return result;
- }
-
- private boolean containsPhaseOptions() {
- List parsers = parsers();
- for (int i = 0; i < parsers.size(); i++) {
- if (parsers.get(i) instanceof PhaseSetOptionParser) return true;
- }
- return false;
- }
-
- /**
- * Returns the help message for this compiler command.
- *
- * @return a formatted string containing the help message.
- */
- public String getHelpMessage() {
- StringBuffer buffer = new StringBuffer(super.getHelpMessage());
- if (containsPhaseOptions()) {
- buffer.append(Strings.EOL);
- buffer.append("and possible compilation phases include:");
- buffer.append(Strings.EOL);
- PhaseDescriptor[] array = phases.phases();
- List lines = new ArrayList(array.length);
- for (int i = 0; i < array.length; i++) {
- PhaseDescriptor phase = array[i];
- lines.add(" " + phase.name() + "\t " + phase.description());
- }
- lines.add(" " + "all" + "\t " + "matches all phases");
- buffer.append(Strings.format(lines));
- }
- return buffer.toString();
- }
-
- /**
- * Returns the class path for this compiler command.
- *
- * @return the class path.
- */
- public ClassPath classpath() {
- return new ClassPath(classpath.value, sourcepath.value,
- bootclasspath.value, extdirs.value);
- }
-
- /**
- * Returns the output path for this compiler command.
- *
- * @return the output path terminated by .
- */
- public String outpath() {
- return outpath.value + (
- outpath.value.endsWith(File.separator) ? "" : File.separator
- );
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/CompilerPhases.java b/sources/scalac/CompilerPhases.java
deleted file mode 100644
index 3440f9bf75..0000000000
--- a/sources/scalac/CompilerPhases.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class defines all compiler phases and maintains a list of
- * active phases.
- */
-public abstract class CompilerPhases {
-
- //########################################################################
- // Public Fields
-
- /** The compiler phases. */
- public final PhaseDescriptor INITIAL;
- public final PhaseDescriptor PARSER;
- public final PhaseDescriptor NAMER;
- public final PhaseDescriptor ANALYZER;
- public final PhaseDescriptor REFCHECK;
- public final PhaseDescriptor UNCURRY;
- // public final PhaseDescriptor OPTIMIZE;
- public final PhaseDescriptor TAILCALL; // Moved here experimentally
-
- public final PhaseDescriptor TRANSMATCH;
- public final PhaseDescriptor LAMBDALIFT;
- public final PhaseDescriptor ADDACCESSORS;
- public final PhaseDescriptor EXPLICITOUTER;
- public final PhaseDescriptor ADDCONSTRUCTORS;
- public final PhaseDescriptor TYPESASVALUES;
-
- public final PhaseDescriptor WHOLEPROG;
- public final PhaseDescriptor ADDINTERFACES;
- public final PhaseDescriptor EXPANDMIXIN;
- public final PhaseDescriptor MAKEBOXINGEXPLICIT;
- public final PhaseDescriptor ERASURE;
- public final PhaseDescriptor ICODE;
- public final PhaseDescriptor CODEGEN;
- public final PhaseDescriptor TERMINAL;
-
- //########################################################################
- // Private Fields
-
- /** The list containing the active phases */
- private final List phases;
-
- /** Phase names, can be overridden to install .
- */
- protected abstract Class PARSER_PHASE();
- protected abstract Class NAMER_PHASE();
- protected abstract Class ANALYZER_PHASE();
- protected abstract Class REFCHECK_PHASE();
- protected abstract Class UNCURRY_PHASE();
- protected abstract Class TRANSMATCH_PHASE();
- protected Class LAMBDALIFT_PHASE() { return scalac.transformer.LambdaLiftPhase.class; }
- protected Class EXPLICITOUTER_PHASE() { return scalac.transformer.ExplicitOuterClassesPhase.class; }
- protected Class ADDACCESSORS_PHASE() { return scalac.transformer.AddAccessorsPhase.class; }
- protected Class ADDCONSTRUCTORS_PHASE() { return scalac.transformer.AddConstructorsPhase.class; }
- protected Class TYPESASVALUES_PHASE() { return scalac.transformer.TypesAsValuesPhase.class; }
- protected Class TAILCALL_PHASE() { return scalac.transformer.TailCallPhase.class; }
- protected abstract Class WHOLEPROG_PHASE();
- protected Class ADDINTERFACES_PHASE() { return scalac.transformer.AddInterfacesPhase.class; }
- protected Class EXPANDMIXIN_PHASE() { return scalac.transformer.ExpandMixinsPhase.class; }
- protected Class ERASURE_PHASE() { return scalac.transformer.ErasurePhase.class; }
- protected abstract Class ICODE_PHASE();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public CompilerPhases() {
- this.phases = new ArrayList();
- PhaseDescriptor[] array = {
- this.INITIAL = new PhaseDescriptor(
- "initial",
- "initializing compiler",
- "initializing compiler",
- scalac.util.EmptyPhase.class),
- this.PARSER = new PhaseDescriptor(
- "parse",
- "parse source files",
- "parsed",
- PARSER_PHASE()),
- this.NAMER = new PhaseDescriptor(
- "namer",
- "create symbols",
- "symbols created",
- NAMER_PHASE()),
- this.ANALYZER = new PhaseDescriptor(
- "analyze",
- "name and type analysis",
- "type checking",
- ANALYZER_PHASE()),
- this.REFCHECK = new PhaseDescriptor(
- "refcheck",
- "reference checking",
- "reference checking",
- REFCHECK_PHASE()),
- this.UNCURRY = new PhaseDescriptor(
- "uncurry",
- "uncurry function types and applications",
- "uncurried",
- UNCURRY_PHASE()),
-// this.OPTIMIZE = new PhaseDescriptor(
-// "optimize",
-// "tree-optimizer",
-// "tree optimization",
-// scalac.optimizer.OptimizePhase.class),
-
- this.TAILCALL = new PhaseDescriptor(
- "tailcall",
- "add tail-calls",
- "added tail-calls",
- TAILCALL_PHASE()),
-
- this.TRANSMATCH = new PhaseDescriptor(
- "transmatch",
- "translate match expressions",
- "translated pattern matching",
- TRANSMATCH_PHASE()),
- this.TYPESASVALUES = new PhaseDescriptor(
- "typesasvalues",
- "represent types as values",
- "represented types as values",
- TYPESASVALUES_PHASE()),
- this.LAMBDALIFT = new PhaseDescriptor(
- "lambdalift",
- "lambda lifter",
- "lambda lifting",
- LAMBDALIFT_PHASE()),
- this.ADDACCESSORS = new PhaseDescriptor(
- "addaccessors",
- "add accessors for constructor arguments",
- "added accessors",
- ADDACCESSORS_PHASE()),
- this.EXPLICITOUTER = new PhaseDescriptor(
- "explicitouterclasses",
- "make links from inner classes to enclosing one explicit",
- "made outer links explicit",
- EXPLICITOUTER_PHASE()),
- this.ADDCONSTRUCTORS = new PhaseDescriptor(
- "addconstructors",
- "add explicit constructor for each class",
- "added constructors",
- ADDCONSTRUCTORS_PHASE()),
- this.WHOLEPROG = new PhaseDescriptor(
- "wholeprog",
- "perform whole program analysis",
- "find monomorphic callsites and performs inlining",
- WHOLEPROG_PHASE()),
- this.ADDINTERFACES = new PhaseDescriptor(
- "addinterfaces",
- "add one interface per class",
- "added interfaces",
- ADDINTERFACES_PHASE()),
- this.EXPANDMIXIN = new PhaseDescriptor(
- "expandmixins",
- "expand mixins by code copying",
- "expanded mixins",
- EXPANDMIXIN_PHASE()),
- this.MAKEBOXINGEXPLICIT = new PhaseDescriptor(
- "boxing",
- "makes boxing explicit",
- "made boxing explicit",
- scalac.transformer.MakeBoxingExplicitPhase.class),
- this.ERASURE = new PhaseDescriptor(
- "erasure",
- "type eraser",
- "erased types",
- ERASURE_PHASE()),
- this.ICODE = new PhaseDescriptor(
- "icode",
- "generate icode",
- "generated icode",
- ICODE_PHASE()),
- this.CODEGEN = new PhaseDescriptor(
- "codegen",
- "enable code generation",
- "code generation enabled",
- scalac.util.EmptyPhase.class),
- this.TERMINAL = new PhaseDescriptor(
- "terminal",
- "compilation terminated",
- "compilation terminated",
- scalac.util.EmptyPhase.class),
- };
- for (int i = 0; i < array.length; i++) phases.add(array[i]);
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns an array containing all active phases. */
- public PhaseDescriptor[] phases() {
- PhaseDescriptor[] array = new PhaseDescriptor[phases.size()];
- phases.toArray(array);
- return array;
- }
-
- /** Freezes all active phases. */
- public void freeze() {
- PhaseDescriptor[] phases = phases();
- PhaseDescriptor.freeze(phases);
- }
-
- /** Activates phase "phase" by placing it before phase "where". */
- public int insertBefore(PhaseDescriptor phase, PhaseDescriptor where) {
- int index = phases.indexOf(where);
- assert index >= 0 : "could not find phase " + where;
- phases.add(index, phase);
- return index;
- }
-
- /** Activates phase "phase" by placing it after phase "where". */
- public int insertAfter(PhaseDescriptor phase, PhaseDescriptor where) {
- int index = phases.indexOf(where);
- assert index >= 0 : "could not find phase " + where;
- phases.add(index + 1, phase);
- return index + 1;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/Global.java b/sources/scalac/Global.java
deleted file mode 100644
index 801883ad25..0000000000
--- a/sources/scalac/Global.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac;
-
-import ch.epfl.lamp.util.CodePrinter;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.*;
-
-import scala.tools.util.AbstractFile;
-import scala.tools.util.ClassPath;
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-import scala.tools.util.SourceReader;
-import scala.tools.util.Reporter;
-import scala.tools.util.Timer;
-import scala.tools.util.DummyTimer;
-import scala.tools.util.ReporterTimer;
-
-import scalac.ast.*;
-import scalac.ast.parser.*;
-import scalac.ast.printer.TreePrinter;
-import scalac.atree.AConstant;
-import scalac.atree.ATreePrinter;
-import scalac.backend.Primitives;
-// !!! <<< Interpreter stuff
-import scalac.symtab.*;
-// !!! >>> Interpreter stuff
-import scalac.symtab.Definitions;
-import scalac.symtab.classfile.PackageParser;
-import scalac.symtab.classfile.CLRPackageParser;
-import scalac.typechecker.AnalyzerPhase;
-import scalac.typechecker.Infer;
-import scalac.transformer.ICodePhase;
-import scalac.util.*;
-
-/** The global environment of a compiler run
- *
- * @author Matthias Zenger
- * @version 1.0
- */
-public abstract class Global {
-
- public static Global instance;
-
- /** global options
- */
- public final boolean noimports;
- public final boolean nopredefs;
- public final boolean separate;
- //public final boolean optimize;
- public final boolean debug;
- public final boolean debuginfo;
- public final boolean explaintypes;
- public final boolean uniqid;
- public final boolean newMatch;
- public final boolean xmlPreserveWS;
- public final boolean runTimeTypes;
-
- public final boolean printtypes;
- public final boolean printtokens;
-
- public final String outpath;
- public final String encoding;
- public final String target;
-
- /** the message reporter
- */
- public final Reporter reporter;
-
- /** the timer
- */
- public final Timer timer;
-
- /** the source file charset
- */
- private final Charset charset;
-
- /** the source file decoder
- */
- private final CharsetDecoder decoder;
-
- /** the source file reader
- */
- private final SourceReader reader;
-
- /** the class path
- */
- public final ClassPath classPath;
-
- /** the global tree factory
- */
- public final TreeFactory make;
-
- /** the tree generator
- */
- public final TreeGen treeGen;
-
- /** the global tree printer
- */
- public final PrintWriter writer;
- public final TreePrinter treePrinter;
-
- /** documentation comments of symbols
- */
- public final Map/*<Symbol, String>*/ mapSymbolComment = new HashMap();
-
- /** attributes of symbols
- */
- protected final Map/*<Symbol, AttributeInfo>*/ mapSymbolAttr = new HashMap();
-
- /** views associated with (upper-bounded) type parameters
- */
- public final Map/*<Symbol, Symbol>*/ viewOfTypeParam = new HashMap();
-
- /** Pickled info of top-level symbols
- */
- public final Map/*<Symbol, Pickle>*/ symdata = new HashMap();
-
-
- /** The compiler command arguments
- */
- public final CompilerCommand args;
-
- /** The set of currently compiled top-level symbols
- */
- public HashMap/*<Symbol,Sourcefile>*/ compiledNow = new HashMap();
-
- /** The set of already compiled sourcefiles
- */
- private HashSet/*<SourceFile>*/ compiledUnits = new HashSet();
-
- /** the current phase
- */
- public Phase currentPhase;
-
- /** the global definitions
- */
- public Definitions definitions;
-
- /** the global primitives
- */
- public final Primitives primitives;
-
- /** compilation phases.
- */
- public final CompilerPhases PHASE;
-
- /** The current compilation loop or null */
- private CompilationLoop loop;
-
- /** compilation targets
- */
- public static final String TARGET_INT;
- public static final String TARGET_JVM;
- public static final String TARGET_MSIL;
- public static final String TARGET_JVMFROMICODE;
-
- public static final String[] TARGETS = new String[] {
- TARGET_INT = "int",
- TARGET_JVM = "jvm",
- TARGET_MSIL = "msil",
- TARGET_JVMFROMICODE = "jvmfromicode"
- };
-
- /** tree printers
- */
- public static final String PRINTER_TEXT;
- public static final String PRINTER_HTML;
- public static final String PRINTER_SWING;
-
- public static final String[] PRINTERS = new String[] {
- PRINTER_TEXT = "text",
- PRINTER_HTML = "html",
- PRINTER_SWING = "swing",
- };
-
- public static Timer getTimer(Reporter reporter) {
- return reporter.verbose()
- ? (Timer)new ReporterTimer(reporter)
- : (Timer)DummyTimer.object;
- }
-
- /** hooks for installing printers
- */
- public abstract Infer newInfer();
- public abstract TreePrinter newTextTreePrinter(PrintWriter writer);
- public abstract TreePrinter newHTMLTreePrinter(PrintWriter writer);
- public abstract TreePrinter newSwingTreePrinter(PrintWriter writer);
-
- /**
- * Creates an instance variable.
- *
- * @param args
- * @param interpret
- */
- public Global(CompilerCommand args, Timer timer, boolean interpret) {
- assert Debug.initialize() || true;
- if (Global.instance != null) // jaco bug: can't use assert here
- /* throw */ Debug.abort("duplicate creation of Global");
- Global.instance = this;
- this.args = args;
- this.reporter = args.reporter();
- this.timer = timer;
- this.noimports = args.noimports.value;
- this.nopredefs = args.nopredefs.value;
- //this.optimize = args.optimize.optimize;
- this.debug = args.debug.value;
- this.debuginfo = args.debuginfo.value;
- this.uniqid = args.uniqid.value;
- this.newMatch = args.Xnewmatch.value;
- this.xmlPreserveWS = args.XpreserveWS.value;
- this.runTimeTypes = args.XrunTimeTypes.value;
- this.explaintypes = args.explaintypes.value;
- this.printtypes = args.types.value;
- this.printtokens = args.print.tokens;
- this.classPath = args.classpath();
- reporter.info(null, "classpath = " + classPath, false);
- this.outpath = args.outpath();
- String encoding = args.encoding.value;
- Charset charset = null;
- try {
- charset = Charset.forName(encoding);
- } catch (IllegalCharsetNameException exception) {
- args.encoding.error("illegal charset name '" + encoding + "'");
- } catch (UnsupportedCharsetException exception) {
- args.encoding.error("unsupported charset '" + encoding + "'");
- }
- if (charset == null) {
- encoding = "ISO-8859-1"; // A mandatory charset
- charset = Charset.forName(encoding);
- }
- this.encoding = encoding;
- this.charset = charset;
- this.decoder = charset.newDecoder();
- this.reader = new SourceReader(decoder);
- this.target = interpret ? TARGET_INT : args.target.value.intern();
- this.separate = args.separate.value.equals("yes") ||
- args.separate.value.equals("default") && !this.target.equals(TARGET_INT);
- String printFile = args.printfile.value;
- OutputStream stream;
- try {
- stream = "-".equals(printFile)
- ? System.out
- : new FileOutputStream(printFile);
- } catch (FileNotFoundException e) {
- error("unable to open file " + printFile + ". Printing on console");
- stream = System.out;
- }
- this.writer = new PrintWriter(stream, debug);
- if (args.printer.value.equals(PRINTER_HTML)) {
- this.treePrinter = newHTMLTreePrinter(writer);
- } else if (args.printer.value.equals(PRINTER_SWING)) {
- this.treePrinter = newSwingTreePrinter(writer);
- } else {
- if (!args.printer.value.equals(PRINTER_TEXT))
- error("unknown printer kind: " + args.printer.value);
- this.treePrinter = newTextTreePrinter(writer);
- }
- this.make = new DefaultTreeFactory();
- this.PHASE = args.phases;
- args.phases.WHOLEPROG.addSkipFlag(); // !!!
- // if (!optimize) PHASE.remove(args.phases.OPTIMIZE);
- // TODO: Enable TailCall for other backends when they handle LabelDefs
- if (target != TARGET_JVMFROMICODE) args.phases.ICODE.addSkipFlag();
- PHASE.freeze();
- PhaseDescriptor[] descriptors = PHASE.phases();
- int i = 0;
- for (; i < descriptors.length; i++) {
- if (!descriptors[i].hasSkipFlag()) descriptors[i].create(this);
- if (descriptors[i] == PHASE.ANALYZER) { i++; break; }
- }
- this.treeGen = ((AnalyzerPhase)PHASE.ANALYZER.phase()).gen;
- this.primitives = new Primitives(this);
- for (; i < descriptors.length; i++)
- if (!descriptors[i].hasSkipFlag()) descriptors[i].create(this);
- assert descriptors.length >= 2
- && descriptors[0] == PHASE.INITIAL
- && descriptors[descriptors.length - 1] == PHASE.TERMINAL:
- Debug.show(descriptors);
- assert !PHASE.INITIAL.hasSkipFlag();
- this.currentPhase = PHASE.INITIAL.phase();
- }
-
- /**
- * Moves to next phase.
- */
- public void nextPhase() {
- assert currentPhase.next != null;
- currentPhase = currentPhase.next;
- }
-
- /** Move to previous phase
- */
- public void prevPhase() {
- assert currentPhase.prev != null;
- currentPhase = currentPhase.prev;
- }
-
- /** Creates a virtual source file with given name and content. */
- public SourceFile getSourceFile(String sourcename, String content) {
- return new SourceFile(sourcename, content.toCharArray());
- }
-
- /** Reads and returns the source file in file with given name. */
- public SourceFile getSourceFile(String filename) throws IOException {
- AbstractFile file = AbstractFile.getFile(filename);
- if (file == null) throw new FileNotFoundException(
- "source file '" + filename + "' could not be found");
- return getSourceFile(file);
- }
-
- /** Reads and returns the source file in given abstract file. */
- public SourceFile getSourceFile(AbstractFile file) throws IOException {
- return new SourceFile(file, reader.read(file));
- }
-
- /** Reads and returns the source file of given clasz. */
- public SourceFile getSourceFile(Symbol clasz) throws IOException {
- assert clasz.isClass() && clasz.isStatic(): Debug.show(clasz);
- AbstractFile file = classPath.getRoot().lookupPath(
- SourceRepresentation.externalizeFileName(clasz, ".scala"), false);
- if (file == null) throw new FileNotFoundException(
- "source file for " + clasz + " could not be found");
- return getSourceFile(file);
- }
-
- /** Returns the root symbol loader. */
- public SymbolLoader getRootLoader() {
- return target == TARGET_MSIL
- ? new CLRPackageParser(this, classPath.getRoot())
- : new PackageParser(this, classPath.getRoot());
- }
-
- /** the top-level compilation process
- */
- public CompilationUnit[] compile(String[] files, boolean console) {
- reporter.resetCounters();
- // parse files
- List units = new ArrayList(files.length);
- for (int i = 0; i < files.length; i++) {
- try {
- SourceFile source = getSourceFile(files[i]);
- units.add(new CompilationUnit(this, source, console));
- compiledUnits.add(source);
- } catch (IOException exception) {
- error("IO problem (encoding problem?) with file "+files[i]
- +"\n exception was: "+exception.getMessage());
- }
- }
- CompilationUnit[] array = new CompilationUnit[units.size()];
- return compile((CompilationUnit[])units.toArray(array));
- }
-
- /**
- * The top-level compilation process.
- *
- * @param filename
- * @param input
- * @param console
- */
- public CompilationUnit[] compile(String filename, String input, boolean console) {
- reporter.resetCounters();
- SourceFile source = getSourceFile(filename, input);
- compiledUnits.add(source);
- CompilationUnit[] units = {new CompilationUnit(this, source, console)};
- return compile(units);
- }
-
- /** compile all compilation units
- */
- private CompilationUnit[] compile(CompilationUnit[] units) {
- this.currentPhase = PHASE.INITIAL.phase();
- treePrinter.begin();
- this.loop = new CompilationLoop(this);
- loadFunctions();
- units = loop.compile(units);
- this.loop = null;
- if (reporter.errors() != 0) {
- imports.clear();
- for (Iterator i = compiledNow.entrySet().iterator(); i.hasNext();) {
- Map.Entry entry = (Map.Entry)i.next();
- Symbol clasz = (Symbol)entry.getKey();
- AbstractFile file = ((SourceFile)entry.getValue()).getFile();
- clasz.reset(new SourceCompleter(this, file));
- }
- }
- compiledNow.clear();
- treePrinter.end();
- this.currentPhase = PHASE.TERMINAL.phase();
- return units;
- }
-
- protected abstract void loadFunctions();
-
- /** Compiles an additional source file. */
- public void compileLate(SourceFile source, boolean mixinOnly) {
- assert loop != null: source;
- if (!compiledUnits.contains(source)) {
- compiledUnits.add(source);
- CompilationUnit unit = new CompilationUnit(this, source, false, mixinOnly);
- loop.insert(unit);
- }
- }
-
-
- /** Add attribute for a symbol
- * @param sym - symbol of the defininition to which the attribute is applied
- * @param aSym - symbol of the constructor of the attribute class
- * @param args - arguments to the attribute constructor
- */
- public void addAttribute(Symbol sym, Symbol aSym, AConstant[] args) {
- if (aSym != null && ! (aSym.isNone() || aSym.isError())) {
- AttributeInfo attr = getAttributes(sym);
- attr = new AttributeInfo(aSym, args, attr);
- setAttribute(sym, attr);
- }
- }
-
- /** Add attribute with no arguments
- * @param sym - symbol of the defininition to which the attribute is applied
- * @param aSym - symbol of the constructor of the attribute class
- */
- public void addAttribute(Symbol sym, Symbol aSym) {
- addAttribute(sym, aSym, AConstant.EMPTY_ARRAY);
- }
-
- /** Set the attributes for a given symbol
- */
- public void setAttribute(Symbol sym, AttributeInfo attr) {
- mapSymbolAttr.put(sym, attr);
- if (sym.isModule() && !sym.isModuleClass())
- mapSymbolAttr.put(sym.moduleClass(), attr);
- }
-
- /** Return all attributes for a given symbol
- */
- public AttributeInfo getAttributes(Symbol sym) {
- return (AttributeInfo)mapSymbolAttr.get(sym);
- }
-
- /** Return attribute arguments
- * @param sym - symbol of the definition
- * @param aSym - symbol of the constructor of the attribute class
- */
- public AConstant[] getAttrArguments(Symbol sym, Symbol aSym) {
- AttributeInfo attrs = getAttributes(sym);
- return attrs == null ? null : attrs.getAttrArguments(aSym);
- }
-
- /** Remove the attributes for a given symbol
- */
- public AttributeInfo removeAttributes(Symbol sym) {
- return (AttributeInfo)mapSymbolAttr.remove(sym);
- }
-
- public abstract void dump(CompilationUnit[] units);
-
- void print(CompilationUnit[] units) {
- if (currentPhase.id == PHASE.MAKEBOXINGEXPLICIT.id()) {
- boolean html = args.printer.value.equals(PRINTER_HTML);
- if (html) writer.println("<pre>");
- ATreePrinter printer = new ATreePrinter(new CodePrinter(writer));
- boolean next = currentPhase.next != null;
- if (next) currentPhase = currentPhase.next;
- printer.printUnits(units);
- if (next) currentPhase = currentPhase.prev;
- if (html) writer.println("</pre>");
- } else if (currentPhase.id == PHASE.ICODE.id()) {
- Phase phase = currentPhase;
- boolean html = args.printer.value.equals(PRINTER_HTML);
- if (html) writer.println("<pre>");
-
- boolean next = currentPhase.next != null;
- if (next) currentPhase = currentPhase.next;
- ((ICodePhase)phase).print(units, new CodePrinter(writer));
- if (next) currentPhase = currentPhase.prev;
- if (html) writer.println("</pre>");
- } else {
- // go to next phase to print symbols with their new type
- boolean next = currentPhase.next != null;
- if (next) currentPhase = currentPhase.next;
- treePrinter.print(units);
- if (next) currentPhase = currentPhase.prev;
- }
- }
-
- // !!! <<< Interpreter stuff
- public static final String CONSOLE_S = "$console$";
- private static final Name
- SHOW_DEFINITION_N = Name.fromString("showDefinition"),
- SHOW_VALUE_DEFINITION_N = Name.fromString("showValueDefinition"),
- SET_EVALUATION_RESULT_N = Name.fromString("setEvaluationResult");
- private Symbol INTERPRETER;
- private Symbol PRINTER;
- private Symbol SHOW_VALUE;
- private Symbol SET_EVALUATION_RESULT;
- private Symbol SHOW_DEFINITION;
- private Symbol SHOW_VALUE_DEFINITION;
-
- private Symbol INTERPRETER() {
- if (INTERPRETER == null)
- INTERPRETER = definitions.getModule("scala.runtime.InterpreterSupport");
- return INTERPRETER;
- }
-
- private Symbol SHOW_DEFINITION() {
- if (SHOW_DEFINITION == null)
- SHOW_DEFINITION = INTERPRETER().lookup(SHOW_DEFINITION_N);
- return SHOW_DEFINITION;
- }
-
- private Symbol SHOW_VALUE_DEFINITION() {
- if (SHOW_VALUE_DEFINITION == null)
- SHOW_VALUE_DEFINITION = INTERPRETER().lookup(SHOW_VALUE_DEFINITION_N);
- return SHOW_VALUE_DEFINITION;
- }
-
- private Symbol SET_EVALUATION_RESULT() {
- if (SET_EVALUATION_RESULT == null)
- SET_EVALUATION_RESULT = INTERPRETER().lookup(SET_EVALUATION_RESULT_N);
- return SET_EVALUATION_RESULT;
- }
-
- private int module = 0;
- private List imports = new ArrayList();
- public Symbol console;
-
- void fix1(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) {
- if (units[i].console) fix1(units[i]);
- }
- nextPhase();
- for (int i = 0; i < imports.size(); i++) {
- Symbol module = (Symbol)imports.get(i);
- ((scalac.typechecker.AnalyzerPhase)PHASE.ANALYZER.phase()).addConsoleImport(module);
- }
- prevPhase();
- }
-
- private void fix1(CompilationUnit unit) {
- unit.body = new Tree[] {
- make.ModuleDef(Position.FIRSTPOS,
- 0, Name.fromString(CONSOLE_S+module), Tree.Empty,
- make.Template(Position.FIRSTPOS, new Tree[]{
- make.Apply(Position.FIRSTPOS,
- make.Select(Position.FIRSTPOS,
- make.Ident(Position.FIRSTPOS, Names.scala),
- Names.AnyRef.toTypeName()),
- new Tree[0])},
- unit.body))};
- module++;
- }
-
- void fix2(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) {
- if (units[i].console) fix2(units[i]);
- }
- }
-
- private void fix2(CompilationUnit unit) {
- imports.clear();
- for (int i = 0; i < unit.body.length; i++) {
- switch (unit.body[i]) {
- case ModuleDef(_, _, _, Tree.Template impl):
- Symbol symbol = unit.body[i].symbol();
- if (!symbol.name.toString().startsWith(CONSOLE_S)) break;
- console = symbol;
- if (impl.body.length <= 0) break;
- imports.add(unit.body[i].symbol());
- Tree last = impl.body[impl.body.length - 1];
- if (last != Tree.Empty && last.isTerm()) {
- impl.body[impl.body.length - 1] =
- treeGen.Apply(last.pos,
- treeGen.Select(last.pos,
- treeGen.mkGlobalRef(last.pos, INTERPRETER()),
- SET_EVALUATION_RESULT()),
- new Tree[] {
- last,
- treeGen.mkStringLit(
- last.pos, show(last.getType()))});
- }
- TreeList body = new TreeList();
- for (int j = 0; j < impl.body.length; j++)
- fix2(body, impl.body[j]);
- impl.body = body.toArray();
- break;
- }
- }
- }
-
- private void fix2(TreeList body, Tree tree) {
- body.append(tree);
- switch (tree) {
- case PatDef(_, _, _): // !!! impossible (removed by analyzer)
- assert false : Debug.show(tree);
- return;
- case ClassDef(_, _, _, _, _, _):
- case PackageDef(_, _):
- case ModuleDef(_, _, _, _):
- case DefDef(_, _, _, _, _, _):
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- if (!mustShow(tree.symbol())) return;
- body.append(
- treeGen.Apply(tree.pos,
- treeGen.Select(tree.pos,
- treeGen.mkGlobalRef(tree.pos, INTERPRETER()),
- SHOW_DEFINITION()),
- new Tree[] {
- treeGen.mkStringLit(tree.pos, show(tree.symbol()))}));
- return;
- case ValDef(_, _, _, _):
- if (!mustShow(tree.symbol())) return;
- body.append(
- treeGen.Apply(tree.pos,
- treeGen.Select(tree.pos,
- treeGen.mkGlobalRef(tree.pos, INTERPRETER()),
- SHOW_VALUE_DEFINITION()),
- new Tree[] {
- treeGen.mkStringLit(tree.pos, show(tree.symbol())),
- treeGen.Ident(tree.pos, tree.symbol())}));
- return;
- default:
- return;
- }
- }
-
- private boolean mustShow(Symbol symbol) {
- return !symbol.isAccessor();
- }
-
- private String show(Symbol symbol) {
- return new InterpreterPrinter().printSignature(symbol).toString();
- }
-
- private String show(Type type) {
- return new InterpreterPrinter().printType(type).toString();
- }
-
- private class InterpreterPrinter extends SymbolTablePrinter {
- public InterpreterPrinter() {
- super(" ");
- }
- public String getSymbolName(Symbol symbol) {
- String string = super.getSymbolName(symbol);
- if (!debug) {
- int index = string.indexOf('$');
- if (index > 0) string = string.substring(0, index);
- }
- return string;
- }
- }
-
- // !!! >>> Interpreter stuff
-
- /** issue a global error
- */
- public void error(String message) {
- reporter.error(null, message);
- }
-
- /** issue a global warning
- */
- public void warning(String message) {
- reporter.warning(null, message);
- }
-
- /** issue an operation note
- */
- public void operation(String message) {
- reporter.info(null, "[" + message + "]", false);
- }
-
- /** issue a debug message from currentPhase
- */
- // the boolean return value is here to let one write "assert log( ... )"
- public boolean log(String message) {
- if (log()) {
- reporter.info(null, "[log " + currentPhase + "] " + message, true);
- }
- return true;
- }
-
- /** return true if logging is switched on for the current phase
- */
- public boolean log() {
- return currentPhase.descriptor.hasLogFlag();
- }
-
-}
diff --git a/sources/scalac/Phase.java b/sources/scalac/Phase.java
deleted file mode 100644
index 5239562e9d..0000000000
--- a/sources/scalac/Phase.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-public abstract class Phase {
-
- //########################################################################
- // Public Fields
-
- /** The global environment */
- public final Global global;
-
- /** The phase descriptor */
- public final PhaseDescriptor descriptor;
-
- /** The phase identifier */
- public final int id;
-
- /** The previous phase */
- public final Phase prev;
-
- /** The next phase */
- public Phase next;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public Phase(Global global, PhaseDescriptor descriptor) {
- this.global = global;
- this.descriptor = descriptor;
- this.id = descriptor.id();
- this.prev = global.currentPhase;
- if (prev != null) prev.next = this;
- descriptor.initialize(this);
- global.currentPhase = this;
- }
-
- //########################################################################
- // Public Methods
-
- /** Does this phase precede the given phase? */
- public boolean precedes(Phase phase) {
- return id < phase.id;
- }
-
- /**
- * Returns the info of `sym' after the phase. Assumes that `tp' is
- * the info of symbol `sym' before this phase.
- */
- public Type transformInfo(Symbol sym, Type tp) {
- return tp;
- }
-
- /** Applies this phase to the given compilation unit. */
- public abstract void apply(CompilationUnit unit);
-
- /** Returns the name of this phase. */
- public final String toString() {
- return descriptor.name();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/PhaseDescriptor.java b/sources/scalac/PhaseDescriptor.java
deleted file mode 100644
index c93fd327ba..0000000000
--- a/sources/scalac/PhaseDescriptor.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import scalac.util.Debug;
-
-/**
- * Information about a compiler phase.
- */
-public final class PhaseDescriptor {
-
- //########################################################################
- // Public Constants
-
- public static final int STOP = 0x0001;
- public static final int SKIP = 0x0002;
- public static final int PRINT = 0x0004;
- public static final int GRAPH = 0x0008;
- public static final int CHECK = 0x0010;
- public static final int LOG = 0x0020;
-
- //########################################################################
- // Public Functions
-
- /** Freezes the given phases (patches flags and assigns ids). */
- public static void freeze(PhaseDescriptor[] phases) {
- // there are at least two phases: INITIAL and TERMINAL
- assert phases.length >= 2;
- if (phases.length == 0) return;
- // propagate STOP and SKIP
- for (int i = 0; i < phases.length - 1; i++) {
- phases[i].flags |= (phases[i + 1].flags >>> 16) & (STOP | SKIP);
- phases[i+1].flags &= ~((STOP | SKIP) << 16);
- }
- // transform STOP flags into SKIP flags
- boolean stop = false;
- for (int i = 0; i < phases.length; i++) {
- if (stop) phases[i].flags |= SKIP;
- stop |= phases[i].hasStopFlag();
- if (stop) phases[i].flags &= ~STOP;
- }
- // remove SKIP flag on INITIAL and TERMINAL phases
- phases[0].flags &= ~SKIP;
- phases[phases.length - 1].flags &= ~SKIP;
- // propagate other flags and freeze remaining phases
- PhaseDescriptor last = null;
- for (int i = 0; i < phases.length; i++) {
- phases[i].id = 2 * i;
- if (phases[i].hasSkipFlag()) continue;
- if (last != null) last.flags |= phases[i].flags >>> 16;
- phases[i].flags &= 0x0000FFFF;
- if (i != phases.length - 1) last = phases[i];
- }
- // place TERMINAL phase just after last active phase
- phases[phases.length - 1].id = last.id + 1;
- }
-
- //########################################################################
- // Private Fields
-
- /** The phase name */
- private final String name;
- /** The phase description */
- private final String description;
- /** The phase task description */
- private final String task;
- /** The phase implementation class */
- private final Class clasz;
-
- /** The flags of this phase */
- private int flags;
- /** The phase instance */
- private Phase phase;
- /** The phase identifier */
- private int id = -1;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public PhaseDescriptor(String name, String description, String task,
- Class clasz)
- {
- this.name = name;
- this.description = description;
- this.task = task;
- this.clasz = clasz;
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the one-word name of this phase. */
- public String name() {
- return name;
- }
-
- /** Returns a one-line description of this phase. */
- public String description() {
- return description;
- }
-
- /** Returns a one-line task description of this phase. */
- public String taskDescription() {
- return task;
- }
-
- /** Creates the object implementing this phase. */
- public Phase create(Global global) {
- assert id >= 0 : "phase " + name + " not yet frozen";
- assert phase == null : "phase " + name + " already created";
- try {
- Class[] params = { Global.class, PhaseDescriptor.class };
- Object[] args = { global, this };
- Object phase = clasz.getConstructor(params).newInstance(args);
- assert this.phase == phase: this.phase + " != " + phase;
- return this.phase;
- } catch (NoSuchMethodException exception) {
- throw Debug.abort(exception);
- } catch (IllegalAccessException exception) {
- throw Debug.abort(exception);
- } catch (InstantiationException exception) {
- throw Debug.abort(exception);
- } catch (InvocationTargetException exception) {
- throw Debug.abort(exception);
- }
- }
-
- /** Returns the object implementing this phase. */
- public Phase phase() {
- assert phase != null : "phase " + name + " not yet created";
- return phase;
- }
-
- /** Returns the identifier of this phase. */
- public int id() {
- assert id >= 0 : "phase " + name + " not yet frozen";
- return id;
- }
-
- /** Adds the given flag (to previous phase if prev is true). */
- public void addFlag(int flag, boolean prev) {
- assert id < 0 : "phase " + name + " already frozen";
- flags |= flag << (prev ? 16 : 0);
- }
-
- /** Adds the SKIP flag. */
- public void addSkipFlag() {
- flags |= SKIP;
- }
-
- /** Adds the CHECK flag. */
- public void addCheckFlag() {
- flags |= CHECK;
- }
-
- /** Adds the PRINT flag. */
- public void addPrintFlag() {
- flags |= PRINT;
- }
-
- /** Adds the GRAPH flag. */
- public void addGraphFlag() {
- flags |= GRAPH;
- }
-
- /** Adds the STOP flag. */
- public void addStopFlag() {
- flags |= STOP;
- }
-
- /** Adds the LOG flag. */
- public void addLogFlag() {
- flags |= LOG;
- }
-
- /** Has this phase the SKIP flag? */
- public boolean hasSkipFlag() {
- return (flags & SKIP) != 0;
- }
-
- /** Has this phase the CHECK flag? */
- public boolean hasCheckFlag() {
- return (flags & CHECK) != 0;
- }
-
- /** Has this phase the PRINT flag? */
- public boolean hasPrintFlag() {
- return (flags & PRINT) != 0;
- }
-
- /** Has this phase the GRAPH flag? */
- public boolean hasGraphFlag() {
- return (flags & GRAPH) != 0;
- }
-
- /** Has this phase the STOP flag? */
- public boolean hasStopFlag() {
- return (flags & STOP) != 0;
- }
-
- /** Has this phase the LOG flag? */
- public boolean hasLogFlag() {
- return (flags & LOG) != 0;
- }
-
- /** Returns the name of this phase. */
- public String toString() {
- return name();
- }
-
- //########################################################################
- // Protected Methods
-
- /** Initializes this descriptor with given phase. */
- protected void initialize(Phase phase) {
- assert phase != null: "illegal null phase";
- assert phase.descriptor == this: phase.descriptor.name + " != " + name;
- assert this.phase == null: "phase " + name + " already initialized";
- this.phase = phase;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/Unit.java b/sources/scalac/Unit.java
deleted file mode 100644
index 44e131bed7..0000000000
--- a/sources/scalac/Unit.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac;
-
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-import scalac.ast.Tree;
-import scalac.atree.ARepository;
-import scalac.util.FreshNameCreator;
-import java.util.HashMap;
-
-
-/** A representation for a compilation unit in scala
- *
- * @author Matthias Zenger
- * @version 1.0
- */
-public class CompilationUnit {
-
- /** the global compilation environment
- */
- public final Global global;
-
- /** the associated source code file
- */
- public final SourceFile source;
-
- /** does this unit come from the interpreter console
- */
- public final boolean console;
-
- /** is this unit only there for mixin expansion?
- */
- public final boolean mixinOnly;
-
- /** the fresh name creator
- */
- public final FreshNameCreator fresh;
-
- /** the content of the compilation unit in tree form
- */
- public Tree[] body;
- public ARepository repository;
-
- public CompilationUnit(Global global, SourceFile source,
- boolean console, boolean mixinOnly) {
- this.global = global;
- this.source = source;
- this.console = console;
- this.mixinOnly = mixinOnly;
- this.fresh = new FreshNameCreator();
- }
-
- public CompilationUnit(Global global, SourceFile source, boolean console) {
- this(global, source, console, false);
- }
-
- /** return the position representing the given encoded position
- */
- public Position position(int pos) {
- return new Position(source, pos);
- }
-
- /** issue an error in this compilation unit at a specific location
- */
- public void error(int pos, String message) {
- global.reporter.error(position(pos), message);
- }
-
- /** issue a warning in this compilation unit at a specific location
- */
- public void warning(int pos, String message) {
- global.reporter.warning(position(pos), message);
- }
-
- /** return a string representation
- */
- public String toString() {
- return source.toString();
- }
-
-}
diff --git a/sources/scalac/ast/DefaultTreeFactory.java.tmpl b/sources/scalac/ast/DefaultTreeFactory.java.tmpl
deleted file mode 100644
index 48fa7760fa..0000000000
--- a/sources/scalac/ast/DefaultTreeFactory.java.tmpl
+++ /dev/null
@@ -1,22 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-{#Imports#}
-
-/** The default tree factory */
-public class DefaultTreeFactory implements TreeFactory {
-
- //########################################################################
- // Public Methods
-
- {#TreeMethods#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/LazyTreeCopier.java.tmpl b/sources/scalac/ast/LazyTreeCopier.java.tmpl
deleted file mode 100644
index 8da7facf2a..0000000000
--- a/sources/scalac/ast/LazyTreeCopier.java.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-{#Imports#}
-
-/**
- * A tree copier that returns a new tree only if some fields have
- * changed
- */
-public class LazyTreeCopier implements TreeCopier {
-
- //########################################################################
- // Protected Fields
-
- /** The tree copier used to copy trees */
- protected final TreeCopier copier;
-
- //########################################################################
- // Public Constructors
-
- public LazyTreeCopier(TreeFactory make) {
- this(new StrictTreeCopier(make));
- }
-
- public LazyTreeCopier(TreeCopier copier) {
- this.copier = copier;
- }
-
- //########################################################################
- // Public Methods
-
- {#TreeMethods#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/StrictTreeCopier.java.tmpl b/sources/scalac/ast/StrictTreeCopier.java.tmpl
deleted file mode 100644
index f82653279a..0000000000
--- a/sources/scalac/ast/StrictTreeCopier.java.tmpl
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-{#Imports#}
-
-/** A tree copier that returns always a new tree */
-public class StrictTreeCopier implements TreeCopier {
-
- //########################################################################
- // Protected Fields
-
- /** The tree factory used to create the tree copies */
- protected final TreeFactory make;
-
- //########################################################################
- // Public Constructors
-
- public StrictTreeCopier(TreeFactory make) {
- this.make = make;
- }
-
- //########################################################################
- // Public Methods
-
- {#TreeMethods#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/Transformer.java.tmpl b/sources/scalac/ast/Transformer.java.tmpl
deleted file mode 100644
index 2fa347c305..0000000000
--- a/sources/scalac/ast/Transformer.java.tmpl
+++ /dev/null
@@ -1,319 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-import scalac.Global;
-import scalac.CompilationUnit;
-import scalac.symtab.Type;
-{#Imports#}
-
-/**
- * A default transformer class. This class traverses the abstract
- * syntax tree but does not do any transformations.
- */
-public class Transformer {
-
- //########################################################################
- // Public Fields
-
- /** The global environment */
- public final Global global;
-
- /** The tree factory */
- public final TreeFactory make;
-
- /** The tree copier */
- public final TreeCopier copy;
-
- /** A tree generator */
- public final TreeGen gen;
-
- //########################################################################
- // Public Constructors
-
- public Transformer(Global global) {
- this(global, global.make);
- }
-
- public Transformer(Global global, TreeFactory make) {
- this(global, make, new LazyTreeCopier(make));
- }
-
- public Transformer(Global global, TreeFactory make, TreeCopier copy) {
- this.global = global;
- this.make = make;
- this.copy = copy;
- this.gen = global.treeGen;
- }
-
- //########################################################################
- // Public Methods
-
- public void apply(CompilationUnit unit) {
- unit.global.log("transforming " + unit);
- unit.body = transform(unit.body);
- }
-
- public Tree transform(Tree tree) {
- {#TreeSwitch#}
- }
-
- public Template transform(Template tree) {
- return (Template)transform((Tree)tree);
- }
-
- {#TransformArrays#}
-
- //########################################################################
-}
-
-
-public class GenTransformer {
-
- //########################################################################
- // Public Fields
-
- /** The global environment */
- public final Global global;
-
- /** The type map */
- public final Type.Map map;
-
- /** A tree generator */
- public final TreeGen gen;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance with an identity type map. */
- public GenTransformer(Global global) {
- this(global, Type.IdMap);
- }
-
- /** Initializes this instance with given type map. */
- public GenTransformer(Global global, Type.Map map) {
- this.global = global;
- this.gen = global.treeGen;
- this.map = map;
- }
-
- //########################################################################
- // Public Methods
-
- /** Transforms the given units. */
- public void apply(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) apply(units[i]);
- }
-
- /** Transforms the given unit. */
- public void apply(CompilationUnit unit) {
- unit.global.log("transforming " + unit);
- unit.body = transform(unit.body);
- }
-
- /** Transforms the given symbol. */
- public Symbol getSymbolFor(Tree tree) {
- return tree.symbol();
- }
-
- /** Transforms the given types. */
- public Type[] transform(Type[] types) {
- for (int i = 0; i < types.length; i++) {
- Type type = transform(types[i]);
- if (type == types[i]) continue;
- Type[] clones = new Type[types.length];
- for (int j = 0; j < i; j++) clones[j] = types[j];
- clones[i] = type;
- for (; i < types.length; i++) clones[i] = transform(types[i]);
- return clones;
- }
- return types;
- }
-
- /** Transforms the given type. */
- public Type transform(Type type) {
- return map.apply(type);
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- switch (tree) {
-
- // case Bad():
-
- case Empty:
- return tree;
-
- case ClassDef(_, _, _, _, _, Template impl):
- Symbol symbol = getSymbolFor(tree);
- if (global.currentPhase.id < global.PHASE.ADDCONSTRUCTORS.id()) {
- Symbol impl_symbol = getSymbolFor(impl);
- Tree[] parents = transform(impl.parents);
- Tree[] body = transform(impl.body);
- return gen.ClassDef(symbol, parents, impl_symbol, body);
- } else {
- Tree[] body = transform(impl.body);
- return gen.ClassDef(symbol, body);
- }
-
- case PackageDef(Tree packaged, Template(Tree[] parents, Tree[] body)):
- Symbol symbol = getSymbolFor(packaged);
- assert parents.length == 0: tree;
- return gen.PackageDef(symbol, transform(body));
-
- // case ModuleDef(_, _, _, Template impl):
-
- case ValDef(_, _, _, Tree rhs):
- Symbol symbol = getSymbolFor(tree);
- return gen.ValDef(symbol, transform(rhs));
-
- // case PatDef(int mods, Tree pat, Tree rhs):
-
- case DefDef(_, _, _, _, _, Tree rhs):
- Symbol symbol = getSymbolFor(tree);
- return gen.DefDef(symbol, transform(rhs));
-
- case AbsTypeDef(_, _, _, _):
- Symbol symbol = getSymbolFor(tree);
- return gen.AbsTypeDef(symbol);
-
- case AliasTypeDef(_, _, _, _):
- Symbol symbol = getSymbolFor(tree);
- return gen.AliasTypeDef(symbol);
-
- case Import(Tree expr, Name[] selectors):
- return gen.Import(tree.pos, transform(expr), selectors);
-
- case CaseDef(Tree pat, Tree guard, Tree body):
- pat = transform(pat);
- guard = transform(guard);
- body = transform(body);
- return gen.CaseDef(pat, guard, body);
-
- // case Template(Tree[] parents, Tree[] body):
-
- case LabelDef(_, Ident[] params, Tree rhs):
- Symbol symbol = getSymbolFor(tree);
- return gen.LabelDef(symbol, transform(params), transform(rhs));
-
- case Block(Tree[] stats, Tree value):
- return gen.Block(tree.pos, transform(stats), transform(value));
-
- case Sequence(Tree[] trees):
- trees = transform(trees);
- Tree seq = new Sequence(trees);
- seq.pos = tree.pos;
- seq.type = tree.type;
- return seq;
- // case Alternative(Tree[] trees):
- // case Visitor(CaseDef[] cases):
- // case Function(ValDef[] vparams, Tree body):
-
- case Bind(Name n, Tree pat): // test
- Symbol sym = getSymbolFor(tree);
- global.nextPhase();
- sym.setType(tree.type);
- global.prevPhase();
- Tree bind = new ExtBind(sym, transform(pat));
- bind.type = sym.getType();
- bind.pos = tree.pos;
- return bind;
-
-
- case Assign(Tree lhs, Tree rhs):
- return gen.Assign(tree.pos, transform(lhs), transform(rhs));
-
- case If(Tree cond, Tree thenp, Tree elsep):
- cond = transform(cond);
- thenp = transform(thenp);
- elsep = transform(elsep);
- if (tree.type().isSameAs(global.definitions.ANY_TYPE())) {
- global.nextPhase();
- Type type = global.definitions.ANY_TYPE();
- global.prevPhase();
- return gen.If(tree.pos, cond, thenp, elsep, type);
- } else {
- return gen.If(tree.pos, cond, thenp, elsep);
- }
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- test = transform(test);
- bodies = transform(bodies);
- otherwise = transform(otherwise);
- if (tree.type().isSameAs(global.definitions.ANY_TYPE())) {
- global.nextPhase();
- Type type = global.definitions.ANY_TYPE();
- global.prevPhase();
- return gen.Switch(tree.pos, test, tags, bodies,otherwise,type);
- } else {
- return gen.Switch(tree.pos, test, tags, bodies, otherwise);
- }
-
- case Return(Tree expr):
- Symbol symbol = getSymbolFor(tree);
- return gen.Return(tree.pos, symbol, transform(expr));
-
- // case Throw(Tree expr):
-
- case New(Tree init):
- return gen.New(tree.pos, transform(init));
-
- case Create(Tree qualifier, Tree[] args):
- Symbol symbol = getSymbolFor(tree);
- qualifier = transform(qualifier);
- args = transform(args);
- return gen.Create(tree.pos, qualifier, symbol, args);
-
- case Typed(Tree expr, Tree tpe):
- return gen.Typed(tree.pos, transform(expr), transform(tpe));
-
- case TypeApply(Tree fun, Tree[] args):
- return gen.TypeApply(transform(fun), transform(args));
-
- case Apply(Tree fun, Tree[] args):
- return gen.Apply(transform(fun), transform(args));
-
- case Super(_, _):
- Symbol symbol = getSymbolFor(tree);
- return gen.Super(tree.pos, symbol);
-
- case This(_):
- Symbol symbol = getSymbolFor(tree);
- return gen.This(tree.pos, symbol);
-
- case Select(Tree qualifier, _):
- Symbol symbol = getSymbolFor(tree);
- return gen.Select(tree.pos, transform(qualifier), symbol);
-
- case Ident(_):
- Symbol symbol = getSymbolFor(tree);
- return gen.Ident(tree.pos, symbol);
-
- case Literal(AConstant value):
- return gen.Literal(tree.pos, value);
-
- case TypeTerm():
- return gen.mkType(tree.pos, transform(tree.type()));
-
- // case SingletonType(Tree ref):
- // case SelectFromType(Tree qualifier, Name selector):
- // case FunType(Tree[] argtpes, Tree restpe):
- // case CompoundType(Tree[] parents, Tree[] refinements):
- // case AppliedType(Tree tpe, Tree[] args):
- // case Try(Tree block, Tree catcher, Tree finalizer):
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- {#TransformArrays#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/Traverser.java.tmpl b/sources/scalac/ast/Traverser.java.tmpl
deleted file mode 100644
index a17768e2b4..0000000000
--- a/sources/scalac/ast/Traverser.java.tmpl
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-import scalac.CompilationUnit;
-{#Imports#}
-
-/** Class to traverse a tree without modifying it. */
-public class Traverser {
-
- //########################################################################
- // Public Methods
-
- public void traverse(CompilationUnit[] units) {
- for (int i = 0; i < units.length; i++) traverse(units[i]);
- }
-
- public void traverse(CompilationUnit unit) {
- traverse(unit.body);
- }
-
- public void traverse(Tree tree) {
- {#TreeSwitch#}
- }
-
- {#TraverseArrays#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/Tree.java.tmpl b/sources/scalac/ast/Tree.java.tmpl
deleted file mode 100644
index c76c2b37d0..0000000000
--- a/sources/scalac/ast/Tree.java.tmpl
+++ /dev/null
@@ -1,202 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import scala.tools.util.Position;
-
-import scalac.Global;
-import scalac.ast.printer.TreePrinter;
-import scalac.checkers.CheckTreeNodes;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Names;
-{#Imports#}
-
-public class Tree {
-
- //########################################################################
- // Public Constants
-
- {#EmptyArrays#}
-
- //########################################################################
- // Public Fields
-
- /** The position of the tree */
- public int pos = Position.NOPOS;
-
- /** The type of the tree */
- public Type type;
-
- //########################################################################
- // Public Cases
-
- {#TreeCases#}
-
- //########################################################################
- // Public Methods - queries
-
- {#IsKind#}
-
- //########################################################################
- // Public Methods - tree type
-
- /** Get the type of the node. */
- public final Type getType() {
- return type;
- }
-
- /** Get the type of the node, which must be non-null. */
- public Type type() {
- assert type != null : Debug.show(this);
- return type;
- }
-
- /** Set the type of the node. */
- public Tree setType(Type type) {
- assert !(type instanceof Type.LazyType) : Debug.show(this);
- this.type = type;
- return this;
- }
-
- /** Get types attached to array of nodes. */
- public static Type[] typeOf(Tree[] trees) {
- Type[] types = new Type[trees.length];
- for (int i = 0; i < trees.length; i++) types[i] = trees[i].getType();
- return types;
- }
-
- //########################################################################
- // Public Methods - tree symbol
-
- /** Has this tree a symbol field? */
- public boolean hasSymbol() {
- return false;
- }
-
- /** Tells if the tree defines a symbol. */
- public boolean definesSymbol() {
- return false;
- }
-
- /** Get symbol attached to the node, if any. */
- public Symbol symbol() {
- return null;
- }
-
- /** Set symbol attached to the node, if possible. */
- public Tree setSymbol(Symbol sym) {
- throw Debug.abort("no settable symbol for node", this);
- }
-
- /** Get symbols attached to array of nodes. */
- public static Symbol[] symbolOf(Tree[] trees) {
- Symbol[] symbols = new Symbol[trees.length];
- for (int i = 0; i < trees.length; i++) symbols[i] = trees[i].symbol();
- return symbols;
- }
-
- //########################################################################
- // Public Methods - tree to string
-
- /** Returns the string representation of this tree. */
- public String toString() {
- StringWriter buffer = new StringWriter();
- TreePrinter printer =
- Global.instance.newTextTreePrinter(new PrintWriter(buffer));
- printer.print(this);
- printer.flush();
- return buffer.toString();
- }
-
- //########################################################################
- // Public Methods - duplication
-
- public static Transformer duplicator;
-
- /** Returns a shallow copy of the given array. */
- public static Tree[] cloneArray(Tree[] array) {
- return cloneArray(0, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items.
- */
- public static Tree[] cloneArray(int prefix, Tree[] array) {
- return cloneArray(prefix, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array suffixed by "suffix"
- * null items.
- */
- public static Tree[] cloneArray(Tree[] array, int suffix) {
- return cloneArray(0, array, suffix);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items and suffixed by "suffix" null items.
- */
- public static Tree[] cloneArray(int prefix, Tree[] array, int suffix) {
- assert prefix >= 0 && suffix >= 0: prefix + " - " + suffix;
- int size = prefix + array.length + suffix;
- if (size == 0) return EMPTY_ARRAY;
- Tree[] clone = new Tree[size];
- for (int i = 0; i < array.length; i++) clone[prefix + i] = array[i];
- return clone;
- }
-
- /** Returns the concatenation of the two arrays. */
- public static Tree[] concat(Tree[] array1, Tree[] array2) {
- if (array1.length == 0) return array2;
- if (array2.length == 0) return array1;
- Tree[] clone = cloneArray(array1.length, array2);
- for (int i = 0; i < array1.length; i++) clone[i] = array1[i];
- return clone;
- }
-
- public Tree duplicate() {
- if (duplicator == null) duplicator =new Transformer(
- Global.instance, Global.instance.make,
- new StrictTreeCopier(Global.instance.make));
- return duplicator.transform(this);
- }
-
- //########################################################################
- // Public Classes
-
- {#ExtClasses#}
-
- //########################################################################
- // Empty Switch
-
- /*
-
- public void foobar(Tree tree) {
-
- switch (tree) {
-
- {#EmptyCases#}
-
- default:
- throw Debug.abort("illegal case", tree);
- }
-
- }
-
- */
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/TreeCloner.java b/sources/scalac/ast/TreeCloner.java
deleted file mode 100644
index 8d96c1b23e..0000000000
--- a/sources/scalac/ast/TreeCloner.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-import java.util.Map;
-
-import scalac.Global;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolCloner;
-import scalac.symtab.SymbolSubstTypeMap;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/**
- * This class implements a deep tree cloner. It provides support to
- * change tree symbols and tree types on the fly. This cloner never
- * clones symbols, but its default implementation of getSymbolFor
- * requires that all symbols that are defined by the tree to be cloned
- * are present in the symbol substitution. This implies that if the
- * tree to clone contains definitions, it must first be traversed to
- * map all defined symbols. To do this, one can use TreeSymbolCloner.
- */
-public class TreeCloner extends Transformer {
-
- //########################################################################
- // Private Fields
-
- /** The symbol substitution to apply to tree symbols */
- private final Map/*<Symbol,Symbol>*/ symbols;
-
- /** The type map to apply to tree types */
- private final Type.Map types;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes a new instance. */
- public TreeCloner(Global global, SymbolSubstTypeMap types) {
- this(global, types.getSymbols(), types);
- }
-
- /** Initializes a new instance. */
- public TreeCloner(Global global, Map symbols, Type.Map types) {
- super(global, global.make, new StrictTreeCopier(global.make));
- this.symbols = symbols;
- this.types = types;
- }
-
- //########################################################################
- // Public Methods
-
- /**
- * Returns the symbol for the given cloned tree. The default
- * implementation returns the result of the application of the
- * symbol substitution to the given tree's symbol. If there is no
- * mapping for that symbol returns that same symbol.
- */
- public Symbol getSymbolFor(Tree tree) {
- Symbol oldsym = tree.symbol();
- Symbol newsym = (Symbol)symbols.get(oldsym);
- // cloned definitions must have a cloned symbol
- assert newsym != null || !tree.definesSymbol() : Debug.show(oldsym);
- return newsym != null ? newsym : oldsym;
- }
-
- /**
- * Returns the type for the given cloned tree. The default
- * implementation returns the result of the application of the
- * type map to the given tree's type.
- */
- public Type getTypeFor(Tree tree) {
- return types.apply(tree.getType());
- }
-
- /** Traverses the given tree and returns a deeply cloned one. */
- public Tree transform(Tree tree) {
- tree = super.transform(tree);
- if (tree.hasSymbol()) tree.setSymbol(getSymbolFor(tree));
- tree.setType(getTypeFor(tree));
- return tree;
- }
-
- //########################################################################
-}
-
-
-/** !!! */
-public class GenTreeCloner extends GenTransformer {
-
- //########################################################################
- // Public Fields
-
- /** The symbol cloner */
- public final SymbolCloner cloner;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes a new instance. */
- public GenTreeCloner(Global global, Type.Map map, SymbolCloner cloner) {
- super(global, map);
- this.cloner = cloner;
- }
-
- public GenTreeCloner(Global global, SymbolCloner cloner) {
- super(global, cloner.getTypeMap());
- this.cloner = cloner;
- }
-
- //########################################################################
- // Public Methods
-
- public Symbol getSymbolFor(Tree tree) {
- switch (tree) {
- case ValDef(_, _, _, _):
- if (tree.symbol().owner().isClass()) break;
- Symbol symbol = cloner.cloneSymbol(tree.symbol());
- symbol.setType(transform(symbol.type()));
- return symbol;
- case LabelDef(_, _, _):
- Symbol symbol = cloner.cloneSymbol(tree.symbol());
- symbol.setType(transform(symbol.type()));
- return symbol;
- }
- Symbol symbol = (Symbol)cloner.clones.get(tree.symbol());
- assert !tree.definesSymbol() || symbol != null: tree;
- return symbol != null ? symbol : tree.symbol();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/TreeCopier.java.tmpl b/sources/scalac/ast/TreeCopier.java.tmpl
deleted file mode 100644
index 27a9cf476e..0000000000
--- a/sources/scalac/ast/TreeCopier.java.tmpl
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-{#Imports#}
-
-/**
- * Interface for a kind of factory which, for each node constructor,
- * takes an original node from which some data will be copied or
- * shared.
- */
-public interface TreeCopier {
-
- //########################################################################
- // Public Methods
-
- {#TreeMethods#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/TreeFactory.java.tmpl b/sources/scalac/ast/TreeFactory.java.tmpl
deleted file mode 100644
index 3b46970e77..0000000000
--- a/sources/scalac/ast/TreeFactory.java.tmpl
+++ /dev/null
@@ -1,22 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-{#Imports#}
-
-/** This interface describes a tree factory */
-public interface TreeFactory {
-
- //########################################################################
- // Public Methods
-
- {#TreeMethods#}
-
- //########################################################################
-}
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java
deleted file mode 100644
index 49e97c24d7..0000000000
--- a/sources/scalac/ast/TreeGen.java
+++ /dev/null
@@ -1,1361 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-import scalac.Global;
-import scalac.ast.Tree.*;
-import scalac.atree.AConstant;
-import scalac.symtab.*;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.TypeNames;
-
-/**
- * This class provides method to build attributed trees.
- *
- * @author Martin Odersky, Christine Roeckl
- * @version 1.0
- */
-public class TreeGen implements Kinds, Modifiers, TypeTags {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
-
- /** The global definitions */
- private final Definitions definitions;
-
- /** The tree factory */
- private final TreeFactory make;
-
- /** Initializes this instance. */
- public TreeGen(Global global) {
- this(global, global.make);
- }
-
- /** Initializes this instance. */
- public TreeGen(Global global, TreeFactory make) {
- this.global = global;
- this.definitions = global.definitions;
- this.make = make;
- }
-
- //########################################################################
- // Public Methods - Building types
-
- /** Builds type references corresponding to given symbols. */
- public Tree[] mkTypeRefs(int pos, Symbol[] syms) {
- if (syms.length == 0) return Tree.EMPTY_ARRAY;
- Tree[] trees = new Tree[syms.length];
- for (int i = 0; i < trees.length; i++)
- trees[i] = mkTypeRef(pos, syms[i]);
- return trees;
- }
-
- /** Builds a type reference corresponding to given symbol. */
- public Tree mkTypeRef(int pos, Symbol sym) {
- assert sym.kind == TYPE: Debug.show(sym);
- sym.flags |= ACCESSED;
- return mkType(pos, sym.nextType());
- }
-
- /** Builds trees corresponding to given types. */
- public Tree[] mkTypes(int pos, Type[] types) {
- if (types.length == 0) return Tree.EMPTY_ARRAY;
- Tree[] trees = new Tree[types.length];
- for (int i = 0; i < trees.length; i++)
- trees[i] = mkType(pos, types[i]);
- return trees;
- }
-
- /** Builds a tree corresponding to given type. */
- public Tree mkType(int pos, Type type) {
- return TypeTerm(pos, type);
- }
-
- /** Builds a TypeTerm node corresponding to given type. */
- public TypeTerm TypeTerm(int pos, Type type) {
- TypeTerm tree = make.TypeTerm(pos);
- tree.setType(type);
- return tree;
- }
-
- //########################################################################
- // Public Methods - Building constants
-
- /** Builds a unit literal. */
- public Tree mkUnitLit(int pos) {
- return Literal(pos, AConstant.UNIT);
- }
-
- /** Builds a boolean literal. */
- public Tree mkBooleanLit(int pos, boolean value) {
- return Literal(pos, AConstant.BOOLEAN(value));
- }
-
- /** Builds a byte literal. */
- public Tree mkByteLit(int pos, byte value) {
- return Literal(pos, AConstant.BYTE(value));
- }
-
- /** Builds a short literal. */
- public Tree mkShortLit(int pos, short value) {
- return Literal(pos, AConstant.SHORT(value));
- }
-
- /** Builds a character literal. */
- public Tree mkCharLit(int pos, char value) {
- return Literal(pos, AConstant.CHAR(value));
- }
-
- /** Builds an integer literal */
- public Tree mkIntLit(int pos, int value) {
- return Literal(pos, AConstant.INT(value));
- }
-
- /** Builds a long literal. */
- public Tree mkLongLit(int pos, long value) {
- return Literal(pos, AConstant.LONG(value));
- }
-
- /** Builds a float literal. */
- public Tree mkFloatLit(int pos, float value) {
- return Literal(pos, AConstant.FLOAT(value));
- }
-
- /** Builds a double literal. */
- public Tree mkDoubleLit(int pos, double value) {
- return Literal(pos, AConstant.DOUBLE(value));
- }
-
- /** Builds a string literal. */
- public Tree mkStringLit(int pos, String value) {
- assert value != null;
- return Literal(pos, AConstant.STRING(value));
- }
-
- /** Builds a symbol name literal. */
- public Tree mkSymbolNameLit(int pos, Symbol value) {
- return Literal(pos, AConstant.SYMBOL_NAME(value));
- }
-
- /** Builds a null literal. */
- public Tree mkNullLit(int pos) {
- return Literal(pos, AConstant.NULL);
- }
-
- /** Builds a zero literal. */
- public Tree mkZeroLit(int pos) {
- return Literal(pos, AConstant.ZERO);
- }
-
- /** Builds a default zero value according to given type tag. */
- public Tree mkDefaultValue(int pos, int tag) {
- switch (tag) {
- case UNIT : return mkUnitLit(pos);
- case BOOLEAN: return mkBooleanLit(pos, false);
- case BYTE : return mkByteLit(pos, (byte)0);
- case SHORT : return mkShortLit(pos, (short)0);
- case CHAR : return mkCharLit(pos, '\0');
- case INT : return mkIntLit(pos, 0);
- case LONG : return mkLongLit(pos, 0l);
- case FLOAT : return mkFloatLit(pos, 0f);
- case DOUBLE : return mkDoubleLit(pos, 0d);
- default : throw Debug.abort("unknown type tag: " + tag);
- }
- }
-
- /** Builds a default zero value according to given type. */
- public Tree mkDefaultValue(int pos, Type type) {
- switch (type.unbox()) {
- case UnboxedType(int tag): return mkDefaultValue(pos, tag);
- }
- if (definitions.ALLREF_TYPE().isSubType(type)) return mkNullLit(pos);
- return mkZeroLit(pos);
- }
-
- /** Builds a Literal node of given value. */
- public Literal Literal(int pos, AConstant value) {
- Literal tree = make.Literal(pos, value);
- global.nextPhase();
- tree.setType(definitions.atyper.type(value));
- global.prevPhase();
- return tree;
- }
-
- //########################################################################
- // Public Methods - Building references
-
- /**
- * Builds a reference to primary constructor of given class with
- * given qualifier.
- */
- public Tree mkPrimaryConstructorRef(int pos, Tree qualifier, Symbol clasz){
- return mkRef(pos, qualifier, primaryConstructorOf(clasz));
- }
- public Tree mkPrimaryConstructorRef(Tree qualifier, Symbol clasz) {
- return mkPrimaryConstructorRef(qualifier.pos, qualifier, clasz);
- }
-
- /**
- * Builds a reference to primary constructor of given class with
- * given stable prefix.
- */
- public Tree mkPrimaryConstructorRef(int pos, Type stable, Symbol clasz) {
- return mkRef(pos, stable, primaryConstructorOf(clasz));
- }
-
- /**
- * Builds a local reference to primary constructor of given class.
- */
- public Tree mkPrimaryConstructorLocalRef(int pos, Symbol clasz) {
- return mkLocalRef(pos, primaryConstructorOf(clasz));
- }
-
- /**
- * Builds a global reference to primary constructor of given
- * class.
- */
- public Tree mkPrimaryConstructorGlobalRef(int pos, Symbol clasz) {
- return mkGlobalRef(pos, primaryConstructorOf(clasz));
- }
-
- /** Builds local references to given symbols. */
- public Tree[] mkLocalRefs(int pos, Symbol[] symbols) {
- if (symbols.length == 0) return Tree.EMPTY_ARRAY;
- Tree[] trees = new Tree[symbols.length];
- for (int i = 0; i < trees.length; i++)
- trees[i] = mkLocalRef(pos, symbols[i]);
- return trees;
- }
-
- /** Builds global references to given symbols. */
- public Tree[] mkGlobalRefs(int pos, Symbol[] symbols) {
- if (symbols.length == 0) return Tree.EMPTY_ARRAY;
- Tree[] trees = new Tree[symbols.length];
- for (int i = 0; i < trees.length; i++)
- trees[i] = mkGlobalRef(pos, symbols[i]);
- return trees;
- }
-
- /** Builds a reference to given symbol with given qualifier. */
- public Tree mkRef(int pos, Tree qualifier, Symbol symbol) {
- return Select(pos, qualifier, symbol);
- }
- public Tree mkRef(Tree qualifier, Symbol symbol) {
- return mkRef(qualifier.pos, qualifier, symbol);
- }
-
- /**
- * Builds a reference to given symbol with given stable prefix.
- */
- public Tree mkRef(int pos, Type stable, Symbol symbol) {
- Tree qualifier = mkQualifier(pos, stable);
- if (qualifier == Tree.Empty) return Ident(pos, symbol);
- return mkRef(pos, qualifier, symbol);
- }
-
- /** Builds a local reference to given symbol. */
- public Tree mkLocalRef(int pos, Symbol symbol) {
- assert symbol.isTerm(): Debug.show(symbol);
- Type prefix = symbol.hasStaticAttribute()
- ? Type.NoPrefix
- : symbol.owner().thisType();
- return mkRef(pos, prefix, symbol);
- }
-
- /** Builds a global reference to given symbol. */
- public Tree mkGlobalRef(int pos, Symbol symbol) {
- assert symbol.isTerm(): Debug.show(symbol);
- global.nextPhase();
- Type prefix = symbol.owner().staticPrefix();
- global.prevPhase();
- return mkRef(pos, prefix, symbol);
- }
-
- /** Builds a qualifier corresponding to given stable prefix. */
- public Tree mkQualifier(int pos, Type stable) {
- switch (stable) {
- case NoPrefix:
- return Tree.Empty;
- case ThisType(Symbol clasz):
- return This(pos, clasz);
- case SingleType(Type prefix, Symbol member):
- Tree qualifier = mkRef(pos, prefix, member);
- switch (qualifier.type()) {
- case MethodType(Symbol[] params, _):
- assert params.length == 0: qualifier.type();
- return Apply(pos, qualifier);
- default:
- return qualifier;
- }
- default:
- throw Debug.abort("illegal case", stable);
- }
- }
-
- /** Builds a This node corresponding to given class. */
- public This This(int pos, Symbol clazz) {
- assert clazz.isClassType(): Debug.show(clazz);
- This tree = make.This(pos, clazz);
- global.nextPhase();
- tree.setType(clazz.thisType());
- global.prevPhase();
- return tree;
- }
-
- /** Builds a Super node corresponding to given class. */
- public Super Super(int pos, Symbol clazz) {
- assert clazz.isClass(): Debug.show(clazz);
- Super tree = make.Super(pos, clazz, TypeNames.EMPTY);
- global.nextPhase();
- tree.setType(clazz.thisType());
- global.prevPhase();
- return tree;
- }
-
- /** Builds an Ident node corresponding to given symbol. */
- public Ident Ident(int pos, Symbol sym) {
- assert sym.isTerm(): Debug.show(sym);
- sym.flags |= ACCESSED;
- Ident tree = make.Ident(pos, sym);
- global.nextPhase();
- Type type;
- if (sym.isInitializer()) {
- type = sym.type();
- Symbol[] tparams = sym.owner().typeParams();
- if (tparams.length != 0) type = Type.PolyType(tparams, type);
- } else {
- type = sym.owner().thisType().memberStabilizedType(sym);
- }
- tree.setType(type);
- global.prevPhase();
- return tree;
- }
-
- /**
- * Builds a Select node corresponding to given symbol selected
- * from given qualifier.
- */
- public Select Select(int pos, Tree qualifier, Symbol sym) {
- assert sym.isTerm(): Debug.show(sym);
- sym.flags |= ACCESSED | SELECTOR;
- Select tree = make.Select(pos, sym, qualifier);
- global.nextPhase();
- tree.setType(qualifier.type.memberStabilizedType(sym));
- global.prevPhase();
- return tree;
- }
- public Select Select(Tree qualifier, Symbol sym) {
- return Select(qualifier.pos, qualifier, sym);
- }
-
- //########################################################################
- // Public Methods - Building applications
-
- /**
- * Builds an application with given function, type arguments and
- * value arguments.
- */
- public Tree mkApplyTV(int pos, Tree fn, Type[] targs, Tree[] vargs) {
- if (targs.length != 0) fn = TypeApply(pos, fn, mkTypes(pos, targs));
- if (vargs.length == 0 && fn.getType().isObjectType()) return fn;
- else return Apply(pos, fn, vargs);
- }
- public Tree mkApplyTV(Tree fn, Type[] targs, Tree[] vargs) {
- return mkApplyTV(fn.pos, fn, targs, vargs);
- }
- public Tree mkApplyTV(int pos, Tree fn, Tree[] targs, Tree[] vargs) {
- if (targs.length != 0) fn = TypeApply(pos, fn, targs);
- if (vargs.length == 0 && fn.getType().isObjectType()) return fn;
- else return Apply(pos, fn, vargs);
- }
- public Tree mkApplyTV(Tree fn, Tree[] targs, Tree[] vargs) {
- return mkApplyTV(fn.pos, fn, targs, vargs);
- }
-
- /**
- * Builds an application with given function and type arguments
- * and with no value arguments.
- */
- public Tree mkApplyT_(int pos, Tree fn, Type[] targs) {
- return mkApplyTV(pos, fn, targs, Tree.EMPTY_ARRAY);
- }
- public Tree mkApplyT_(Tree fn, Type[] targs) {
- return mkApplyT_(fn.pos, fn, targs);
- }
- public Tree mkApplyT_(int pos, Tree fn, Tree[] targs) {
- return mkApplyTV(pos, fn, targs, Tree.EMPTY_ARRAY);
- }
- public Tree mkApplyT_(Tree fn, Tree[] targs) {
- return mkApplyT_(fn.pos, fn, targs);
- }
-
- /**
- * Builds an application with given function, no type arguments
- * and given value arguments.
- */
- public Tree mkApply_V(int pos, Tree fn, Tree[] vargs) {
- return mkApplyTV(pos, fn, Tree.EMPTY_ARRAY, vargs);
- }
- public Tree mkApply_V(Tree fn, Tree[] vargs) {
- return mkApply_V(fn.pos, fn, vargs);
- }
-
- /**
- * Builds an application with given function and no type arguments
- * and no value arguments.
- */
- public Tree mkApply__(int pos, Tree fn) {
- return mkApplyTV(pos, fn, Tree.EMPTY_ARRAY, Tree.EMPTY_ARRAY);
- }
- public Tree mkApply__(Tree fn) {
- return mkApply__(fn.pos, fn);
- }
-
- /** Builds a TypeApply node with given function and arguments. */
- public TypeApply TypeApply(int pos, Tree fn, Type[] targs) {
- return TypeApply(pos, fn, mkTypes(pos, targs));
- }
- public TypeApply TypeApply(Tree fn, Type[] targs) {
- return TypeApply(fn.pos, fn, targs);
- }
- public TypeApply TypeApply(int pos, Tree fn, Tree[] targs) {
- Type fnType = fn.type();
- switch (fnType) {
- case Type.OverloadedType(_, _):
- // TreeGen only builds trees, names must already be resolved
- throw Debug.abort("unresolved name", fn + " - " + fnType);
- case Type.PolyType(Symbol[] tparams, Type restpe):
- global.nextPhase();
- restpe = restpe.subst(tparams, Tree.typeOf(targs));
- global.prevPhase();
- return (TypeApply)make.TypeApply(pos, fn, targs).setType(restpe);
- default:
- throw Debug.abort("illegal case", fn + " - " + fnType + " - " + fnType.getClass());
- }
- }
- public TypeApply TypeApply(Tree fn, Tree[] targs) {
- return TypeApply(fn.pos, fn, targs);
- }
-
- /** Builds an Apply node with given function and arguments. */
- public Apply Apply(int pos, Tree fn, Tree[] vargs) {
- Type fnType = fn.type();
- switch (fnType) {
- case Type.OverloadedType(_, _):
- // TreeGen only builds trees, names must already be resolved
- throw Debug.abort("unresolved name", fn + " - " + fnType);
- case Type.MethodType(Symbol[] vparams, Type restpe):
- return (Apply)make.Apply(pos, fn, vargs).setType(restpe);
- default:
- throw Debug.abort("illegal case", fn + " - " + fnType + " - " + fnType.getClass());
- }
- }
- public Apply Apply(Tree fn, Tree[] vargs) {
- return Apply(fn.pos, fn, vargs);
- }
-
- /** Builds an Apply node with given function and no arguments. */
- public Apply Apply(int pos, Tree fn) {
- return Apply(pos, fn, Tree.EMPTY_ARRAY);
- }
- public Apply Apply(Tree fn) {
- return Apply(fn.pos, fn);
- }
-
- //########################################################################
- // Public Methods - Building new instances
-
- /**
- * Builds a new instance creation with given qualifier,
- * initializer, type arguments and value arguments.
- */
- public Tree mkNewTV(int pos, Tree qual, Symbol init, Type[] targs,
- Tree[] vargs)
- {
- return mkNewTV(pos, qual, init, mkTypes(pos, targs), vargs);
- }
- public Tree mkNewTV(Tree qual, Symbol init, Type[] targs, Tree[] vargs) {
- return mkNewTV(qual.pos, qual, init, targs, vargs);
- }
- public Tree mkNewTV(int pos, Tree qual, Symbol init, Tree[] targs,
- Tree[] vargs)
- {
- assert init.isInitializer(): Debug.show(init);
- Tree instance = Create(pos, qual, init.owner(), targs);
- return New(pos, Apply(pos, Select(pos, instance, init), vargs));
- }
- public Tree mkNewTV(Tree qual, Symbol init, Tree[] targs, Tree[] vargs) {
- return mkNewTV(qual.pos, qual, init, targs, vargs);
- }
-
- /**
- * Builds a new instance creation with given qualifier,
- * initializer and type arguments and no value arguments.
- */
- public Tree mkNewT_(int pos, Tree qual, Symbol init, Type[] targs) {
- return mkNewTV(pos, qual, init, targs, Tree.EMPTY_ARRAY);
- }
- public Tree mkNewT_(Tree qual, Symbol init, Type[] targs) {
- return mkNewT_(qual.pos, qual, init, targs);
- }
- public Tree mkNewT_(int pos, Tree qual, Symbol init, Tree[] targs) {
- return mkNewTV(pos, qual, init, targs, Tree.EMPTY_ARRAY);
- }
- public Tree mkNewT_(Tree qual, Symbol init, Tree[] targs) {
- return mkNewT_(qual.pos, qual, init, targs);
- }
-
- /**
- * Builds a new instance creation with given qualifier,
- * initializer and value arguments and no type arguments.
- */
- public Tree mkNew_V(int pos, Tree qual, Symbol init, Tree[] vargs) {
- return mkNewTV(pos, qual, init, Tree.EMPTY_ARRAY, vargs);
- }
- public Tree mkNew_V(Tree qual, Symbol init, Tree[] vargs) {
- return mkNew_V(qual.pos, qual, init, vargs);
- }
-
- /**
- * Builds a new instance creation with given qualifier, and
- * initializer and no type arguments and no value arguments.
- */
- public Tree mkNew__(int pos, Tree qual, Symbol init) {
- return mkNewTV(pos, qual, init, Tree.EMPTY_ARRAY, Tree.EMPTY_ARRAY);
- }
- public Tree mkNew__(Tree qual, Symbol init) {
- return mkNew__(qual.pos, qual, init);
- }
-
- /** Builds a New node corresponding to "new <init>". */
- public New New(int pos, Tree init) {
- New tree = make.New(pos, init);
- tree.setType(init.type());
- // after AddConstructor use type of Create node
- switch (init) {
- case Apply(Select(Tree qual, _), _):
- if (qual instanceof Tree.Create) tree.setType(qual.type());
- }
- return tree;
- }
- public New New(Tree init) {
- return New(init.pos, init);
- }
-
- /**
- * Builds a Create node with given qualifier, clasz and type
- * arguments.
- */
- public Create Create(int pos, Tree qual, Symbol clasz, Type[] targs) {
- return Create(pos, qual, clasz, mkTypes(pos, targs));
- }
- public Create Create(Tree qual, Symbol clasz, Type[] targs) {
- return Create(qual.pos, qual, clasz, targs);
- }
- public Create Create(int pos, Tree qual, Symbol clasz, Tree[] targs) {
- assert clasz.isClass(): Debug.show(clasz);
- Create tree = make.Create(pos, clasz, qual, targs);
- global.nextPhase();
- assert targs.length == clasz.typeParams().length: tree;
- Type prefix = qual == Tree.Empty ? Type.NoPrefix:qual.type();
- tree.setType(Type.typeRef(prefix, clasz, Tree.typeOf(targs)));
- global.prevPhase();
- return tree;
- }
- public Create Create(Tree qual, Symbol clasz, Tree[] targs) {
- return Create(qual.pos, qual, clasz, targs);
- }
-
- /**
- * Builds a Create node with given qualifier, clasz and no type
- * arguments.
- */
- public Create Create(int pos, Tree qual, Symbol clasz) {
- return Create(pos, qual, clasz, Tree.EMPTY_ARRAY);
- }
- public Create Create(Tree qual, Symbol clasz) {
- return Create(qual.pos, qual, clasz);
- }
-
- /** Builds a Create node with given type. */
- public Create Create(int pos, Type type) {
- switch (type) {
- case TypeRef(Type prefix, Symbol clasz, Type[] targs):
- return Create(pos, mkQualifier(pos, prefix), clasz, targs);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- //########################################################################
- // Public Methods - Building expressions - Simple nodes
-
- /** Flattens the given tree array by inlining Block nodes. */
- public Tree[] flatten_(Tree[] trees) {
- boolean copy = false;
- int length = 0;
- for (int i = 0; i < trees.length; i++) {
- switch (trees[i]) {
- case Empty:
- copy = true;
- length -= 1;
- continue;
- case Block(Tree[] stats, Tree value):
- copy = true;
- length += stats.length + 1;
- continue;
- }
- length += 1;
- }
- if (!copy) return trees;
- Tree[] clone = new Tree[length];
- for (int i = 0, o = 0; i < trees.length; i++) {
- switch (trees[i]) {
- case Empty:
- continue;
- case Block(Tree[] stats, Tree value):
- for (int j = 0; j < stats.length; j++) clone[o++] = stats[j];
- clone[o++] = value;
- continue;
- }
- clone[o++] = trees[i];
- }
- return clone;
- }
-
- /** Builds an import of all names of given qualifier. */
- public Import mkImportAll(int pos, Tree qualifier) {
- return Import(pos, qualifier, new Name[]{Names.IMPORT_WILDCARD});
- }
- public Import mkImportAll(Tree qualifier) {
- return mkImportAll(qualifier.pos, qualifier);
- }
- public Import mkImportAll(int pos, Symbol qualifier) {
- return mkImportAll(pos, mkGlobalRef(pos, qualifier));
- }
-
- /** Builds an instance test with given value and type. */
- public Tree mkIsInstanceOf(int pos, Tree value, Type type, boolean erased) {
- Symbol sym = erased ? definitions.ANY_IS_ERASED : definitions.ANY_IS;
- return mkApplyT_(pos, Select(value, sym), new Type[]{type});
- }
- public Tree mkIsInstanceOf(int pos, Tree value, Type type) {
- boolean afterTAV =
- global.currentPhase.id >= global.PHASE.TYPESASVALUES.id();
- return mkIsInstanceOf(pos, value, type, afterTAV);
- }
- public Tree mkIsInstanceOf(Tree value, Type type) {
- return mkIsInstanceOf(value.pos, value, type);
- }
-
- /** Builds a cast with given value and type. */
- public Tree mkAsInstanceOf(int pos, Tree value, Type type, boolean erased) {
- Symbol sym = erased ? definitions.ANY_AS_ERASED : definitions.ANY_AS;
- return mkApplyT_(pos, Select(value, sym), new Type[]{type});
- }
- public Tree mkAsInstanceOf(int pos, Tree value, Type type) {
- boolean afterTAV =
- global.currentPhase.id >= global.PHASE.TYPESASVALUES.id();
- return mkAsInstanceOf(pos, value, type, afterTAV);
- }
- public Tree mkAsInstanceOf(Tree value, Type type) {
- return mkAsInstanceOf(value.pos, value, type);
- }
-
- /** Builds an expression of type Unit with given statements. */
- public Tree mkUnitBlock(int pos, Tree[] stats) {
- return mkBlock(pos, stats, mkUnitLit(pos));
- }
-
- /** Builds an expression of type Unit with given statement. */
- public Tree mkUnitBlock(int pos, Tree stat) {
- return mkUnitBlock(pos, new Tree[]{stat});
- }
- public Tree mkUnitBlock(Tree stat) {
- return mkUnitBlock(stat.pos, stat);
- }
-
- /** Builds an expression with given statements and value. */
- public Tree mkBlock(int pos, Tree[] stats, Tree value) {
- if (stats.length == 0) return value;
- return Block(pos, stats, value); // !!! add flatten?
- }
- public Tree mkBlock(Tree[] stats, Tree value) {
- return mkBlock((stats.length!=0 ? stats[0] : value).pos, stats, value);
- }
-
- /** Builds an expression with given statement and value. */
- public Tree mkBlock(int pos, Tree stat, Tree value) {
- switch (stat) {
- case Empty:
- return value;
- case Block(Tree[] block_stats, Tree block_value):
- Tree[] stats = Tree.cloneArray(block_stats, 1);
- stats[block_stats.length] = block_value;
- return Block(stat.pos, stats, value);
- default:
- return Block(pos, new Tree[]{stat}, value);
- }
- }
- public Tree mkBlock(Tree stat, Tree value) {
- return mkBlock(stat.pos, stat, value);
- }
-
- /** Builds an Import node with given qualifier and names. */
- public Import Import(int pos, Tree qualifier, Name[] names) {
- Import tree = make.Import(pos, qualifier.symbol(), qualifier, names);
- tree.setType(Type.NoType);
- return tree;
- }
- public Import Import(Tree qualifier, Name[] names) {
- return Import(qualifier.pos, qualifier, names);
- }
- public Import Import(int pos, Symbol qualifier, Name[] names) {
- return Import(pos, mkGlobalRef(pos, qualifier), names);
- }
-
- /** Builds a Template node with given symbol, parents and body. */
- public Template Template(int pos, Symbol local, Tree[]parents, Tree[]body){
- Template tree = make.Template(pos, local, parents, body);
- tree.setType(Type.NoType);
- return tree;
- }
-
- /** Builds a Block node with given statements and value. */
- public Block Block(int pos, Tree[] stats, Tree value) {
- inline:
- switch (value) {
- case Block(Tree[] value_stats, Tree value_value):
- int count = 0;
- for (int i = 0; i < value_stats.length; i++) {
- if (value_stats[i].definesSymbol()) break inline;
- if (value_stats[i] != Tree.Empty) count++;
- }
- Tree[] array = Tree.cloneArray(stats, count);
- for (int i = 0, j = stats.length; i < value_stats.length; i++) {
- if (value_stats[i] != Tree.Empty) array[j++] = value_stats[i];
- }
- stats = array;
- value = value_value;
- }
- Block tree = make.Block(pos, stats, value);
- tree.setType(value.type());
- return tree;
- }
- public Block Block(Tree[] stats, Tree value) {
- return Block((stats.length != 0 ? stats[0] : value).pos, stats, value);
- }
-
- /** Builds an Assign node corresponding to "<lhs> = <rhs>". */
- public Assign Assign(int pos, Tree lhs, Tree rhs) {
- Assign tree = make.Assign(pos, lhs, rhs);
- global.nextPhase();
- tree.setType(definitions.void_TYPE());
- global.prevPhase();
- return tree;
- }
- public Assign Assign(Tree lhs, Tree rhs) {
- return Assign(lhs.pos, lhs, rhs);
- }
-
- /** Builds an If node with given components and type. */
- public If If(int pos, Tree cond, Tree thenpart, Tree elsepart, Type type) {
- //if (!thenpart.type.isSubType(type)) System.out.println(type + "!>:(" + thenpart.type + "," + elsepart.type + ")");//debug
- assert assertTreeSubTypeOf(thenpart, type);
- assert assertTreeSubTypeOf(elsepart, type);
- If tree = make.If(pos, cond, thenpart, elsepart);
- tree.setType(type);
- return tree;
- }
- public If If(Tree cond, Tree thenpart, Tree elsepart, Type type) {
- return If(cond.pos, cond, thenpart, elsepart, type);
- }
-
- /** Builds an If node with given condition and branches. */
- public If If(int pos, Tree cond, Tree thenpart, Tree elsepart) {
- global.nextPhase();
- Type type = thenpart.getType().isSameAs(elsepart.getType())
- ? thenpart.type
- : Type.lub(new Type[] {thenpart.getType(), elsepart.getType()});
- global.prevPhase();
- return If(pos, cond, thenpart, elsepart, type);
- }
- public If If(Tree cond, Tree thenpart, Tree elsepart) {
- return If(cond.pos, cond, thenpart, elsepart);
- }
-
- /** Builds a Switch node with given components and type.
- * @param tags a <b>sorted</b> array of tags
- */
- public Switch Switch(int pos, Tree test, int[] tags, Tree[] bodies,
- Tree otherwise, Type type)
- {
- for (int i = 0; i < bodies.length; i++) {
- assert assertTreeSubTypeOf(bodies[i], type);
- assert (i==0) || ( tags[i-1] < tags[i] ) : "expecting sorted tags";
- }
- assert assertTreeSubTypeOf(otherwise, type);
- Switch tree = make.Switch(pos, test, tags, bodies, otherwise);
- tree.setType(type);
- return tree;
- }
- public Switch Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise,
- Type type)
- {
- return Switch(test.pos, test, tags, bodies, otherwise, type);
- }
-
- /** Builds a Switch node with given components. */
- public Switch Switch(int pos, Tree test, int[] tags, Tree[] bodies,
- Tree otherwise)
- {
- Type[] types = new Type[bodies.length + 1];
- for (int i = 0; i < bodies.length; i++) types[i] = bodies[i].getType();
- types[bodies.length] = otherwise.getType();
- global.nextPhase();
- Type type = Type.lub(types);
- global.prevPhase();
- return Switch(pos, test, tags, bodies, otherwise, type);
- }
- public Switch Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise){
- return Switch(test.pos, test, tags, bodies, otherwise);
- }
-
- /** Builds a Return node of given method with given value. */
- public Return Return(int pos, Symbol method, Tree value) {
- Return tree = make.Return(pos, method, value);
- tree.setType(definitions.ALL_TYPE());
- return tree;
- }
- public Return Return(Symbol method, Tree value) {
- return Return(value.pos, method, value);
- }
-
- /** Builds a Typed nodes with given value and type. */
- public Typed Typed(int pos, Tree value, Tree type) {
- Typed tree = make.Typed(pos, value, type);
- tree.setType(type.type());
- return tree;
- }
- public Typed Typed(Tree value, Tree type) {
- return Typed(value.pos, value, type);
- }
- public Typed Typed(int pos, Tree value, Type type) {
- return Typed(pos, value, mkType(pos, type));
- }
- public Typed Typed(Tree value, Type type) {
- return Typed(value.pos, value, type);
- }
-
- //########################################################################
- // Public Methods - Building expressions - Lists
-
- /** Builds an empty list. */
- public Tree mkNil(int pos) {
- return mkGlobalRef(pos, definitions.NIL());
- }
-
- /** Builds a list with given element type, head and tail. */
- public Tree mkNewCons(int pos, Type element, Tree head, Tree tail) {
- // !!! these checks can be removed once they are done in Apply
- global.nextPhase();
- assert head.type().isSubType(element):
- element + " -- " + head + " : " + head.type;
- assert tail.type().isSubType(definitions.LIST_TYPE(element)):
- element + " -- " + tail + " : " + tail.type;
- global.prevPhase();
- return New(
- mkApplyTV(
- mkPrimaryConstructorGlobalRef(pos, definitions.CONS_CLASS()),
- new Type[]{element},
- new Tree[]{head, tail}));
- }
- public Tree mkNewCons(Type element, Tree head, Tree tail) {
- return mkNewCons(head.pos, element, head, tail);
- }
-
- /** Builds a list with given element type and values. */
- public Tree mkNewList(int pos, Type element, Tree[] values) {
- Tree list = mkNil(pos);
- for (int i = values.length - 1; 0 <= i; i--)
- list = mkNewCons(pos, element, values[i], list);
- return list;
- }
-
- //########################################################################
- // Public Methods - Building expressions - Arrays
-
- /** Builds a new array tree with given element type and length. */
- public Tree mkNewArray(int pos, Type element, Tree length) {
- return New(
- mkApplyTV(
- mkPrimaryConstructorGlobalRef(pos, definitions.ARRAY_CLASS),
- new Type[]{element},
- new Tree[]{length}));
- }
- public Tree mkNewArray(Type element, Tree length) {
- return mkNewArray(length.pos, element, length);
- }
- public Tree mkNewArray(int pos, Type element, int length) {
- return mkNewArray(pos, element, mkIntLit(pos, length));
- }
-
- /**
- * Builds a new array tree with given element type and values. The
- * owner must be the owner of the created code. It is needed to
- * create a local variable.
- */
- public Tree mkNewArray(int pos, Type element, Tree[] values, Symbol owner){
- if (values.length == 0) return mkNewArray(pos, element, 0);
- Tree[] trees = new Tree[1 + values.length];
- Symbol array = newLocal(
- owner, pos, FINAL, "array", definitions.array_TYPE(element));
- trees[0] = ValDef(array, mkNewArray(pos, element, values.length));
- for (int i = 0; i < values.length; i++)
- trees[1 + i] = mkArraySet(Ident(pos, array), i, values[i]);
- return Block(pos, trees, Ident(pos, array));
- }
-
- /** Builds an array length operation. */
- public Tree mkArrayLength(int pos, Tree array) {
- Tree function = Select(pos, array, definitions.ARRAY_LENGTH());
- return Apply(pos, function);
- }
- public Tree mkArrayLength(Tree array) {
- return mkArrayLength(array.pos, array);
- }
-
- /** Builds an array get operation. */
- public Tree mkArrayGet(int pos, Tree array, Tree index) {
- Tree function = Select(pos, array, definitions.ARRAY_GET());
- return Apply(pos, function, new Tree[] {index});
- }
- public Tree mkArrayGet(Tree array, Tree index) {
- return mkArrayGet(array.pos, array, index);
- }
- public Tree mkArrayGet(int pos, Tree array, int index) {
- return mkArrayGet(pos, array, mkIntLit(pos, index));
- }
- public Tree mkArrayGet(Tree array, int index) {
- return mkArrayGet(array.pos, array, index);
- }
-
- /** Builds an array set operation. */
- public Tree mkArraySet(int pos, Tree array, Tree index, Tree value) {
- Tree function = Select(pos, array, definitions.ARRAY_SET());
- return Apply(pos, function, new Tree[] {index, value});
- }
- public Tree mkArraySet(Tree array, Tree index, Tree value) {
- return mkArraySet(array.pos, array, index, value);
- }
- public Tree mkArraySet(int pos, Tree array, int index, Tree value) {
- return mkArraySet(pos, array, mkIntLit(pos, index), value);
- }
- public Tree mkArraySet(Tree array, int index, Tree value) {
- return mkArraySet(array.pos, array, index, value);
- }
-
- //########################################################################
- // Public Methods - Building definitions
-
- /** Builds the type parameter section of given symbol. */
- public AbsTypeDef[] mkTypeParamsOf(Symbol sym) {
- Symbol[] tparams = sym.nextTypeParams();
- AbsTypeDef[] trees = new AbsTypeDef[tparams.length];
- for (int i = 0; i < tparams.length; i++)
- trees[i] = mkTypeParam(tparams[i]);
- return trees;
- }
-
- /** Builds the value parameter section of given symbol. */
- public ValDef[][] mkParamsOf(Symbol sym) {
- global.nextPhase();
- if (sym.isClass()) sym = sym.primaryConstructor();
- Type type = sym.type();
- global.prevPhase();
- ValDef[][] treess = Tree.ValDef_EMPTY_ARRAY_ARRAY;
- while (true) {
- switch (type) {
- case PolyType(_, Type result):
- type = result;
- continue;
- case MethodType(Symbol[] vparams, Type result):
- ValDef[] trees = new ValDef[vparams.length];
- for (int i = 0; i < vparams.length; i++)
- trees[i] = mkParam(vparams[i]);
- ValDef[][] array = new ValDef[treess.length + 1][];
- for (int i = 0; i < treess.length; i++) array[i] = treess[i];
- array[treess.length] = trees;
- treess = array;
- type = result;
- continue;
- default:
- return treess;
- }
- }
- }
-
- /** Builds the type parameter corresponding to given symbol. */
- public AbsTypeDef mkTypeParam(Symbol sym) {
- return AbsTypeDef(sym);
- }
-
- /** Builds the value parameter corresponding to given symbol. */
- public ValDef mkParam(Symbol sym) {
- return ValDef(sym, Tree.Empty);
- }
-
- /** Builds a PackageDef with given package and template. */
- public PackageDef PackageDef(Tree peckage, Template template) {
- PackageDef tree = make.PackageDef(peckage.pos, peckage, template);
- tree.setType(Type.NoType);
- return tree;
- }
- public PackageDef PackageDef(Symbol peckage, Template template) {
- return PackageDef(mkGlobalRef(peckage.pos, peckage), template);
- }
-
- /** Builds a PackageDef with given package and body. */
- public PackageDef PackageDef(Tree peckage, Tree[] body) {
- return PackageDef(
- peckage,
- Template(peckage.pos, Symbol.NONE, Tree.EMPTY_ARRAY, body));
- }
- public PackageDef PackageDef(Symbol peckage, Tree[] body) {
- return PackageDef(mkGlobalRef(peckage.pos, peckage), body);
- }
-
- /** Builds a ClassDef node for given class with given template. */
- public ClassDef ClassDef(Symbol clazz, Template template) {
- Tree type = Tree.Empty;
- if (clazz.thisSym() != clazz) {
- global.nextPhase();
- type = mkType(clazz.pos, clazz.typeOfThis());
- global.prevPhase();
- }
- ClassDef tree = make.ClassDef(
- clazz.pos,
- clazz,
- mkTypeParamsOf(clazz),
- mkParamsOf(clazz),
- type,
- template);
- tree.setType(Type.NoType);
- return tree;
- }
-
- /**
- * Builds a ClassDef node for given class with given parent
- * constructors, local symbol and body.
- */
- public ClassDef ClassDef(Symbol clazz, Tree[] constrs, Symbol local,
- Tree[] body)
- {
- return ClassDef(clazz, Template(clazz.pos, local, constrs, body));
- }
-
- /** Builds a ClassDef node for given class with given body. */
- public Tree ClassDef(Symbol clazz, Tree[] body) {
- for (int i = 0; i < body.length; i++) {
- assert body[i] == Tree.Empty
- || body[i].definesSymbol() && body[i].symbol().owner() ==clazz:
- "\nclass : " + Debug.show(clazz) +
- "\nmember: " + Debug.show(body[i].symbol()) +
- "\nmember: " + body[i];
- }
- Global.instance.nextPhase();
- Type[] parents = clazz.parents();
- Global.instance.prevPhase();
- Tree[] constrs = new Tree[parents.length];
- for (int i = 0; i < constrs.length; i++) {
- switch (parents[i]) {
- case TypeRef(Type prefix, Symbol parent, Type[] targs):
- constrs[i] = mkApplyT_(
- mkPrimaryConstructorRef(clazz.pos, prefix, parent),
- targs);
- continue;
- default:
- throw Debug.abort("invalid type", parents[i]);
- }
- }
- return ClassDef(clazz, constrs, Symbol.NONE, body);
- }
-
- /** Builds a ValDef node for given symbol and with given rhs. */
- public ValDef ValDef(Symbol sym, Tree rhs) {
- ValDef tree = make.ValDef(
- sym.pos,
- sym,
- TypeTerm(sym.pos, sym.nextType()),
- rhs);
- tree.setType(Type.NoType);
- return tree;
- }
-
- /** Builds a DefDef node for given symbol with given body. */
- public DefDef DefDef(Symbol sym, Tree body) {
- DefDef tree = make.DefDef(
- sym.pos,
- sym,
- mkTypeParamsOf(sym),
- mkParamsOf(sym),
- TypeTerm(sym.pos, sym.nextType().resultType()),
- body);
- tree.setType(Type.NoType);
- return tree;
- }
-
- /** Builds an AbsTypeDef node for given symbol. */
- public AbsTypeDef AbsTypeDef(Symbol sym) {
- AbsTypeDef tree = make.AbsTypeDef(
- sym.pos,
- sym,
- TypeTerm(sym.pos, sym.isViewBounded() ? sym.vuBound() : sym.nextInfo()),
- TypeTerm(sym.pos, sym.loBound()));
- tree.setType(Type.NoType);
- return tree;
- }
-
- /** Builds an AliasTypeDef node for given symbol. */
- public AliasTypeDef AliasTypeDef(Symbol sym) {
- AliasTypeDef tree = make.AliasTypeDef(
- sym.pos,
- sym,
- mkTypeParamsOf(sym),
- TypeTerm(sym.pos, sym.nextInfo()));
- tree.setType(Type.NoType);
- return tree;
- }
-
- /** Builds an CaseDef node with given pattern, guard and body. */
- public CaseDef CaseDef(Tree pattern, Tree guard, Tree body) {
- CaseDef tree = make.CaseDef(pattern.pos, pattern, guard, body);
- tree.setType(body.getType());
- return tree;
- }
-
- /** Builds an CaseDef node with given pattern and body. */
- public CaseDef CaseDef(Tree pattern, Tree body) {
- return CaseDef(pattern, Tree.Empty, body);
- }
-
- /**
- * Builds a LabelDef node for given label with given parameters
- * and body.
- */
- public LabelDef LabelDef(Symbol label, Ident[] params, Tree body) {
- LabelDef tree = make.LabelDef(label.pos, label, params, body);
- tree.setType(label.nextType().resultType());
- return tree;
- }
- public LabelDef LabelDef(Symbol label, Symbol[] params, Tree body) {
- Ident[] idents = new Ident[params.length];
- for (int i = 0; i < params.length; i++)
- idents[i] = Ident(params[i].pos, params[i]);
- return LabelDef(label, idents, body);
- }
-
- //########################################################################
- // Private Methods
-
- /** Asserts type of given tree is a subtype of given type. */
- private boolean assertTreeSubTypeOf(Tree tree, Type expected) {
- global.nextPhase();
- assert tree.getType().isSubType(expected):
- "\ntree : " + tree +
- "\ntype : " + tree.getType() +
- "\nexpected: " + expected;
- global.prevPhase();
- return true;
- }
-
- /** Creates a new local variable and initializes it. */
- private Symbol newLocal(Symbol owner, int pos, int flags, String prefix,
- Type type)
- {
- Name name = Names.LOCAL(owner); // !!! create unique names ?
- flags |= Modifiers.SYNTHETIC;
- Symbol local = owner.newVariable(pos, flags, name);
- global.nextPhase();
- local.setType(type);
- global.prevPhase();
- return local;
- }
-
- /** Returns the primary constructor of given class. */
- private Symbol primaryConstructorOf(Symbol clasz) {
- global.nextPhase();
- Symbol constr = clasz.primaryConstructor();
- global.prevPhase();
- return constr;
- }
-
- //########################################################################
- //########################################################################
- //########################################################################
-
- //########################################################################
- // !!! not yet reviewed
-
- /** Build the expansion of (() => expr)
- */
- public Tree mkUnitFunction(Tree expr, Type type, Symbol owner,
- boolean tagMethod)
- {
- return mkFunction
- (expr.pos, Tree.ValDef_EMPTY_ARRAY, expr, type, owner, tagMethod);
- }
-
- /** Build the expansion of ((vparams_1, ..., vparams_n) => body)
- * with result type `restype', where `owner' is the previous owner
- * of `body'.
- * This is:
- * { class $anon() extends scala.Object with
- * scala.Function_N[T_1, ..., T_n, restype] {
- * def apply(vparams_1, ..., vparams_n) = body1
- * }
- * new $anon()
- * }
- * where
- * vparams_i: T_i
- * `body1' results from `body' by changing owner of all defined
- * symbols in `body' from `owner' to the apply method.
- */
- public Tree mkFunction(int pos, ValDef[] vparams, Tree body, Type restype,
- Symbol owner, boolean tagMethod)
- {
- int n = vparams.length;
- Symbol[] params = new Symbol[n];
- Type[] argtypes = new Type[n];
- for (int i = 0; i < n; i++) {
- params[i] = vparams[i].symbol();
- argtypes[i] = params[i].type();
- }
- Type[] parentTypes = {
- definitions.ANYREF_TYPE(),
- definitions.FUNCTION_TYPE(argtypes, restype) };
- Name name = Names.ANON_CLASS_NAME.toTypeName();
- ClassSymbol clazz = owner.newAnonymousClass(pos, name);
- clazz.setInfo(Type.compoundType(parentTypes, new Scope(), clazz));
- clazz.allConstructors().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, clazz.typeConstructor()));
- global.addAttribute(clazz, definitions.SCALA_SERIALIZABLE_CONSTR);
- Symbol applyMeth = clazz.newMethod(pos, FINAL, Names.apply)
- .setInfo(Type.MethodType(params, restype));
- clazz.info().members().enter(applyMeth);
-
- for (int i = 0; i < params.length; i++) {
- params[i].setOwner(applyMeth);
- }
- changeOwner(body, owner, applyMeth);
- Tree[] memberTrees = new Tree[tagMethod ? 2 : 1];
- memberTrees[0] = DefDef(applyMeth, body);
- if (tagMethod)
- memberTrees[1] = mkTagMethod(clazz);
- Tree classDef = ClassDef(clazz, memberTrees);
- Tree alloc = New(mkApply__(mkPrimaryConstructorLocalRef(pos, clazz)));
- return mkBlock(classDef, Typed(alloc, parentTypes[1])); // !!! Typed
- }
-
- public Tree mkTagMethod(ClassSymbol clazz) {
- int flags =
- clazz.isSubClass(definitions.SCALAOBJECT_CLASS) ? OVERRIDE : 0;
- Symbol tagSym = clazz.newMethod(clazz.pos, flags, Names.tag)
- .setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, definitions.int_TYPE()));
- clazz.info().members().enter(tagSym);
- int tagValue = clazz.isCaseClass() ? clazz.tag() : 0;
- return DefDef(tagSym, mkIntLit(clazz.pos, tagValue));
- }
-
- public Tree mkPartialFunction(int pos, Tree applyVisitor, Tree isDefinedAtVisitor,
- Type pattype, Type restype, Symbol owner) {
- Name name = Names.ANON_CLASS_NAME.toTypeName();
- Symbol clazz = owner.newAnonymousClass(pos, name);
- Type[] parentTypes = {
- definitions.ANYREF_TYPE(),
- definitions.PARTIALFUNCTION_TYPE(pattype, restype)};
- clazz.setInfo(Type.compoundType(parentTypes, new Scope(), clazz));
- clazz.allConstructors().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, clazz.typeConstructor()));
- Tree[] memberTrees = {
- makeVisitorMethod(pos, Names.apply, applyVisitor,
- pattype, restype, clazz, owner),
- makeVisitorMethod(pos, Names.isDefinedAt, isDefinedAtVisitor,
- pattype, definitions.boolean_TYPE(), clazz, owner)};
- Tree classDef = ClassDef(clazz, memberTrees);
- Tree alloc = New(mkApply__(mkPrimaryConstructorLocalRef(pos, clazz)));
- return mkBlock(classDef, Typed(alloc, parentTypes[1])); // !!! Typed
- }
- //where
- private Tree makeVisitorMethod(int pos, Name name, Tree visitor,
- Type pattype, Type restype,
- Symbol clazz, Symbol prevOwner) {
- Symbol meth = clazz.newMethod(pos, FINAL, name);
- Symbol param = meth.newVParam(pos, 0, Name.fromString("x$"), pattype);
- meth.setInfo(Type.MethodType(new Symbol[]{param}, restype));
- clazz.info().members().enter(meth);
- changeOwner(visitor, prevOwner, meth);
- Tree body =
- mkApplyTV(
- Select(Ident(pos, param), definitions.ANY_MATCH),
- new Tree[]{mkType(pos, pattype), mkType(pos, restype)},
- new Tree[]{visitor});
- return DefDef(meth, body);
- }
-
- /** Change owner of all defined symbols from `prevOwner' to `newOwner'
- */
- public void changeOwner(Tree tree, final Symbol prevOwner, final Symbol newOwner) {
- Traverser lifter = new Traverser() {
- public void traverse(Tree tree) {
- if (tree.definesSymbol()) {
- Symbol sym = tree.symbol();
- if (sym != null && sym.owner() == prevOwner) {
- sym.setOwner(newOwner);
- }
- }
- super.traverse(tree);
- }
- };
- lifter.traverse(tree);
- }
-
- /** Build a postfix function application
- */
- public Tree postfixApply(Tree obj, Tree fn, Symbol owner) {
- if (TreeInfo.isPureExpr(obj) || TreeInfo.isPureExpr(fn)) {
- return Apply(Select(fn, definitions.FUNCTION_APPLY(1)), new Tree[]{obj});
- } else {
- Symbol tmp = newLocal(owner, obj.pos, FINAL, "postfix", obj.type);
- Tree expr = postfixApply(Ident(obj.pos, tmp), fn, owner);
- return mkBlock(ValDef(tmp, obj), expr);
- }
- }
-
- // for insert debug printing code
-
- public Tree Console_print(int pos, String str) {
- return Console_print( pos, mkStringLit( pos, str ));
- }
-
- public Tree Console_print(int pos, Tree arg) {
- return Apply( Select( pos,
- mkGlobalRef(pos, definitions.CONSOLE),
- definitions.CONSOLE_PRINT()),
- new Tree[] {
- arg
- });
- }
-
-}
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
deleted file mode 100644
index caeb7d72c0..0000000000
--- a/sources/scalac/ast/TreeInfo.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.ast;
-
-import scalac.ApplicationError;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.symtab.Type;
-import scalac.symtab.Symbol;
-import scalac.symtab.Modifiers;
-
-import java.util.LinkedList;
-
-public class TreeInfo {
-
- public static boolean isTerm(Tree tree) {
- return tree.isTerm();
- }
-
- public static boolean isType(Tree tree) {
- return tree.isType();
- }
-
- public static boolean isOwnerDefinition(Tree tree) {
- switch (tree) {
- case PackageDef(_, _):
- case ClassDef(_, _, _, _, _, _):
- case ModuleDef(_, _, _, _):
- case DefDef(_, _, _, _, _, _):
- case Import(_, _):
- return true;
- default:
- return false;
- }
- }
-
- public static boolean isDefinition(Tree tree) {
- switch (tree) {
- case PackageDef(_, _):
- case ClassDef(_, _, _, _, _, _):
- case ModuleDef(_, _, _, _):
- case DefDef(_, _, _, _, _, _):
- case ValDef(_, _, _, _):
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- case Import(_, _):
- return true;
- default:
- return false;
- }
- }
-
- public static boolean isDeclaration(Tree tree) {
- switch (tree) {
- case DefDef(_, _, _, _, _, Tree rhs):
- return rhs == Tree.Empty;
- case ValDef(_, _, _, Tree rhs):
- return rhs == Tree.Empty;
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- return true;
- default:
- return false;
- }
- }
-
- /** Is tree a pure definition?
- */
- public static boolean isPureDef(Tree tree) {
- switch (tree) {
- case Tree.Empty:
- case ClassDef(_, _, _, _, _, _):
- case ModuleDef(_, _, _, _):
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- case Import(_, _):
- return true;
- case DefDef(_, Name name, _, _, _, _):
- return name != Names.CONSTRUCTOR;
- case ValDef(int mods, _, _, Tree rhs):
- return (mods & Modifiers.MUTABLE) == 0 && isPureExpr(rhs);
- case DocDef(_, Tree definition):
- return isPureDef(definition);
- default:
- return false;
- }
- }
-
- /** Is tree a stable & pure expression?
- */
- public static boolean isPureExpr(Tree tree) {
- switch (tree) {
- case Empty:
- case This(_):
- case Super(_, _):
- return true;
- case Ident(_):
- assert tree.type != null : tree.toString();
- return tree.symbol().isStable();
- case Select(Tree qual, _):
- return tree.symbol().isStable() && isPureExpr(qual);
- case Apply(Tree fn, Tree[] args):
- return isPureExpr(fn) && args.length == 0;
- case TypeApply(Tree fn, Tree[] targs):
- return isPureExpr(fn);
- case Typed(Tree expr, _):
- return isPureExpr(expr);
- case Literal(_):
- return true;
- default:
- return false;
- }
- }
-
- /** Is tree a pure constructor?
- */
- public static boolean isPureConstr(Tree tree) {
- switch (tree) {
- case Ident(_):
- case Select(_, _):
- return tree.symbol() != null && tree.symbol().isPrimaryConstructor();
- case TypeApply(Tree constr, _):
- return isPureConstr(constr);
- case Apply(Tree fn, Tree[] args):
- return args.length == 0 && isPureConstr(fn);
- default:
- return false;
- }
- }
-
- /** Is tree a self constructor call?
- */
- public static boolean isSelfConstrCall(Tree tree) {
- switch (tree) {
- case Ident(Name name):
- return name == Names.CONSTRUCTOR;
- case TypeApply(Tree constr, _):
- return isSelfConstrCall(constr);
- case Apply(Tree constr, _):
- return isSelfConstrCall(constr);
- default:
- return false;
- }
- }
-
- /** Is tree a variable pattern
- */
- public static boolean isVarPattern(Tree pat) {
- switch (pat) {
- case Ident(Name name):
- return name.isVariable();
- default:
- return false;
- }
- }
-
- /** Is tree a this node which belongs to `enclClass'?
- */
- public static boolean isSelf(Tree tree, Symbol enclClass) {
- switch (tree) {
- case This(_):
- return tree.symbol() == enclClass;
- default:
- return false;
- }
- }
-
- /** The method symbol of an application node, or Symbol.NONE, if none exists.
- */
- public static Symbol methSymbol(Tree tree) {
- Tree meth = methPart(tree);
- if (meth.hasSymbol()) return meth.symbol();
- else return Symbol.NONE;
- }
-
- /** The method part of an application node
- */
- public static Tree methPart(Tree tree) {
- switch (tree) {
- case Apply(Tree fn, _):
- return methPart(fn);
- case TypeApply(Tree fn, _):
- return methPart(fn);
- case AppliedType(Tree fn, _):
- return methPart(fn);
- default:
- return tree;
- }
- }
-
- /** The symbol with name `name' imported from import clause `tree'.
- */
- public static Symbol importedSymbol(Tree tree, Name name) {
- switch (tree) {
- case Import(Tree expr, Name[] selectors):
- Type pre = tree.symbol().type();
- if (pre != Type.ErrorType) {
- boolean renamed = false;
- for (int i = 0; i < selectors.length; i = i + 2) {
- if (i + 1 < selectors.length && name.toTermName() == selectors[i + 1]) {
- if (name.isTypeName())
- return pre.lookupNonPrivate(selectors[i].toTypeName());
- else
- return pre.lookupNonPrivate(selectors[i]);
- } else if (name.toTermName() == selectors[i]) {
- renamed = true;
- } else if (selectors[i] == Names.IMPORT_WILDCARD && !renamed) {
- return pre.lookupNonPrivate(name);
- }
- }
- }
- return Symbol.NONE;
- default:
- throw new ApplicationError();
- }
- }
-
-
- /** returns true if the tree is a sequence-valued pattern.
- * precondition: tree is a pattern.
- * calls isSequenceValued( Tree, List ) because needs to remember bound
- * values.
- */
- public static boolean isSequenceValued( Tree tree ) {
- return isSequenceValued( tree, new LinkedList() );
- }
-
- /** returns true if the tree is a sequence-valued pattern.
- * precondition: tree is a pattern
- */
- public static boolean isSequenceValued( Tree tree, LinkedList recVars ) {
- switch( tree ) {
- case Bind(_, Tree t):
- recVars.addFirst( tree.symbol() );
- boolean res = isSequenceValued( t );
- recVars.removeFirst();
- return res;
- case Sequence(_):
- return true;
- case Alternative(Tree[] ts):
- for( int i = 0; i < ts.length; i++ ) {
- if( isSequenceValued( ts[ i ] ) )
- return true;
- }
- return false;
- case Ident(Name n): // if Ident is a recursive var, then true
- return recVars.contains( tree.symbol() );
- case Apply( _, _ ):
- case Literal( _ ):
- case Select(_,_):
- case Typed(_,_):
- return false;
- default:
- throw new scalac.ApplicationError("Unexpected pattern "+tree.getClass());
- }
- }
-
- /** returns true if the argument is an empty sequence pattern
- */
- public static boolean isEmptySequence( Tree tree ) {
- switch( tree ) {
- case Sequence( Tree ts[] ):
- return ( ts.length == 0 );
- default:
- return false;
- }
- }
- /** this test should correspond to the one used in TransMatch phase */
- public static boolean isRegularPattern( Tree tree ) {
- switch (tree) {
- case Alternative(_):
- return true;
- case Bind(_, Tree pat):
- return isRegularPattern( pat );
- case Ident(_):
- return false;
- case CaseDef(Tree pat, _, _):
- isRegularPattern(pat);
- break;
- case Sequence( Tree[] trees):
- return true;
- case Apply( _, Tree[] trees ):
- for( int i = 0; i < trees.length; i++ )
- if( isRegularPattern( trees[i] ) )
- return true;
- case Literal( _ ):
- return false;
-
- }
- return false;
- }
-
- /** @todo replace with cleaner test (e.g. of a symbol flag)
- */
- public static boolean isNameOfStarPattern( Name n ) {
- String s = n.toString();
- return (s.indexOf("$") != -1)
- &&(!s.startsWith("nest"));
- }
-
-}
diff --git a/sources/scalac/ast/TreeList.java b/sources/scalac/ast/TreeList.java
deleted file mode 100644
index bf4550c632..0000000000
--- a/sources/scalac/ast/TreeList.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-\* */
-
-// $Id$
-
-package scalac.ast;
-
-/** List of trees.
- */
-
-public final class TreeList {
- Tree[] trees;
- int len;
-
- public TreeList(Tree[] ts) {
- trees = ts;
- len = ts.length;
- }
-
- public TreeList() {
- clear();
- }
-
- public void append(Tree tree) {
- if (len == trees.length) {
- Tree[] ts = new Tree[len == 0 ? 4 : len * 2];
- System.arraycopy(trees, 0, ts, 0, len);
- trees = ts;
- }
- trees[len++] = tree;
- }
-
- public void append(Tree[] ts) {
- for (int j = 0; j < ts.length; j++)
- append(ts[j]);
- }
-
- public void append(TreeList tl) {
- for (int j = 0; j < tl.len; j++)
- append(tl.trees[j]);
- }
-
- public void clear() {
- trees = new Tree[4];
- len = 0;
- }
-
- public int length() {
- return len;
- }
-
- public Tree get(int i) {
- return trees[i];
- }
-
- public Tree first() {
- return trees[0];
- }
-
- public Tree removeLast() {
- return trees[--len];
- }
-
- public Tree[] toArray() {
- Tree[] ts = new Tree[len];
- System.arraycopy(trees, 0, ts, 0, len);
- return ts;
- }
-
- public Tree[] copyTo(Tree[] ts) {
- return copyTo(ts, 0);
- }
-
- public Tree[] copyTo(Tree[] ts, int from) {
- System.arraycopy(trees, 0, ts, from, len);
- return ts;
- }
-}
diff --git a/sources/scalac/ast/printer/TreePrinter.java b/sources/scalac/ast/printer/TreePrinter.java
deleted file mode 100644
index a0884b0b2a..0000000000
--- a/sources/scalac/ast/printer/TreePrinter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.ast.printer;
-
-import scalac.Global;
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-
-/**
- * Interface for all abstract tree printers.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-public interface TreePrinter {
- public void begin();
- public void end();
- public void flush();
-
- public void print(CompilationUnit[] units);
- public void print(Tree tree);
-}
diff --git a/sources/scalac/atree/AArithmeticOp.java b/sources/scalac/atree/AArithmeticOp.java
deleted file mode 100644
index 1627ca1ad9..0000000000
--- a/sources/scalac/atree/AArithmeticOp.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents an arithmetic operation. */
-public class AArithmeticOp {
-
- //########################################################################
- // Public Cases
-
- /** An arithmetic addition operation */
- public case ADD;
-
- /** An arithmetic subtraction operation */
- public case SUB;
-
- /** An arithmetic multiplication operation */
- public case MUL;
-
- /** An arithmetic division operation */
- public case DIV;
-
- /** An arithmetic remainder operation */
- public case REM;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this operation. */
- public String toString() {
- switch (this) {
- case ADD: return "ADD";
- case SUB: return "SUB";
- case MUL: return "MUL";
- case DIV: return "DIV";
- case REM: return "REM";
- default : throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AClass.java b/sources/scalac/atree/AClass.java
deleted file mode 100644
index 66cf4693e1..0000000000
--- a/sources/scalac/atree/AClass.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import java.util.Map;
-import java.util.LinkedHashMap;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/** This class represents an attributed class. */
-public class AClass extends ARepository {
-
- //########################################################################
- // Private Fields
-
- /** The class symbol */
- private final Symbol symbol;
-
- /** The symbol to field map */
- private final Map/*<Symbol,AField>*/ fields;
-
- /** The symbol to method map */
- private final Map/*Symbol,AMethod*/ methods;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AClass(Symbol symbol) {
- this.symbol = symbol;
- this.fields = new LinkedHashMap();
- this.methods = new LinkedHashMap();
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the symbol of this class. */
- public Symbol symbol() {
- return symbol;
- }
-
- /** Is this class public? */
- public boolean isPublic() {
- return symbol().isPublic();
- }
-
- /** Is this class private? */
- public boolean isPrivate() {
- return symbol().isPrivate();
- }
-
- /** Is this class protected? */
- public boolean isProtected() {
- return symbol().isProtected();
- }
-
- /** Is this class final? */
- public boolean isFinal() {
- return false; // !!!
- }
-
- /** Is this class abstract? */
- public boolean isAbstract() {
- return symbol.isAbstractClass();
- }
-
- /** Is this class an interface? */
- public boolean isInterface() {
- return symbol.isInterface();
- }
-
- /** Is this class deprecated? */
- public boolean isDeprecated() {
- return false; // !!!
- }
-
- /** Is this class synthetic? */
- public boolean isSynthetic() {
- return symbol().isSynthetic();
- }
-
- /** Adds the given field to this class. */
- public void addField(AField field) {
- assert !fields.containsKey(field.symbol()): field;
- fields.put(field.symbol(), field);
- }
-
- /** Adds the given method to this class. */
- public void addMethod(AMethod method) {
- assert !methods.containsKey(method.symbol()): method;
- methods.put(method.symbol(), method);
- }
-
- /** Returns the fields of this class. */
- public AField[] fields() {
- return (AField[])fields.values().toArray(new AField[fields.size()]);
- }
-
- /** Returns the methods of this class. */
- public AMethod[] methods() {
- return(AMethod[])methods.values().toArray(new AMethod[methods.size()]);
- }
-
- /** Returns the type parameters of this class. */
- public Symbol[] tparams() {
- return symbol.typeParams();
- }
-
- /** Returns the value parameters of this class. */
- public Symbol[] vparams() {
- return symbol.valueParams();
- }
-
- /** Returns the parent types of this class. */
- public Type[] parents() {
- switch (symbol.info()) {
- case CompoundType(Type[] parts, _):
- return parts;
- default:
- throw Debug.abort("illegal case", symbol.info());
- }
- }
-
- /** Returns a string representation of this class. */
- public String toString() {
- return new ATreePrinter().printClass(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ACode.java b/sources/scalac/atree/ACode.java
deleted file mode 100644
index 3e65d41829..0000000000
--- a/sources/scalac/atree/ACode.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-/** This class represents attributed code. */
-public class ACode {
-
- //########################################################################
- // Public Constants
-
- public static final ACode[] EMPTY_ARRAY = new ACode[0];
-
- //########################################################################
- // Public Cases
-
- // jvm : -
- public case Void;
-
- // jvm : aload_0
- public case This(Symbol clasz);
-
- // jvm : {b, s}ipush, ldc{ ,_w, 2_w}, aconst_null
- // jvm : iconst_{m1, 2, 3, 4, 5}, {i, l, f, d}const_{0, 1}, fconst_2
- public case Constant(AConstant constant);
-
- // jvm : get{static, field}
- // jvm : {i, l, f, d, a}load{, _0, _1, _2, _3}
- // jvm : {i, l, f, d, a, b, c, s}aload
- public case Load(ALocation location);
-
- // jvm : put{static, field}
- // jvm : {i, l, f, d, a}store{, _0, _1, _2, _3}
- // jvm : {i, l, f, d, a, b, c, s}store
- public case Store(ALocation location, ACode value);
-
- // jvm : new, invoke{static, virtual, interface, special}, {, a}newarray
- // jvm : <see also in APrimitive>
- public case Apply(AFunction function, Type[] targs, ACode[] vargs);
-
- // jvm : instanceof, checkcast
- public case IsAs(ACode value, Type type, boolean cast);
-
- // jvm : -
- public case If(ACode test, ACode success, ACode failure);
-
- // jvm : {tables, lookup}switch
- public case Switch(ACode test, int[][] tags, ACode[] bodies);
-
- // jvm : monitor{enter, exit}
- public case Synchronized(ACode lock, ACode value);
-
- // jvm : -
- public case Block(Symbol[] locals, ACode[] statements, ACode value);
-
- // jvm : -
- public case Label(Symbol label, Symbol[] locals, ACode value);
-
- // jvm : goto, goto_w
- public case Goto(Symbol label, ACode[] vargs);
-
- // jvm : {i, l, f, d, a, }return
- public case Return(Symbol function, ACode value);
-
- // jvm : athrow
- public case Throw(ACode value);
-
- // jvm : pop, pop2
- public case Drop(ACode value, Type type);
-
- // jvm : nop, dup{, _x1, _x2, 2, 2_x1, 2_x2}, swap
- // jvm : multianewarray, iinc, jsr{, _w}, ret, wide
- // NOT MAPPED
-
- //########################################################################
- // Public Fields
-
- /** The source file position */
- public int pos;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this code. */
- public String toString() {
- return new ATreePrinter().printCode(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AComparisonOp.java b/sources/scalac/atree/AComparisonOp.java
deleted file mode 100644
index 1e7bcf1bcd..0000000000
--- a/sources/scalac/atree/AComparisonOp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a comparison operation. */
-public class AComparisonOp {
-
- //########################################################################
- // Public Cases
-
- /** A comparison operation with -1 default for NaNs */
- public case CMPL;
-
- /** A comparison operation with no default for NaNs */
- public case CMP;
-
- /** A comparison operation with +1 default for NaNs */
- public case CMPG;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this operation. */
- public String toString() {
- switch (this) {
- case CMPL: return "CMPL";
- case CMP : return "CMP";
- case CMPG: return "CMPG";
- default : throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AConstant.java b/sources/scalac/atree/AConstant.java
deleted file mode 100644
index 12c58d5889..0000000000
--- a/sources/scalac/atree/AConstant.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-import scalac.symtab.Symbol;
-
-/** This class represents a constant. */
-public class AConstant {
-
- public static final AConstant[] EMPTY_ARRAY = new AConstant[0];
-
- //########################################################################
- // Public Cases
-
- public case UNIT;
- public case BOOLEAN(boolean value);
- public case BYTE(byte value);
- public case SHORT(short value);
- public case CHAR(char value);
- public case INT(int value);
- public case LONG(long value);
- public case FLOAT(float value);
- public case DOUBLE(double value);
- public case STRING(String value);
- public case SYMBOL_NAME(Symbol value);
- public case NULL;
- public case ZERO;
-
- //########################################################################
- // Public Methods
-
- /** Returns the type kind of this constant. */
- public ATypeKind kind() {
- switch (this) {
- case UNIT:
- return ATypeKind.UNIT;
- case BOOLEAN(_):
- return ATypeKind.BOOL;
- case BYTE(_):
- return ATypeKind.I1;
- case SHORT(_):
- return ATypeKind.I2;
- case CHAR(_):
- return ATypeKind.U2;
- case INT(_):
- return ATypeKind.I4;
- case LONG(_):
- return ATypeKind.I8;
- case FLOAT(_):
- return ATypeKind.R4;
- case DOUBLE(_):
- return ATypeKind.R8;
- case STRING(_):
- case SYMBOL_NAME(_):
- return ATypeKind.STR;
- case NULL:
- return ATypeKind.NULL;
- case ZERO:
- return ATypeKind.ZERO;
- default:
- throw Debug.abort("unknown case", this);
- }
- }
-
-
- /** Converts this constant to a boolean value. */
- public boolean booleanValue() {
- switch (this) {
- case BOOLEAN(boolean value):
- return value;
- default:
- throw Debug.abort("not convertible to boolean", this);
- }
- }
-
- /** Converts this constant to a byte value. */
- public byte byteValue() {
- switch (this) {
- case BYTE(byte value):
- return (byte)value;
- case SHORT(short value):
- return (byte)value;
- case CHAR(char value):
- return (byte)value;
- case INT(int value):
- return (byte)value;
- case LONG(long value):
- return (byte)value;
- case FLOAT(float value):
- return (byte)value;
- case DOUBLE(double value):
- return (byte)value;
- default:
- throw Debug.abort("not convertible to byte", this);
- }
- }
-
- /** Converts this constant to a short value. */
- public short shortValue() {
- switch (this) {
- case BYTE(byte value):
- return (short)value;
- case SHORT(short value):
- return (short)value;
- case CHAR(char value):
- return (short)value;
- case INT(int value):
- return (short)value;
- case LONG(long value):
- return (short)value;
- case FLOAT(float value):
- return (short)value;
- case DOUBLE(double value):
- return (short)value;
- default:
- throw Debug.abort("not convertible to short", this);
- }
- }
-
- /** Converts this constant to a char value. */
- public char charValue() {
- switch (this) {
- case BYTE(byte value):
- return (char)value;
- case SHORT(short value):
- return (char)value;
- case CHAR(char value):
- return (char)value;
- case INT(int value):
- return (char)value;
- case LONG(long value):
- return (char)value;
- case FLOAT(float value):
- return (char)value;
- case DOUBLE(double value):
- return (char)value;
- default:
- throw Debug.abort("not convertible to char", this);
- }
- }
-
- /** Converts this constant to a int value. */
- public int intValue() {
- switch (this) {
- case BYTE(byte value):
- return (int)value;
- case SHORT(short value):
- return (int)value;
- case CHAR(char value):
- return (int)value;
- case INT(int value):
- return (int)value;
- case LONG(long value):
- return (int)value;
- case FLOAT(float value):
- return (int)value;
- case DOUBLE(double value):
- return (int)value;
- default:
- throw Debug.abort("not convertible to int", this);
- }
- }
-
- /** Converts this constant to a long value. */
- public long longValue() {
- switch (this) {
- case BYTE(byte value):
- return (long)value;
- case SHORT(short value):
- return (long)value;
- case CHAR(char value):
- return (long)value;
- case INT(int value):
- return (long)value;
- case LONG(long value):
- return (long)value;
- case FLOAT(float value):
- return (long)value;
- case DOUBLE(double value):
- return (long)value;
- default:
- throw Debug.abort("not convertible to long", this);
- }
- }
-
- /** Converts this constant to a float value. */
- public float floatValue() {
- switch (this) {
- case BYTE(byte value):
- return (float)value;
- case SHORT(short value):
- return (float)value;
- case CHAR(char value):
- return (float)value;
- case INT(int value):
- return (float)value;
- case LONG(long value):
- return (float)value;
- case FLOAT(float value):
- return (float)value;
- case DOUBLE(double value):
- return (float)value;
- default:
- throw Debug.abort("not convertible to float", this);
- }
- }
-
- /** Converts this constant to a double value. */
- public double doubleValue() {
- switch (this) {
- case BYTE(byte value):
- return (double)value;
- case SHORT(short value):
- return (double)value;
- case CHAR(char value):
- return (double)value;
- case INT(int value):
- return (double)value;
- case LONG(long value):
- return (double)value;
- case FLOAT(float value):
- return (double)value;
- case DOUBLE(double value):
- return (double)value;
- default:
- throw Debug.abort("not convertible to double", this);
- }
- }
-
- /** Converts this constant to a String value. */
- public String stringValue() {
- switch (this) {
- case UNIT:
- return "()";
- case BOOLEAN(boolean value):
- return String.valueOf(value);
- case BYTE(byte value):
- return String.valueOf(value);
- case SHORT(short value):
- return String.valueOf(value);
- case CHAR(char value):
- return String.valueOf(value);
- case INT(int value):
- return String.valueOf(value);
- case LONG(long value):
- return String.valueOf(value);
- case FLOAT(float value):
- return String.valueOf(value);
- case DOUBLE(double value):
- return String.valueOf(value);
- case STRING(String value):
- return value;
- case SYMBOL_NAME(Symbol value):
- return value.name.toString();
- case NULL:
- return String.valueOf(null);
- default:
- throw Debug.abort("not convertible to String", this);
- }
- }
-
- /** Tests whether this constant equals given Object. */
- public boolean equals(Object that) {
- if (this == that) return true;
- return (that instanceof AConstant) && this.equals((AConstant)that);
- }
-
- /** Tests whether this constant equals given one. */
- public boolean equals(AConstant that) {
- if (this == that) return true;
- if (null == that) return false;
- switch (this) {
- case UNIT:
- return false;
- case BOOLEAN(boolean ivalue):
- switch (that) {
- case BOOLEAN(boolean avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case BYTE(byte ivalue):
- switch (that) {
- case BYTE(byte avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case SHORT(short ivalue):
- switch (that) {
- case SHORT(short avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case CHAR(char ivalue):
- switch (that) {
- case CHAR(char avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case INT(int ivalue):
- switch (that) {
- case INT(int avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case LONG(long ivalue):
- switch (that) {
- case LONG(long avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case FLOAT(float ivalue):
- switch (that) {
- case FLOAT(float avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case DOUBLE(double ivalue):
- switch (that) {
- case DOUBLE(double avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case STRING(String ivalue):
- switch (that) {
- case STRING(String avalue):
- return ivalue.equals(avalue);
- default:
- return false;
- }
- case SYMBOL_NAME(Symbol ivalue):
- switch (that) {
- case SYMBOL_NAME(Symbol avalue):
- return ivalue == avalue;
- default:
- return false;
- }
- case NULL:
- return false;
- case ZERO:
- return false;
- default:
- throw Debug.abort("unknown case", this);
- }
- }
-
- /** Returns the hash code of this constant. */
- public int hashCode() {
- switch (this) {
- case UNIT:
- return 4041;
- case BOOLEAN(boolean value):
- return value ? 1231 : 1237;
- case BYTE(byte value):
- return value;
- case SHORT(short value):
- return value;
- case CHAR(char value):
- return value;
- case INT(int value):
- return value;
- case LONG(long value):
- long bits = value;
- return (int)(bits ^ (bits >>> 32));
- case FLOAT(float value):
- int bits = java.lang.Float.floatToIntBits(value);
- return bits;
- case DOUBLE(double value):
- long bits = java.lang.Double.doubleToLongBits(value);
- return (int)(bits ^ (bits >>> 32));
- case STRING(String value):
- return value.hashCode();
- case SYMBOL_NAME(Symbol value):
- return value.hashCode();
- case NULL:
- return 0;
- case ZERO:
- return 0;
- default:
- throw Debug.abort("unknown case", this);
- }
- }
-
- /** Returns a string representation of this constant. */
- public String toString() {
- return new ATreePrinter().printConstant(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AField.java b/sources/scalac/atree/AField.java
deleted file mode 100644
index bbc27f7063..0000000000
--- a/sources/scalac/atree/AField.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-/** This class represents an attributed field. */
-public class AField extends AMember {
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AField(Symbol symbol, boolean isStatic) {
- super(symbol, isStatic);
- }
-
- //########################################################################
- // Public Methods
-
- /** Is this field final? */
- public boolean isFinal() {
- return false; // !!!
- }
-
- /** Is this field volatile? */
- public boolean isVolatile() {
- return false; // !!!
- }
-
- /** Is this field transient? */
- public boolean isTransient() {
- return false; // !!!
- }
-
- /** Returns the type of this field. */
- public Type type() {
- return symbol().type();
- }
-
- /** Returns a string representation of this field. */
- public String toString() {
- return new ATreePrinter().printField(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AFunction.java b/sources/scalac/atree/AFunction.java
deleted file mode 100644
index 2970222a2c..0000000000
--- a/sources/scalac/atree/AFunction.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Type;
-import scalac.symtab.Symbol;
-
-/** This class represents an attributed function reference. */
-public class AFunction {
-
- //########################################################################
- // Public Cases
-
- public case Method(ACode object, Symbol method, AInvokeStyle style);
- public case Primitive(APrimitive primitive);
- public case NewArray(Type element);
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this function. */
- public String toString() {
- return new ATreePrinter().printFunction(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AInvokeStyle.java b/sources/scalac/atree/AInvokeStyle.java
deleted file mode 100644
index f833aad2f0..0000000000
--- a/sources/scalac/atree/AInvokeStyle.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a method invocation style. */
-public class AInvokeStyle {
-
- //########################################################################
- // Public Cases
-
- public case New;
- public case Dynamic;
- public case Static(boolean onInstance);
-
- //########################################################################
- // Public Constants
-
- public static final AInvokeStyle StaticClass = Static(false);
- public static final AInvokeStyle StaticInstance = Static(true);
-
- //########################################################################
- // Public Methods
-
- /** Is this a new object creation? */
- public boolean isNew() {
- switch (this) {
- case New:
- return true;
- default:
- return false;
- }
- }
-
- /** Is this a dynamic method call? */
- public boolean isDynamic() {
- switch (this) {
- case Dynamic:
- return true;
- default:
- return false;
- }
- }
-
- /** Is this a static method call? */
- public boolean isStatic() {
- switch (this) {
- case Static(_):
- return true;
- default:
- return false;
- }
- }
-
- /** Is this an instance method call? */
- public boolean hasInstance() {
- switch (this) {
- case Dynamic:
- return true;
- case Static(boolean onInstance):
- return onInstance;
- default:
- return false;
- }
- }
-
- /** Returns a string representation of this style. */
- public String toString() {
- switch (this) {
- case New:
- return "new";
- case Dynamic:
- return "dynamic";
- case Static(false):
- return "static-class";
- case Static(true):
- return "static-instance";
- default:
- throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ALocation.java b/sources/scalac/atree/ALocation.java
deleted file mode 100644
index 0a9c440df2..0000000000
--- a/sources/scalac/atree/ALocation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Symbol;
-
-/** This class represents an attributed value location. */
-public class ALocation {
-
- //########################################################################
- // Public Cases
-
- public case Module(Symbol module); // !!! remove ?
- public case Field(ACode object, Symbol field, boolean isStatic);
- public case Local(Symbol local, boolean isArgument);
- public case ArrayItem(ACode array, ACode index);
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this location. */
- public String toString() {
- return new ATreePrinter().printLocation(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ALogicalOp.java b/sources/scalac/atree/ALogicalOp.java
deleted file mode 100644
index 85010ae4f0..0000000000
--- a/sources/scalac/atree/ALogicalOp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a logical operation. */
-public class ALogicalOp {
-
- //########################################################################
- // Public Cases
-
- /** A bitwise AND operation */
- public case AND;
-
- /** A bitwise OR operation */
- public case OR;
-
- /** A bitwise XOR operation */
- public case XOR;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this operation. */
- public String toString() {
- switch (this) {
- case AND: return "AND";
- case OR : return "OR";
- case XOR: return "XOR";
- default : throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AMember.java b/sources/scalac/atree/AMember.java
deleted file mode 100644
index 4275180a4d..0000000000
--- a/sources/scalac/atree/AMember.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Symbol;
-
-/** This class represents an attributed class member. */
-public abstract class AMember {
-
- //########################################################################
- // Private Fields
-
- /** The member symbol */
- private final Symbol symbol;
-
- /** The static flag */
- private final boolean isStatic;
-
- /** The member code */
- private ACode code;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AMember(Symbol symbol, boolean isStatic) {
- this.symbol = symbol;
- this.isStatic = isStatic;
- this.code = ACode.Void;
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the symbol of this member. */
- public Symbol symbol() {
- return symbol;
- }
-
- /** Is this member public? */
- public boolean isPublic() {
- return symbol().isPublic();
- }
-
- /** Is this member private? */
- public boolean isPrivate() {
- return symbol().isPrivate();
- }
-
- /** Is this member protected? */
- public boolean isProtected() {
- return symbol().isProtected();
- }
-
- /** Is this member static? */
- public boolean isStatic() {
- return isStatic;
- }
-
- /** Is this member deprecated? */
- public boolean isDeprecated() {
- return false; // !!!
- }
-
- /** Is this member synthetic? */
- public boolean isSynthetic() {
- return symbol().isSynthetic();
- }
-
- /** Returns the member code. */
- public ACode code() {
- return code;
- }
-
- /** Sets the member code. */
- public void setCode(ACode code) {
- this.code = code;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AMethod.java b/sources/scalac/atree/AMethod.java
deleted file mode 100644
index f904fa6b92..0000000000
--- a/sources/scalac/atree/AMethod.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-/** This class represents an attributed method. */
-public class AMethod extends AMember {
- //########################################################################
- // Public Fields
-
- /** Contains the Intermediate code of this Method */
- public Object icode = null;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AMethod(Symbol symbol, boolean isStatic) {
- super(symbol, isStatic);
- }
-
- //########################################################################
- // Public Methods
-
- /** Is this method final? */
- public boolean isFinal() {
- return symbol().isMethodFinal();
- }
-
- /** Is this method synchronized? */
- public boolean isSynchronized() {
- return false; // !!!
- }
-
- /** Is this method native? */
- public boolean isNative() {
- return false; // !!!
- }
-
- /** Is this method abstract? */
- public boolean isAbstract() {
- return symbol().isDeferred();
- }
-
- /** Is this method FP-strict? */
- public boolean isStrictFP() {
- return false; // !!!
- }
-
- /** Returns the type parameters of this method. */
- public Symbol[] tparams() {
- return symbol().type().typeParams();
- }
-
- /** Returns the value parameters of this method. */
- public Symbol[] vparams() {
- return symbol().type().valueParams();
- }
-
- /** Returns the result type of this method. */
- public Type result() {
- return symbol().type().resultType();
- }
-
- /** Returns a string representation of this method. */
- public String toString() {
- return new ATreePrinter().printMethod(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/APrimitive.java b/sources/scalac/atree/APrimitive.java
deleted file mode 100644
index 034a9f4d19..0000000000
--- a/sources/scalac/atree/APrimitive.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-/** This class represents a primitive operation. */
-public class APrimitive {
-
- //########################################################################
- // Public Cases
-
- // type : (type) => type
- // range: type <- { BOOL, Ix, Ux, Rx }
- // jvm : {i, l, f, d}neg
- public case Negation(ATypeKind kind);
-
- // type : zero ? (type) => BOOL : (type,type) => BOOL
- // range: type <- { BOOL, Ix, Ux, Rx, REF }
- // jvm : if{eq, ne, lt, ge, le, gt}, if{null, nonnull}
- // if_icmp{eq, ne, lt, ge, le, gt}, if_acmp{eq,ne}
- public case Test(ATestOp op, ATypeKind kind, boolean zero);
-
- // type : (type,type) => I4
- // range: type <- { Ix, Ux, Rx }
- // jvm : lcmp, {f, d}cmp{l, g}
- public case Comparison(AComparisonOp op, ATypeKind kind);
-
- // type : (type,type) => type
- // range: type <- { Ix, Ux, Rx }
- // jvm : {i, l, f, d}{add, sub, mul, div, rem}
- public case Arithmetic(AArithmeticOp op, ATypeKind kind);
-
- // type : (type,type) => type
- // range: type <- { BOOL, Ix, Ux }
- // jvm : {i, l}{and, or, xor}
- public case Logical(ALogicalOp op, ATypeKind kind);
-
- // type : (type,I4) => type
- // range: type <- { Ix, Ux }
- // jvm : {i, l}{shl, ushl, shr}
- public case Shift(AShiftOp op, ATypeKind kind);
-
- // type : (src) => dst
- // range: src,dst <- { Ix, Ux, Rx }
- // jvm : i2{l, f, d}, l2{i, f, d}, f2{i, l, d}, d2{i, l, f}, i2{b, c, s}
- public case Conversion(ATypeKind src, ATypeKind dst);
-
- // type : (Array[REF]) => I4
- // range: type <- { BOOL, Ix, Ux, Rx, REF }
- // jvm : arraylength
- public case ArrayLength(ATypeKind kind);
-
- // type : (lf,rg) => STR
- // range: lf,rg <- { BOOL, Ix, Ux, Rx, REF, STR }
- // jvm : -
- public case StringConcat(ATypeKind lf, ATypeKind rg);
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this primitive. */
- public String toString() {
- return new ATreePrinter().printPrimitive(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ARepository.java b/sources/scalac/atree/ARepository.java
deleted file mode 100644
index c1468a85a8..0000000000
--- a/sources/scalac/atree/ARepository.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import java.util.Map;
-import java.util.LinkedHashMap;
-
-/** This class represents a repository of attributed classes. */
-public class ARepository {
-
- //########################################################################
- // Private Fields
-
- /** The symbol to class map */
- private final Map/*<Symbol,AClass>*/ classes;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ARepository() {
- this.classes = new LinkedHashMap();
- }
-
- //########################################################################
- // Public Methods
-
- /** Adds the given class to this repository. */
- public void addClass(AClass clasz) {
- assert !classes.containsKey(clasz.symbol()): clasz;
- classes.put(clasz.symbol(), clasz);
- }
-
- /** Returns the classes of this repository. */
- public AClass[] classes() {
- return (AClass[])classes.values().toArray(new AClass[classes.size()]);
- }
-
- /** Returns a string representation of this repository. */
- public String toString() {
- return new ATreePrinter().printRepository(this).toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/AShiftOp.java b/sources/scalac/atree/AShiftOp.java
deleted file mode 100644
index 791ce54328..0000000000
--- a/sources/scalac/atree/AShiftOp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a shift operation. */
-public class AShiftOp {
-
- //########################################################################
- // Public Cases
-
- /** A logical shift to the left */
- public case LSL;
-
- /** An arithmetic shift to the right */
- public case ASR;
-
- /** A logical shift to the right */
- public case LSR;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this operation. */
- public String toString() {
- switch (this) {
- case LSL: return "LSL";
- case ASR: return "ASR";
- case LSR: return "LSR";
- default: throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATestOp.java b/sources/scalac/atree/ATestOp.java
deleted file mode 100644
index 1d90f5ba0e..0000000000
--- a/sources/scalac/atree/ATestOp.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a test operation. */
-public class ATestOp {
-
- //########################################################################
- // Public Cases
-
- /** An equality test */
- public case EQ;
-
- /** A non-equality test */
- public case NE;
-
- /** A less-than test */
- public case LT;
-
- /** A greater-than-or-equal test */
- public case GE;
-
- /** A less-than-or-equal test */
- public case LE;
-
- /** A greater-than test */
- public case GT;
-
- //########################################################################
- // Public Methods
-
- /** Returns the negation of this operation. */
- public ATestOp negate() {
- switch (this) {
- case EQ: return NE;
- case NE: return EQ;
- case LT: return GE;
- case GE: return LT;
- case LE: return GT;
- case GT: return LE;
- default: throw Debug.abort("unknown case", this);
- }
- }
-
- /** Returns a string representation of this operation. */
- public String toString() {
- switch (this) {
- case EQ: return "EQ";
- case NE: return "NE";
- case LT: return "LT";
- case GE: return "GE";
- case LE: return "LE";
- case GT: return "GT";
- default: throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATreeFactory.java b/sources/scalac/atree/ATreeFactory.java
deleted file mode 100644
index 0c09650a16..0000000000
--- a/sources/scalac/atree/ATreeFactory.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.ast.Tree;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-/** This class implements an attributed tree factory. */
-public class ATreeFactory {
-
- //########################################################################
- // Public Fields
-
- /** The unique Void node */
- public final ACode Void = ACode.Void;
-
- /** The unique UNIT constant */
- public final AConstant UNIT = AConstant.UNIT;
-
- /** The unique NULL constant */
- public final AConstant NULL = AConstant.NULL;
-
- /** The unique ZERO constant */
- public final AConstant ZERO = AConstant.ZERO;
-
- //########################################################################
- // Public Methods - Building code
-
- /** Builds a This node. */
- public ACode This(Tree t, Symbol clasz) {
- ACode.This code = ACode.This(clasz);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Constant node. */
- public ACode Constant(Tree t, AConstant constant) {
- ACode.Constant code = ACode.Constant(constant);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Load node. */
- public ACode Load(Tree t, ALocation location) {
- ACode.Load code = ACode.Load(location);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Store node. */
- public ACode Store(Tree t, ALocation location, ACode value) {
- ACode.Store code = ACode.Store(location, value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, AFunction function, Type[] ts, ACode[] vs) {
- ACode.Apply code = ACode.Apply(function, ts, vs);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, AFunction function, Type[] ts) {
- return Apply(t, function, ts, ACode.EMPTY_ARRAY);
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, AFunction function, ACode[] vs) {
- return Apply(t, function, Type.EMPTY_ARRAY, vs);
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, AFunction function) {
- return Apply(t, function, Type.EMPTY_ARRAY, ACode.EMPTY_ARRAY);
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, APrimitive primitive, ACode v0) {
- return Apply(t, AFunction.Primitive(primitive), new ACode[] {v0});
- }
-
- /** Builds an Apply node. */
- public ACode Apply(Tree t, APrimitive primitive, ACode v0, ACode v1) {
- return Apply(t, AFunction.Primitive(primitive), new ACode[] {v0,v1});
- }
-
- /** Builds an IsAs node. */
- public ACode IsAs(Tree t, ACode value, Type type, boolean cast) {
- ACode.IsAs code = ACode.IsAs(value, type, cast);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds an If node. */
- public ACode If(Tree t, ACode test, ACode success, ACode failure) {
- ACode.If code = ACode.If(test, success, failure);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Switch node. */
- public ACode Switch(Tree t, ACode test, int[][] tags, ACode[] bodies) {
- ACode.Switch code = ACode.Switch(test, tags, bodies);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Synchronized node. */
- public ACode Synchronized(Tree t, ACode lock, ACode value) {
- ACode.Synchronized code = ACode.Synchronized(lock, value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Block node. */
- public ACode Block(Tree t, Symbol[] locals,ACode[] statements,ACode value){
- ACode.Block code = ACode.Block(locals, statements, value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Label node. */
- public ACode Label(Tree t, Symbol label, Symbol[] locals, ACode value) {
- ACode.Label code = ACode.Label(label, locals, value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Goto node. */
- public ACode Goto(Tree t, Symbol label, ACode[] vargs) {
- ACode.Goto code = ACode.Goto(label, vargs);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Return node. */
- public ACode Return(Tree t, Symbol function, ACode value) {
- ACode.Return code = ACode.Return(function, value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Throw node. */
- public ACode Throw(Tree t, ACode value) {
- ACode.Throw code = ACode.Throw(value);
- code.pos = t.pos;
- return code;
- }
-
- /** Builds a Drop node. */
- public ACode Drop(Tree t, ACode value, Type type) {
- ACode.Drop code = ACode.Drop(value, type);
- code.pos = t.pos;
- return code;
- }
-
- //########################################################################
- // Public Methods - Building primitive operations
-
- /** Builds a negation operation */
- public ACode NOT(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, NOT(kind), v0);
- }
-
- /** Builds an EQ operation */
- public ACode EQ(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, EQ(kind, true), v0);
- }
-
- /** Builds a NE operation */
- public ACode NE(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, NE(kind, true), v0);
- }
-
- /** Builds a LT operation */
- public ACode LT(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, LT(kind, true), v0);
- }
-
- /** Builds a GE operation */
- public ACode GE(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, GE(kind, true), v0);
- }
-
- /** Builds a LE operation */
- public ACode LE(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, LE(kind, true), v0);
- }
-
- /** Builds a GT operation */
- public ACode GT(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, GT(kind, true), v0);
- }
-
- /** Builds an EQ operation */
- public ACode EQ(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, EQ(kind, false), v0, v1);
- }
-
- /** Builds a NE operation */
- public ACode NE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, NE(kind, false), v0, v1);
- }
-
- /** Builds a LT operation */
- public ACode LT(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, LT(kind, false), v0, v1);
- }
-
- /** Builds a GE operation */
- public ACode GE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, GE(kind, false), v0, v1);
- }
-
- /** Builds a LE operation */
- public ACode LE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, LE(kind, false), v0, v1);
- }
-
- /** Builds a GT operation */
- public ACode GT(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, GT(kind, false), v0, v1);
- }
-
- /** Builds a CMPL operation */
- public ACode CMPL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, CMPL(kind), v0, v1);
- }
-
- /** Builds a CMP operation */
- public ACode CMP(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, CMP(kind), v0, v1);
- }
-
- /** Builds a CMPG operation */
- public ACode CMPG(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, CMPG(kind), v0, v1);
- }
-
- /** Builds an ADD operation */
- public ACode ADD(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, ADD(kind), v0, v1);
- }
-
- /** Builds a SUB operation */
- public ACode SUB(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, SUB(kind), v0, v1);
- }
-
- /** Builds a MUL operation */
- public ACode MUL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, MUL(kind), v0, v1);
- }
-
- /** Builds a DIV operation */
- public ACode DIV(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, DIV(kind), v0, v1);
- }
-
- /** Builds a REM operation */
- public ACode REM(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, REM(kind), v0, v1);
- }
-
- /** Builds an AND operation. */
- public ACode AND(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, AND(kind), v0, v1);
- }
-
- /** Builds an OR operation. */
- public ACode OR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, OR(kind), v0, v1);
- }
-
- /** Builds an XOR operation. */
- public ACode XOR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, XOR(kind), v0, v1);
- }
-
- /** Builds a LSL operation. */
- public ACode LSL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, LSL(kind), v0, v1);
- }
-
- /** Builds a LSR operation. */
- public ACode LSR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, LSR(kind), v0, v1);
- }
-
- /** Builds an ASR operation. */
- public ACode ASR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
- return Apply(t, ASR(kind), v0, v1);
- }
-
- /** Builds a value conversion operation. */
- public ACode CONVERT(Tree t, ATypeKind src, ATypeKind dst, ACode v0) {
- return Apply(t, CONVERT(src, dst), v0);
- }
-
- /** Builds an array length operation. */
- public ACode LENGTH(Tree t, ATypeKind kind, ACode v0) {
- return Apply(t, LENGTH(kind), v0);
- }
-
- /** Builds a string concatenation operation. */
- public ACode CONCAT(Tree t, ATypeKind lf, ATypeKind rg, ACode v0,ACode v1){
- return Apply(t, CONCAT(lf, rg), v0, v1);
- }
-
- //########################################################################
- // Public Methods - Building primitives
-
- /** Builds a negation primitive */
- public APrimitive NOT(ATypeKind kind) {
- return APrimitive.Negation(kind);
- }
-
- /** Builds an EQ primitive */
- public APrimitive EQ(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.EQ, kind, zero);
- }
-
- /** Builds a NE primitive */
- public APrimitive NE(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.NE, kind, zero);
- }
-
- /** Builds a LT primitive */
- public APrimitive LT(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.LT, kind, zero);
- }
-
- /** Builds a GE primitive */
- public APrimitive GE(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.GE, kind, zero);
- }
-
- /** Builds a LE primitive */
- public APrimitive LE(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.LE, kind, zero);
- }
-
- /** Builds a GT primitive */
- public APrimitive GT(ATypeKind kind, boolean zero) {
- return APrimitive.Test(ATestOp.GT, kind, zero);
- }
-
- /** Builds a CMPL primitive */
- public APrimitive CMPL(ATypeKind kind) {
- return APrimitive.Comparison(AComparisonOp.CMPL, kind);
- }
-
- /** Builds a CMP primitive */
- public APrimitive CMP(ATypeKind kind) {
- return APrimitive.Comparison(AComparisonOp.CMP, kind);
- }
-
- /** Builds a CMPG primitive */
- public APrimitive CMPG(ATypeKind kind) {
- return APrimitive.Comparison(AComparisonOp.CMPG, kind);
- }
-
- /** Builds an ADD primitive */
- public APrimitive ADD(ATypeKind kind) {
- return APrimitive.Arithmetic(AArithmeticOp.ADD, kind);
- }
-
- /** Builds a SUB primitive */
- public APrimitive SUB(ATypeKind kind) {
- return APrimitive.Arithmetic(AArithmeticOp.SUB, kind);
- }
-
- /** Builds a MUL primitive */
- public APrimitive MUL(ATypeKind kind) {
- return APrimitive.Arithmetic(AArithmeticOp.MUL, kind);
- }
-
- /** Builds a DIV primitive */
- public APrimitive DIV(ATypeKind kind) {
- return APrimitive.Arithmetic(AArithmeticOp.DIV, kind);
- }
-
- /** Builds a REM primitive */
- public APrimitive REM(ATypeKind kind) {
- return APrimitive.Arithmetic(AArithmeticOp.REM, kind);
- }
-
- /** Builds an AND primitive. */
- public APrimitive AND(ATypeKind kind) {
- return APrimitive.Logical(ALogicalOp.AND, kind);
- }
-
- /** Builds an OR primitive. */
- public APrimitive OR(ATypeKind kind) {
- return APrimitive.Logical(ALogicalOp.OR, kind);
- }
-
- /** Builds an XOR primitive. */
- public APrimitive XOR(ATypeKind kind) {
- return APrimitive.Logical(ALogicalOp.XOR, kind);
- }
-
- /** Builds a LSL primitive. */
- public APrimitive LSL(ATypeKind kind) {
- return APrimitive.Shift(AShiftOp.LSL, kind);
- }
-
- /** Builds a LSR primitive. */
- public APrimitive LSR(ATypeKind kind) {
- return APrimitive.Shift(AShiftOp.LSR, kind);
- }
-
- /** Builds an ASR primitive. */
- public APrimitive ASR(ATypeKind kind) {
- return APrimitive.Shift(AShiftOp.ASR, kind);
- }
-
- /** Builds a value conversion primitive. */
- public APrimitive CONVERT(ATypeKind src, ATypeKind dst) {
- return APrimitive.Conversion(src, dst);
- }
-
- /** Builds an array length primitive. */
- public APrimitive LENGTH(ATypeKind kind) {
- return APrimitive.ArrayLength(kind);
- }
-
- /** Builds a string concatenation primitive. */
- public APrimitive CONCAT(ATypeKind lf, ATypeKind rg) {
- return APrimitive.StringConcat(lf, rg);
- }
-
- //########################################################################
- // Public Methods - Building constants
-
- /** Builds a BOOLEAN constant of given value. */
- public AConstant BOOLEAN(Boolean value) {
- return BOOLEAN(value.booleanValue());
- }
-
- /** Builds a BOOLEAN constant of given value. */
- public AConstant BOOLEAN(boolean value) {
- return AConstant.BOOLEAN(value);
- }
-
- /** Builds a BYTE constant of given value. */
- public AConstant BYTE(Byte value) {
- return BYTE(value.byteValue());
- }
-
- /** Builds a BYTE constant of given value. */
- public AConstant BYTE(byte value) {
- return AConstant.BYTE(value);
- }
-
- /** Builds a SHORT constant of given value. */
- public AConstant SHORT(Short value) {
- return SHORT(value.shortValue());
- }
-
- /** Builds a SHORT constant of given value. */
- public AConstant SHORT(short value) {
- return AConstant.SHORT(value);
- }
-
- /** Builds a CHAR constant of given value. */
- public AConstant CHAR(Character value) {
- return CHAR(value.charValue());
- }
-
- /** Builds a CHAR constant of given value. */
- public AConstant CHAR(char value) {
- return AConstant.CHAR(value);
- }
-
- /** Builds an INT constant of given value. */
- public AConstant INT(Integer value) {
- return INT(value.intValue());
- }
-
- /** Builds an INT constant of given value. */
- public AConstant INT(int value) {
- return AConstant.INT(value);
- }
-
- /** Builds a LONG constant of given value. */
- public AConstant LONG(Long value) {
- return LONG(value.longValue());
- }
-
- /** Builds a LONG constant of given value. */
- public AConstant LONG(long value) {
- return AConstant.LONG(value);
- }
-
- /** Builds a FLOAT constant of given value. */
- public AConstant FLOAT(Float value) {
- return FLOAT(value.floatValue());
- }
-
- /** Builds a FLOAT constant of given value. */
- public AConstant FLOAT(float value) {
- return AConstant.FLOAT(value);
- }
-
- /** Builds a DOUBLE constant of given value. */
- public AConstant DOUBLE(Double value) {
- return DOUBLE(value.doubleValue());
- }
-
- /** Builds a DOUBLE constant of given value. */
- public AConstant DOUBLE(double value) {
- return AConstant.DOUBLE(value);
- }
-
- /** Builds a STRING constant of given value. */
- public AConstant STRING(String value) {
- return AConstant.STRING(value);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATreeFromSTree.java b/sources/scalac/atree/ATreeFromSTree.java
deleted file mode 100644
index 83e50eb7e1..0000000000
--- a/sources/scalac/atree/ATreeFromSTree.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Ident;
-import scalac.ast.Tree.Template;
-import scalac.symtab.Definitions;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Name;
-
-/** This class translates syntax trees into attributed trees. */
-public class ATreeFromSTree {
-
- //########################################################################
- // Private Fields
-
- /** The global definitions */
- private final Definitions definitions;
-
- /** The attributed tree factory */
- private final ATreeFactory make;
-
- /** A mapping from primitive classes to initialization state */
- private final Map/*<Symbol,Boolean>*/ states;
-
- /** A mapping from primitive methods to generators */
- private final Map/*<Symbol,Generator>*/ generators;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ATreeFromSTree(Definitions definitions) {
- this.definitions = definitions;
- this.make = new ATreeFactory();
- this.states = new HashMap();
- this.generators = new HashMap();
- Symbol[] classes = {
- definitions.ANY_CLASS,
- definitions.OBJECT_CLASS,
- definitions.STRING_CLASS,
- definitions.THROWABLE_CLASS,
- definitions.ARRAY_CLASS,
- definitions.UNIT_CLASS,
- definitions.BOOLEAN_CLASS,
- definitions.BYTE_CLASS,
- definitions.SHORT_CLASS,
- definitions.CHAR_CLASS,
- definitions.INT_CLASS,
- definitions.LONG_CLASS,
- definitions.FLOAT_CLASS,
- definitions.DOUBLE_CLASS,
- };
- for (int i = 0; i < classes.length; i++)
- states.put(classes[i], Boolean.FALSE);
- }
-
- //########################################################################
- // Public Methods - Translating units
-
- /** Translates the unit's body and stores the result in it. */
- public void translate(CompilationUnit unit) {
- template(unit.repository = new ARepository(), unit.body);
- }
-
- //########################################################################
- // Private Methods - Translating templates
-
- /** Translates the templates and adds them to the repository. */
- private void template(ARepository repository, Tree[] trees) {
- for (int i = 0; i < trees.length; i++) template(repository, trees[i]);
- }
-
- /** Translates the template and adds it to the repository. */
- private void template(ARepository repository, Tree tree) {
- switch (tree) {
-
- case Empty:
- return;
-
- case ClassDef(_, _, _, _, _, Template(_, Tree[] body)):
- AClass clasz = new AClass(tree.symbol());
- // !!! add static field to global modules
- repository.addClass(clasz);
- member(clasz, body);
- return;
-
- case PackageDef(_, Template(_, Tree[] body)):
- template(repository, body);
- return;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Translating members
-
- /** Translates the members and adds them to the class. */
- private void member(AClass clasz, Tree[] trees) {
- for (int i = 0; i < trees.length; i++) member(clasz, trees[i]);
- }
-
- /** Translates the member and adds it to the class. */
- private void member(AClass clasz, Tree tree) {
- switch (tree) {
-
- case Empty:
- return;
-
- case ClassDef(_, _, _, _, _, _):
- template(clasz, tree);
- return;
-
- case ValDef(_, _, _, Tree rhs):
- AField field = new AField(tree.symbol(), false);
- clasz.addField(field);
- return;
-
- case DefDef(_, _, _, _, _, Tree rhs):
- AMethod method = new AMethod(tree.symbol(), false);
- clasz.addMethod(method);
- if (!method.isAbstract()) method.setCode(expression(rhs));
- return;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Translating statements
-
- /** Translates the statements. */
- private ACode[] statement(List locals, Tree[] trees) {
- List codes = new ArrayList();
- for (int i = 0; i < trees.length; i++) {
- ACode code = statement(locals, trees[i]);
- if (code != ACode.Void) codes.add(code);
- }
- return (ACode[])codes.toArray(new ACode[codes.size()]);
- }
-
- /** Translates the statement. */
- private ACode statement(List locals, Tree tree) {
- switch (tree) {
-
- case Empty:
- return make.Void;
-
- case ValDef(_, _, _, Tree rhs):
- Symbol symbol = tree.symbol();
- locals.add(symbol);
- ALocation location = ALocation.Local(symbol, false);
- return make.Store(tree, location, expression(rhs));
-
- default:
- return ACode.Drop(expression(tree), tree.type());
- }
- }
-
- //########################################################################
- // Private Methods - Translating expressions
-
- /** Translates the expressions. */
- private ACode[] expression(Tree[] trees) {
- ACode[] codes = new ACode[trees.length];
- for (int i = 0; i < codes.length; i++) codes[i] = expression(trees[i]);
- return codes;
- }
-
- /** Translates the expression. */
- private ACode expression(Tree tree) {
- switch (tree) {
-
- case LabelDef(_, Ident[] idents, Tree rhs):
- Symbol[] locals = Tree.symbolOf(idents);
- return make.Label(tree, tree.symbol(), locals, expression(rhs));
-
- case Block(Tree[] stats, Tree value):
- List locals = new ArrayList();
- ACode[] codes = statement(locals, stats);
- ACode code = expression(value);
- if (locals.size() == 0 && codes.length == 0) return code;
- Symbol[] symbols =
- (Symbol[])locals.toArray(new Symbol[locals.size()]);
- return make.Block(tree, symbols, codes, code);
-
- case Assign(Tree lhs, Tree rhs):
- return make.Block(tree, Symbol.EMPTY_ARRAY, new ACode[] {
- make.Store(tree, location(lhs), expression(rhs))},
- make.Void);
-
- case If(Tree cond, Tree thenp, Tree elsep):
- ACode test = expression(cond);
- return make.If(tree, test, expression(thenp), expression(elsep));
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- int[][] tagss = new int[tags.length][];
- for (int i = 0; i < tagss.length; i++)
- tagss[i] = new int[] {tags[i]};
- ACode[] codes = new ACode[bodies.length + 1];
- for (int i = 0; i < bodies.length; i++)
- codes[i] = expression(bodies[i]);
- codes[tags.length] = expression(otherwise);
- return make.Switch(tree, expression(test), tagss, codes);
-
- case Return(Tree value):
- return make.Return(tree, tree.symbol(), expression(value));
-
- case Throw(Tree value):
- return make.Throw(tree, expression(value));
-
- case New(Apply(Tree fun, Tree[] vargs)):
- switch (fun) {
- case Select(Create(_, Tree[] targs), _):
- return apply(tree, fun, targs, vargs);
- default:
- throw Debug.abort("illegal case", tree);
- }
-
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs):
- return apply(tree, fun, targs, vargs);
- case Apply(Tree fun, Tree[] vargs):
- return apply(tree, fun, Tree.EMPTY_ARRAY, vargs);
-
- case Super(_, _):
- case This(_):
- return make.This(tree, tree.symbol());
-
- case Select(_, _):
- case Ident(_):
- return make.Load(tree, location(tree));
-
- case Literal(AConstant value):
- return make.Constant(tree, value);
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- /** Translates the application. */
- private ACode apply(Tree tree, Tree fun, Tree[] targs, Tree[] vargs) {
- Symbol symbol = fun.symbol();
- ACode[] codes = expression(vargs);
- if (symbol.isLabel()) return make.Goto(tree, symbol, codes);
- Type[] types = Tree.typeOf(targs);
- AFunction function = function(fun);
- switch (function) {
- case Method(ACode object, Symbol method, AInvokeStyle style):
- if (!style.isDynamic()) break;
- Symbol clasz = method.owner();
- Object state = states.get(clasz);
- if (state == null) break;
- if (state != Boolean.TRUE) addGeneratorsOf(clasz);
- Object generator = generators.get(method);
- if (generator == null) break;
- return generate((Generator)generator, tree, object, types, vargs);
- }
- return make.Apply(tree, function, types, codes);
- }
-
- //########################################################################
- // Private Methods - Translating functions
-
- /** Translates the method. */
- private AFunction function(Tree tree) {
- Symbol symbol = tree.symbol();
- switch (tree) {
-
- case Select(Create(_, _), _):
- AInvokeStyle style = AInvokeStyle.New;
- return AFunction.Method(make.Void, symbol, style);
-
- case Select(Tree qualifier, _):
- AInvokeStyle style = invokeStyle(qualifier);
- return AFunction.Method(expression(qualifier), symbol, style);
-
- case Ident(_):
- AInvokeStyle style = AInvokeStyle.StaticClass;
- return AFunction.Method(make.Void, symbol, style);
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- /** Returns the InvokeStyle to use for the qualifier. */
- private AInvokeStyle invokeStyle(Tree qualifier) {
- switch (qualifier) {
- case Super(_, _):
- return AInvokeStyle.StaticInstance;
- default:
- return AInvokeStyle.Dynamic;
- }
- }
-
- //########################################################################
- // Private Methods - Translating locations
-
- /** Translates the location. */
- private ALocation location(Tree tree) {
- Symbol symbol = tree.symbol();
- switch (tree) {
-
- case Select(Tree qualifier, _):
- return ALocation.Field(expression(qualifier), symbol, false);
-
- case Ident(_):
- if (symbol.isModule()) return ALocation.Module(symbol);
- return symbol.owner().isClass()
- ? ALocation.Field(make.Void, symbol, true)
- : ALocation.Local(symbol, symbol.isParameter());
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Translating constants
-
- /** Translates the constant. */
- private AConstant constant(Object value) {
- if (value instanceof Boolean ) return make.BOOLEAN((Boolean )value);
- if (value instanceof Byte ) return make.BYTE (((Byte )value));
- if (value instanceof Short ) return make.SHORT ((Short )value);
- if (value instanceof Character) return make.CHAR ((Character)value);
- if (value instanceof Integer ) return make.INT ((Integer )value);
- if (value instanceof Long ) return make.LONG ((Long )value);
- if (value instanceof Float ) return make.FLOAT ((Float )value);
- if (value instanceof Double ) return make.DOUBLE ((Double )value);
- if (value instanceof String ) return make.STRING ((String )value);
- throw Debug.abort("illegal constant", value +" -- "+ value.getClass());
- }
-
- //########################################################################
- // Private Methods - Generating code for primitive methods
-
- /** Applies generator to given object and arguments. */
- private ACode generate(Generator generator, Tree tree, ACode object,
- Type[] targs, Tree[] vargs)
- {
- switch (generator) {
-
- case ANYID:
- assert targs.length == 0 && vargs.length == 1: tree;
- return make.EQ(tree, ATypeKind.REF, object, expression(vargs[0]));
-
- case ANYNI:
- assert targs.length == 0 && vargs.length == 1: tree;
- return make.NE(tree, ATypeKind.REF, object, expression(vargs[0]));
-
- case ANYEQ:
- Symbol lf = newLocal(tree, definitions.ANY_TYPE());
- Symbol rg = newLocal(tree, definitions.ANY_TYPE());
- return make.Block(tree,
- new Symbol[] {lf, rg},
- new ACode[] {
- store(tree, lf, object),
- store(tree, rg, expression(vargs[0]))},
- make.If(tree,
- make.EQ(tree, ATypeKind.REF, load(tree, lf)),
- make.EQ(tree, ATypeKind.REF, load(tree, rg)),
- make.Apply(tree,
- AFunction.Method(
- load(tree, lf),
- definitions.ANY_EQUALS,
- AInvokeStyle.Dynamic),
- Type.EMPTY_ARRAY,
- new ACode[] {load(tree, rg)})));
-
- case ANYNE:
- Symbol lf = newLocal(tree, definitions.ANY_TYPE());
- Symbol rg = newLocal(tree, definitions.ANY_TYPE());
- return make.Block(tree,
- new Symbol[] {lf, rg},
- new ACode[] {
- store(tree, lf, object),
- store(tree, rg, expression(vargs[0]))},
- make.If(tree,
- make.EQ(tree, ATypeKind.REF, load(tree, lf)),
- make.NE(tree, ATypeKind.REF, load(tree, rg)),
- make.NOT(tree,
- ATypeKind.BOOL,
- make.Apply(tree,
- AFunction.Method(
- load(tree, lf),
- definitions.ANY_EQUALS,
- AInvokeStyle.Dynamic),
- Type.EMPTY_ARRAY,
- new ACode[] {load(tree, rg)}))));
-
- case ISAS(boolean cast):
- assert targs.length == 1 && vargs.length == 0: tree;
- return make.IsAs(tree, object, targs[0], cast);
-
- case SYNCHRONIZED:
- assert targs.length == 1 && vargs.length == 1: tree;
- return make.Synchronized(tree, object, expression(vargs[0]));
-
- case THROW:
- assert targs.length == 0 && vargs.length == 0: tree;
- return make.Throw(tree, object);
-
- case CONCAT(ATypeKind prefix):
- assert targs.length == 0 && vargs.length == 1: tree;
- ATypeKind suffix = kind(vargs[0].type());
- ACode argument = expression(vargs[0]);
- return make.CONCAT(tree, prefix, suffix, object, argument);
-
- default:
- throw Debug.abort("unknown case", generator);
- }
- }
-
- /** Generates a load operation with given variable. */
- private ACode load(Tree tree, Symbol local) {
- assert local.owner().isNone(): Debug.show(local);
- return make.Load(tree, ALocation.Local(local, false));
- }
-
- /** Generates a store operation with given variable and value. */
- private ACode store(Tree tree, Symbol local, ACode value) {
- assert local.owner().isNone(): Debug.show(local);
- return make.Store(tree, ALocation.Local(local, false), value);
- }
-
- /** Creates a variable with tree's position and given type. */
- private Symbol newLocal(Tree tree, Type type) {
- Symbol owner = Symbol.NONE; // !!!
- Name name = Name.fromString("local"); // !!!
- return owner.newTerm(tree.pos, 0, name).setType(type);
- }
-
- /** Returns the type kind of given type. */
- private ATypeKind kind(Type type) {
- switch (type) {
- case SingleType(_, _):
- case ConstantType(_, _):
- return kind(type.singleDeref());
- case TypeRef(_, Symbol clasz, _):
- if (clasz == definitions.BOOLEAN_CLASS) return ATypeKind.BOOL;
- if (clasz == definitions.BYTE_CLASS) return ATypeKind.I1;
- if (clasz == definitions.SHORT_CLASS) return ATypeKind.I2;
- if (clasz == definitions.CHAR_CLASS) return ATypeKind.U2;
- if (clasz == definitions.INT_CLASS) return ATypeKind.I4;
- if (clasz == definitions.LONG_CLASS) return ATypeKind.I8;
- if (clasz == definitions.FLOAT_CLASS) return ATypeKind.R4;
- if (clasz == definitions.DOUBLE_CLASS) return ATypeKind.R8;
- if (clasz == definitions.STRING_CLASS) return ATypeKind.STR;
- return ATypeKind.REF;
- default:
- return ATypeKind.REF;
- }
- }
-
- //########################################################################
- // Private Methods - Collecting primitive methods
-
- /** Associates generators to primitive methods of given class. */
- private void addGeneratorsOf(Symbol clasz) {
- if (clasz == definitions.ANY_CLASS) {
- addGenerator(definitions.ANY_EQEQ, Generator.ANYEQ);
- addGenerator(definitions.ANY_BANGEQ, Generator.ANYNE);
- addGenerator(definitions.ANY_IS_ERASED, Generator.ISAS(false));
- addGenerator(definitions.ANY_AS_ERASED, Generator.ISAS(true));
- }
- if (clasz == definitions.OBJECT_CLASS) {
- addGenerator(definitions.OBJECT_EQ, Generator.ANYID);
- addGenerator(definitions.OBJECT_NE, Generator.ANYNI);
- addGenerator(definitions.OBJECT_SYNCHRONIZED, Generator.SYNCHRONIZED);
- }
- if (clasz == definitions.STRING_CLASS) {
- addGenerator(definitions.STRING_PLUS, Generator.CONCAT(ATypeKind.STR));
- }
- if (clasz == definitions.THROWABLE_CLASS) {
- addGenerator(definitions.THROWABLE_THROW, Generator.THROW);
- }
- if (clasz == definitions.ARRAY_CLASS) {
- // !!! addAll(defs.ARRAY_CLASS, Names.length, Primitive.LENGTH, 1);
- // !!! addAll(defs.ARRAY_CLASS, Names.apply, Primitive.APPLY, 2);
- // !!! addAll(defs.ARRAY_CLASS, Names.update, Primitive.UPDATE, 1);
- }
- if (clasz == definitions.UNIT_CLASS) {
- // !!!
- }
- if (clasz == definitions.BOOLEAN_CLASS) {
- // !!!
- }
- if (clasz == definitions.BYTE_CLASS) {
- // !!!
- }
- if (clasz == definitions.SHORT_CLASS) {
- // !!!
- }
- if (clasz == definitions.CHAR_CLASS) {
- // !!!
- }
- if (clasz == definitions.INT_CLASS) {
- // !!!
- }
- if (clasz == definitions.LONG_CLASS) {
- // !!!
- }
- if (clasz == definitions.FLOAT_CLASS) {
- // !!!
- }
- if (clasz == definitions.DOUBLE_CLASS) {
- // !!!
- }
- states.put(clasz, Boolean.TRUE);
- }
-
- /** Associates given generator to given primitive method. */
- private void addGenerator(Symbol method, Generator generator) {
- generators.put(method, generator);
- }
-
- //########################################################################
- // Private Class - Code generators
-
- /** Code generators for primitive methods. */
- private static class Generator {
- case ANYID;
- case ANYNI;
- case ANYEQ;
- case ANYNE;
- case ISAS(boolean cast);
- case SYNCHRONIZED;
- case THROW;
- case CONCAT(ATypeKind prefix);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATreePrinter.java b/sources/scalac/atree/ATreePrinter.java
deleted file mode 100644
index fb0a108a99..0000000000
--- a/sources/scalac/atree/ATreePrinter.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import ch.epfl.lamp.util.CodePrinter;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.CompilationUnit;
-import scalac.symtab.Type;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolTablePrinter;
-import scalac.util.Debug;
-import scalac.util.SourceRepresentation;
-
-/** This class provides methods to print attributed trees. */
-public class ATreePrinter {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
-
- /** The underlying code printer */
- private final CodePrinter printer;
-
- /** The underlying symbol table printer */
- private final SymbolTablePrinter symtab;
-
- //########################################################################
- // Public Constructors
-
- /** Initalizes this instance */
- public ATreePrinter() {
- this(new CodePrinter());
- }
-
- /** Initalizes this instance */
- public ATreePrinter(String step) {
- this(Global.instance, new CodePrinter(step));
- }
-
- /** Initalizes this instance */
- public ATreePrinter(CodePrinter printer) {
- this(Global.instance, printer);
- }
-
- /** Initalizes this instance */
- public ATreePrinter(Global global, CodePrinter printer) {
- this.global = global;
- this.printer = printer;
- this.symtab = new SymbolTablePrinter(global, printer);
- }
-
- //########################################################################
- // Public Methods - Getting & Setting
-
- /** Returns the underlying code printer. */
- public CodePrinter getCodePrinter() {
- return printer;
- }
-
- //########################################################################
- // Public Methods - Formatting
-
- /** Increases the indentation level by one. */
- public ATreePrinter indent() {
- printer.indent();
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public ATreePrinter undent() {
- printer.undent();
- return this;
- }
-
- /** Inserts a new line. */
- public ATreePrinter line() {
- printer.line();
- return this;
- }
-
- /** Inserts a white space. */
- public ATreePrinter space() {
- printer.space();
- return this;
- }
-
- /** Prints an opening brace followed by a new line. */
- public ATreePrinter lbrace() {
- return space().println('{').indent();
- }
-
- /** Prints a closing brace followed by a new line. */
- public ATreePrinter rbrace() {
- return undent().space().println('}');
- }
-
- //########################################################################
- // Public Methods - Printing simple values
-
- /** Prints a new line. */
- public ATreePrinter println() {
- printer.println();
- return this;
- }
-
- /** Prints the boolean value followed by a new line. */
- public ATreePrinter println(boolean value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the byte value followed by a new line. */
- public ATreePrinter println(byte value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the short value followed by a new line. */
- public ATreePrinter println(short value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the char value followed by a new line. */
- public ATreePrinter println(char value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the int value followed by a new line. */
- public ATreePrinter println(int value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the long value followed by a new line. */
- public ATreePrinter println(long value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the float value followed by a new line. */
- public ATreePrinter println(float value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the double value followed by a new line. */
- public ATreePrinter println(double value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the string followed by a new line. */
- public ATreePrinter println(String value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the boolean value. */
- public ATreePrinter print(boolean value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the byte value. */
- public ATreePrinter print(byte value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the short value. */
- public ATreePrinter print(short value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the char value. */
- public ATreePrinter print(char value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the int value. */
- public ATreePrinter print(int value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public ATreePrinter print(long value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the float value. */
- public ATreePrinter print(float value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public ATreePrinter print(double value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the string. */
- public ATreePrinter print(String value) {
- printer.print(value);
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing types and symbols
-
- /** Prints the symbol. */
- public ATreePrinter printSymbol(Symbol symbol) {
- symtab.printSymbolName(symbol);
- return this;
- }
-
- /** Prints the type. */
- public ATreePrinter printType(Type type) {
- symtab.printType(type);
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing trees
-
- /** Prints the units. */
- public ATreePrinter printUnits(CompilationUnit[] units) {
- Phase phase = global.currentPhase;
- println("[[attributed trees at "+phase+" (after "+phase.prev+")]]");
- for (int i = 0; i < units.length; i++) printUnit(units[i]);
- return this;
- }
-
- /** Prints the unit. */
- public ATreePrinter printUnit(CompilationUnit unit) {
- println("// Scala source: " + unit.source);
- return printRepository(unit.repository);
- }
-
- /** Prints the repository. */
- public ATreePrinter printRepository(ARepository repository) {
- AClass[] classes = repository.classes();
- for (int i = 0; i < classes.length; i++) printClass(classes[i]);
- return this;
- }
-
- /** Prints the class. */
- public ATreePrinter printClass(AClass clasz) {
- printClassModifiers(clasz);
- print(clasz.isInterface() ? "interface" : "class").space();
- printSymbol(clasz.symbol());
- Symbol[] tparams = clasz.tparams();
- if (tparams.length != 0) symtab.printTypeParams(tparams);
- Symbol[] vparams = clasz.vparams();
- if (vparams.length != 0) symtab.printValueParams(vparams);
- if (clasz.symbol().typeOfThis() != clasz.symbol().thisType())
- space().print(':').printType(clasz.symbol().typeOfThis());
- space().print("extends").space();
- symtab.printTypes(clasz.parents()," with ");
- lbrace();
- printRepository(clasz);
- AField[] fields = clasz.fields();
- for (int i = 0; i < fields.length; i++) printField(fields[i]);
- AMethod[] methods = clasz.methods();
- for (int i = 0; i < methods.length; i++) printMethod(methods[i]);
- return rbrace();
- }
-
- /** Prints the class modifiers. */
- public ATreePrinter printClassModifiers(AClass clasz) {
- if (clasz.isDeprecated()) print("deprecated").space();
- if (clasz.isSynthetic()) print("synthetic").space();
- if (clasz.isPublic()) print("public").space();
- if (clasz.isPrivate()) print("private").space();
- if (clasz.isProtected()) print("protected").space();
- if (clasz.isFinal()) print("final").space();
- if (clasz.isAbstract()) print("abstract").space();
- return this;
- }
-
- /** Prints the member modifiers. */
- public ATreePrinter printMemberModifiers(AMember member) {
- if (member.isDeprecated()) print("deprecated").space();
- if (member.isSynthetic()) print("synthetic").space();
- if (member.isPublic()) print("public").space();
- if (member.isPrivate()) print("private").space();
- if (member.isProtected()) print("protected").space();
- if (member.isStatic()) print("static").space();
- return this;
- }
-
- /** Prints the member code. */
- public ATreePrinter printMemberCode(AMember member) {
- if (member.code() == ACode.Void) return this;
- return print('=').space().printCode(member.code());
- }
-
- /** Prints the field. */
- public ATreePrinter printField(AField field) {
- printFieldModifiers(field);
- symtab.printSignature(field.symbol()).space();
- return printMemberCode(field).line();
- }
-
- /** Prints the field modifiers. */
- public ATreePrinter printFieldModifiers(AField field) {
- printMemberModifiers(field);
- if (field.isFinal()) print("final").space();
- if (field.isVolatile()) print("volatile").space();
- if (field.isTransient()) print("transient").space();
- return this;
- }
-
- /** Prints the method. */
- public ATreePrinter printMethod(AMethod method) {
- printMethodModifiers(method);
- symtab.printSignature(method.symbol()).space();
- return printMemberCode(method).line();
- }
-
- /** Prints the method modifiers. */
- public ATreePrinter printMethodModifiers(AMethod method) {
- printMemberModifiers(method);
- if (method.isFinal()) print("final").space();
- if (method.isSynchronized()) print("synchronized").space();
- if (method.isNative()) print("native").space();
- if (method.isAbstract()) print("abstract").space();
- return this;
- }
-
- /** Prints the code. */
- public ATreePrinter printCode(ACode code) {
- switch (code) {
- case Void:
- return print("<void>");
- case This(Symbol clasz):
- return printSymbol(clasz).print('.').print("this");
- case Constant(AConstant constant):
- return printConstant(constant);
- case Load(ALocation location):
- return printLocation(location);
- case Store(ALocation location, ACode value):
- printLocation(location).space().print('=').space();
- return printCode(value);
- case Apply(AFunction function, Type[] targs, ACode[] vargs):
- printFunction(function);
- if (targs.length > 0){
- print('[');
- for (int i = 0; i < targs.length; i++)
- (i == 0 ? this : print(',').space()).printType(targs[i]);
- print(']');
- }
- print('(');
- for (int i = 0; i < vargs.length; i++)
- (i == 0 ? this : print(',').space()).printCode(vargs[i]);
- print(')');
- return this;
- case IsAs(ACode value, Type type, boolean cast):
- printCode(value).print('.').print(cast ? "as" : "is");
- return print('[').printType(type).print(']');
- case If(ACode test, ACode success, ACode failure):
- print("if").space().print('(').printCode(test).print(')').lbrace();
- printCode(success).line();
- rbrace().space().print("else").space().lbrace();
- printCode(failure).line();
- return rbrace();
- case Switch(ACode test, int[][] tags, ACode[] bodies):
- print("switch").space().print('(').printCode(test).print(')');
- lbrace();
- for (int i = 0; i < tags.length; i++) {
- for (int j = 0; j < tags[i].length; j++)
- print("case").space().print(tags[i][j]).print(':').line();
- indent().printCode(bodies[i]).undent().line();
- }
- print("case").space().print('_').print(':').line();
- indent().printCode(bodies[tags.length]).undent();
- return rbrace();
- case Synchronized(ACode lock, ACode value):
- print("synchronized").space();
- print('(').printCode(lock).print(')');
- return lbrace().printCode(value).rbrace();
- case Block(Symbol[] locals, ACode[] statements, ACode value):
- lbrace();
- for (int i = 0; i < locals.length; i++) {
- print("var").space().printSymbol(locals[i]);
- print(":").space().printType(locals[i].type());
- println(";");
- }
- for (int i = 0; i < statements.length; i++)
- printCode(statements[i]).println(';');
- return printCode(value).line().rbrace();
- case Label(Symbol label, Symbol[] locals, ACode value):
- print("label").space().printSymbol(label).print('(');
- for (int i = 0; i < locals.length; i++)
- (i == 0 ? this : print(',').space()).printSymbol(locals[i]);
- print(')').space().print('=').lbrace();
- return printCode(value).rbrace();
- case Goto(Symbol label, ACode[] vargs):
- print("goto").space().printSymbol(label).print('(');
- for (int i = 0; i < vargs.length; i++)
- (i == 0 ? this : print(',').space()).printCode(vargs[i]);
- return print(')');
- case Return(Symbol function, ACode value):
- print("return").symtab.printSymbolUniqueId(function).space();
- return printCode(value);
- case Throw(ACode value):
- return print("throw").space().printCode(value);
- case Drop(ACode value, Type type):
- print("drop").print('[').printType(type).print(']').space();
- return printCode(value);
- default:
- throw Debug.abort("unknown case", code);
- }
- }
-
- /** Prints the location. */
- public ATreePrinter printLocation(ALocation location) {
- switch (location) {
- case Module(Symbol module):
- return printSymbol(module);
- case Field(Void, Symbol field, true):
- return printSymbol(field.owner()).print('.').printSymbol(field);
- case Field(ACode object, Symbol field, boolean isStatic):
- printCode(object).print('.');
- if (isStatic) print("<static>").space();
- return printSymbol(field);
- case Local(Symbol local, _):
- return printSymbol(local);
- case ArrayItem(ACode array, ACode index):
- return printCode(array).print('(').printCode(index).print(')');
- default:
- throw Debug.abort("unknown case", location);
- }
- }
-
- /** Prints the function. */
- public ATreePrinter printFunction(AFunction function) {
- switch (function) {
- case Method(Void, Symbol method, AInvokeStyle.New):
- return print("new").space().printSymbol(method);
- case Method(Void, Symbol method, AInvokeStyle.Static(false)):
- return printSymbol(method.owner()).print('.').printSymbol(method);
- case Method(This(Symbol c), Symbol method, AInvokeStyle.Static(true)):
- printSymbol(c).print('.').print("super").print('.');
- return printSymbol(method);
- case Method(ACode object, Symbol method, AInvokeStyle style):
- printCode(object).print('.');
- if (style != AInvokeStyle.Dynamic) print("<" +style+ ">").space();
- return printSymbol(method);
- case Primitive(APrimitive primitive):
- return printPrimitive(primitive);
- case NewArray(Type element):
- return print("new").space().printType(element).print("[]");
- default:
- throw Debug.abort("unknown case", function);
- }
- }
-
- /** Prints the primitive. */
- public ATreePrinter printPrimitive(APrimitive primitive) {
- switch (primitive) {
- case Negation(ATypeKind kind):
- return printPrimitiveOp("NEG", kind);
- case Test(ATestOp op, ATypeKind kind, boolean zero):
- return printPrimitiveOp(op.toString() + (zero ? "Z" : ""), kind);
- case Comparison(AComparisonOp op, ATypeKind kind):
- return printPrimitiveOp(op.toString(), kind);
- case Arithmetic(AArithmeticOp op, ATypeKind kind):
- return printPrimitiveOp(op.toString(), kind);
- case Logical(ALogicalOp op, ATypeKind kind):
- return printPrimitiveOp(op.toString(), kind);
- case Shift(AShiftOp op, ATypeKind kind):
- return printPrimitiveOp(op.toString(), kind);
- case Conversion(ATypeKind src, ATypeKind dst):
- return printPrimitiveOp("CONV", src, dst);
- case ArrayLength(ATypeKind kind):
- return printPrimitiveOp("LENGTH", kind);
- case StringConcat(ATypeKind lf, ATypeKind rg):
- return printPrimitiveOp("CONCAT", lf, rg);
- default:
- throw Debug.abort("unknown case", primitive);
- }
- }
-
- /** Prints the primitive operation of given type kind. */
- public ATreePrinter printPrimitiveOp(String op, ATypeKind kind) {
- return printPrimitiveOp(op, kind, null);
- }
-
- /** Prints the primitive operation of given types. */
- public ATreePrinter printPrimitiveOp(String op, ATypeKind k1,ATypeKind k2){
- print('<').print(op).print('>');
- if (k1 != null && global.uniqid) print('#').print(k1.toString());
- if (k2 != null && global.uniqid) print(',').print(k2.toString());
- return this;
- }
-
- /** Prints the constant. */
- public ATreePrinter printConstant(AConstant constant) {
- switch (constant) {
- case UNIT:
- return print("()");
- case BOOLEAN(boolean value):
- return print(value);
- case BYTE(byte value):
- return print(value);
- case SHORT(short value):
- return print(value);
- case CHAR(char value):
- return print('\'').print(value).print('\'');
- case INT(int value):
- return print(value);
- case LONG(long value):
- return print(value);
- case FLOAT(float value):
- return print(value);
- case DOUBLE(double value):
- return print(value);
- case STRING(String value):
- return print('\"').print(SourceRepresentation.escape(value)).print('\"');
- case SYMBOL_NAME(Symbol value):
- return print('\"').print(SourceRepresentation.escape(value.name.toString())).print('\"');
- case NULL:
- return print("null");
- case ZERO:
- return print("<zero>");
- default:
- throw Debug.abort("unknown case", constant);
- }
- }
-
- //########################################################################
- // Public Methods - Converting
-
- /** Returns the string representation of this printer. */
- public String toString() {
- return printer.toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATreeTyper.java b/sources/scalac/atree/ATreeTyper.java
deleted file mode 100644
index 06133db15f..0000000000
--- a/sources/scalac/atree/ATreeTyper.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scala.tools.util.Position;
-
-import scalac.Global;
-import scalac.symtab.Definitions;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Name;
-
-/** This class implements an attributed tree typer. */
-public class ATreeTyper {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- public final Global global;
-
- /** The global definitions */
- private final Definitions definitions;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ATreeTyper(Global global, Definitions definitions) {
- this.global = global;
- this.definitions = definitions;
- }
-
- //########################################################################
- // Public Methods - Typing code
-
- /** Returns the types of the given codes. */
- public Type[] type(ACode[] codes) {
- Type[] types = new Type[codes.length];
- for (int i = 0; i < types.length; i++) types[i] = type(codes[i]);
- return types;
- }
-
- /** Returns the type of the given code. */
- public Type type(ACode code) {
- switch (code) {
- case Void:
- return definitions.void_TYPE();
- case This(Symbol clasz):
- return clasz.thisType();
- case Constant(AConstant constant):
- return type(constant);
- case Load(ALocation location):
- return type(location);
- case Store(_, _):
- return Type.NoType;
- case Apply(AFunction function, Type[] targs, _):
- return apply(type(function), targs).resultType();
- case IsAs(_, Type type, boolean cast):
- return cast ? type : definitions.boolean_TYPE();
- case If(_, ACode success, ACode failure):
- return Type.lub(new Type[]{type(success), type(failure)});
- case Switch(_, _, ACode[] bodies):
- return Type.lub(type(bodies));
- case Synchronized(_, ACode value):
- return type(value);
- case Block(_, _, ACode value):
- return type(value);
- case Label(Symbol label, _, _):
- return label.type().resultType();
- case Goto(_, _):
- return Type.NoType;
- case Return(_, _):
- return Type.NoType;
- case Throw(_):
- return Type.NoType;
- case Drop(_, _):
- return Type.NoType;
- default:
- throw Debug.abort("unknown case", code);
- }
- }
-
- //########################################################################
- // Public Methods - Typing value locations
-
- /** Returns the type of the given value location. */
- public Type type(ALocation location) {
- switch (location) {
- case Module(Symbol module):
- return module.thisType();
- case Field(Void, Symbol field, _):
- return field.owner().thisType().memberStabilizedType(field);
- case Field(ACode object, Symbol field, _):
- return type(object).memberStabilizedType(field);
- case Local(Symbol local, _):
- return local.type();
- case ArrayItem(ACode array, _):
- return getArrayElementType(type(array));
- default:
- throw Debug.abort("unknown case", location);
- }
- }
-
- //########################################################################
- // Public Methods - Typing function references
-
- /** Returns the type of the given function reference. */
- public Type type(AFunction function) {
- switch (function) {
- case Method(Void, Symbol method, AInvokeStyle style):
- Type type = method.owner().thisType().memberStabilizedType(method);
- if (style == AInvokeStyle.New) {
- assert method.isInitializer(): function;
- Symbol[] tparams = method.owner().typeParams();
- if (tparams.length != 0) type = Type.PolyType(tparams, type);
- }
- return type;
- case Method(ACode object, Symbol method, _):
- return type(object).memberStabilizedType(method);
- case Primitive(APrimitive primitive):
- return type(primitive);
- case NewArray(Type element):
- return definitions.array_TYPE(element);
- default:
- throw Debug.abort("unknown case", function);
- }
- }
-
- //########################################################################
- // Public Methods - Typing primitives
-
- /** Returns the type of the given primitive. */
- public Type type(APrimitive primitive) {
- switch (primitive) {
- case Negation(ATypeKind kind):
- Type type = type(kind);
- return getMethodType(type, type);
- case Test(_, ATypeKind kind, true):
- Type type = type(kind);
- return getMethodType(type, type(ATypeKind.BOOL));
- case Test(_, ATypeKind kind, false):
- Type type = type(kind);
- return getMethodType(type, type, type(ATypeKind.BOOL));
- case Comparison(_, ATypeKind kind):
- Type type = type(kind);
- return getMethodType(type, type, type(ATypeKind.I4));
- case Arithmetic(_, ATypeKind kind):
- Type type = type(kind);
- return getMethodType(type, type, type);
- case Logical(_, ATypeKind kind):
- Type type = type(kind);
- return getMethodType(type, type, type);
- case Shift(_, ATypeKind kind):
- Type type = type(kind);
- return getMethodType(type, type(ATypeKind.I4), type);
- case Conversion(ATypeKind src, ATypeKind dst):
- return getMethodType(type(src), type(dst));
- case ArrayLength(ATypeKind kind):
- Type type = definitions.array_TYPE(type(kind));
- return getMethodType(type, type(ATypeKind.I4));
- case StringConcat(ATypeKind lf, ATypeKind rg):
- return getMethodType(type(lf), type(rg), type(ATypeKind.STR));
- default:
- throw Debug.abort("unknown case", primitive);
- }
- }
-
- //########################################################################
- // Public Methods - Typing constants
-
- /** Returns the type of the given constant. */
- public Type type(AConstant constant) {
- Type base = basetype(constant);
- if (global.currentPhase.id > global.PHASE.ERASURE.id()) return base;
- return Type.ConstantType(base, constant);
- }
-
- /** Returns the base type of the given constant. */
- public Type basetype(AConstant constant) {
- switch (constant) {
- case UNIT : return definitions.void_TYPE(); // !!! -> UNIT_TYPE()
- case BOOLEAN(_): return definitions.boolean_TYPE();
- case BYTE(_) : return definitions.byte_TYPE();
- case SHORT(_) : return definitions.short_TYPE();
- case CHAR(_) : return definitions.char_TYPE();
- case INT(_) : return definitions.int_TYPE();
- case LONG(_) : return definitions.long_TYPE();
- case FLOAT(_) : return definitions.float_TYPE();
- case DOUBLE(_) : return definitions.double_TYPE();
- case SYMBOL_NAME(_):
- case STRING(_) : return definitions.STRING_TYPE();
- case NULL : return definitions.ALLREF_TYPE();
- case ZERO : return definitions.ALL_TYPE();
- default : throw Debug.abort("unknown case", constant);
- }
- }
-
- //########################################################################
- // Public Methods - Typing type kinds
-
- /** Returns the type of the given type kind. */
- public Type type(ATypeKind kind) {
- switch (kind) {
- case UNIT: return definitions.void_TYPE(); // !!! -> UNIT_TYPE()
- case BOOL: return definitions.boolean_TYPE();
- // !!! case U1 : return ?;
- case U2 : return definitions.char_TYPE();
- // !!! case U4 : return ?;
- // !!! case U8 : return ?;
- case I1 : return definitions.byte_TYPE();
- case I2 : return definitions.short_TYPE();
- case I4 : return definitions.int_TYPE();
- case I8 : return definitions.long_TYPE();
- case R4 : return definitions.float_TYPE();
- case R8 : return definitions.double_TYPE();
- case REF : return definitions.ANYREF_TYPE();
- case STR : return definitions.STRING_TYPE();
- case NULL: return definitions.ALLREF_TYPE();
- case ZERO: return definitions.ALL_TYPE();
- default : throw Debug.abort("unknown case", kind);
- }
- }
-
- //########################################################################
- // Public Methods - Aliases for scala
-
- public Type[] computeType(ACode[] codes) {
- return type(codes);
- }
-
- public Type computeType(ACode code) {
- return type(code);
- }
-
- public Type computeType(ALocation location) {
- return type(location);
- }
-
- public Type computeType(AFunction function) {
- return type(function);
- }
-
- public Type computeType(APrimitive primitive) {
- return type(primitive);
- }
-
- public Type computeType(AConstant constant) {
- return type(constant);
- }
-
- public Type computeType(ATypeKind kind) {
- return type(kind);
- }
-
- //########################################################################
- // Private Methods
-
- /** Returns the application of given arguments to given type. */
- private Type apply(Type type, Type[] targs) {
- switch (type) {
- case PolyType(Symbol[] tparams, Type result):
- return result.subst(tparams, targs);
- default:
- assert targs.length == 0: type + " -- " + Debug.show(targs);
- return type;
- }
- }
-
- /** Returns the element type of the given array type. */
- public Type getArrayElementType(Type type) { // !!! public / private
- switch (type) {
- case TypeRef(_, Symbol symbol, Type[] args):
- assert symbol == definitions.ARRAY_CLASS && args.length == 1: type;
- return args[0];
- case UnboxedArrayType(Type element):
- return element;
- default:
- throw Debug.abort("non-array type", type);
- }
- }
-
- /** Returns a method type with given argument and result types. */
- private Type getMethodType(Type targ1, Type result) {
- return getMethodType(new Type[]{targ1}, result);
- }
-
- /** Returns a method type with given argument and result types. */
- private Type getMethodType(Type targ1, Type targ2, Type result) {
- return getMethodType(new Type[]{targ1, targ2}, result);
- }
-
- /** Returns a method type with given argument and result types. */
- private Type getMethodType(Type[] targs, Type result) {
- Symbol[] tparams = new Symbol[targs.length];
- for (int i = 0; i < tparams.length; i++) {
- Name name = Name.fromString("v" + i);
- tparams[i] = Symbol.NONE.newTerm( // !!! should be newVParam
- Position.NOPOS, Modifiers.PARAM, name);
- tparams[i].setType(targs[i]);
- }
- return Type.MethodType(tparams, result);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/atree/ATypeKind.java b/sources/scalac/atree/ATypeKind.java
deleted file mode 100644
index 1be2eb540d..0000000000
--- a/sources/scalac/atree/ATypeKind.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.atree;
-
-import scalac.util.Debug;
-
-/** This class represents a type kind. */
-public class ATypeKind {
-
- //########################################################################
- // Public Cases
-
- /** The unit value */
- public case UNIT;
-
- /** A boolean value */
- public case BOOL;
-
- /** A 1-byte unsigned integer */
- public case U1;
-
- /** A 2-byte unsigned integer */
- public case U2;
-
- /** A 4-byte unsigned integer */
- public case U4;
-
- /** An 8-byte unsigned integer */
- public case U8;
-
- /** A 1-byte signed integer */
- public case I1;
-
- /** A 2-byte signed integer */
- public case I2;
-
- /** A 4-byte signed integer */
- public case I4;
-
- /** An 8-byte signed integer */
- public case I8;
-
- /** A 4-byte floating point number */
- public case R4;
-
- /** An 8-byte floating point number */
- public case R8;
-
- /** An object reference */
- public case REF;
-
- /** A string reference */
- public case STR;
-
- /** The null reference */
- public case NULL;
-
- /** The zero value */
- public case ZERO;
-
- //########################################################################
- // Public Methods
-
- /** Returns a string representation of this type kind. */
- public String toString() {
- switch (this) {
- case UNIT: return "UNIT";
- case BOOL: return "BOOL";
- case U1 : return "U1";
- case U2 : return "U2";
- case U4 : return "U4";
- case U8 : return "U8";
- case I1 : return "I1";
- case I2 : return "I2";
- case I4 : return "I4";
- case I8 : return "I8";
- case R4 : return "R4";
- case R8 : return "R8";
- case REF : return "REF";
- case STR : return "STR";
- case NULL: return "NULL";
- case ZERO: return "ZERO";
- default : throw Debug.abort("unknown case", this);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/backend/Primitive.java b/sources/scalac/backend/Primitive.java
deleted file mode 100644
index 2c55a68dc8..0000000000
--- a/sources/scalac/backend/Primitive.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// Old$Id$
-// $Id$
-
-package scalac.backend;
-
-import scalac.util.Debug;
-
-/**
- * Primitive functions.
- *
- * @author Michel Schinz, Philippe Altherr
- * @version 1.0
- */
-
-public class Primitive {
-
- // Non-primitive operations
- public case NOT_A_PRIMITIVE; // not a primitive
-
- // Arithmetic unary operations
- public case POS; // +x
- public case NEG; // -x
- public case NOT; // ~x
-
- // Arithmetic binary operations
- public case ADD; // x + y
- public case SUB; // x - y
- public case MUL; // x * y
- public case DIV; // x / y
- public case MOD; // x % y
-
- // Bitwise operations
- public case OR; // x | y
- public case XOR; // x ^ y
- public case AND; // x & y
-
- // Shift operations
- public case LSL; // x << y
- public case LSR; // x >>> y
- public case ASR; // x >> y
-
- // Comparison operations
- public case ID; // x eq y
- public case NI; // x ne y
- public case EQ; // x == y
- public case NE; // x != y
- public case LT; // x < y
- public case LE; // x <= y
- public case GE; // x > y
- public case GT; // x >= y
-
- // Boolean unary operations
- public case ZNOT; // !x
-
- // Boolean binary operations
- public case ZOR; // x || y
- public case ZAND; // x && y
-
- // Array operations
- public case LENGTH; // x.length
- public case APPLY; // x(y)
- public case UPDATE; // x(y) = z
-
- // Any operations
- public case IS; // x.is[y]
- public case AS; // x.as[y]
- public case EQUALS; // x.equals(y)
- public case HASHCODE; // x.hashcode()
- public case TOSTRING; // x.toString()
-
- // AnyRef operations
- public case SYNCHRONIZED; // x.synchronized(y)
-
- // String operations
- public case CONCAT; // String.valueOf(x)+String.valueOf(y)
-
- // Throwable operations
- public case THROW; // throw x
-
- // Value types conversions
- public case COERCE; // x.coerce()
-
- // RunTime operations
- public case BOX; // RunTime.box_<X>(x)
- public case UNBOX; // RunTime.unbox_<X>(x)
- public case NEW_ZARRAY; // RunTime.zarray(x)
- public case NEW_BARRAY; // RunTime.barray(x)
- public case NEW_SARRAY; // RunTime.sarray(x)
- public case NEW_CARRAY; // RunTime.carray(x)
- public case NEW_IARRAY; // RunTime.iarray(x)
- public case NEW_LARRAY; // RunTime.larray(x)
- public case NEW_FARRAY; // RunTime.farray(x)
- public case NEW_DARRAY; // RunTime.darray(x)
- public case NEW_OARRAY; // RunTime.oarray(x)
- public case ZARRAY_LENGTH; // RunTime.zarray_length(x)
- public case BARRAY_LENGTH; // RunTime.barray_length(x)
- public case SARRAY_LENGTH; // RunTime.sarray_length(x)
- public case CARRAY_LENGTH; // RunTime.carray_length(x)
- public case IARRAY_LENGTH; // RunTime.iarray_length(x)
- public case LARRAY_LENGTH; // RunTime.larray_length(x)
- public case FARRAY_LENGTH; // RunTime.farray_length(x)
- public case DARRAY_LENGTH; // RunTime.darray_length(x)
- public case OARRAY_LENGTH; // RunTime.oarray_length(x)
- public case ZARRAY_GET; // RunTime.zarray_get(x,y)
- public case BARRAY_GET; // RunTime.barray_get(x,y)
- public case SARRAY_GET; // RunTime.sarray_get(x,y)
- public case CARRAY_GET; // RunTime.carray_get(x,y)
- public case IARRAY_GET; // RunTime.iarray_get(x,y)
- public case LARRAY_GET; // RunTime.larray_get(x,y)
- public case FARRAY_GET; // RunTime.farray_get(x,y)
- public case DARRAY_GET; // RunTime.darray_get(x,y)
- public case OARRAY_GET; // RunTime.oarray_get(x,y)
- public case ZARRAY_SET; // RunTime.zarray(x,y,z)
- public case BARRAY_SET; // RunTime.barray(x,y,z)
- public case SARRAY_SET; // RunTime.sarray(x,y,z)
- public case CARRAY_SET; // RunTime.carray(x,y,z)
- public case IARRAY_SET; // RunTime.iarray(x,y,z)
- public case LARRAY_SET; // RunTime.larray(x,y,z)
- public case FARRAY_SET; // RunTime.farray(x,y,z)
- public case DARRAY_SET; // RunTime.darray(x,y,z)
- public case OARRAY_SET; // RunTime.oarray(x,y,z)
-
- public case B2B; // RunTime.b2b(x)
- public case B2S; // RunTime.b2s(x)
- public case B2C; // RunTime.b2c(x)
- public case B2I; // RunTime.b2i(x)
- public case B2L; // RunTime.b2l(x)
- public case B2F; // RunTime.b2f(x)
- public case B2D; // RunTime.b2d(x)
- public case S2B; // RunTime.s2b(x)
- public case S2S; // RunTime.s2s(x)
- public case S2C; // RunTime.s2c(x)
- public case S2I; // RunTime.s2i(x)
- public case S2L; // RunTime.s2l(x)
- public case S2F; // RunTime.s2f(x)
- public case S2D; // RunTime.s2d(x)
- public case C2B; // RunTime.c2b(x)
- public case C2S; // RunTime.c2s(x)
- public case C2C; // RunTime.c2c(x)
- public case C2I; // RunTime.c2i(x)
- public case C2L; // RunTime.c2l(x)
- public case C2F; // RunTime.c2f(x)
- public case C2D; // RunTime.c2d(x)
- public case I2B; // RunTime.i2b(x)
- public case I2S; // RunTime.i2s(x)
- public case I2C; // RunTime.i2c(x)
- public case I2I; // RunTime.i2i(x)
- public case I2L; // RunTime.i2l(x)
- public case I2F; // RunTime.i2f(x)
- public case I2D; // RunTime.i2d(x)
- public case L2B; // RunTime.l2b(x)
- public case L2S; // RunTime.l2s(x)
- public case L2C; // RunTime.l2c(x)
- public case L2I; // RunTime.l2i(x)
- public case L2L; // RunTime.l2l(x)
- public case L2F; // RunTime.l2f(x)
- public case L2D; // RunTime.l2d(x)
- public case F2B; // RunTime.f2b(x)
- public case F2S; // RunTime.f2s(x)
- public case F2C; // RunTime.f2c(x)
- public case F2I; // RunTime.f2i(x)
- public case F2L; // RunTime.f2l(x)
- public case F2F; // RunTime.f2f(x)
- public case F2D; // RunTime.f2d(x)
- public case D2B; // RunTime.d2b(x)
- public case D2S; // RunTime.d2s(x)
- public case D2C; // RunTime.d2c(x)
- public case D2I; // RunTime.d2i(x)
- public case D2L; // RunTime.d2l(x)
- public case D2F; // RunTime.d2f(x)
- public case D2D; // RunTime.d2d(x)
-
- /** Return negated version of comparison primitive. */
- public Primitive negate() {
- switch (this) {
- case LT: return Primitive.GE;
- case LE: return Primitive.GT;
- case EQ: return Primitive.NE;
- case NE: return Primitive.EQ;
- case GE: return Primitive.LT;
- case GT: return Primitive.LE;
- default: throw Debug.abort("unknown primitive", this);
- }
- }
-
- /** Return primitive with arguments swapped (e.g. <= is turned
- ** into =>). */
- public Primitive swap() {
- switch (this) {
- case LT: return Primitive.GT;
- case LE: return Primitive.GE;
- case EQ: return Primitive.EQ;
- case NE: return Primitive.NE;
- case GE: return Primitive.LE;
- case GT: return Primitive.LT;
- default: throw Debug.abort("unknown primitive", this);
- }
- }
-}
diff --git a/sources/scalac/backend/Primitives.java b/sources/scalac/backend/Primitives.java
deleted file mode 100644
index fb2b49a3b0..0000000000
--- a/sources/scalac/backend/Primitives.java
+++ /dev/null
@@ -1,1304 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Primitives.java,v 1.12 2002/11/19 12:01:11 paltherr Exp $
-// $Id$
-
-package scalac.backend;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.Global;
-import scalac.symtab.Definitions;
-import scalac.symtab.TypeTags;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolNameWriter;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Debug;
-
-/**
- * Primitive functions.
- *
- * @author Michel Schinz, Philippe Altherr
- * @version 1.0
- */
-
-public class Primitives {
-
- //########################################################################
- // Primitives constants
-
- private static final Name RUNTIME_N = Name.fromString("RunTime");
-
- private static final Name ZARRAY_N = Name.fromString("zarray");
- private static final Name BARRAY_N = Name.fromString("barray");
- private static final Name SARRAY_N = Name.fromString("sarray");
- private static final Name CARRAY_N = Name.fromString("carray");
- private static final Name IARRAY_N = Name.fromString("iarray");
- private static final Name LARRAY_N = Name.fromString("larray");
- private static final Name FARRAY_N = Name.fromString("farray");
- private static final Name DARRAY_N = Name.fromString("darray");
- private static final Name OARRAY_N = Name.fromString("oarray");
-
- private static final Name ZARRAY_LENGTH_N=Name.fromString("zarray_length");
- private static final Name BARRAY_LENGTH_N=Name.fromString("barray_length");
- private static final Name SARRAY_LENGTH_N=Name.fromString("sarray_length");
- private static final Name CARRAY_LENGTH_N=Name.fromString("carray_length");
- private static final Name IARRAY_LENGTH_N=Name.fromString("iarray_length");
- private static final Name LARRAY_LENGTH_N=Name.fromString("larray_length");
- private static final Name FARRAY_LENGTH_N=Name.fromString("farray_length");
- private static final Name DARRAY_LENGTH_N=Name.fromString("darray_length");
- private static final Name OARRAY_LENGTH_N=Name.fromString("oarray_length");
-
- private static final Name ZARRAY_GET_N = Name.fromString("zarray_get");
- private static final Name BARRAY_GET_N = Name.fromString("barray_get");
- private static final Name SARRAY_GET_N = Name.fromString("sarray_get");
- private static final Name CARRAY_GET_N = Name.fromString("carray_get");
- private static final Name IARRAY_GET_N = Name.fromString("iarray_get");
- private static final Name LARRAY_GET_N = Name.fromString("larray_get");
- private static final Name FARRAY_GET_N = Name.fromString("farray_get");
- private static final Name DARRAY_GET_N = Name.fromString("darray_get");
- private static final Name OARRAY_GET_N = Name.fromString("oarray_get");
-
- private static final Name ZARRAY_SET_N = Name.fromString("zarray_set");
- private static final Name BARRAY_SET_N = Name.fromString("barray_set");
- private static final Name SARRAY_SET_N = Name.fromString("sarray_set");
- private static final Name CARRAY_SET_N = Name.fromString("carray_set");
- private static final Name IARRAY_SET_N = Name.fromString("iarray_set");
- private static final Name LARRAY_SET_N = Name.fromString("larray_set");
- private static final Name FARRAY_SET_N = Name.fromString("farray_set");
- private static final Name DARRAY_SET_N = Name.fromString("darray_set");
- private static final Name OARRAY_SET_N = Name.fromString("oarray_set");
-
- private static final Name BOX_UVALUE_N = Name.fromString("box_uvalue");
- private static final Name BOX_ZVALUE_N = Name.fromString("box_zvalue");
- private static final Name BOX_BVALUE_N = Name.fromString("box_bvalue");
- private static final Name BOX_SVALUE_N = Name.fromString("box_svalue");
- private static final Name BOX_CVALUE_N = Name.fromString("box_cvalue");
- private static final Name BOX_IVALUE_N = Name.fromString("box_ivalue");
- private static final Name BOX_LVALUE_N = Name.fromString("box_lvalue");
- private static final Name BOX_FVALUE_N = Name.fromString("box_fvalue");
- private static final Name BOX_DVALUE_N = Name.fromString("box_dvalue");
-
- private static final Name BOX_ZARRAY_N = Name.fromString("box_zarray");
- private static final Name BOX_BARRAY_N = Name.fromString("box_barray");
- private static final Name BOX_SARRAY_N = Name.fromString("box_sarray");
- private static final Name BOX_CARRAY_N = Name.fromString("box_carray");
- private static final Name BOX_IARRAY_N = Name.fromString("box_iarray");
- private static final Name BOX_LARRAY_N = Name.fromString("box_larray");
- private static final Name BOX_FARRAY_N = Name.fromString("box_farray");
- private static final Name BOX_DARRAY_N = Name.fromString("box_darray");
- private static final Name BOX_OARRAY_N = Name.fromString("box_oarray");
- private static final Name BOX__ARRAY_N = Name.fromString("box__array");
-
- private static final Name UNBOX_UVALUE_N = Name.fromString("unbox_uvalue");
- private static final Name UNBOX_ZVALUE_N = Name.fromString("unbox_zvalue");
- private static final Name UNBOX_BVALUE_N = Name.fromString("unbox_bvalue");
- private static final Name UNBOX_SVALUE_N = Name.fromString("unbox_svalue");
- private static final Name UNBOX_CVALUE_N = Name.fromString("unbox_cvalue");
- private static final Name UNBOX_IVALUE_N = Name.fromString("unbox_ivalue");
- private static final Name UNBOX_LVALUE_N = Name.fromString("unbox_lvalue");
- private static final Name UNBOX_FVALUE_N = Name.fromString("unbox_fvalue");
- private static final Name UNBOX_DVALUE_N = Name.fromString("unbox_dvalue");
-
- private static final Name UNBOX_ZARRAY_N = Name.fromString("unbox_zarray");
- private static final Name UNBOX_BARRAY_N = Name.fromString("unbox_barray");
- private static final Name UNBOX_SARRAY_N = Name.fromString("unbox_sarray");
- private static final Name UNBOX_CARRAY_N = Name.fromString("unbox_carray");
- private static final Name UNBOX_IARRAY_N = Name.fromString("unbox_iarray");
- private static final Name UNBOX_LARRAY_N = Name.fromString("unbox_larray");
- private static final Name UNBOX_FARRAY_N = Name.fromString("unbox_farray");
- private static final Name UNBOX_DARRAY_N = Name.fromString("unbox_darray");
- private static final Name UNBOX_OARRAY_N = Name.fromString("unbox_oarray");
- private static final Name UNBOX__ARRAY_N = Name.fromString("unbox__array");
-
- private static final Name B2B_N = Name.fromString("b2b");
- private static final Name B2S_N = Name.fromString("b2s");
- private static final Name B2C_N = Name.fromString("b2c");
- private static final Name B2I_N = Name.fromString("b2i");
- private static final Name B2L_N = Name.fromString("b2l");
- private static final Name B2F_N = Name.fromString("b2f");
- private static final Name B2D_N = Name.fromString("b2d");
- private static final Name S2B_N = Name.fromString("s2b");
- private static final Name S2S_N = Name.fromString("s2s");
- private static final Name S2C_N = Name.fromString("s2c");
- private static final Name S2I_N = Name.fromString("s2i");
- private static final Name S2L_N = Name.fromString("s2l");
- private static final Name S2F_N = Name.fromString("s2f");
- private static final Name S2D_N = Name.fromString("s2d");
- private static final Name C2B_N = Name.fromString("c2b");
- private static final Name C2S_N = Name.fromString("c2s");
- private static final Name C2C_N = Name.fromString("c2c");
- private static final Name C2I_N = Name.fromString("c2i");
- private static final Name C2L_N = Name.fromString("c2l");
- private static final Name C2F_N = Name.fromString("c2f");
- private static final Name C2D_N = Name.fromString("c2d");
- private static final Name I2B_N = Name.fromString("i2b");
- private static final Name I2S_N = Name.fromString("i2s");
- private static final Name I2C_N = Name.fromString("i2c");
- private static final Name I2I_N = Name.fromString("i2i");
- private static final Name I2L_N = Name.fromString("i2l");
- private static final Name I2F_N = Name.fromString("i2f");
- private static final Name I2D_N = Name.fromString("i2d");
- private static final Name L2B_N = Name.fromString("l2b");
- private static final Name L2S_N = Name.fromString("l2s");
- private static final Name L2C_N = Name.fromString("l2c");
- private static final Name L2I_N = Name.fromString("l2i");
- private static final Name L2L_N = Name.fromString("l2l");
- private static final Name L2F_N = Name.fromString("l2f");
- private static final Name L2D_N = Name.fromString("l2d");
- private static final Name F2B_N = Name.fromString("f2b");
- private static final Name F2S_N = Name.fromString("f2s");
- private static final Name F2C_N = Name.fromString("f2c");
- private static final Name F2I_N = Name.fromString("f2i");
- private static final Name F2L_N = Name.fromString("f2l");
- private static final Name F2F_N = Name.fromString("f2f");
- private static final Name F2D_N = Name.fromString("f2d");
- private static final Name D2B_N = Name.fromString("d2b");
- private static final Name D2S_N = Name.fromString("d2s");
- private static final Name D2C_N = Name.fromString("d2c");
- private static final Name D2I_N = Name.fromString("d2i");
- private static final Name D2L_N = Name.fromString("d2l");
- private static final Name D2F_N = Name.fromString("d2f");
- private static final Name D2D_N = Name.fromString("d2d");
-
- //########################################################################
- // Primitives state
-
- private final Global global;
- private final Definitions definitions;
- private final Map/*<Symbol,Primitive>*/ primitives;
- private final SymbolNameWriter jreNameWriter;
- private final SymbolNameWriter clrNameWriter;
-
- public final Symbol RUNTIME;
-
- public final Symbol NEW_ZARRAY;
- public final Symbol NEW_BARRAY;
- public final Symbol NEW_SARRAY;
- public final Symbol NEW_CARRAY;
- public final Symbol NEW_IARRAY;
- public final Symbol NEW_LARRAY;
- public final Symbol NEW_FARRAY;
- public final Symbol NEW_DARRAY;
- public final Symbol NEW_OARRAY;
-
- public final Symbol ZARRAY_LENGTH;
- public final Symbol BARRAY_LENGTH;
- public final Symbol SARRAY_LENGTH;
- public final Symbol CARRAY_LENGTH;
- public final Symbol IARRAY_LENGTH;
- public final Symbol LARRAY_LENGTH;
- public final Symbol FARRAY_LENGTH;
- public final Symbol DARRAY_LENGTH;
- public final Symbol OARRAY_LENGTH;
-
- public final Symbol ZARRAY_GET;
- public final Symbol BARRAY_GET;
- public final Symbol SARRAY_GET;
- public final Symbol CARRAY_GET;
- public final Symbol IARRAY_GET;
- public final Symbol LARRAY_GET;
- public final Symbol FARRAY_GET;
- public final Symbol DARRAY_GET;
- public final Symbol OARRAY_GET;
-
- public final Symbol ZARRAY_SET;
- public final Symbol BARRAY_SET;
- public final Symbol SARRAY_SET;
- public final Symbol CARRAY_SET;
- public final Symbol IARRAY_SET;
- public final Symbol LARRAY_SET;
- public final Symbol FARRAY_SET;
- public final Symbol DARRAY_SET;
- public final Symbol OARRAY_SET;
-
- public final Symbol BOX_UVALUE;
- public final Symbol BOX_ZVALUE;
- public final Symbol BOX_BVALUE;
- public final Symbol BOX_SVALUE;
- public final Symbol BOX_CVALUE;
- public final Symbol BOX_IVALUE;
- public final Symbol BOX_LVALUE;
- public final Symbol BOX_FVALUE;
- public final Symbol BOX_DVALUE;
-
- public final Symbol BOX_ZARRAY;
- public final Symbol BOX_BARRAY;
- public final Symbol BOX_SARRAY;
- public final Symbol BOX_CARRAY;
- public final Symbol BOX_IARRAY;
- public final Symbol BOX_LARRAY;
- public final Symbol BOX_FARRAY;
- public final Symbol BOX_DARRAY;
- public final Symbol BOX_OARRAY;
- public final Symbol BOX__ARRAY;
-
- public final Symbol UNBOX_UVALUE;
- public final Symbol UNBOX_ZVALUE;
- public final Symbol UNBOX_BVALUE;
- public final Symbol UNBOX_SVALUE;
- public final Symbol UNBOX_CVALUE;
- public final Symbol UNBOX_IVALUE;
- public final Symbol UNBOX_LVALUE;
- public final Symbol UNBOX_FVALUE;
- public final Symbol UNBOX_DVALUE;
-
- public final Symbol UNBOX_ZARRAY;
- public final Symbol UNBOX_BARRAY;
- public final Symbol UNBOX_SARRAY;
- public final Symbol UNBOX_CARRAY;
- public final Symbol UNBOX_IARRAY;
- public final Symbol UNBOX_LARRAY;
- public final Symbol UNBOX_FARRAY;
- public final Symbol UNBOX_DARRAY;
- public final Symbol UNBOX_OARRAY;
- public final Symbol UNBOX__ARRAY;
-
- public final Symbol B2B;
- public final Symbol B2S;
- public final Symbol B2C;
- public final Symbol B2I;
- public final Symbol B2L;
- public final Symbol B2F;
- public final Symbol B2D;
- public final Symbol S2B;
- public final Symbol S2S;
- public final Symbol S2C;
- public final Symbol S2I;
- public final Symbol S2L;
- public final Symbol S2F;
- public final Symbol S2D;
- public final Symbol C2B;
- public final Symbol C2S;
- public final Symbol C2C;
- public final Symbol C2I;
- public final Symbol C2L;
- public final Symbol C2F;
- public final Symbol C2D;
- public final Symbol I2B;
- public final Symbol I2S;
- public final Symbol I2C;
- public final Symbol I2I;
- public final Symbol I2L;
- public final Symbol I2F;
- public final Symbol I2D;
- public final Symbol L2B;
- public final Symbol L2S;
- public final Symbol L2C;
- public final Symbol L2I;
- public final Symbol L2L;
- public final Symbol L2F;
- public final Symbol L2D;
- public final Symbol F2B;
- public final Symbol F2S;
- public final Symbol F2C;
- public final Symbol F2I;
- public final Symbol F2L;
- public final Symbol F2F;
- public final Symbol F2D;
- public final Symbol D2B;
- public final Symbol D2S;
- public final Symbol D2C;
- public final Symbol D2I;
- public final Symbol D2L;
- public final Symbol D2F;
- public final Symbol D2D;
-
- //########################################################################
- // Primitives constructor
-
- public Primitives(Global global) {
- this.global = global;
- this.definitions = global.definitions;
- this.primitives = new HashMap();
- this.jreNameWriter = new SymbolNameWriter().setClassSeparator('$');
- this.clrNameWriter = new SymbolNameWriter();
- this.RUNTIME = definitions.getModule("scala.runtime.RunTime");
- this.NEW_ZARRAY = getUniqueTerm(RUNTIME, ZARRAY_N);
- this.NEW_BARRAY = getUniqueTerm(RUNTIME, BARRAY_N);
- this.NEW_SARRAY = getUniqueTerm(RUNTIME, SARRAY_N);
- this.NEW_CARRAY = getUniqueTerm(RUNTIME, CARRAY_N);
- this.NEW_IARRAY = getUniqueTerm(RUNTIME, IARRAY_N);
- this.NEW_LARRAY = getUniqueTerm(RUNTIME, LARRAY_N);
- this.NEW_FARRAY = getUniqueTerm(RUNTIME, FARRAY_N);
- this.NEW_DARRAY = getUniqueTerm(RUNTIME, DARRAY_N);
- this.NEW_OARRAY = getUniqueTerm(RUNTIME, OARRAY_N);
- this.ZARRAY_LENGTH = getUniqueTerm(RUNTIME, ZARRAY_LENGTH_N);
- this.BARRAY_LENGTH = getUniqueTerm(RUNTIME, BARRAY_LENGTH_N);
- this.SARRAY_LENGTH = getUniqueTerm(RUNTIME, SARRAY_LENGTH_N);
- this.CARRAY_LENGTH = getUniqueTerm(RUNTIME, CARRAY_LENGTH_N);
- this.IARRAY_LENGTH = getUniqueTerm(RUNTIME, IARRAY_LENGTH_N);
- this.LARRAY_LENGTH = getUniqueTerm(RUNTIME, LARRAY_LENGTH_N);
- this.FARRAY_LENGTH = getUniqueTerm(RUNTIME, FARRAY_LENGTH_N);
- this.DARRAY_LENGTH = getUniqueTerm(RUNTIME, DARRAY_LENGTH_N);
- this.OARRAY_LENGTH = getUniqueTerm(RUNTIME, OARRAY_LENGTH_N);
- this.ZARRAY_GET = getUniqueTerm(RUNTIME, ZARRAY_GET_N);
- this.BARRAY_GET = getUniqueTerm(RUNTIME, BARRAY_GET_N);
- this.SARRAY_GET = getUniqueTerm(RUNTIME, SARRAY_GET_N);
- this.CARRAY_GET = getUniqueTerm(RUNTIME, CARRAY_GET_N);
- this.IARRAY_GET = getUniqueTerm(RUNTIME, IARRAY_GET_N);
- this.LARRAY_GET = getUniqueTerm(RUNTIME, LARRAY_GET_N);
- this.FARRAY_GET = getUniqueTerm(RUNTIME, FARRAY_GET_N);
- this.DARRAY_GET = getUniqueTerm(RUNTIME, DARRAY_GET_N);
- this.OARRAY_GET = getUniqueTerm(RUNTIME, OARRAY_GET_N);
- this.ZARRAY_SET = getUniqueTerm(RUNTIME, ZARRAY_SET_N);
- this.BARRAY_SET = getUniqueTerm(RUNTIME, BARRAY_SET_N);
- this.SARRAY_SET = getUniqueTerm(RUNTIME, SARRAY_SET_N);
- this.CARRAY_SET = getUniqueTerm(RUNTIME, CARRAY_SET_N);
- this.IARRAY_SET = getUniqueTerm(RUNTIME, IARRAY_SET_N);
- this.LARRAY_SET = getUniqueTerm(RUNTIME, LARRAY_SET_N);
- this.FARRAY_SET = getUniqueTerm(RUNTIME, FARRAY_SET_N);
- this.DARRAY_SET = getUniqueTerm(RUNTIME, DARRAY_SET_N);
- this.OARRAY_SET = getUniqueTerm(RUNTIME, OARRAY_SET_N);
- this.BOX_UVALUE = getUniqueTerm(RUNTIME, BOX_UVALUE_N);
- this.BOX_ZVALUE = getUniqueTerm(RUNTIME, BOX_ZVALUE_N);
- this.BOX_BVALUE = getUniqueTerm(RUNTIME, BOX_BVALUE_N);
- this.BOX_SVALUE = getUniqueTerm(RUNTIME, BOX_SVALUE_N);
- this.BOX_CVALUE = getUniqueTerm(RUNTIME, BOX_CVALUE_N);
- this.BOX_IVALUE = getUniqueTerm(RUNTIME, BOX_IVALUE_N);
- this.BOX_LVALUE = getUniqueTerm(RUNTIME, BOX_LVALUE_N);
- this.BOX_FVALUE = getUniqueTerm(RUNTIME, BOX_FVALUE_N);
- this.BOX_DVALUE = getUniqueTerm(RUNTIME, BOX_DVALUE_N);
- this.BOX_ZARRAY = getUniqueTerm(RUNTIME, BOX_ZARRAY_N);
- this.BOX_BARRAY = getUniqueTerm(RUNTIME, BOX_BARRAY_N);
- this.BOX_SARRAY = getUniqueTerm(RUNTIME, BOX_SARRAY_N);
- this.BOX_CARRAY = getUniqueTerm(RUNTIME, BOX_CARRAY_N);
- this.BOX_IARRAY = getUniqueTerm(RUNTIME, BOX_IARRAY_N);
- this.BOX_LARRAY = getUniqueTerm(RUNTIME, BOX_LARRAY_N);
- this.BOX_FARRAY = getUniqueTerm(RUNTIME, BOX_FARRAY_N);
- this.BOX_DARRAY = getUniqueTerm(RUNTIME, BOX_DARRAY_N);
- this.BOX_OARRAY = getUniqueTerm(RUNTIME, BOX_OARRAY_N);
- this.BOX__ARRAY = getUniqueTerm(RUNTIME, BOX__ARRAY_N);
- this.UNBOX_UVALUE = getUniqueTerm(RUNTIME, UNBOX_UVALUE_N);
- this.UNBOX_ZVALUE = getUniqueTerm(RUNTIME, UNBOX_ZVALUE_N);
- this.UNBOX_BVALUE = getUniqueTerm(RUNTIME, UNBOX_BVALUE_N);
- this.UNBOX_SVALUE = getUniqueTerm(RUNTIME, UNBOX_SVALUE_N);
- this.UNBOX_CVALUE = getUniqueTerm(RUNTIME, UNBOX_CVALUE_N);
- this.UNBOX_IVALUE = getUniqueTerm(RUNTIME, UNBOX_IVALUE_N);
- this.UNBOX_LVALUE = getUniqueTerm(RUNTIME, UNBOX_LVALUE_N);
- this.UNBOX_FVALUE = getUniqueTerm(RUNTIME, UNBOX_FVALUE_N);
- this.UNBOX_DVALUE = getUniqueTerm(RUNTIME, UNBOX_DVALUE_N);
- this.UNBOX_ZARRAY = getUniqueTerm(RUNTIME, UNBOX_ZARRAY_N);
- this.UNBOX_BARRAY = getUniqueTerm(RUNTIME, UNBOX_BARRAY_N);
- this.UNBOX_SARRAY = getUniqueTerm(RUNTIME, UNBOX_SARRAY_N);
- this.UNBOX_CARRAY = getUniqueTerm(RUNTIME, UNBOX_CARRAY_N);
- this.UNBOX_IARRAY = getUniqueTerm(RUNTIME, UNBOX_IARRAY_N);
- this.UNBOX_LARRAY = getUniqueTerm(RUNTIME, UNBOX_LARRAY_N);
- this.UNBOX_FARRAY = getUniqueTerm(RUNTIME, UNBOX_FARRAY_N);
- this.UNBOX_DARRAY = getUniqueTerm(RUNTIME, UNBOX_DARRAY_N);
- this.UNBOX_OARRAY = getUniqueTerm(RUNTIME, UNBOX_OARRAY_N);
- this.UNBOX__ARRAY = getUniqueTerm(RUNTIME, UNBOX__ARRAY_N);
- this.B2B = getUniqueTerm(RUNTIME, B2B_N);
- this.B2S = getUniqueTerm(RUNTIME, B2S_N);
- this.B2C = getUniqueTerm(RUNTIME, B2C_N);
- this.B2I = getUniqueTerm(RUNTIME, B2I_N);
- this.B2L = getUniqueTerm(RUNTIME, B2L_N);
- this.B2F = getUniqueTerm(RUNTIME, B2F_N);
- this.B2D = getUniqueTerm(RUNTIME, B2D_N);
- this.S2B = getUniqueTerm(RUNTIME, S2B_N);
- this.S2S = getUniqueTerm(RUNTIME, S2S_N);
- this.S2C = getUniqueTerm(RUNTIME, S2C_N);
- this.S2I = getUniqueTerm(RUNTIME, S2I_N);
- this.S2L = getUniqueTerm(RUNTIME, S2L_N);
- this.S2F = getUniqueTerm(RUNTIME, S2F_N);
- this.S2D = getUniqueTerm(RUNTIME, S2D_N);
- this.C2B = getUniqueTerm(RUNTIME, C2B_N);
- this.C2S = getUniqueTerm(RUNTIME, C2S_N);
- this.C2C = getUniqueTerm(RUNTIME, C2C_N);
- this.C2I = getUniqueTerm(RUNTIME, C2I_N);
- this.C2L = getUniqueTerm(RUNTIME, C2L_N);
- this.C2F = getUniqueTerm(RUNTIME, C2F_N);
- this.C2D = getUniqueTerm(RUNTIME, C2D_N);
- this.I2B = getUniqueTerm(RUNTIME, I2B_N);
- this.I2S = getUniqueTerm(RUNTIME, I2S_N);
- this.I2C = getUniqueTerm(RUNTIME, I2C_N);
- this.I2I = getUniqueTerm(RUNTIME, I2I_N);
- this.I2L = getUniqueTerm(RUNTIME, I2L_N);
- this.I2F = getUniqueTerm(RUNTIME, I2F_N);
- this.I2D = getUniqueTerm(RUNTIME, I2D_N);
- this.L2B = getUniqueTerm(RUNTIME, L2B_N);
- this.L2S = getUniqueTerm(RUNTIME, L2S_N);
- this.L2C = getUniqueTerm(RUNTIME, L2C_N);
- this.L2I = getUniqueTerm(RUNTIME, L2I_N);
- this.L2L = getUniqueTerm(RUNTIME, L2L_N);
- this.L2F = getUniqueTerm(RUNTIME, L2F_N);
- this.L2D = getUniqueTerm(RUNTIME, L2D_N);
- this.F2B = getUniqueTerm(RUNTIME, F2B_N);
- this.F2S = getUniqueTerm(RUNTIME, F2S_N);
- this.F2C = getUniqueTerm(RUNTIME, F2C_N);
- this.F2I = getUniqueTerm(RUNTIME, F2I_N);
- this.F2L = getUniqueTerm(RUNTIME, F2L_N);
- this.F2F = getUniqueTerm(RUNTIME, F2F_N);
- this.F2D = getUniqueTerm(RUNTIME, F2D_N);
- this.D2B = getUniqueTerm(RUNTIME, D2B_N);
- this.D2S = getUniqueTerm(RUNTIME, D2S_N);
- this.D2C = getUniqueTerm(RUNTIME, D2C_N);
- this.D2I = getUniqueTerm(RUNTIME, D2I_N);
- this.D2L = getUniqueTerm(RUNTIME, D2L_N);
- this.D2F = getUniqueTerm(RUNTIME, D2F_N);
- this.D2D = getUniqueTerm(RUNTIME, D2D_N);
- initPrimitives();
- }
-
- //########################################################################
- // Private interface
-
- private Symbol getUniqueTerm(Symbol owner, Name name) {
- Symbol symbol = getTerm(owner, name);
- assert !symbol.isOverloaded() :
- Debug.show(owner) + "." + name + " -> " + Debug.show(symbol);
- return symbol;
- }
-
- private Symbol getTerm(Symbol owner, Name name) {
- Symbol symbol = owner.lookup(name);
- assert symbol != Symbol.NONE : Debug.show(owner) + "." + name;
- return symbol;
- }
-
- private void initPrimitives() {
- Definitions defs = definitions;
-
- // scala.Any
- addPrimitive(defs.ANY_IS_ERASED, Primitive.IS);
- addPrimitive(defs.ANY_AS_ERASED, Primitive.AS);
- addPrimitive(defs.ANY_EQEQ, Primitive.EQ);
- addPrimitive(defs.ANY_BANGEQ, Primitive.NE);
- // !!! addPrimitive(defs.ANY_EQUALS, Primitive.EQUALS);
- addPrimitive(defs.ANY_HASHCODE, Primitive.HASHCODE);
- addPrimitive(defs.ANY_TOSTRING, Primitive.TOSTRING);
-
- // scala.Unit
- addAll(defs.UNIT_CLASS, Names.EQ, Primitive.EQ, 1);
- addAll(defs.UNIT_CLASS, Names.NE, Primitive.NE, 1);
- addAll(defs.UNIT_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.UNIT_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.UNIT_CLASS, Names.toString, Primitive.TOSTRING, 1);
- // !!! addAll(defs.UNIT_CLASS, Names.ADD, Primitive.CONCAT, 1);
-
- // scala.Boolean
- //addAll(defs.BOOLEAN_CLASS, Names.EQ, Primitive.EQ, 2);
- addAllPrimitive(defs.BOOLEAN_CLASS, Names.EQ, Primitive.EQ, 1);
- //addAll(defs.BOOLEAN_CLASS, Names.NE, Primitive.NE, 2);
- addAllPrimitive(defs.BOOLEAN_CLASS, Names.NE, Primitive.NE, 1);
- addAll(defs.BOOLEAN_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.BOOLEAN_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.BOOLEAN_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.BOOLEAN_CLASS, Names.ZNOT, Primitive.ZNOT, 1);
- addAll(defs.BOOLEAN_CLASS, Names.OR, Primitive.OR, 1);
- addAll(defs.BOOLEAN_CLASS, Names.XOR, Primitive.XOR, 1);
- addAll(defs.BOOLEAN_CLASS, Names.AND, Primitive.AND, 1);
- addAll(defs.BOOLEAN_CLASS, Names.ZOR, Primitive.ZOR, 1);
- addAll(defs.BOOLEAN_CLASS, Names.ZAND, Primitive.ZAND, 1);
- // !!! addAll(defs.BOOLEAN_CLASS, Names.ADD, Primitive.CONCAT, 1);
-
- // scala.Byte
- addAll(defs.BYTE_CLASS, Names.coerce, Primitive.COERCE, 5);
- //addAll(defs.BYTE_CLASS, Names.EQ, Primitive.EQ, 5);
- addAllPrimitive(defs.BYTE_CLASS, Names.EQ, Primitive.EQ, 7);
- //addAll(defs.BYTE_CLASS, Names.NE, Primitive.NE, 5);
- addAllPrimitive(defs.BYTE_CLASS, Names.NE, Primitive.NE, 7);
- //addAll(defs.BYTE_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.BYTE_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.BYTE_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.BYTE_CLASS, Names.NOT, Primitive.NOT, 1);
- addAdd(defs.BYTE_CLASS, 7);
- addSub(defs.BYTE_CLASS, 7);
- addAll(defs.BYTE_CLASS, Names.MUL, Primitive.MUL, 7);
- addAll(defs.BYTE_CLASS, Names.DIV, Primitive.DIV, 7);
- addAll(defs.BYTE_CLASS, Names.MOD, Primitive.MOD, 7);
- addAll(defs.BYTE_CLASS, Names.LT, Primitive.LT, 7);
- addAll(defs.BYTE_CLASS, Names.LE, Primitive.LE, 7);
- addAll(defs.BYTE_CLASS, Names.GT, Primitive.GT, 7);
- addAll(defs.BYTE_CLASS, Names.GE, Primitive.GE, 7);
- addAll(defs.BYTE_CLASS, Names.OR, Primitive.OR, 5);
- addAll(defs.BYTE_CLASS, Names.XOR, Primitive.XOR, 5);
- addAll(defs.BYTE_CLASS, Names.AND, Primitive.AND, 5);
- addAll(defs.BYTE_CLASS, Names.LSL, Primitive.LSL, 2);
- addAll(defs.BYTE_CLASS, Names.LSR, Primitive.LSR, 2);
- addAll(defs.BYTE_CLASS, Names.ASR, Primitive.ASR, 2);
-
- // scala.Short
- addAll(defs.SHORT_CLASS, Names.coerce, Primitive.COERCE, 4);
- //addAll(defs.SHORT_CLASS, Names.EQ, Primitive.EQ, 5);
- addAllPrimitive(defs.SHORT_CLASS, Names.EQ, Primitive.EQ, 7);
- //addAll(defs.SHORT_CLASS, Names.NE, Primitive.NE, 5);
- addAllPrimitive(defs.SHORT_CLASS, Names.NE, Primitive.NE, 7);
- //addAll(defs.SHORT_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.SHORT_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.SHORT_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.SHORT_CLASS, Names.NOT, Primitive.NOT, 1);
- addAdd(defs.SHORT_CLASS, 7);
- addSub(defs.SHORT_CLASS, 7);
- addAll(defs.SHORT_CLASS, Names.MUL, Primitive.MUL, 7);
- addAll(defs.SHORT_CLASS, Names.DIV, Primitive.DIV, 7);
- addAll(defs.SHORT_CLASS, Names.MOD, Primitive.MOD, 7);
- addAll(defs.SHORT_CLASS, Names.LT, Primitive.LT, 7);
- addAll(defs.SHORT_CLASS, Names.LE, Primitive.LE, 7);
- addAll(defs.SHORT_CLASS, Names.GT, Primitive.GT, 7);
- addAll(defs.SHORT_CLASS, Names.GE, Primitive.GE, 7);
- addAll(defs.SHORT_CLASS, Names.OR, Primitive.OR, 5);
- addAll(defs.SHORT_CLASS, Names.XOR, Primitive.XOR, 5);
- addAll(defs.SHORT_CLASS, Names.AND, Primitive.AND, 5);
- addAll(defs.SHORT_CLASS, Names.LSL, Primitive.LSL, 2);
- addAll(defs.SHORT_CLASS, Names.LSR, Primitive.LSR, 2);
- addAll(defs.SHORT_CLASS, Names.ASR, Primitive.ASR, 2);
-
- // scala.Char
- addAll(defs.CHAR_CLASS, Names.coerce, Primitive.COERCE, 4);
- //addAll(defs.CHAR_CLASS, Names.EQ, Primitive.EQ, 5);
- addAllPrimitive(defs.CHAR_CLASS, Names.EQ, Primitive.EQ, 7);
- //addAll(defs.CHAR_CLASS, Names.NE, Primitive.NE, 5);
- addAllPrimitive(defs.CHAR_CLASS, Names.NE, Primitive.NE, 7);
- //addAll(defs.CHAR_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.CHAR_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.CHAR_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.CHAR_CLASS, Names.NOT, Primitive.NOT, 1);
- addAdd(defs.CHAR_CLASS, 7);
- addSub(defs.CHAR_CLASS, 7);
- addAll(defs.CHAR_CLASS, Names.MUL, Primitive.MUL, 7);
- addAll(defs.CHAR_CLASS, Names.DIV, Primitive.DIV, 7);
- addAll(defs.CHAR_CLASS, Names.MOD, Primitive.MOD, 7);
- addAll(defs.CHAR_CLASS, Names.LT, Primitive.LT, 7);
- addAll(defs.CHAR_CLASS, Names.LE, Primitive.LE, 7);
- addAll(defs.CHAR_CLASS, Names.GT, Primitive.GT, 7);
- addAll(defs.CHAR_CLASS, Names.GE, Primitive.GE, 7);
- addAll(defs.CHAR_CLASS, Names.OR, Primitive.OR, 5);
- addAll(defs.CHAR_CLASS, Names.XOR, Primitive.XOR, 5);
- addAll(defs.CHAR_CLASS, Names.AND, Primitive.AND, 5);
- addAll(defs.CHAR_CLASS, Names.LSL, Primitive.LSL, 2);
- addAll(defs.CHAR_CLASS, Names.LSR, Primitive.LSR, 2);
- addAll(defs.CHAR_CLASS, Names.ASR, Primitive.ASR, 2);
-
- // scala.Int
- addAll(defs.INT_CLASS, Names.coerce, Primitive.COERCE, 3);
- //addAll(defs.INT_CLASS, Names.EQ, Primitive.EQ, 5);
- addAllPrimitive(defs.INT_CLASS, Names.EQ, Primitive.EQ, 7);
- //addAll(defs.INT_CLASS, Names.NE, Primitive.NE, 5);
- addAllPrimitive(defs.INT_CLASS, Names.NE, Primitive.NE, 7);
- //addAll(defs.INT_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.INT_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.INT_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.INT_CLASS, Names.NOT, Primitive.NOT, 1);
- addAdd(defs.INT_CLASS, 7);
- addSub(defs.INT_CLASS, 7);
- addAll(defs.INT_CLASS, Names.MUL, Primitive.MUL, 7);
- addAll(defs.INT_CLASS, Names.DIV, Primitive.DIV, 7);
- addAll(defs.INT_CLASS, Names.MOD, Primitive.MOD, 7);
- addAll(defs.INT_CLASS, Names.LT, Primitive.LT, 7);
- addAll(defs.INT_CLASS, Names.LE, Primitive.LE, 7);
- addAll(defs.INT_CLASS, Names.GT, Primitive.GT, 7);
- addAll(defs.INT_CLASS, Names.GE, Primitive.GE, 7);
- addAll(defs.INT_CLASS, Names.OR, Primitive.OR, 5);
- addAll(defs.INT_CLASS, Names.XOR, Primitive.XOR, 5);
- addAll(defs.INT_CLASS, Names.AND, Primitive.AND, 5);
- addAll(defs.INT_CLASS, Names.LSL, Primitive.LSL, 2);
- addAll(defs.INT_CLASS, Names.LSR, Primitive.LSR, 2);
- addAll(defs.INT_CLASS, Names.ASR, Primitive.ASR, 2);
-
- // scala.Long
- addAll(defs.LONG_CLASS, Names.coerce, Primitive.COERCE, 2);
- //addAll(defs.LONG_CLASS, Names.EQ, Primitive.EQ, 4);
- addAllPrimitive(defs.LONG_CLASS, Names.EQ, Primitive.EQ, 7);
- //addAll(defs.LONG_CLASS, Names.NE, Primitive.NE, 4);
- addAllPrimitive(defs.LONG_CLASS, Names.NE, Primitive.NE, 7);
- //addAll(defs.LONG_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.LONG_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.LONG_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.LONG_CLASS, Names.NOT, Primitive.NOT, 1);
- addAdd(defs.LONG_CLASS, 7);
- addSub(defs.LONG_CLASS, 7);
- addAll(defs.LONG_CLASS, Names.MUL, Primitive.MUL, 7);
- addAll(defs.LONG_CLASS, Names.DIV, Primitive.DIV, 7);
- addAll(defs.LONG_CLASS, Names.MOD, Primitive.MOD, 7);
- addAll(defs.LONG_CLASS, Names.LT, Primitive.LT, 7);
- addAll(defs.LONG_CLASS, Names.LE, Primitive.LE, 7);
- addAll(defs.LONG_CLASS, Names.GT, Primitive.GT, 7);
- addAll(defs.LONG_CLASS, Names.GE, Primitive.GE, 7);
- addAll(defs.LONG_CLASS, Names.OR, Primitive.OR, 5);
- addAll(defs.LONG_CLASS, Names.XOR, Primitive.XOR, 5);
- addAll(defs.LONG_CLASS, Names.AND, Primitive.AND, 5);
- addAll(defs.LONG_CLASS, Names.LSL, Primitive.LSL, 2);
- addAll(defs.LONG_CLASS, Names.LSR, Primitive.LSR, 2);
- addAll(defs.LONG_CLASS, Names.ASR, Primitive.ASR, 2);
-
- // scala.Float
- addAll(defs.FLOAT_CLASS, Names.coerce, Primitive.COERCE, 1);
- //addAll(defs.FLOAT_CLASS, Names.EQ, Primitive.EQ, 3);
- addAllPrimitive(defs.FLOAT_CLASS, Names.EQ, Primitive.EQ, 2);
- //addAll(defs.FLOAT_CLASS, Names.NE, Primitive.NE, 3);
- addAllPrimitive(defs.FLOAT_CLASS, Names.NE, Primitive.NE, 2);
- //addAll(defs.FLOAT_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.FLOAT_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.FLOAT_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAdd(defs.FLOAT_CLASS, 2);
- addSub(defs.FLOAT_CLASS, 2);
- addAll(defs.FLOAT_CLASS, Names.MUL, Primitive.MUL, 2);
- addAll(defs.FLOAT_CLASS, Names.DIV, Primitive.DIV, 2);
- addAll(defs.FLOAT_CLASS, Names.MOD, Primitive.MOD, 2);
- addAll(defs.FLOAT_CLASS, Names.LT, Primitive.LT, 2);
- addAll(defs.FLOAT_CLASS, Names.LE, Primitive.LE, 2);
- addAll(defs.FLOAT_CLASS, Names.GT, Primitive.GT, 2);
- addAll(defs.FLOAT_CLASS, Names.GE, Primitive.GE, 2);
-
- // scala.Double
- //addAll(defs.DOUBLE_CLASS, Names.EQ, Primitive.EQ, 2);
- addAllPrimitive(defs.DOUBLE_CLASS, Names.EQ, Primitive.EQ, 1);
- //addAll(defs.DOUBLE_CLASS, Names.NE, Primitive.NE, 2);
- addAllPrimitive(defs.DOUBLE_CLASS, Names.NE, Primitive.NE, 1);
- //addAll(defs.DOUBLE_CLASS, Names.equals, Primitive.EQUALS, 1);
- addAll(defs.DOUBLE_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- addAll(defs.DOUBLE_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAdd(defs.DOUBLE_CLASS, 1);
- addSub(defs.DOUBLE_CLASS, 1);
- addAll(defs.DOUBLE_CLASS, Names.MUL, Primitive.MUL, 1);
- addAll(defs.DOUBLE_CLASS, Names.DIV, Primitive.DIV, 1);
- addAll(defs.DOUBLE_CLASS, Names.MOD, Primitive.MOD, 1);
- addAll(defs.DOUBLE_CLASS, Names.LT, Primitive.LT, 1);
- addAll(defs.DOUBLE_CLASS, Names.LE, Primitive.LE, 1);
- addAll(defs.DOUBLE_CLASS, Names.GT, Primitive.GT, 1);
- addAll(defs.DOUBLE_CLASS, Names.GE, Primitive.GE, 1);
-
- // scala.Object
- addPrimitive(defs.OBJECT_EQ, Primitive.ID);
- addPrimitive(defs.OBJECT_NE, Primitive.NI);
- addPrimitive(defs.OBJECT_SYNCHRONIZED, Primitive.SYNCHRONIZED);
-
- // scala.String
- addPrimitive(defs.STRING_PLUS, Primitive.CONCAT);
-
- // scala.Throwable
- addPrimitive(defs.THROWABLE_THROW, Primitive.THROW);
-
- // scala.Array
- // !!! addAll(defs.ARRAY_CLASS, defs.EQEQ_N, Primitive.EQ, 1);
- // !!! addAll(defs.ARRAY_CLASS, defs.BANGEQ_N, Primitive.NE, 1);
- // !!! addAll(defs.ARRAY_CLASS, Names.equals, Primitive.EQUALS, 1);
- // !!! addAll(defs.ARRAY_CLASS, Names.hashCode, Primitive.HASHCODE, 1);
- // !!! addAll(defs.ARRAY_CLASS, Names.toString, Primitive.TOSTRING, 1);
- addAll(defs.ARRAY_CLASS, Names.length, Primitive.LENGTH, 1);
- addAll(defs.ARRAY_CLASS, Names.apply, Primitive.APPLY, 1);
- addAll(defs.ARRAY_CLASS, Names.update, Primitive.UPDATE, 1);
-
- // scala.runtime.RunTime
- addPrimitive(BOX_UVALUE, Primitive.BOX);
- addPrimitive(BOX_ZVALUE, Primitive.BOX);
- addPrimitive(BOX_BVALUE, Primitive.BOX);
- addPrimitive(BOX_SVALUE, Primitive.BOX);
- addPrimitive(BOX_CVALUE, Primitive.BOX);
- addPrimitive(BOX_IVALUE, Primitive.BOX);
- addPrimitive(BOX_LVALUE, Primitive.BOX);
- addPrimitive(BOX_FVALUE, Primitive.BOX);
- addPrimitive(BOX_DVALUE, Primitive.BOX);
- addPrimitive(BOX_ZARRAY, Primitive.BOX);
- addPrimitive(BOX_BARRAY, Primitive.BOX);
- addPrimitive(BOX_SARRAY, Primitive.BOX);
- addPrimitive(BOX_CARRAY, Primitive.BOX);
- addPrimitive(BOX_IARRAY, Primitive.BOX);
- addPrimitive(BOX_LARRAY, Primitive.BOX);
- addPrimitive(BOX_FARRAY, Primitive.BOX);
- addPrimitive(BOX_DARRAY, Primitive.BOX);
- addPrimitive(BOX_OARRAY, Primitive.BOX);
- addPrimitive(BOX__ARRAY, Primitive.BOX);
- addPrimitive(UNBOX_UVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_ZVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_BVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_SVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_CVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_IVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_LVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_FVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_DVALUE, Primitive.UNBOX);
- addPrimitive(UNBOX_ZARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_BARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_SARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_CARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_IARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_LARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_FARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_DARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX_OARRAY, Primitive.UNBOX);
- addPrimitive(UNBOX__ARRAY, Primitive.UNBOX);
- addPrimitive(B2B, Primitive.B2B);
- addPrimitive(B2S, Primitive.B2S);
- addPrimitive(B2C, Primitive.B2C);
- addPrimitive(B2I, Primitive.B2I);
- addPrimitive(B2L, Primitive.B2L);
- addPrimitive(B2F, Primitive.B2F);
- addPrimitive(B2D, Primitive.B2D);
- addPrimitive(S2B, Primitive.S2B);
- addPrimitive(S2S, Primitive.S2S);
- addPrimitive(S2C, Primitive.S2C);
- addPrimitive(S2I, Primitive.S2I);
- addPrimitive(S2L, Primitive.S2L);
- addPrimitive(S2F, Primitive.S2F);
- addPrimitive(S2D, Primitive.S2D);
- addPrimitive(C2B, Primitive.C2B);
- addPrimitive(C2S, Primitive.C2S);
- addPrimitive(C2C, Primitive.C2C);
- addPrimitive(C2I, Primitive.C2I);
- addPrimitive(C2L, Primitive.C2L);
- addPrimitive(C2F, Primitive.C2F);
- addPrimitive(C2D, Primitive.C2D);
- addPrimitive(I2B, Primitive.I2B);
- addPrimitive(I2S, Primitive.I2S);
- addPrimitive(I2C, Primitive.I2C);
- addPrimitive(I2I, Primitive.I2I);
- addPrimitive(I2L, Primitive.I2L);
- addPrimitive(I2F, Primitive.I2F);
- addPrimitive(I2D, Primitive.I2D);
- addPrimitive(L2B, Primitive.L2B);
- addPrimitive(L2S, Primitive.L2S);
- addPrimitive(L2C, Primitive.L2C);
- addPrimitive(L2I, Primitive.L2I);
- addPrimitive(L2L, Primitive.L2L);
- addPrimitive(L2F, Primitive.L2F);
- addPrimitive(L2D, Primitive.L2D);
- addPrimitive(F2B, Primitive.F2B);
- addPrimitive(F2S, Primitive.F2S);
- addPrimitive(F2C, Primitive.F2C);
- addPrimitive(F2I, Primitive.F2I);
- addPrimitive(F2L, Primitive.F2L);
- addPrimitive(F2F, Primitive.F2F);
- addPrimitive(F2D, Primitive.F2D);
- addPrimitive(D2B, Primitive.D2B);
- addPrimitive(D2S, Primitive.D2S);
- addPrimitive(D2C, Primitive.D2C);
- addPrimitive(D2I, Primitive.D2I);
- addPrimitive(D2L, Primitive.D2L);
- addPrimitive(D2F, Primitive.D2F);
- addPrimitive(D2D, Primitive.D2D);
- addPrimitive(NEW_ZARRAY, Primitive.NEW_ZARRAY);
- addPrimitive(NEW_BARRAY, Primitive.NEW_BARRAY);
- addPrimitive(NEW_SARRAY, Primitive.NEW_SARRAY);
- addPrimitive(NEW_CARRAY, Primitive.NEW_CARRAY);
- addPrimitive(NEW_IARRAY, Primitive.NEW_IARRAY);
- addPrimitive(NEW_LARRAY, Primitive.NEW_LARRAY);
- addPrimitive(NEW_FARRAY, Primitive.NEW_FARRAY);
- addPrimitive(NEW_DARRAY, Primitive.NEW_DARRAY);
- addPrimitive(NEW_OARRAY, Primitive.NEW_OARRAY);
- addPrimitive(ZARRAY_LENGTH, Primitive.ZARRAY_LENGTH);
- addPrimitive(BARRAY_LENGTH, Primitive.BARRAY_LENGTH);
- addPrimitive(SARRAY_LENGTH, Primitive.SARRAY_LENGTH);
- addPrimitive(CARRAY_LENGTH, Primitive.CARRAY_LENGTH);
- addPrimitive(IARRAY_LENGTH, Primitive.IARRAY_LENGTH);
- addPrimitive(LARRAY_LENGTH, Primitive.LARRAY_LENGTH);
- addPrimitive(FARRAY_LENGTH, Primitive.FARRAY_LENGTH);
- addPrimitive(DARRAY_LENGTH, Primitive.DARRAY_LENGTH);
- addPrimitive(OARRAY_LENGTH, Primitive.OARRAY_LENGTH);
- addPrimitive(ZARRAY_GET, Primitive.ZARRAY_GET);
- addPrimitive(BARRAY_GET, Primitive.BARRAY_GET);
- addPrimitive(SARRAY_GET, Primitive.SARRAY_GET);
- addPrimitive(CARRAY_GET, Primitive.CARRAY_GET);
- addPrimitive(IARRAY_GET, Primitive.IARRAY_GET);
- addPrimitive(LARRAY_GET, Primitive.LARRAY_GET);
- addPrimitive(FARRAY_GET, Primitive.FARRAY_GET);
- addPrimitive(DARRAY_GET, Primitive.DARRAY_GET);
- addPrimitive(OARRAY_GET, Primitive.OARRAY_GET);
- addPrimitive(ZARRAY_SET, Primitive.ZARRAY_SET);
- addPrimitive(BARRAY_SET, Primitive.BARRAY_SET);
- addPrimitive(SARRAY_SET, Primitive.SARRAY_SET);
- addPrimitive(CARRAY_SET, Primitive.CARRAY_SET);
- addPrimitive(IARRAY_SET, Primitive.IARRAY_SET);
- addPrimitive(LARRAY_SET, Primitive.LARRAY_SET);
- addPrimitive(FARRAY_SET, Primitive.FARRAY_SET);
- addPrimitive(DARRAY_SET, Primitive.DARRAY_SET);
- addPrimitive(OARRAY_SET, Primitive.OARRAY_SET);
- }
-
- private void addAdd(Symbol clasz, int count) {
- Name name = Names.ADD;
- Symbol symbol = clasz.lookup(name);
- assert !symbol.isNone(): Debug.show(clasz) + "." + name;
- Symbol[] alts = symbol.alternativeSymbols();
- boolean unary = false;
- boolean concat = false;
- for (int i = 0; i < alts.length; i++) {
- switch (alts[i].type()) {
- case MethodType(Symbol[] vparams, _):
- assert vparams.length == 1: alts[i].type();
- if (vparams[0].type().isSameAs(definitions.STRING_TYPE())) {
- addPrimitive(alts[i], Primitive.CONCAT);
- assert !concat;
- concat = true;
- } else {
- addPrimitive(alts[i], Primitive.ADD);
- count--;
- }
- break;
- case PolyType(Symbol[] tparams, _):
- addPrimitive(alts[i], Primitive.POS);
- assert !unary;
- unary = true;
- break;
- default:
- throw Debug.abort("illegal case" , alts[i].type());
- }
- }
- assert count == 0 && unary && concat: count+" - "+unary+" - "+concat;
- }
-
- private void addSub(Symbol clasz, int count) {
- Name name = Names.SUB;
- Symbol symbol = clasz.lookup(name);
- assert !symbol.isNone(): Debug.show(clasz) + "." + name;
- Symbol[] alts = symbol.alternativeSymbols();
- boolean unary = false;
- for (int i = 0; i < alts.length; i++) {
- switch (alts[i].type()) {
- case MethodType(_, _):
- addPrimitive(alts[i], Primitive.SUB);
- count--;
- break;
- case PolyType(_, _):
- addPrimitive(alts[i], Primitive.NEG);
- assert !unary;
- unary = true;
- break;
- default:
- throw Debug.abort("illegal case" , alts[i].type());
- }
- }
- assert count == 0 && unary: count + " - " + unary;
- }
-
- private void addAll(Symbol clasz,Name name,Primitive primitive,int count) {
- Symbol symbol = clasz.lookup(name);
- assert symbol != Symbol.NONE : Debug.show(clasz) + "." + name;
- Symbol[] alts = symbol.alternativeSymbols();
- assert count == alts.length : count + " != " + alts.length;
- for (int i = 0; i < alts.length; i++) addPrimitive(alts[i], primitive);
- }
-
- private void addAllPrimitive(Symbol clasz, Name name, Primitive primitive, int count) {
- Symbol symbol = clasz.lookup(name);
- assert symbol != Symbol.NONE : Debug.show(clasz) + "." + name;
- Symbol[] alts = symbol.alternativeSymbols();
- int cnt = 0;
- loop:
- for (int i = 0; i < alts.length; i++) {
- switch (alts[i].info()) {
- case MethodType(Symbol[] vparams, _):
- for (int j = 0; j < vparams.length; j++) {
- if (!isValueType(vparams[j].info()))
- continue loop;
- }
- addPrimitive(alts[i], primitive);
- cnt++;
- break;
- }
- }
- assert cnt == count : "" + cnt + " != " + count;
- }
-
- private boolean isValueType(Type t) {
- return t.isSubType(definitions.ANYVAL_TYPE());
- }
-
- private void addPrimitive(Symbol symbol, Primitive primitive) {
- assert !primitives.containsKey(symbol) : Debug.show(symbol);
- primitives.put(symbol, primitive);
- }
-
- //########################################################################
- // Primitives interface - general primitives
-
- /** Return true iff the given symbol refers to a primitive. */
- public boolean isPrimitive(Symbol symbol) {
- return primitives.containsKey(symbol);
- }
-
- /** Return primitive identified by the symbol. */
- public Primitive getPrimitive(Symbol symbol) {
- Object value = primitives.get(symbol);
- return value == null ? Primitive.NOT_A_PRIMITIVE : (Primitive)value;
- }
-
- //########################################################################
- // Primitives interface - array creation primitives
-
- /** Return array creation method for elements of the given kind. */
- public Symbol getNewArraySymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return NEW_ZARRAY;
- case TypeTags.BYTE : return NEW_BARRAY;
- case TypeTags.SHORT : return NEW_SARRAY;
- case TypeTags.CHAR : return NEW_CARRAY;
- case TypeTags.INT : return NEW_IARRAY;
- case TypeTags.LONG : return NEW_LARRAY;
- case TypeTags.FLOAT : return NEW_FARRAY;
- case TypeTags.DOUBLE : return NEW_DARRAY;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
- // Primitives interface - boxing primitives
-
- /** Return box method for values of the given type. */
- public Symbol getBoxValueSymbol(Type type) {
- switch (type) {
- case UnboxedType(int kind):
- return getBoxValueSymbol(kind);
- case UnboxedArrayType(Type elemtp):
- return getBoxArraySymbol(elemtp);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Return box method for values of the given kind. */
- public Symbol getBoxValueSymbol(int kind) {
- switch (kind) {
- case TypeTags.UNIT : return BOX_UVALUE;
- case TypeTags.BOOLEAN: return BOX_ZVALUE;
- case TypeTags.BYTE : return BOX_BVALUE;
- case TypeTags.SHORT : return BOX_SVALUE;
- case TypeTags.CHAR : return BOX_CVALUE;
- case TypeTags.INT : return BOX_IVALUE;
- case TypeTags.LONG : return BOX_LVALUE;
- case TypeTags.FLOAT : return BOX_FVALUE;
- case TypeTags.DOUBLE : return BOX_DVALUE;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- /** Return box method for arrays of elements of the given type. */
- public Symbol getBoxArraySymbol(Type type) {
- switch (type) {
- case UnboxedType(int kind):
- return getBoxArraySymbol(kind);
- default:
- return BOX_OARRAY;
- }
- }
-
- /** Return box method for arrays of elements of the given kind. */
- public Symbol getBoxArraySymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return BOX_ZARRAY;
- case TypeTags.BYTE : return BOX_BARRAY;
- case TypeTags.SHORT : return BOX_SARRAY;
- case TypeTags.CHAR : return BOX_CARRAY;
- case TypeTags.INT : return BOX_IARRAY;
- case TypeTags.LONG : return BOX_LARRAY;
- case TypeTags.FLOAT : return BOX_FARRAY;
- case TypeTags.DOUBLE : return BOX_DARRAY;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
- // Primitives interface - unboxing primitives
-
- /** Return unbox method returning values of the given type. */
- public Symbol getUnboxValueSymbol(Type type) {
- switch (type) {
- case UnboxedType(int kind):
- return getUnboxValueSymbol(kind);
- case UnboxedArrayType(Type elemtp):
- return getUnboxArraySymbol(elemtp);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Return unbox method returning values of the given kind. */
- public Symbol getUnboxValueSymbol(int kind) {
- switch (kind) {
- case TypeTags.UNIT : return UNBOX_UVALUE;
- case TypeTags.BOOLEAN: return UNBOX_ZVALUE;
- case TypeTags.BYTE : return UNBOX_BVALUE;
- case TypeTags.SHORT : return UNBOX_SVALUE;
- case TypeTags.CHAR : return UNBOX_CVALUE;
- case TypeTags.INT : return UNBOX_IVALUE;
- case TypeTags.LONG : return UNBOX_LVALUE;
- case TypeTags.FLOAT : return UNBOX_FVALUE;
- case TypeTags.DOUBLE : return UNBOX_DVALUE;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- /** Return unbox method returning arrays of elements of the given type. */
- public Symbol getUnboxArraySymbol(Type type) {
- switch (type) {
- case UnboxedType(int kind):
- return getUnboxArraySymbol(kind);
- default:
- return UNBOX_OARRAY;
- }
- }
-
- /** Return unbox method returning arrays of elements of the given kind. */
- public Symbol getUnboxArraySymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return UNBOX_ZARRAY;
- case TypeTags.BYTE : return UNBOX_BARRAY;
- case TypeTags.SHORT : return UNBOX_SARRAY;
- case TypeTags.CHAR : return UNBOX_CARRAY;
- case TypeTags.INT : return UNBOX_IARRAY;
- case TypeTags.LONG : return UNBOX_LARRAY;
- case TypeTags.FLOAT : return UNBOX_FARRAY;
- case TypeTags.DOUBLE : return UNBOX_DARRAY;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
- // Primitives interface - conversion primitives
-
- /** Return conversion method for given types. */
- public Symbol getConvertSymbol(Type from, Type to) {
- switch (from) {
- case UnboxedType(int kind):
- return getConvertSymbol(kind, to);
- default:
- throw Debug.abort("illegal case", from);
- }
- }
-
- /** Return conversion method for given type and type kind. */
- public Symbol getConvertSymbol(Type from, int to) {
- switch (from) {
- case UnboxedType(int kind):
- return getConvertSymbol(kind, to);
- default:
- throw Debug.abort("illegal case", from);
- }
- }
-
- /** Return conversion method for given type kind and type. */
- public Symbol getConvertSymbol(int from, Type to) {
- switch (to) {
- case UnboxedType(int kind):
- return getConvertSymbol(from, kind);
- default:
- throw Debug.abort("illegal case", to);
- }
- }
-
- /** Return conversion method for given kind types. */
- public Symbol getConvertSymbol(int from, int to) {
- switch (from) {
- case TypeTags.BYTE :
- switch (to) {
- case TypeTags.BYTE : return B2B;
- case TypeTags.SHORT : return B2S;
- case TypeTags.CHAR : return B2C;
- case TypeTags.INT : return B2I;
- case TypeTags.LONG : return B2L;
- case TypeTags.FLOAT : return B2F;
- case TypeTags.DOUBLE : return B2D;
- } break;
- case TypeTags.SHORT :
- switch (to) {
- case TypeTags.BYTE : return S2B;
- case TypeTags.SHORT : return S2S;
- case TypeTags.CHAR : return S2C;
- case TypeTags.INT : return S2I;
- case TypeTags.LONG : return S2L;
- case TypeTags.FLOAT : return S2F;
- case TypeTags.DOUBLE : return S2D;
- } break;
- case TypeTags.CHAR :
- switch (to) {
- case TypeTags.BYTE : return C2B;
- case TypeTags.SHORT : return C2S;
- case TypeTags.CHAR : return C2C;
- case TypeTags.INT : return C2I;
- case TypeTags.LONG : return C2L;
- case TypeTags.FLOAT : return C2F;
- case TypeTags.DOUBLE : return C2D;
- } break;
- case TypeTags.INT :
- switch (to) {
- case TypeTags.BYTE : return I2B;
- case TypeTags.SHORT : return I2S;
- case TypeTags.CHAR : return I2C;
- case TypeTags.INT : return I2I;
- case TypeTags.LONG : return I2L;
- case TypeTags.FLOAT : return I2F;
- case TypeTags.DOUBLE : return I2D;
- } break;
- case TypeTags.LONG :
- switch (to) {
- case TypeTags.BYTE : return L2B;
- case TypeTags.SHORT : return L2S;
- case TypeTags.CHAR : return L2C;
- case TypeTags.INT : return L2I;
- case TypeTags.LONG : return L2L;
- case TypeTags.FLOAT : return L2F;
- case TypeTags.DOUBLE : return L2D;
- } break;
- case TypeTags.FLOAT :
- switch (to) {
- case TypeTags.BYTE : return F2B;
- case TypeTags.SHORT : return F2S;
- case TypeTags.CHAR : return F2C;
- case TypeTags.INT : return F2I;
- case TypeTags.LONG : return F2L;
- case TypeTags.FLOAT : return F2F;
- case TypeTags.DOUBLE : return F2D;
- } break;
- case TypeTags.DOUBLE :
- switch (to) {
- case TypeTags.BYTE : return D2B;
- case TypeTags.SHORT : return D2S;
- case TypeTags.CHAR : return D2C;
- case TypeTags.INT : return D2I;
- case TypeTags.LONG : return D2L;
- case TypeTags.FLOAT : return D2F;
- case TypeTags.DOUBLE : return D2D;
- } break;
- }
- throw Debug.abort("illegal case: " + from + " -> " + to);
- }
-
- //########################################################################
- // Primitives interface - array get and set primitives
-
- /** Return length method for arrays of the given type. */
- public Symbol getArrayLengthSymbol(Type type) {
- switch (type) {
- case UnboxedArrayType(UnboxedType(int kind)):
- return getArrayLengthSymbol(kind);
- case UnboxedArrayType(_):
- return OARRAY_LENGTH;
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Return length method for arrays of elements of the given kind. */
- public Symbol getArrayLengthSymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return ZARRAY_LENGTH;
- case TypeTags.BYTE : return BARRAY_LENGTH;
- case TypeTags.SHORT : return SARRAY_LENGTH;
- case TypeTags.CHAR : return CARRAY_LENGTH;
- case TypeTags.INT : return IARRAY_LENGTH;
- case TypeTags.LONG : return LARRAY_LENGTH;
- case TypeTags.FLOAT : return FARRAY_LENGTH;
- case TypeTags.DOUBLE : return DARRAY_LENGTH;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- /** Return get method for arrays of the given type. */
- public Symbol getArrayGetSymbol(Type type) {
- switch (type) {
- case UnboxedArrayType(UnboxedType(int kind)):
- return getArrayGetSymbol(kind);
- case UnboxedArrayType(_):
- return OARRAY_GET;
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Return get method for arrays of elements of the given kind. */
- public Symbol getArrayGetSymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return ZARRAY_GET;
- case TypeTags.BYTE : return BARRAY_GET;
- case TypeTags.SHORT : return SARRAY_GET;
- case TypeTags.CHAR : return CARRAY_GET;
- case TypeTags.INT : return IARRAY_GET;
- case TypeTags.LONG : return LARRAY_GET;
- case TypeTags.FLOAT : return FARRAY_GET;
- case TypeTags.DOUBLE : return DARRAY_GET;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- /** Return set method for arrays of the given type. */
- public Symbol getArraySetSymbol(Type type) {
- switch (type) {
- case UnboxedArrayType(UnboxedType(int kind)):
- return getArraySetSymbol(kind);
- case UnboxedArrayType(_):
- return OARRAY_SET;
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Return set method for arrays of elements of the given kind. */
- public Symbol getArraySetSymbol(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return ZARRAY_SET;
- case TypeTags.BYTE : return BARRAY_SET;
- case TypeTags.SHORT : return SARRAY_SET;
- case TypeTags.CHAR : return CARRAY_SET;
- case TypeTags.INT : return IARRAY_SET;
- case TypeTags.LONG : return LARRAY_SET;
- case TypeTags.FLOAT : return FARRAY_SET;
- case TypeTags.DOUBLE : return DARRAY_SET;
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- //########################################################################
- // Primitives interface - class names
-
- /* Return name to use in "Class.forName(<name>)" for the given type. */
- public String getNameForClassForName(Type type) {
- switch (type) {
- case TypeRef(_, Symbol symbol, _):
- return getNameForClassForName(symbol);
- case UnboxedType(int kind):
- return getNameForClassForName(kind);
- case UnboxedArrayType(TypeRef(_, Symbol symbol, _)):
- return "[L" + getNameForClassForName(symbol) + ";";
- case UnboxedArrayType(Type elemtp):
- return "[" + getNameForClassForName(elemtp);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /* Return name to use in "Class.forName(<name>)" for the given symbol. */
- public String getNameForClassForName(Symbol symbol) {
- return getJREClassName(symbol);
- }
-
- /* Return name to use in "Class.forName(<name>)" for the given kind. */
- public String getNameForClassForName(int kind) {
- switch (kind) {
- case TypeTags.BOOLEAN: return "Z";
- case TypeTags.BYTE : return "B";
- case TypeTags.SHORT : return "S";
- case TypeTags.CHAR : return "C";
- case TypeTags.INT : return "I";
- case TypeTags.LONG : return "J";
- case TypeTags.FLOAT : return "F";
- case TypeTags.DOUBLE : return "D";
- default : throw Debug.abort("illegal kind " + kind);
- }
- }
-
- /** Return the JRE name of given class. */
- public String getJREClassName(Symbol clasz) {
- assert clasz.isClassType(): Debug.show(clasz);
- if (clasz == definitions.ANY_CLASS ||
- clasz == definitions.ANYREF_CLASS)
- return getJREClassName(definitions.OBJECT_CLASS);
- String suffix = clasz.isModuleClass() && !clasz.isJava() ? "$" : "";
- return jreNameWriter.toString(clasz, suffix);
- }
-
- /** Return the CLR name of given class. */
- public String getCLRClassName(Symbol clasz) {
- assert clasz.isClassType(): Debug.show(clasz);
- return clrNameWriter.toString(clasz);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
deleted file mode 100644
index 3ea0cded19..0000000000
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ /dev/null
@@ -1,1927 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.backend.jvm;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.util.*;
-
-import ch.epfl.lamp.fjbg.*;
-import ch.epfl.lamp.util.Pair;
-
-import scala.tools.util.Position;
-
-import scalac.*;
-import scalac.ast.Tree;
-import scalac.atree.AConstant;
-import scalac.backend.*;
-import scalac.symtab.*;
-import scalac.symtab.classfile.ClassfileConstants;
-import scalac.symtab.classfile.Pickle;
-import scalac.transformer.*;
-import scalac.util.*;
-
-
-/* Several things which are done here should in fact be done in
- * previous phases, namely:
- *
- * - code linearisation (i.e. representation of code as a list of
- * instructions),
- *
- * - removal of implicit "this" selection,
- *
- * - removal of implicit "unit" values,
- *
- * - removal of implicit conversion,
- *
- * - removal of "if"s without explicit "else" part,
- *
- * - expansion of "==",
- *
- * - introduction of a special primitive for string concatenation,
- *
- * - initialisation of module instance variable.
- */
-
-/**
- * Backend generating JVM byte-codes.
- *
- * @version 2.0
- * @author Michel Schinz
- */
-
-public class GenJVM {
- protected final static String JAVA_LANG_OBJECT = "java.lang.Object";
- protected final static String JAVA_LANG_STRING = "java.lang.String";
- protected final static String JAVA_LANG_STRINGBUFFER =
- "java.lang.StringBuffer";
- protected final static String JAVA_RMI_REMOTE = "java.rmi.Remote";
- protected final static String JAVA_RMI_REMOTEEXCEPTION =
- "java.rmi.RemoteException";
-
- protected final static String SCALA_RUNTIME_RUNTIME =
- "scala.runtime.RunTime";
-
- protected final static String SCALA_ATTR =
- ClassfileConstants.SCALA_N.toString();
-
- protected final static String MODULE_INSTANCE_FIELD_NAME = "MODULE$";
-
- protected final static String CONSTRUCTOR_STRING =
- "<init>"; // TODO get it from FJBG
-
- protected final JObjectType JAVA_LANG_OBJECT_T =
- new JObjectType(JAVA_LANG_OBJECT);
- protected final JObjectType JAVA_LANG_STRING_T =
- new JObjectType(JAVA_LANG_STRING);
- protected final JObjectType JAVA_LANG_STRINGBUFFER_T =
- new JObjectType (JAVA_LANG_STRINGBUFFER);
- protected final JObjectType JAVA_LANG_THROWABLE_T =
- new JObjectType("java.lang.Throwable");
-
- protected final Symbol JAVA_RMI_REMOTE_CLASS;
- protected final Symbol SCALA_SERIAL_VERSION_UID_CONSTR;
-
- protected final Global global;
- protected final Definitions defs;
- protected final Primitives prims;
-
- protected final Phase refCheckPhase;
- protected final AddInterfacesPhase addInterfacesPhase;
-
- protected final FJBGContext fjbgContext;
-
- protected final ArrayList pickles = new ArrayList();
-
- public GenJVM(Global global) {
- this.global = global;
- this.defs = global.definitions;
- this.prims = global.primitives;
-
- this.refCheckPhase = global.PHASE.REFCHECK.phase();
- this.addInterfacesPhase =
- (AddInterfacesPhase)global.PHASE.ADDINTERFACES.phase();
-
- this.fjbgContext = new FJBGContext();
-
- initTypeMap();
- initArithPrimMap();
-
- JAVA_RMI_REMOTE_CLASS = defs.getClass(JAVA_RMI_REMOTE);
- SCALA_SERIAL_VERSION_UID_CONSTR =
- defs.getClass("scala.SerialVersionUID") .primaryConstructor();
- }
-
- /// Code generation
- //////////////////////////////////////////////////////////////////////
-
- /** Generate code for the given units. */
- public static void translate(Global global, CompilationUnit[] units) {
- GenJVM translator = new GenJVM(global);
- for (int i = 0; i < units.length; i++) translator.translate(units[i]);
- }
-
- /**
- * Generate code for the given unit.
- */
- public void translate(CompilationUnit unit) {
- try {
- for (int i = 0; i < unit.body.length; ++i)
- gen(Context.EMPTY.withSourceFileName(unit.source.getFile().getName()),
- unit.body[i]);
- } catch (JCode.OffsetTooBigException e) {
- if (global.debug) e.printStackTrace();
- global.error(e.getMessage());
- }
- // write .symbl files (must be generated after .class files)
- for (int i = 0; i < pickles.size() / 2; i++) {
- JClass clazz = (JClass)pickles.get(2 * i + 0);
- Pickle pickle = (Pickle)pickles.get(2 * i + 1);
- writeSymblFile(clazz, pickle);
- }
- pickles.clear();
- }
-
- /**
- * Generate code to perform the side effects associated with the
- * given tree (i.e. no value should remain on the stack
- * afterwards).
- */
- protected void gen(Context ctx, Tree tree) throws JCode.OffsetTooBigException {
- startCodeForTree(ctx, tree);
-
- Symbol sym = tree.symbol();
-
- switch (tree) {
- case PackageDef(_, Tree.Template impl):
- gen(ctx, impl);
- break;
-
- case ClassDef(_, _, _, _, _, Tree.Template impl) : {
- Tree.ClassDef classDef = (Tree.ClassDef)tree;
-
- Context ctx1 = enterClass(ctx, sym);
-
- addValueClassMembers(ctx1, classDef);
- gen(ctx1, impl);
- AConstant[] aargs = global.getAttrArguments
- (sym, SCALA_SERIAL_VERSION_UID_CONSTR);
- if (ctx1.isModuleClass || aargs != null) {
- JMethod clinit = getClassConstructorMethod(ctx1);
- if (clinit.getCode().getSize() == 0) {
- Context ctx2 =
- ctx1.withMethod(clinit, Collections.EMPTY_MAP, false);
- completeClassConstructor(ctx2, sym);
- ctx2.code.emitRETURN();
- genLocalVariableTable(ctx2);
- }
- }
-
- leaveClass(ctx1, sym);
- } break;
-
- case Template(_, Tree[] body):
- gen(ctx, body);
- break;
-
- case ValDef(_, Name name, _, Tree rhs): {
- if (ctx.method == null)
- break; // ignore ValDefs in classes, handled elsewhere
-
- JType valType = typeStoJ(sym.info());
- JLocalVariable var =
- ctx.method.addNewLocalVariable(valType, name.toString());
- ctx.locals.put(sym, new Integer(var.getIndex()));
-
- assert (rhs != Tree.Empty) : Debug.show(sym);
- genLoad(ctx, rhs, valType);
- ctx.code.emitSTORE(var);
- } break;
-
- case DefDef(_, _, _, _, _, Tree rhs): {
- Tree.DefDef defDef = (Tree.DefDef)tree;
- boolean retry = false;
- do {
- Context ctx1 = enterMethod(ctx, defDef, retry);
- try {
- if (! Modifiers.Helper.isAbstract(sym.flags)) {
- JType retType = ctx1.method.getReturnType();
- genLoad(ctx1, rhs, retType);
- if (sym.name == Names.CLASS_CONSTRUCTOR)
- completeClassConstructor(ctx1, sym.owner());
- ctx1.code.emitRETURN(retType);
- ctx1.method.freeze();
- }
- leaveMethod(ctx1);
- break;
- } catch (JCode.OffsetTooBigException e) {
- ctx1.clazz.removeMethod(ctx1.method);
- if (retry)
- throw Debug.abort("method too big", sym, e);
- retry = true;
- }
- } while (retry);
- } break;
-
- case Return(Tree expr): {
- JType retType = ctx.method.getReturnType();
- genLoad(ctx, expr, retType);
- ctx.code.emitRETURN(retType);
- } break;
-
- case Typed(Tree expr, _):
- gen(ctx, expr);
- break;
-
- case Empty:
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- case TypeApply(_, _):
- case FunType(_, _):
- case CompoundType(_, _):
- case AppliedType(_,_):
- break;
-
- default:
- genLoad(ctx, tree, JType.VOID);
- }
-
- endCodeForTree(ctx, tree);
- }
-
- protected void gen(Context ctx, Tree[] trees)
- throws JCode.OffsetTooBigException {
- for (int i = 0; i < trees.length; ++i)
- gen(ctx, trees[i]);
- }
-
- /**
- * Generate code to load the value of the given tree on the
- * stack, and make sure it is of the given expected type.
- */
- protected JType genLoad(Context ctx, Tree tree, JType expectedType)
- throws JCode.OffsetTooBigException {
- startCodeForTree(ctx, tree);
-
- JType generatedType = null;
- Symbol sym = tree.symbol();
-
- switch (tree) {
- case LabelDef(_, Tree.Ident[] params, Tree rhs): {
- JCode.Label label = ctx.code.newLabel();
- label.anchorToNext();
- ctx.labels.put(sym, new Pair(label, params));
- generatedType = genLoad(ctx, rhs, expectedType);
- ctx.labels.remove(sym);
- } break;
-
- case Block(Tree[] stats, Tree value): {
- int statsNum = stats.length;
- for (int i = 0; i < stats.length; ++i)
- gen(ctx, stats[i]);
- genLoad(ctx, value, expectedType);
- generatedType = expectedType;
- } break;
-
- case Typed(Tree expr, _):
- genLoad(ctx, expr, expectedType);
- generatedType = expectedType;
- break;
-
- case New(Tree init):
- String className = javaName(tree.type.symbol());
- ctx.code.emitNEW(className);
- ctx.code.emitDUP();
- gen(ctx, init);
- generatedType = new JObjectType(className);
- break;
-
- case Apply(TypeApply(Tree fun, Tree[] args), _): {
- genLoadQualifier(ctx, fun);
-
- JType type = typeStoJ(args[0].type);
- if (fun.symbol() == defs.ANY_IS_ERASED) {
- ctx.code.emitINSTANCEOF((JReferenceType)type);
- generatedType = JType.BOOLEAN;
- } else if (fun.symbol() == defs.ANY_AS_ERASED) {
- ctx.code.emitCHECKCAST((JReferenceType)type);
- generatedType = type;
- } else
- throw Debug.abort("unexpected type application", tree);
- } break;
-
- case Apply(Tree fun, Tree[] args): {
- Symbol funSym = fun.symbol();
-
- if (funSym.isLabel()) {
- Pair/*<Label, Tree[]>*/ labelAndIdents =
- (Pair)ctx.labels.get(funSym);
- assert labelAndIdents != null : Debug.show(funSym);
- JMethodType funType = (JMethodType)typeStoJ(funSym.info());
-
- JCode.Label label = (JCode.Label)labelAndIdents.fst;
- Tree[] idents = (Tree[])labelAndIdents.snd;
- assert idents.length == args.length;
-
- for (int i = 0; i < args.length; ++i)
- genLoad(ctx, args[i], typeStoJ(args[i].type));
- for (int i = idents.length; i > 0; --i)
- genStoreEpilogue(ctx, idents[i-1]);
- ctx.code.emitGOTO_maybe_W(label, ctx.useWideJumps);
- generatedType = funType.getReturnType();
- } else if (isKnownPrimitive(funSym)) {
- Primitive prim = prims.getPrimitive(funSym);
-
- switch (prim) {
- case CONCAT:
- genStringConcatenation(ctx, liftStringConcatenations(tree));
- generatedType = JAVA_LANG_STRING_T;
- break;
-
- case POS: case NEG:
- case ADD: case SUB: case MUL: case DIV: case MOD:
- case NOT: case OR : case XOR: case AND:
- case LSL: case LSR: case ASR:
- Tree[] allArgs = extractPrimitiveArgs((Tree.Apply)tree);
- allArgs[0] = unbox(allArgs[0]);
- JType resType = typeStoJ(tree.type);
- genArithPrim(ctx, prim, allArgs, resType, expectedType);
- generatedType = resType;
- break;
-
- case ID: case NI:
- case EQ: case NE: case LT: case LE: case GE: case GT:
- case ZNOT: case ZOR: case ZAND:
- JCode.Label falseLabel = ctx.code.newLabel();
- JCode.Label afterLabel = ctx.code.newLabel();
- genCond(ctx, tree, falseLabel, false);
- ctx.code.emitICONST_1();
- ctx.code.emitGOTO_maybe_W(afterLabel, ctx.useWideJumps);
- falseLabel.anchorToNext();
- ctx.code.emitICONST_0();
- afterLabel.anchorToNext();
- generatedType = JType.BOOLEAN;
- break;
-
- case THROW:
- assert args.length == 0;
- genThrow(ctx, ((Tree.Select)fun).qualifier);
- // We pretend that we generated something of the
- // expected type, to avoid trying to generate
- // bogus conversions.
- generatedType = expectedType;
- break;
-
- case SYNCHRONIZED: {
- assert args.length == 1;
- Tree qual = ((Tree.Select)fun).qualifier;
- genSynchronized(ctx, qual, args[0], expectedType);
- generatedType = expectedType;
- } break;
-
- case NEW_OARRAY: {
- assert args.length == 2;
- genRefArrayCreate(ctx, args[0], args[1]);
- generatedType = expectedType;
- } break;
-
- case NEW_ZARRAY : case NEW_BARRAY : case NEW_SARRAY :
- case NEW_CARRAY : case NEW_IARRAY : case NEW_LARRAY :
- case NEW_FARRAY : case NEW_DARRAY :
- assert args.length == 1;
- genArrayCreate(ctx, prim, args[0]);
- generatedType = JAVA_LANG_OBJECT_T; // TODO refine
- break;
-
- case ZARRAY_SET : case BARRAY_SET : case SARRAY_SET :
- case CARRAY_SET : case IARRAY_SET : case LARRAY_SET :
- case FARRAY_SET : case DARRAY_SET : case OARRAY_SET :
- assert args.length == 3;
- genArrayUpdate(ctx, args[0], args[1], args[2]);
- generatedType = JType.VOID;
- break;
-
- case ZARRAY_GET : case BARRAY_GET : case SARRAY_GET :
- case CARRAY_GET : case IARRAY_GET : case LARRAY_GET :
- case FARRAY_GET : case DARRAY_GET : case OARRAY_GET :
- assert args.length == 2 : "get - " + args.length;
- genArrayAccess(ctx, args[0], args[1]);
- generatedType = getArrayElementType(args[0]);
- break;
-
- case ZARRAY_LENGTH : case BARRAY_LENGTH : case SARRAY_LENGTH :
- case CARRAY_LENGTH : case IARRAY_LENGTH : case LARRAY_LENGTH :
- case FARRAY_LENGTH : case DARRAY_LENGTH : case OARRAY_LENGTH :
- assert args.length == 1 : args.length;
- genArrayLength(ctx, args[0]);
- generatedType = JType.INT;
- break;
-
- case B2B: case B2S: case B2C: case B2I: case B2L: case B2F: case B2D:
- case S2B: case S2S: case S2C: case S2I: case S2L: case S2F: case S2D:
- case C2B: case C2S: case C2C: case C2I: case C2L: case C2F: case C2D:
- case I2B: case I2S: case I2C: case I2I: case I2L: case I2F: case I2D:
- case L2B: case L2S: case L2C: case L2I: case L2L: case L2F: case L2D:
- case F2B: case F2S: case F2C: case F2I: case F2L: case F2F: case F2D:
- case D2B: case D2S: case D2C: case D2I: case D2L: case D2F: case D2D:
- assert args.length == 1 : args.length;
- JType fromType = typeStoJ(args[0].type);
- genLoad(ctx, args[0], fromType);
- ctx.code.emitT2T(fromType, expectedType);
- generatedType = expectedType;
- break;
-
- default:
- throw Debug.abort("unknown primitive", prim);
- }
- } else {
- JMethodType funType = (JMethodType)typeStoJ(funSym.info());
- JType[] argTypes = funType.getArgumentTypes();
-
- boolean isConstrCall = funSym.isInitializer();
- boolean isSuperCall = false;
- switch (fun) {
- case Select(Super(_, _), _): isSuperCall = true;
- }
-
- boolean isStatic = isStaticMember(funSym);
- if (!isStatic)
- genLoadQualifier(ctx, fun);
- for (int i = 0; i < args.length; ++i)
- genLoad(ctx, args[i], argTypes[i]);
-
- String clsName = isSuperCall
- ? ctx.clazz.getSuperclassName()
- : javaName(funSym.owner());
- String mthName = funSym.name.toString();
-
- funSym.owner().info(); // [HACK] ensure that flags are
- // transformed.
-
- if (funSym.owner().isInterface())
- ctx.code.emitINVOKEINTERFACE(clsName, mthName, funType);
- else {
- if (isConstrCall || isSuperCall) {
- ctx.code.emitINVOKESPECIAL(clsName, mthName, funType);
- if (isConstrCall && isSuperCall && ctx.isModuleClass) {
- // Initialise module instance field ASAP
- ctx.code.emitALOAD_0();
- ctx.code.emitPUTSTATIC(ctx.clazz.getName(),
- MODULE_INSTANCE_FIELD_NAME,
- ctx.clazz.getType());
- }
- } else if (isStatic)
- ctx.code.emitINVOKESTATIC(clsName, mthName, funType);
- else
- ctx.code.emitINVOKEVIRTUAL(clsName, mthName, funType);
- }
- generatedType = funType.getReturnType();
- }
- } break;
-
- case Ident(_):
- JType type = typeStoJ(sym.info());
- if (sym.isModule()) {
- String javaSymName = javaName(sym.moduleClass());
- ctx.code.emitGETSTATIC(javaSymName,
- MODULE_INSTANCE_FIELD_NAME,
- type);
- generatedType = type;
- } else if (sym.isStatic()) {
- JType fieldType = typeStoJ(sym.info());
- String className = javaName(sym.owner());
- String fieldName = sym.name.toString();
- ctx.code.emitGETSTATIC(className, fieldName, fieldType);
- generatedType = type;
- } else {
- assert ctx.locals.containsKey(sym)
- : Debug.show(sym) + " not in " + ctx.locals;
- int index = ((Integer)(ctx.locals.get(sym))).intValue();
- ctx.code.emitLOAD(index, type);
- generatedType = type;
- }
- break;
-
- case Select(Tree qualifier, _):
- JType fieldType = typeStoJ(sym.info());
- String className = javaName(sym.owner());
- String fieldName = sym.name.toString();
- if (sym.isStatic()) {
- ctx.code.emitGETSTATIC(className, fieldName, fieldType);
- } else {
- genLoadQualifier(ctx, tree);
- ctx.code.emitGETFIELD(className, fieldName, fieldType);
- }
- generatedType = fieldType;
- break;
-
- case Assign(Tree lhs, Tree rhs): {
- genStorePrologue(ctx, lhs);
- genLoad(ctx, rhs, typeStoJ(lhs.symbol().info()));
- genStoreEpilogue(ctx, lhs);
- generatedType = JType.VOID;
- } break;
-
- case If(Tree cond, Tree thenp, Tree elsep): {
- JType finalType = typeStoJ(tree.type);
-
- JCode.Label elseLabel = ctx.code.newLabel();
- genCond(ctx, cond, elseLabel, false);
- genLoad(ctx, thenp, finalType);
- JCode.Label afterLabel = ctx.code.newLabel();
- ctx.code.emitGOTO_maybe_W(afterLabel, ctx.useWideJumps);
- elseLabel.anchorToNext();
- genLoad(ctx, elsep, finalType);
- afterLabel.anchorToNext();
- generatedType = finalType;
- } break;
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise): {
- JCode.Label[] labels = ctx.code.newLabels(bodies.length);
- JCode.Label defaultLabel = ctx.code.newLabel();
- JCode.Label afterLabel = ctx.code.newLabel();
-
- genLoad(ctx, test, JType.INT);
- ctx.code.emitSWITCH(tags, labels, defaultLabel, 0.9);
- for (int i = 0; i < bodies.length; ++i) {
- labels[i].anchorToNext();
- genLoad(ctx, bodies[i], expectedType);
- ctx.code.emitGOTO_maybe_W(afterLabel, ctx.useWideJumps);
- }
- defaultLabel.anchorToNext();
- genLoad(ctx, otherwise, expectedType);
- afterLabel.anchorToNext();
- generatedType = expectedType;
- } break;
-
- case This(_):
- case Super(_, _):
- ctx.code.emitALOAD_0();
- generatedType = JAVA_LANG_OBJECT_T;
- break;
-
- case Literal(AConstant value):
- generatedType = genLoadLiteral(ctx, value, expectedType);
- break;
-
- case Empty:
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- case TypeApply(_, _):
- case FunType(_, _):
- case CompoundType(_, _):
- case AppliedType(_,_):
- generatedType = JType.VOID;
- break;
-
- case Sequence(_):
- case ModuleDef(_,_,_,_):
- case PatDef(_,_,_):
- case Import(_, _):
- case CaseDef(_, _, _):
- case Visitor(_):
- case Function(_, _):
- throw Debug.abort("unexpected node", tree);
- default:
- throw Debug.abort("unknown node", tree);
- }
-
- // Pop unneeded result from stack, or widen it if needed.
- if (expectedType == JType.VOID && generatedType != JType.VOID) {
- if (generatedType == JType.LONG || generatedType == JType.DOUBLE)
- ctx.code.emitPOP2();
- else
- ctx.code.emitPOP();
- } else if (! (expectedType == JType.VOID
- || generatedType == expectedType
- || generatedType.isReferenceType()))
- ctx.code.emitT2T(generatedType, expectedType);
-
- endCodeForTree(ctx, tree);
- return expectedType;
- }
-
- /**
- * Generate code to load the qualifier of the given tree, which
- * can be implicitely "this".
- */
- protected void genLoadQualifier(Context ctx, Tree tree)
- throws JCode.OffsetTooBigException {
- switch (tree) {
- case Ident(_):
- break;
- case Select(Create(_, _), _):
- break;
- case Select(Tree qualifier, _):
- genLoad(ctx, qualifier, JAVA_LANG_OBJECT_T);
- break;
- default:
- throw Debug.abort("unknown qualifier", tree);
- }
- }
-
- protected JType genLoadLiteral(Context ctx, AConstant lit, JType type) {
- switch (lit) {
- case UNIT:
- return JType.VOID;
- case BOOLEAN(boolean value):
- ctx.code.emitPUSH(value);
- return JType.BOOLEAN;
- case BYTE(byte value):
- ctx.code.emitPUSH(value);
- return JType.BYTE;
- case SHORT(short value):
- ctx.code.emitPUSH(value);
- return JType.SHORT;
- case CHAR(char value):
- ctx.code.emitPUSH(value);
- return JType.CHAR;
- case INT(int value):
- ctx.code.emitPUSH(value);
- return JType.INT;
- case LONG(long value):
- ctx.code.emitPUSH(value);
- return JType.LONG;
- case FLOAT(float value):
- ctx.code.emitPUSH(value);
- return JType.FLOAT;
- case DOUBLE(double value):
- ctx.code.emitPUSH(value);
- return JType.DOUBLE;
- case STRING(String value):
- ctx.code.emitPUSH(value);
- return JAVA_LANG_STRING_T;
- case SYMBOL_NAME(Symbol value):
- ctx.code.emitPUSH(javaName(value));
- return JAVA_LANG_STRING_T;
- case NULL:
- if (type != JType.VOID) ctx.code.emitACONST_NULL();
- return type;
- default:
- throw Debug.abort("unknown literal", lit);
- }
- }
-
- /**
- * Generate code to prepare the storage of a value in the location
- * represented by the tree.
- */
- protected void genStorePrologue(Context ctx, Tree tree)
- throws JCode.OffsetTooBigException {
- genLoadQualifier(ctx, tree);
- }
-
- /**
- * Generate code to perform the storage of the value on top of
- * stack in the location represented by the tree.
- */
- protected void genStoreEpilogue(Context ctx, Tree tree) {
- Symbol sym = tree.symbol();
- if (sym.owner().isClass()) {
- String ownerName = javaName(sym.owner());
- if (isStaticMember(sym))
- ctx.code.emitPUTSTATIC(ownerName,
- sym.name.toString(),
- typeStoJ(sym.info()));
- else
- ctx.code.emitPUTFIELD(ownerName,
- sym.name.toString(),
- typeStoJ(sym.info()));
- } else {
- assert ctx.locals.containsKey(sym)
- : Debug.show(sym) + " not in " + ctx.locals;
- int index = ((Integer)(ctx.locals.get(sym))).intValue();
- ctx.code.emitSTORE(index, typeStoJ(sym.info()));
- }
- }
-
- /**
- * Generate code to evaluate the condition associated with the
- * given tree and jump to the target when the condition is equal
- * to the given value.
- */
- protected void genCond(Context ctx,
- Tree tree,
- JCode.Label target,
- boolean when)
- throws JCode.OffsetTooBigException {
- switch (tree) {
- case Apply(Tree fun, Tree[] args):
- if (isJumpingPrimitive(fun.symbol())) {
- Primitive prim = prims.getPrimitive(fun.symbol());
- Tree[] allArgs = extractPrimitiveArgs((Tree.Apply)tree);
-
- switch (prim) {
- case ID: case NI: case EQ: case NE:
- assert allArgs.length == 2;
- Tree unbox1 = unbox(allArgs[0]);
- Tree unbox2 = unbox(allArgs[1]);
- if (!getMaxType(unbox1, unbox2).isReferenceType()) {
- allArgs[0] = unbox1;
- allArgs[1] = unbox2;
- genCompPrim(ctx, prim, allArgs, target, when);
- } else {
- genEqPrim(ctx, prim, allArgs, target, when);
- }
- return;
-
- case LT: case LE: case GE: case GT:
- assert allArgs.length == 2;
- allArgs[0] = unbox(allArgs[0]);
- genCompPrim(ctx, prim, allArgs, target, when);
- return;
-
- case ZNOT:
- assert allArgs.length == 1;
- genCond(ctx, unbox(allArgs[0]), target, !when);
- return;
-
- case ZOR:
- case ZAND:
- if (when ^ (prim == Primitive.ZAND)) {
- // x || y jump if true -or- x && y jump if false
- genCond(ctx, unbox(allArgs[0]), target, when);
- genCond(ctx, allArgs[1], target, when);
- } else {
- // x || y jump if false -or- x && y jump if true
- JCode.Label afterLabel = ctx.code.newLabel();
- genCond(ctx, unbox(allArgs[0]), afterLabel, !when);
- genCond(ctx, allArgs[1], target, when);
- afterLabel.anchorToNext();
- }
- return;
- }
- }
- }
- // Default case: the condition is not a comparison or logical
- // primitive.
- genLoad(ctx, tree, JType.BOOLEAN);
- if (when)
- ctx.code.emitIFNE(target);
- else
- ctx.code.emitIFEQ(target);
- }
-
- protected Map/*<Primitive, Instruction>*/ arithPrimMap;
- protected void addPrim(Primitive prim,
- JOpcode z,
- JOpcode i,
- JOpcode l,
- JOpcode f,
- JOpcode d) {
- arithPrimMap.put(prim, new JOpcode[] { z, i, l, f, d });
- }
-
- protected void initArithPrimMap() {
- arithPrimMap = new HashMap();
- /* boolean, int & al., long, float, double */
- addPrim(Primitive.ADD,
- null, JOpcode.IADD, JOpcode.LADD, JOpcode.FADD, JOpcode.DADD);
- addPrim(Primitive.SUB,
- null, JOpcode.ISUB, JOpcode.LSUB, JOpcode.FSUB, JOpcode.DSUB);
- addPrim(Primitive.MUL,
- null, JOpcode.IMUL, JOpcode.LMUL, JOpcode.FMUL, JOpcode.DMUL);
- addPrim(Primitive.DIV,
- null, JOpcode.IDIV, JOpcode.LDIV, JOpcode.FDIV, JOpcode.DDIV);
- addPrim(Primitive.MOD,
- null, JOpcode.IREM, JOpcode.LREM, JOpcode.FREM, JOpcode.DREM);
- addPrim(Primitive.AND,
- JOpcode.IAND, JOpcode.IAND, JOpcode.LAND, null, null);
- addPrim(Primitive.OR,
- JOpcode.IOR, JOpcode.IOR, JOpcode.LOR, null, null);
- addPrim(Primitive.XOR,
- JOpcode.IXOR, JOpcode.IXOR, JOpcode.LXOR, null, null);
- addPrim(Primitive.LSL,
- null, JOpcode.ISHL, JOpcode.LSHL, null, null);
- addPrim(Primitive.LSR,
- null, JOpcode.IUSHR, JOpcode.LUSHR, null, null);
- addPrim(Primitive.ASR,
- null, JOpcode.ISHR, JOpcode.LSHR, null, null);
- addPrim(Primitive.POS,
- null, null, null, null, null);
- addPrim(Primitive.NEG,
- null, JOpcode.INEG, JOpcode.LNEG, JOpcode.FNEG, JOpcode.DNEG);
- }
-
- /**
- * Generate code for the given arithmetic primitive, applied on
- * the given arguments.
- */
- protected void genArithPrim(Context ctx,
- Primitive prim,
- Tree[] args,
- JType resType,
- JType expectedType)
- throws JCode.OffsetTooBigException {
- int arity = args.length;
- int resTypeIdx = getTypeIndex(resType);
-
- if ((prim == Primitive.LSL)
- || (prim == Primitive.LSR)
- || (prim == Primitive.ASR)) {
- genLoad(ctx, args[0], resType);
- genLoad(ctx, args[1], JType.INT);
- } else {
- for (int i = 0; i < arity; ++i)
- genLoad(ctx, args[i], resType);
- }
-
- if (prim == Primitive.NOT) {
- if (resType == JType.LONG) {
- ctx.code.emitPUSH(-1L);
- ctx.code.emitLXOR();
- } else {
- assert resType == JType.INT;
- ctx.code.emitPUSH(-1);
- ctx.code.emitIXOR();
- }
- } else {
- assert arithPrimMap.containsKey(prim);
- JOpcode primInst = ((JOpcode[])arithPrimMap.get(prim))[resTypeIdx];
- if (primInst != null)
- ctx.code.emit(primInst);
- }
- }
-
- /** Variable in which temporary objects are stored by the
- * implementation of == */
- protected JLocalVariable eqEqTempVar;
-
- /**
- * Generate code for the given equality primitive, applied on the
- * given arguments.
- */
- protected void genEqPrim(Context ctx,
- Primitive prim,
- Tree[] args,
- JCode.Label target,
- boolean when)
- throws JCode.OffsetTooBigException {
- JType maxType = getMaxType(args);
- assert maxType.isReferenceType(): args[0]+" - "+args[1]+" : "+maxType;
- // Generate code for all arguments
- for (int i = 0; i < args.length; ++i) genLoad(ctx, args[i], maxType);
-
- if (prim == Primitive.ID) {
- if (when) ctx.code.emitIF_ACMPEQ(target);
- else ctx.code.emitIF_ACMPNE(target);
- } else if (prim == Primitive.NI) {
- if (!when) ctx.code.emitIF_ACMPEQ(target);
- else ctx.code.emitIF_ACMPNE(target);
- } else {
- // Comparison between two references. We inline the code
- // for the predefined (and final) "=="/"!=" operators,
- // which check for null values and then forward the call
- // to "equals". "==" could be defined as follows, if
- // "null" was an object:
- // final def ==(other: Any): boolean =
- // if (this == null) other == null else this.equals(other)
- assert prim == Primitive.EQ || prim == Primitive.NE;
-
- if (eqEqTempVar == null || eqEqTempVar.getOwner() != ctx.method)
- eqEqTempVar =
- ctx.method.addNewLocalVariable(JObjectType.JAVA_LANG_OBJECT,
- "eqEqTemp$");
-
- ctx.code.emitSTORE(eqEqTempVar);
- ctx.code.emitDUP();
- JCode.Label ifNonNullLabel = ctx.code.newLabel();
- ctx.code.emitIFNONNULL(ifNonNullLabel);
- ctx.code.emitPOP();
- ctx.code.emitLOAD(eqEqTempVar);
- if (when ^ (prim != Primitive.EQ))
- ctx.code.emitIFNULL(target);
- else
- ctx.code.emitIFNONNULL(target);
- JCode.Label afterLabel = ctx.code.newLabel();
- ctx.code.emitGOTO_maybe_W(afterLabel, ctx.useWideJumps);
- ifNonNullLabel.anchorToNext();
- ctx.code.emitLOAD(eqEqTempVar);
- JMethodType equalsType =
- new JMethodType(JType.BOOLEAN,
- new JType[] { JObjectType.JAVA_LANG_OBJECT });
- ctx.code.emitINVOKEVIRTUAL(JAVA_LANG_OBJECT, "equals", equalsType);
- if (when ^ (prim != Primitive.EQ))
- ctx.code.emitIFNE(target);
- else
- ctx.code.emitIFEQ(target);
- afterLabel.anchorToNext();
- }
- }
-
- /**
- * Generate code for the given comparison primitive, applied on
- * the given arguments.
- */
- protected void genCompPrim(Context ctx,
- Primitive prim,
- Tree[] args,
- JCode.Label target,
- boolean when)
- throws JCode.OffsetTooBigException {
- JType maxType = getMaxType(args);
- assert !maxType.isReferenceType(): args[0]+" - "+args[1]+" : "+maxType;
- int maxTypeIdx = getTypeIndex(maxType);
- int intTypeIdx = getTypeIndex(JType.INT);
- boolean intCompareWithZero = false;
- // Generate code for all arguments, while detecting
- // comparisons with 0, which can be optimised.
- for (int i = 0; i < args.length; ++i) {
- boolean isIntZero = false;
- if (maxTypeIdx <= intTypeIdx) {
- switch (args[i]) {
- case Literal(AConstant constant):
- int intVal;
- switch (constant) {
- case BOOLEAN(boolean value):
- intVal = value ? 1 : 0;
- break;
- case BYTE(byte value):
- intVal = value;
- break;
- case SHORT(short value):
- intVal = value;
- break;
- case CHAR(char value):
- intVal = value;
- break;
- case INT(int value):
- intVal = value;
- break;
- default:
- throw Debug.abort("unknown literal", constant);
- }
- if (intVal == 0) {
- isIntZero = true;
- if (i == 0) prim = prim.swap();
- }
- }
- }
- if (intCompareWithZero || !isIntZero)
- genLoad(ctx, args[i], maxType);
- intCompareWithZero |= isIntZero;
- }
-
- if (maxTypeIdx <= intTypeIdx && !intCompareWithZero) {
- // Comparison between ints, no zeros involved
- switch (maybeNegatedPrim(prim, !when)) {
- case LT: ctx.code.emitIF_ICMPLT(target); break;
- case LE: ctx.code.emitIF_ICMPLE(target); break;
- case EQ: ctx.code.emitIF_ICMPEQ(target); break;
- case NE: ctx.code.emitIF_ICMPNE(target); break;
- case GE: ctx.code.emitIF_ICMPGE(target); break;
- case GT: ctx.code.emitIF_ICMPGT(target); break;
- default: throw Debug.abort("unknown primitive", prim);
- }
- } else {
- // Comparison between longs, floats or double, or between
- // one int and zero.
- switch (maxType.getTag()) {
- case JType.T_LONG: ctx.code.emitLCMP(); break;
- case JType.T_FLOAT: ctx.code.emitFCMPG(); break;
- case JType.T_DOUBLE: ctx.code.emitDCMPG(); break;
- default:
- ; // do nothing (int comparison with 0)
- }
- switch (maybeNegatedPrim(prim, !when)) {
- case LT: ctx.code.emitIFLT(target); break;
- case LE: ctx.code.emitIFLE(target); break;
- case EQ: ctx.code.emitIFEQ(target); break;
- case NE: ctx.code.emitIFNE(target); break;
- case GE: ctx.code.emitIFGE(target); break;
- case GT: ctx.code.emitIFGT(target); break;
- default: throw Debug.abort("unknown primitive", prim);
- }
- }
- }
-
- /**
- * Generate code to throw the value returned by the argument.
- */
- protected void genThrow(Context ctx, Tree arg)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, arg, JAVA_LANG_OBJECT_T);
- ctx.code.emitCHECKCAST(JAVA_LANG_THROWABLE_T);
- ctx.code.emitATHROW();
- }
-
- /**
- * Generate code to synchronise on the object and evaluate the
- * code fragment.
- */
- protected void genSynchronized(Context ctx,
- Tree object,
- Tree code,
- JType expectedType)
- throws JCode.OffsetTooBigException {
- JLocalVariable monitorVar =
- ctx.method.addNewLocalVariable(JAVA_LANG_OBJECT_T, "monitor");
- genLoad(ctx, object, JAVA_LANG_OBJECT_T);
- ctx.code.emitSTORE(monitorVar);
- ctx.code.emitLOAD(monitorVar);
- ctx.code.emitMONITORENTER();
- int startPC = ctx.code.getPC();
- genLoad(ctx, code, expectedType);
- int endPC = ctx.code.getPC();
- ctx.code.emitLOAD(monitorVar);
- ctx.code.emitMONITOREXIT();
-
- JCode.Label afterLabel = ctx.code.newLabel();
- ctx.code.emitGOTO(afterLabel);
- int handlerPC = ctx.code.getPC();
- ctx.code.emitLOAD(monitorVar);
- ctx.code.emitMONITOREXIT();
- ctx.code.emitATHROW();
- afterLabel.anchorToNext();
-
- ctx.code.addFinallyHandler(startPC, endPC, handlerPC);
- }
-
- /// Arrays
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Generate code to create an array of some basic type, whose size
- * will be dynamically computed.
- */
- protected void genArrayCreate(Context ctx, Primitive prim, Tree size)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, size, JType.INT);
- JType type;
- switch (prim) {
- case NEW_ZARRAY : type = JType.BOOLEAN; break;
- case NEW_BARRAY : type = JType.BYTE; break;
- case NEW_SARRAY : type = JType.SHORT; break;
- case NEW_CARRAY : type = JType.CHAR; break;
- case NEW_IARRAY : type = JType.INT; break;
- case NEW_LARRAY : type = JType.LONG; break;
- case NEW_FARRAY : type = JType.FLOAT; break;
- case NEW_DARRAY : type = JType.DOUBLE; break;
- default: throw Debug.abort("unexpected primitive", prim);
- }
- ctx.code.emitNEWARRAY(type);
- }
-
- /**
- * Generate code to create an array of references, whose size will
- * be dynamically computed.
- */
- protected void genRefArrayCreate(Context ctx, Tree size, Tree classNameLit)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, size, JType.INT);
-
- String className;
- switch (classNameLit) {
- case Literal(STRING(String name)): className = name; break;
- default: throw Debug.abort("invalid argument for oarray", classNameLit);
- }
-
- JReferenceType elemType;
- switch (className.charAt(0)) {
- case '[': case 'L':
- elemType = (JReferenceType)JType.parseSignature(className); break;
- default:
- elemType = new JObjectType(className);
- }
- ctx.code.emitANEWARRAY(elemType);
- }
-
- /**
- * Generate code to update an array.
- */
- protected void genArrayUpdate(Context ctx, Tree array, Tree index, Tree value)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, array, JAVA_LANG_OBJECT_T);
- genLoad(ctx, index, JType.INT);
- JType elemType = getArrayElementType(array);
- if (elemType.isValueType())
- value = unbox(value);
- genLoad(ctx, value, elemType);
- ctx.code.emitASTORE(elemType);
- }
-
- /**
- * Generate code to load an element of an array.
- */
- protected void genArrayAccess(Context ctx, Tree array, Tree index)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, array, JAVA_LANG_OBJECT_T);
- genLoad(ctx, index, JType.INT);
- ctx.code.emitALOAD(getArrayElementType(array));
- }
-
- /**
- * Generate code to load the length of an array.
- */
- protected void genArrayLength(Context ctx, Tree array)
- throws JCode.OffsetTooBigException {
- genLoad(ctx, array, JAVA_LANG_OBJECT_T);
- ctx.code.emitARRAYLENGTH();
- }
-
- /**
- * Return the Java type of the elements of the array represented
- * by the given tree.
- */
- protected JType getArrayElementType(Tree array) {
- JArrayType arrayType = (JArrayType)typeStoJ(array.type);
- return arrayType.getElementType();
- }
-
- /// String concatenation
- //////////////////////////////////////////////////////////////////////
-
- protected Tree[] liftStringConcatenations(Tree tree) {
- LinkedList accu = new LinkedList();
- liftStringConcatenations(tree, accu);
- return (Tree[])accu.toArray(new Tree[accu.size()]);
- }
-
- protected void liftStringConcatenations(Tree tree, LinkedList accu) {
- switch (tree) {
- case Apply(Select(Tree qualifier, Name selector), Tree[] args): {
- Symbol funSym = ((Tree.Apply)tree).fun.symbol();
- if (prims.isPrimitive(funSym)
- && prims.getPrimitive(funSym) == Primitive.CONCAT) {
- liftStringConcatenations(qualifier, accu);
- liftStringConcatenations(args[0], accu);
- } else
- accu.addLast(tree);
- } break;
- default:
- accu.addLast(tree);
- }
- }
-
- /**
- * Generate code to concatenate a list of expressions which return
- * strings.
- */
- protected void genStringConcatenation(Context ctx, Tree[] elements)
- throws JCode.OffsetTooBigException {
- // Create string buffer
- ctx.code.emitNEW(JAVA_LANG_STRINGBUFFER);
- ctx.code.emitDUP();
- ctx.code.emitINVOKESPECIAL(JAVA_LANG_STRINGBUFFER,
- "<init>",
- JMethodType.ARGLESS_VOID_FUNCTION);
-
- // Append all strings
- for (int i = 0; i < elements.length; ++i) {
- JType elemType = typeStoJ(elements[i].type);
- if (!elemType.equals(JObjectType.JAVA_LANG_STRING)
- && elemType.isReferenceType())
- elemType = JObjectType.JAVA_LANG_OBJECT;
- genLoad(ctx, elements[i], elemType);
- ctx.code.emitINVOKEVIRTUAL(JAVA_LANG_STRINGBUFFER,
- "append",
- new JMethodType(JAVA_LANG_STRINGBUFFER_T,
- new JType[] { elemType }));
- }
-
- // Get resulting string
- ctx.code.emitINVOKEVIRTUAL(JAVA_LANG_STRINGBUFFER,
- "toString",
- new JMethodType(JObjectType.JAVA_LANG_STRING,
- JType.EMPTY_ARRAY));
- }
-
- /// Primitives
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Return true iff the given symbol is a primitive, AND that
- * primitive is recognized by this back-end, AND that primitive is
- * a "jumping" one.
- */
- protected boolean isJumpingPrimitive(Symbol sym) {
- if (prims.isPrimitive(sym)) {
- switch (prims.getPrimitive(sym)) {
- case ID : case NI : case EQ : case NE :
- case LT : case LE : case GE : case GT :
- case ZNOT : case ZOR : case ZAND :
- return true;
- }
- }
- return false;
- }
-
- /**
- * Return true iff the given symbol is a primitive, AND that
- * primitive is recognized by this back-end.
- */
- protected boolean isKnownPrimitive(Symbol sym) {
- if (isJumpingPrimitive(sym))
- return true;
-
- if (prims.isPrimitive(sym)) {
- switch (prims.getPrimitive(sym)) {
- case POS : case NEG :
- case ADD : case SUB : case MUL : case DIV : case MOD :
- case NOT : case OR : case XOR : case AND :
- case LSL : case LSR : case ASR :
- case NEW_ZARRAY : case NEW_BARRAY : case NEW_SARRAY :
- case NEW_CARRAY : case NEW_IARRAY : case NEW_LARRAY :
- case NEW_FARRAY : case NEW_DARRAY : case NEW_OARRAY :
- case ZARRAY_GET : case BARRAY_GET : case SARRAY_GET :
- case CARRAY_GET : case IARRAY_GET : case LARRAY_GET :
- case FARRAY_GET : case DARRAY_GET : case OARRAY_GET :
- case ZARRAY_SET : case BARRAY_SET : case SARRAY_SET :
- case CARRAY_SET : case IARRAY_SET : case LARRAY_SET :
- case FARRAY_SET : case DARRAY_SET : case OARRAY_SET :
- case ZARRAY_LENGTH : case BARRAY_LENGTH : case SARRAY_LENGTH :
- case CARRAY_LENGTH : case IARRAY_LENGTH : case LARRAY_LENGTH :
- case FARRAY_LENGTH : case DARRAY_LENGTH : case OARRAY_LENGTH :
- case IS : case AS : case ID : case NI :
- case CONCAT : case THROW : case SYNCHRONIZED:
- case B2B: case B2S: case B2C: case B2I: case B2L: case B2F: case B2D:
- case S2B: case S2S: case S2C: case S2I: case S2L: case S2F: case S2D:
- case C2B: case C2S: case C2C: case C2I: case C2L: case C2F: case C2D:
- case I2B: case I2S: case I2C: case I2I: case I2L: case I2F: case I2D:
- case L2B: case L2S: case L2C: case L2I: case L2L: case L2F: case L2D:
- case F2B: case F2S: case F2C: case F2I: case F2L: case F2F: case F2D:
- case D2B: case D2S: case D2C: case D2I: case D2L: case D2F: case D2D:
- return true;
-
- case EQUALS :
- case HASHCODE :
- case TOSTRING :
- case COERCE :
- case BOX :
- case UNBOX :
- case APPLY : case UPDATE : case LENGTH :
- return false;
- default:
- throw Debug.abort("unknown primitive", sym);
- }
- } else
- return false;
- }
-
- /**
- * Negate the given primitive only if the second argument is
- * true, otherwise return it as is.
- */
- protected Primitive maybeNegatedPrim(Primitive prim, boolean negate) {
- return negate ? prim.negate() : prim;
- }
-
- /**
- * Return all the arguments associated with the primitive
- * represented by the given function call.
- */
- protected Tree[] extractPrimitiveArgs(Tree.Apply call) {
- Tree[] allArgs = Tree.cloneArray(1, call.args);
- allArgs[0] = ((Tree.Select)(call.fun)).qualifier;
- return allArgs;
- }
-
- /**
- * Return the unboxed version of the given tree.
- */
- protected Tree unbox(Tree tree) {
- switch (tree) {
- case Apply(Tree fun, Tree[] args):
- if (prims.getPrimitive(fun.symbol()) == Primitive.BOX) {
- assert args.length == 1;
- return args[0];
- } else
- return tree;
- default:
- return tree;
- }
- }
-
- /// Modules
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Add field containing module instance, and code to initialize
- * it, to current class.
- */
- protected void addModuleInstanceField(Context ctx) {
- ctx.clazz.addNewField(JAccessFlags.ACC_PUBLIC
- | JAccessFlags.ACC_FINAL
- | JAccessFlags.ACC_STATIC,
- MODULE_INSTANCE_FIELD_NAME,
- ctx.clazz.getType());
-
- ctx.code.emitNEW(ctx.clazz.getName());
- ctx.code.emitINVOKESPECIAL(ctx.clazz.getName(),
- CONSTRUCTOR_STRING,
- JMethodType.ARGLESS_VOID_FUNCTION);
- // The field is initialised by the constructor, so we don't
- // need to do it here, creating the instance is sufficient.
- }
-
- protected JMethod addNewScalaMethod(JClass clazz,
- Symbol method,
- int addFlags) {
- JMethodType methodType = (JMethodType)typeStoJ(method.type());
-
- Symbol[] params = method.valueParams();
- String[] argNames = new String[params.length];
-
- for (int i = 0; i < argNames.length; ++i)
- argNames[i] = params[i].name.toString();
-
- return clazz.addNewMethod(javaModifiers(method) | addFlags,
- method.name.toString(),
- methodType.getReturnType(),
- methodType.getArgumentTypes(),
- argNames);
- }
-
- /**
- * Create a class which mirrors all public methods of the given
- * module class as static methods, to enable the use of the module
- * from Java.
- */
- protected void dumpModuleMirrorClass(Context ctx, Symbol cSym, Pickle pickle) {
- String mainName = javaName(cSym);
- String mirrorName = mainName.substring(0, mainName.length() - 1);
-
- JClass mirrorClass = fjbgContext.JClass(JAccessFlags.ACC_SUPER
- | JAccessFlags.ACC_PUBLIC
- | JAccessFlags.ACC_FINAL,
- mirrorName,
- JAVA_LANG_OBJECT,
- JClass.NO_INTERFACES,
- ctx.sourceFileName);
- Scope.SymbolIterator memberIt =
- cSym.members().iterator();
- while (memberIt.hasNext()) {
- Symbol member = memberIt.next();
- if (!member.isMethod()
- || member.isInitializer()
- || member.isStatic())
- continue;
-
- JMethod mirrorMeth =
- addNewScalaMethod(mirrorClass, member, JAccessFlags.ACC_STATIC);
- JExtendedCode mirrorCode = (JExtendedCode)mirrorMeth.getCode();
-
- mirrorCode.emitGETSTATIC(mainName,
- MODULE_INSTANCE_FIELD_NAME,
- new JObjectType(mainName));
- JType[] argTypes = mirrorMeth.getArgumentTypes();
- for (int index = 0, i = 0; i < argTypes.length; ++i) {
- mirrorCode.emitLOAD(index, argTypes[i]);
- index += argTypes[i].getSize();
- }
- mirrorCode.emitINVOKEVIRTUAL(mainName,
- mirrorMeth.getName(),
- (JMethodType)mirrorMeth.getType());
- mirrorCode.emitRETURN(mirrorMeth.getReturnType());
-
- mirrorCode.setLineNumber(0,
- mirrorCode.getPC(),
- Position.line(member.pos));
- }
- addScalaAttr(mirrorClass, pickle);
-
- writeClassFile(mirrorClass);
- }
-
- /**
- * Add the "Scala" attribute to the given class, in which the
- * symbol table is saved.
- */
- protected void addScalaAttr(JClass cls, Pickle pickle) {
- // change this to true to enable .symbl file generation
- if (false) {
- pickles.add(cls);
- pickles.add(pickle);
- } else {
- JOtherAttribute scalaAttr =
- fjbgContext.JOtherAttribute(cls,
- cls,
- SCALA_ATTR,
- pickle.bytes,
- pickle.size());
- cls.addAttribute(scalaAttr);
- }
- }
-
- /// Names
- //////////////////////////////////////////////////////////////////////
-
- protected HashMap nameMap/*<Symbol,String>*/ = new HashMap();
-
- /**
- * Return a Java-compatible version of the name of the given
- * symbol. The returned name is mangled and includes the names of
- * the owners.
- */
- protected String javaName(Symbol sym) {
- Object value = nameMap.get(sym);
- if (value != null) return (String)value;
- String name = prims.getJREClassName(sym);
- nameMap.put(sym, name);
- return name;
- }
-
- /// Types
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Return the Java modifiers for the given Scala symbol.
- */
- protected int javaModifiers(Symbol sym) {
- int flags = sym.flags;
- int jFlags = 0;
-
- if (Modifiers.Helper.isPrivate(flags))
- jFlags |= JAccessFlags.ACC_PRIVATE;
- else
- jFlags |= JAccessFlags.ACC_PUBLIC;
-
- if (Modifiers.Helper.isAbstract(flags))
- jFlags |= JAccessFlags.ACC_ABSTRACT;
- if (Modifiers.Helper.isInterface(flags))
- jFlags |= JAccessFlags.ACC_INTERFACE;
-
- if (Modifiers.Helper.isFinal(flags)
- && !(Modifiers.Helper.isAbstract(flags)
- || Modifiers.Helper.isInterface(flags)))
- jFlags |= JAccessFlags.ACC_FINAL;
-
- if (sym.isStatic())
- jFlags |= JAccessFlags.ACC_STATIC;
-
- return jFlags;
- }
-
- protected HashMap typeMap/*<Symbol,Type>*/ = new HashMap();
- protected void initTypeMap() {
- typeMap.put(defs.ANY_CLASS, JObjectType.JAVA_LANG_OBJECT);
- typeMap.put(defs.ANYREF_CLASS, JObjectType.JAVA_LANG_OBJECT);
- }
-
- /**
- * Return the Java type corresponding to the given Scala type.
- */
- protected JType typeStoJ(Type tp) {
- switch (tp) {
- case ConstantType(Type base, _):
- return typeStoJ(base);
- case TypeRef(_, Symbol sym, _):
- Object value = typeMap.get(sym);
- if (value != null) return (JType)value;
- JType jTp = new JObjectType(javaName(sym));
- typeMap.put(sym, jTp);
- return jTp;
- case UnboxedType(TypeTags.BYTE):
- return JType.BYTE;
- case UnboxedType(TypeTags.CHAR):
- return JType.CHAR;
- case UnboxedType(TypeTags.SHORT):
- return JType.SHORT;
- case UnboxedType(TypeTags.INT):
- return JType.INT;
- case UnboxedType(TypeTags.LONG):
- return JType.LONG;
- case UnboxedType(TypeTags.FLOAT):
- return JType.FLOAT;
- case UnboxedType(TypeTags.DOUBLE):
- return JType.DOUBLE;
- case UnboxedType(TypeTags.BOOLEAN):
- return JType.BOOLEAN;
- case UnboxedType(TypeTags.UNIT):
- return JType.VOID;
- case UnboxedType(TypeTags.STRING):
- return JObjectType.JAVA_LANG_STRING;
- case UnboxedArrayType(Type elementType):
- return new JArrayType(typeStoJ(elementType));
- case MethodType(Symbol[] vparams, Type result):
- JType[] argTypes = new JType[vparams.length];
- for (int i = 0; i < vparams.length; ++i)
- argTypes[i] = typeStoJ(vparams[i].info());
- return new JMethodType(typeStoJ(result), argTypes);
- default:
- throw Debug.abort("invalid type", tp);
- }
- }
-
- /**
- * Return the "index" of the given type. This index encodes the
- * level in the hierarchy of basic types, with arrays and objects
- * on top of everything.
- */
- protected int getTypeIndex(JType tp) {
- return getTypeIndex(tp.getTag());
- }
-
- /**
- * Return the "index" of the given type.
- */
- protected int getTypeIndex(int tp) {
- switch (tp) {
- case JType.T_BOOLEAN: return 0;
- case JType.T_BYTE:
- case JType.T_CHAR:
- case JType.T_SHORT:
- case JType.T_INT: return 1;
- case JType.T_LONG: return 2;
- case JType.T_FLOAT: return 3;
- case JType.T_DOUBLE: return 4;
- case JType.T_ARRAY:
- case JType.T_OBJECT: return 5;
- default: return -1;
- }
- }
-
- /**
- * Return the maximum of the types of all the given trees. All
- * reference types are considered to be equivalent, and if several
- * reference types are present in the trees, any one of them is
- * returned.
- */
- protected JType getMaxType(Tree[] trees) {
- JType maxType = JType.BOOLEAN;
- int maxTypeIdx = getTypeIndex(maxType);
-
- for (int i = 0; i < trees.length; ++i) {
- JType argType = typeStoJ(trees[i].type);
- if (getTypeIndex(argType) > maxTypeIdx) {
- maxType = argType;
- maxTypeIdx = getTypeIndex(maxType);
- }
- }
- return maxType;
- }
- protected JType getMaxType(Tree tree1, Tree tree2) {
- JType type1 = typeStoJ(tree1.type);
- JType type2 = typeStoJ(tree2.type);
- return getTypeIndex(type1) > getTypeIndex(type2) ? type1 : type2;
- }
-
- /// Line numbers
- //////////////////////////////////////////////////////////////////////
-
- int[] pcStack = new int[32];
- int pcStackDepth = 0;
- void startCodeForTree(Context ctx, Tree tree) {
- if (pcStackDepth == pcStack.length) {
- int[] newPCStack = new int[pcStack.length * 2];
- System.arraycopy(pcStack, 0, newPCStack, 0, pcStack.length);
- pcStack = newPCStack;
- }
- pcStack[pcStackDepth++] = (ctx.code == null ? 0 : ctx.code.getPC());
- }
-
- void endCodeForTree(Context ctx, Tree tree) {
- assert pcStackDepth > 0;
- int startPC = pcStack[--pcStackDepth];
- if (ctx.code != null)
- ctx.code.completeLineNumber(startPC,
- ctx.code.getPC(),
- Position.line(tree.pos));
- }
-
- protected void genLocalVariableTable(Context ctx) {
- JLocalVariable[] vars = ctx.method.getLocalVariables();
-
- if (!global.debuginfo || vars.length == 0)
- return;
-
- JConstantPool pool = ctx.clazz.getConstantPool();
- int pc = ctx.code.getPC();
- int anonCounter = 1;
-
- ByteBuffer lvTab = ByteBuffer.allocate(2 + 10 * vars.length);
- lvTab.putShort((short)vars.length);
- for (int i = 0; i < vars.length; i++) {
- JLocalVariable lv = vars[i];
- String name = (lv.getName() == null)
- ? "<anon" + (anonCounter++) + ">" : lv.getName();
- lvTab.putShort((short)0);
- lvTab.putShort((short)pc);
- lvTab.putShort((short)pool.addUtf8(name));
- lvTab.putShort((short)pool.addUtf8(lv.getType().getSignature()));
- lvTab.putShort((short)lv.getIndex());
- }
- JAttribute attr =
- fjbgContext.JOtherAttribute(ctx.clazz,
- ctx.method,
- "LocalVariableTable",
- lvTab.array());
- ctx.code.addAttribute(attr);
- }
-
-
- /// Context
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Record the entry into a class, and return the appropriate
- * context.
- */
- protected Context enterClass(Context ctx, Symbol cSym) {
- String javaName = javaName(cSym);
-
- boolean serializable =
- global.getAttrArguments(cSym, defs.SCALA_SERIALIZABLE_CONSTR) != null;
-
- boolean cloneable =
- global.getAttrArguments(cSym, defs.SCALA_CLONEABLE_CONSTR) != null;
-
- scalac.symtab.Type[] baseTps = cSym.info().parents();
- assert baseTps.length > 0 : Debug.show(cSym);
-
- int offset;
- String superClassName;
- if (cSym.isInterface()) {
- offset = baseTps[0].symbol() == defs.ANY_CLASS ? 1 : 0;
- superClassName = JAVA_LANG_OBJECT;
- } else {
- offset = 1;
- superClassName = javaName(baseTps[0].symbol());
- }
- String[] interfaceNames = new String[baseTps.length - offset
- + (serializable ? 1 : 0)
- + (cloneable ? 1 : 0)];
- for (int i = offset; i < baseTps.length; ++i) {
- Symbol baseSym = baseTps[i].symbol();
- assert baseSym.isInterface() : cSym + " implements " + baseSym;
- interfaceNames[i - offset] = javaName(baseSym);
- }
- if (serializable)
- interfaceNames[interfaceNames.length - 1 - (cloneable ? 1 : 0)] =
- "java.io.Serializable";
- if (cloneable)
- interfaceNames[interfaceNames.length - 1] = "java.lang.Cloneable";
-
- JClass cls = fjbgContext.JClass(javaModifiers(cSym)
- & ~JAccessFlags.ACC_STATIC
- | JAccessFlags.ACC_SUPER,
- javaName,
- superClassName,
- interfaceNames,
- ctx.sourceFileName);
-
- return ctx.withClass(cls,
- cSym.isModuleClass() && ctx.clazz == null,
- cSym.isSubClass(JAVA_RMI_REMOTE_CLASS));
- }
-
- protected void leaveClass(Context ctx, Symbol cSym) {
- JClass clazz = ctx.clazz;
-
- Pickle pickle = (Pickle)global.symdata.get(cSym);
- if (pickle != null)
- if (ctx.isModuleClass)
- dumpModuleMirrorClass(ctx, cSym, pickle);
- else
- addScalaAttr(clazz, pickle);
-
- writeClassFile(clazz);
- }
-
- /**
- * Record the entry into a method, and return the appropriate
- * context.
- */
- protected Context enterMethod(Context ctx,
- Tree.DefDef mDef,
- boolean useWideJumps) {
- Symbol mSym = mDef.symbol();
-
- global.log("entering method " + Debug.show(mSym)
- + " (type: " + Debug.show(mSym.info()) + ")"
- + " wide jumps? " + useWideJumps);
-
- JMethod method = addNewScalaMethod(ctx.clazz, mSym, 0);
-
- Map locals = new HashMap();
- Symbol[] args = mSym.valueParams();
- JType[] argTypes = method.getArgumentTypes();
-
- int firstPos = mSym.isStatic() ? 0 : 1;
- for (int i = 0, pos = firstPos; i < argTypes.length; ++i) {
- locals.put(args[i], new Integer(pos));
- pos += argTypes[i].getSize();
- }
-
- if ((mSym.flags & Modifiers.BRIDGE) != 0)
- method.addAttribute(fjbgContext.JOtherAttribute(ctx.clazz,
- method,
- "Bridge",
- new byte[]{}));
-
- if (ctx.isRemote && mSym.isPublic()) {
- // (see http://java.sun.com/docs/books/vmspec/html/ClassFile.doc.html#3129)
- // Exceptions_attribute {
- // ..
- // u2 number_of_exceptions;
- // u2 exception_index_table[number_of_exceptions];
- // }
- JConstantPool cp = ctx.clazz.getConstantPool();
- int reInx = cp.addClass(JAVA_RMI_REMOTEEXCEPTION);
- ByteBuffer contents = ByteBuffer.allocate(4); // u2 + u2[1]
- contents.putShort((short)1);
- contents.putShort((short)reInx);
- global.log("adding 'Exceptions_attribute' " + contents.toString()
- + " for remote method " + mSym.name.toString());
- method.addAttribute(fjbgContext.JOtherAttribute(ctx.clazz,
- method,
- "Exceptions",
- contents.array()));
- }
-
- return ctx.withMethod(method, locals, useWideJumps);
- }
-
- protected void leaveMethod(Context ctx) {
- genLocalVariableTable(ctx);
- global.log("leaving method");
- }
-
- /// I/O
- //////////////////////////////////////////////////////////////////////
-
- /** Writes the given class to a file. */
- protected void writeClassFile(JClass clazz) {
- File file = getFile(clazz, ".class");
- try {
- clazz.writeTo(file);
- global.operation("wrote " + file);
- } catch (IOException exception) {
- if (global.debug) exception.printStackTrace();
- global.error("could not write file " + file);
- }
- }
-
- /** Writes the given pickle for given class to a file. */
- protected void writeSymblFile(JClass clazz, Pickle pickle) {
- File file = getFile(clazz, ".symbl");
- try {
- pickle.writeTo(file);
- global.operation("wrote " + file);
- } catch (IOException exception) {
- if (global.debug) exception.printStackTrace();
- global.error("could not write file " + file);
- }
- }
-
- /** Returns the file with the given suffix for the given class. */
- protected File getFile(JClass clazz, String suffix) {
- String path = clazz.getName().replace('.', File.separatorChar);
- return new File(global.outpath + File.separatorChar + path + suffix);
- }
-
- /// Misc.
- //////////////////////////////////////////////////////////////////////
-
- /**
- * Add value members (i.e. fields) to current class.
- */
- protected void addValueClassMembers(Context ctx, Tree.ClassDef cDef) {
- Symbol cSym = cDef.symbol();
- Scope.SymbolIterator memberIt =
- cSym.members().iterator();
- while (memberIt.hasNext()) {
- Symbol member = memberIt.next();
- if (member.isTerm() && !member.isMethod()) {
- int flags = javaModifiers(member);
- if (global.getAttrArguments(member,defs.SCALA_TRANSIENT_CONSTR)
- != null)
- flags |= JAccessFlags.ACC_TRANSIENT;
- if (global.getAttrArguments(member,defs.SCALA_VOLATILE_CONSTR)
- != null)
- flags |= JAccessFlags.ACC_VOLATILE;
- ctx.clazz.addNewField(flags,
- member.name.toString(),
- typeStoJ(member.info()));
- }
- }
- }
-
- protected void completeClassConstructor(Context ctx, Symbol cSym) {
- if (ctx.isModuleClass)
- addModuleInstanceField(ctx);
- AConstant[] aargs =
- global.getAttrArguments(cSym, SCALA_SERIAL_VERSION_UID_CONSTR);
- if (aargs == null)
- return;
- assert aargs.length == 1 : "Wrong attribute arguments: ";
- String fieldName = "serialVersionUID";
- JField field = ctx.clazz.addNewField
- (JAccessFlags.ACC_STATIC | JAccessFlags.ACC_PUBLIC, fieldName,
- JType.LONG);
- genLoadLiteral(ctx, aargs[0], JType.LONG);
- ctx.code.emitPUTSTATIC(ctx.clazz.getName(), fieldName, JType.LONG);
- }
-
- /**
- * Return the class constructor method of the given class.
- */
- private JMethod getClassConstructorMethod(Context ctx) {
- JMethod[] methods = ctx.clazz.getMethods();
- JMethod clinit = null;
- for (int i = 0; i < methods.length; ++i) {
- if (methods[i].getName().equals("<clinit>")) {
- clinit = methods[i];
- break;
- }
- }
- return clinit != null
- ? clinit
- : ctx.clazz.addNewMethod(JAccessFlags.ACC_PUBLIC
- | JAccessFlags.ACC_STATIC,
- "<clinit>",
- JType.VOID,
- JType.EMPTY_ARRAY,
- Strings.EMPTY_ARRAY);
- }
-
-
- /**
- * Return true iff the given symbol is a static (in the Java
- * sense) member of its owner.
- */
- protected boolean isStaticMember(Symbol sym) {
- return sym.isStatic();
- }
-}
-
-/**
- * A compilation context, which records information about the class
- * and the method currently being generated.
- */
-class Context {
- public final String sourceFileName;
- public final JClass clazz;
- public final JMethod method;
- public final JExtendedCode code;
- public final Map/*<Symbol,JLocalVariable>*/ locals;
- public final Map/*<Symbol,Pair<JCode.Label,Tree[]>>*/ labels;
- public final boolean useWideJumps;
- public final boolean isModuleClass;
- public final boolean isRemote;
-
- public final static Context EMPTY =
- new Context(null, null, null, null, null, false, false, false);
-
- private Context(String sourceFileName,
- JClass clazz,
- JMethod method,
- Map locals,
- Map labels,
- boolean useWideJumps,
- boolean isModuleClass,
- boolean isRemote) {
- this.sourceFileName = sourceFileName;
- this.clazz = clazz;
- this.method = method;
- if (method == null || method.isAbstract())
- this.code = null;
- else
- this.code = (JExtendedCode)method.getCode();
- this.locals = locals;
- this.labels = labels;
- this.useWideJumps = useWideJumps;
- this.isModuleClass = isModuleClass;
- this.isRemote = isRemote;
- }
-
- public Context withSourceFileName(String sourceFileName) {
- return new Context(sourceFileName,
- null,
- null,
- null,
- null,
- false,
- false,
- false);
- }
-
- public Context withClass(JClass clazz, boolean isModuleClass, boolean isRemote) {
- return new Context(this.sourceFileName,
- clazz,
- null,
- null,
- null,
- false,
- isModuleClass,
- isRemote);
- }
-
- public Context withMethod(JMethod method, Map locals, boolean useWideJumps) {
- assert this.clazz == method.getOwner();
- return new Context(this.sourceFileName,
- this.clazz,
- method,
- locals,
- new HashMap(),
- useWideJumps,
- this.isModuleClass,
- this.isRemote);
- }
-}
diff --git a/sources/scalac/backend/msil/GenMSIL.java b/sources/scalac/backend/msil/GenMSIL.java
deleted file mode 100644
index 3850369356..0000000000
--- a/sources/scalac/backend/msil/GenMSIL.java
+++ /dev/null
@@ -1,2632 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.backend.msil;
-
-import scalac.Global;
-import scalac.CompilationUnit;
-
-import scalac.util.Debug;
-
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Debug;
-import scalac.util.SourceRepresentation;
-import scalac.ast.Tree;
-import scalac.ast.TreeList;
-import scalac.atree.AConstant;
-import Tree.*;
-import scalac.symtab.Symbol;
-import scalac.symtab.TypeTags;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Definitions;
-import scalac.symtab.classfile.Pickle;
-import scalac.symtab.classfile.CLRTypes;
-
-import scalac.backend.Primitive;
-import scalac.backend.Primitives;
-
-import scala.tools.util.Position;
-
-import ch.epfl.lamp.compiler.msil.*;
-import ch.epfl.lamp.compiler.msil.emit.*;
-
-import Item.*;
-
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Iterator;
-
-/**
- * Generates MS IL code via Reflection.Emit-like API
- * (ch.epfl.lamp.compiler.msil.emit package)
- *
- * @author Nikolay Mihaylov
- */
-public final class GenMSIL {
-
- //################################################################
-
- // The position of the paramater in the parameter list
- private final Map/*<Symbol, Integer>*/ params = new HashMap();
-
- // The LocalBuilder corresponding to the local variable symbol
- private final Map/*<Symbol, LocalBuilder>*/ locals = new HashMap();
-
- // mapping from LabelDef symbols to labels
- private final Map/*<Symbol, Label>*/ sym2label = new HashMap();
-
- // the code generator for the current method
- private ILGenerator code;
-
- private final Global global;
- private final TypeCreator tc;
- private final Definitions defs;
- private final Primitives primitives;
- private final ItemFactory items;
-
- private static final Item TRUE_ITEM = Item.CondItem(Test.True, null, null);
- private static final Item FALSE_ITEM = Item.CondItem(Test.False, null, null);
-
- /** The public entry point into the code generator. */
- public static void translate(Global global, CompilationUnit[] units) {
- TypeCreator tc = new TypeCreator(global);
- GenMSIL translator = new GenMSIL(global, tc);
- tc.init();
- tc.collectSymbols(units);
- tc.initAssembly();
- for (int i = 0; i < units.length; i++) translator.apply(units[i]);
- tc.saveAssembly();
- }
-
- /**
- * The private constructor of the code generator.
- */
- private GenMSIL(Global global, TypeCreator tc) {
- this.global = global;
- this.defs = global.definitions;
- this.primitives = global.primitives;
- this.tc = tc; //new TypeCreator(global, this, phase);
- this.items = new ItemFactory(this);
- }
-
-
- private String getSourceFilename() {
- assert currUnit != null;
- return SourceRepresentation.escape(currUnit.source.getFile().getPath());
- }
-
- // keeps track of the current compilation unit for better error reporting
- private CompilationUnit currUnit;
-
- /**
- * The main entry point into the code generator. Called from translate
- * for every compilation unit.
- */
- private void apply(CompilationUnit unit) {
- currUnit = unit;
- for (int i = 0; i < unit.body.length; i++) {
- Tree tree = unit.body[i];
- Symbol sym = tree.symbol();
- try {
- switch (tree) {
- case Empty: break;
- case ClassDef(_, _, _, _, _, Template(_, Tree[] body)):
- genClass(sym, body);
- break;
- case PackageDef(_, Template(_ , Tree[] body)):
- genPackage(body);
- break;
- default:
- throw Debug.abort
- ("Illegal top-level definition: " + Debug.show(tree));
- }
- } catch (Throwable e) {
- currUnit.error(tree.pos, "Exception caught: " + e.getMessage());
- e.printStackTrace();
- tc.saveAssembly();
- System.exit(1);
- }
- }
- }
-
- /**
- * Generate the code for a Package definition.
- */
- private void genPackage(Tree[] body) {
- for (int i = 0; i < body.length; i++) {
- Symbol sym = body[i].symbol();
- switch (body[i]) {
- case Empty:
- break;
-
- case ClassDef(_, _, _, _, _, Template(_, Tree[] classBody)):
- Type type = tc.getType(sym);
- assert type instanceof TypeBuilder
- : Debug.show(sym) + " => [" + type.Assembly() + "]" + type;
- if (type instanceof TypeBuilder)
- genClass(sym, classBody);
- break;
-
- case PackageDef(_, Template(_ , Tree[] body2)):
- genPackage(body2);
- break;
-
- default:
- throw Debug.abort("Class definition expected", Debug.show(sym));
- }
- }
- }
-
- /** The symbol of the class that is currently being compiled. */
- private Symbol currentClass;
-
- /** The method that is currently being compiled. */
- private MethodBase currentMethod;
-
-
- private static final byte[] NO_SYMTAB = new byte[] {1, 0, 0, 0};
- /*
- * Emit the symbol table for the class given class as an MSIL attribute.
- */
- private void emitSymtab(Symbol clazz) {
- ConstructorInfo symtabConstr = tc.SYMTAB_DEFAULT_CONSTR;
- byte[] symtab = null;
- Pickle pickle = (Pickle)global.symdata.get(clazz);
- if (pickle == null) {
- symtab = NO_SYMTAB;
- } else {
- symtabConstr = tc.SYMTAB_CONSTR;
- symtab = new byte[pickle.size() + 8];
- symtab[0] = 1;
- for (int size = pickle.size(), i = 2; i < 6; i++) {
- symtab[i] = (byte)(size & 0xff);
- size >>= 8;
- }
- System.arraycopy(pickle.bytes, 0, symtab, 6, pickle.size());
- }
- TypeBuilder type = (TypeBuilder) tc.getType(clazz);
- if (clazz.isModuleClass()) {
- TypeBuilder t = tc.getStaticType(clazz);
- if (t != null) {
- type.SetCustomAttribute(tc.SYMTAB_DEFAULT_CONSTR, NO_SYMTAB);
- type = t;
- if (global.args.debuginfo.value)
- type.setPosition(Position.line(clazz.pos), getSourceFilename());
- }
- }
- type.SetCustomAttribute(symtabConstr, symtab);
- }
-
- /*
- * Generate the code for a class definition
- */
- private void genClass(Symbol clazz, Tree[] body) {
- Symbol outerClass = currentClass;
- currentClass = clazz;
- if (clazz.isModuleClass()) {
- tc.getModuleField(clazz);
- }
- final TypeBuilder type = (TypeBuilder)tc.getType(clazz);
- if (global.args.debuginfo.value)
- type.setPosition(Position.line(clazz.pos), getSourceFilename());
- emitSymtab(clazz);
- for (int i = 0; i < body.length; i++) {
- Symbol sym = body[i].symbol();
- switch (body[i]) {
- case Empty:
- break;
-
- case ValDef(_, _, _, _):
- // just to generate the field declaration
- // the rhs should've been moved to the constructor body
- tc.createField(sym);
- break;
-
- case ClassDef(_, _, _, _, _, Template impl):
- genClass(sym, impl.body);
- break;
-
- case DefDef(_, _, _, ValDef[][] vparams, Tree tpe, Tree rhs):
- if (!sym.isDeferred()) {
- currentMethod = tc.getMethod(sym);
- if (tc.isEntryPoint(sym) && tc.moreThanOneEntryPoint())
- currUnit.warning(body[i].pos,
- "Program has more than one"
- + " entry point defined");
- genDef(sym, vparams[0], rhs, msilType(tpe.type));
- }
- break;
-
- default:
- assert false : "Illegal class body definition: "
- + Debug.show(body[i]);
- }
- }
- if (tc.isCloneable(clazz)) {
- Symbol cloneSym = clazz.lookup(Names.clone);
- if (cloneSym.isNone()) {
- short mods = MethodAttributes.Public
- | MethodAttributes.Virtual
- | MethodAttributes.HideBySig;
- ILGenerator code =
- type.DefineMethod("Clone", mods, tc.OBJECT, Type.EmptyTypes)
- .GetILGenerator();
- code.Emit(OpCodes.Ldarg_0);
- code.Emit(OpCodes.Call, tc.MEMBERWISE_CLONE);
- code.Emit(OpCodes.Ret);
- }
- }
- currentClass = outerClass;
- } //genClass()
-
-
- /*
- * Specifies if the currently processed tree node is the last expression
- * in a function so the generated code can be optimized: emitting ret
- * instead of branch, emitting tailcalls, etc.
- */
- private boolean lastExpr;
-
- private boolean enableTailCalls = false;
-
- private Label methodEnd = null;
-
- // set by backward jumps to show that the code ofter them is unreachable
- private boolean unreachable = false;
-
- // used to push down the exit label of conditional expressions
- private Label exitLabel;
-
- /*
- * Generate code for constructors and methods.
- */
- private void genDef(Symbol sym, ValDef[] parameters, Tree rhs, MSILType toType) {
- MethodBase method = tc.getMethod(sym);
-
- params.clear();
- locals.clear();
- int argOffset = method.IsStatic() ? 0 : 1;
- for (int i = 0; i < parameters.length; i++) {
- params.put(parameters[i].symbol(), new Integer(i + argOffset));
- }
- if (method.IsConstructor()) {
- ConstructorInfo ctor = (ConstructorInfo) method;
- code = ((ConstructorBuilder)ctor).GetILGenerator();
- methodEnd = code.DefineLabel();
- if (global.args.debuginfo.value)
- code.setPosition(Position.line(rhs.pos));
- if (sym.owner().isModuleClass()
- && sym.owner().owner().isPackageClass()) {
- Tree[] cstats = null;
- switch (rhs) {
- case Block(Tree[] stats, Tree value):
- TreeList stms = new TreeList();
- for (int i = 0; i < stats.length; i++) {
- switch (stats[i]) {
- case Block(Tree[] stats2, Tree value2):
- stms.append(stats2);
- stms.append(value2);
- break;
- default:
- stms.append(stats[i]);
- }
- }
- switch (value) {
- case Block(Tree[] stats2, Tree value2):
- stms.append(stats2);
- stms.append(value2);
- break;
- }
- cstats = stms.toArray();
- break;
- default:
- cstats = new Tree[]{rhs};
- }
-
- // emit the call to the superconstructor
- drop(gen(cstats[0], MSILType.VOID));
- closeMethod(methodEnd);
- ConstructorBuilder cctor = ((TypeBuilder)(method.DeclaringType)).
- DefineConstructor((short)(MethodAttributes.Static
- | MethodAttributes.Public),
- CallingConventions.Standard,
- Type.EmptyTypes);
- currentMethod = cctor;
- code = cctor.GetILGenerator();
- if (global.args.debuginfo.value)
- code.setPosition(Position.line(sym.owner().pos));
- // initialize the static module reference
- code.Emit(OpCodes.Newobj, ctor);
- code.Emit(OpCodes.Stsfld, tc.getModuleField(currentClass));
- for (int i = 1; i < cstats.length; i++) {
- drop(gen(cstats[i], MSILType.VOID));
- }
- code.Emit(OpCodes.Ret); // conclude the static constructor
- } else {
- drop(gen(rhs, MSILType.VOID));
- closeMethod(methodEnd);
- }
- } else if (!method.IsAbstract()) {
- lastExpr = true;
- code = ((MethodBuilder)method).GetILGenerator();
- methodEnd = code.DefineLabel();
- if (global.args.debuginfo.value)
- code.setPosition(Position.line(rhs.pos));
- Item item = gen(rhs, toType);
- if (returnsVoid(method))
- drop(item);
- else
- coerce(load(item), toType); // FIXME: coerce???
- closeMethod(methodEnd);
- if (currentClass.isModuleClass()) {
- MethodBuilder staticMethod = tc.getStaticObjectMethod(sym);
- if (staticMethod != null) {
- code = staticMethod.GetILGenerator();
- if (global.args.debuginfo.value)
- code.setPosition(Position.line(sym.pos));
- code.Emit(OpCodes.Ldsfld, tc.getModuleField(currentClass));
- for (int i = 0; i < parameters.length; i++)
- emitLdarg(i);
- code.Emit(OpCodes.Call, (MethodInfo)method);
- code.Emit(OpCodes.Ret);
- }
- }
- }
-
- lastExpr = false;
- code = null;
- methodEnd = null;
- } // genDef();
-
- private void closeMethod(Label methodEnd) {
- code.MarkLabel(methodEnd);
- code.Emit(OpCodes.Ret);
- }
-
- /*
- * Check if the result type of a method is void
- */
- private boolean returnsVoid(MethodBase method) {
- return method.IsConstructor() ||
- (((MethodInfo)method).ReturnType == tc.VOID);
- }
-
- private boolean returnsVoid(Symbol fun) {
- switch (fun.type()) {
- case MethodType(_, scalac.symtab.Type restype):
- return restype.isSameAs(defs.UNIT_TYPE().unbox());
- default:
- return false;
- }
- }
-
- /*
- * Emit the code for this.
- */
- private void emitThis() {
- if (currentMethod.IsStatic()) {
- if (currentMethod.IsConstructor()) {
- code.Emit(OpCodes.Ldsfld, tc.getModuleField(currentClass));
- } else
- throw Debug.abort ("Static methods don't have 'this' pointer");
- } else
- code.Emit(OpCodes.Ldarg_0);
- }
-
-
- /*
- * Sanity checks for items.
- */
- private Item check(Item item) {
- assert item != null && item.type != null : "" + item;
- return item;
- }
-
- /*
- *
- */
- private Item genLoad(Tree tree, MSILType toType) {
- return load(gen(tree, toType));
- }
-
- /** the position of the treenode which is currently being processed. */
- private int pos;
-
- /*
- * The main generator function. It keeps track of
- * the current position in the tree for better error messages
- */
- private Item gen(Tree tree, MSILType toType) {
- unreachable = false;
- if (global.args.debuginfo.value
- && code != null && tree.pos != Position.NOPOS
- && Position.line(tree.pos) != Position.line(pos))
- {
- code.setPosition(Position.line(tree.pos));
- }
- int tmpPos = pos;
- pos = tree.pos;
- Item item = null;
- //i = gen0(tree, toType);
- try {
- item = gen0(tree, toType);
- assert item.type.equals(toType)
- || item.type.equals(unboxValueType(toType))
- : "" + item + " <> " + toType + "; tree = " + tree.getClass();
- }
- catch (Throwable e) {
- currUnit.error(tree.pos, "Exception caught: " + e.getMessage());
- e.printStackTrace();
- tc.saveAssembly();
- System.exit(1);
-// + (global.debug ? "" : "; Use -debug to get a stack trace."));
-// //if (global.debug)
-// e.printStackTrace();
-// //System.exit(1);
- //throw Debug.abort(tree, e);
- throw Debug.abort(e);
- }
- pos = tmpPos;
- return check(item);
- }
-
- /*
- * Generate the code corresponding to the given tree node
- */
- private Item gen0(Tree tree, MSILType toType) {
- Symbol sym = tree.hasSymbol() ? tree.symbol() : null;
- Item item = null;
- switch (tree) {
- case Empty:
- return items.VoidItem();
-
- case Block(Tree[] stats, Tree value):
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Label tmpExitLabel = exitLabel; exitLabel = null;
- for (int i = 0; i < stats.length; i++) {
- drop(gen(stats[i], MSILType.VOID));
- }
- lastExpr = tmpLastExpr;
- exitLabel = tmpExitLabel;
- return gen(value, toType);
-
- case ValDef(_, Name name, Tree tpe, Tree rhs):
- LocalBuilder local = code.DeclareLocal(tc.getType(sym));
- local.SetLocalSymInfo(tree.symbol().name.toString());
- locals.put(sym, local);
- if (rhs == Tree.Empty)
- return items.VoidItem();
- MSILType type = msilType(tpe.type);
- genLoad(rhs, type);
- return check(store(items.LocalItem(local)));
-
- case Ident(_):
- if (sym.isModule()) {
- FieldInfo field = tc.getModuleField(sym);
- // force the loading of the module
- item = coerce(load(items.StaticItem(field)), toType);
- } else {
- MSILType type = msilType(sym.info());
- Integer slot = (Integer) params.get(sym);
- if (slot != null) {
- item = items.ArgItem(type, slot.intValue());
- } else {
- LocalBuilder local = (LocalBuilder) locals.get(sym);
- if (local != null)
- item = items.LocalItem(local);
- else {
- assert sym.isStatic() : Debug.show(sym);
- FieldInfo field = tc.getField(sym);
- assert field != null : Debug.show(sym);
- if (field.IsLiteral()) {
- assert field.FieldType.IsEnum()
- && field.getValue() != null
- : field.toString();
- return coerce(mkLiteral(msilType(field.FieldType),
- field.getValue()),
- toType);
- }
- return coerce(items.StaticItem(field), toType);
- }
- }
- }
- return coerce(item, toType);
-
- case Select(Tree qualifier, _):
- if (sym.isModule()) {
- assert !sym.isJava() : "Cannot treat Java class '" +
- Debug.show(sym) + "' as value.";
- return coerce(load(items.StaticItem(tc.getModuleField(sym))), toType);
- }
- assert !sym.isStatic() :Debug.show(sym);
- item = items.SelectItem(genLoad(qualifier, msilType(qualifier)),
- tc.getField(sym));
- return coerce(item, toType);
-
- case Apply(Tree fun, Tree[] args):
- Item i = check(genApply(fun, args, msilType(tree.type)));
- return coerce(i, toType);
-
- case Assign(Tree lhs, Tree rhs):
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Label tmpExitLabel = exitLabel; exitLabel = null;
- MSILType type = msilType(lhs.type);
- Item var = gen(lhs, type);
- genLoad(rhs, type);
- lastExpr = tmpLastExpr;
- exitLabel = tmpExitLabel;
- return check(store(var));
-
- case New(Tree init):
- switch (init) {
- case Apply(Tree fun, Tree[] args):
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Label tmpExitLabel = exitLabel; exitLabel = null;
- ConstructorInfo ctor = (ConstructorInfo) tc.getMethod(fun.symbol());
- loadArgs(args, ctor.GetParameters());
- code.Emit(OpCodes.Newobj, ctor);
- lastExpr = tmpLastExpr;
- exitLabel = tmpExitLabel;
- return coerce(items.StackItem(msilType(ctor.DeclaringType)),
- toType);
- default:
- throw Debug.abort("Incorrect tree", init);
- }
-
- case This(_):
- return coerce(items.SelfItem(tc.getType(sym)), toType);
-
- case Super(_, _):
- return coerce(items.SelfItem(tc.getType(sym)), toType);
-
- case Literal(AConstant value):
- if (toType == MSILType.VOID)
- return items.VoidItem();
- return coerce(items.LiteralItem(value), toType);
-
- case Return(Tree expr):
- genLoad(expr, msilType(expr));
- code.Emit(OpCodes.Ret);
- //code.Emit(OpCodes.Br, methodEnd);
- return items.VoidItem();
-
- case If(Tree cond, Tree thenp, Tree elsep):
- item = genIf(cond, thenp, elsep, toType);
- return check(item);
-
- case LabelDef(_, Ident[] params, Tree rhs):
- Label l = code.DefineLabel();
- code.MarkLabel(l);
- sym2label.put(sym, new LabelDescr(l, params));
- return gen(rhs, toType);
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Item loc = gen(test, MSILType.I4);
- switch (loc) {
- case ArgItem(_):
- case LocalItem(_):
- case LiteralItem(_):
- break;
- default:
- loc = items.LocalItem(code.DeclareLocal(tc.INT));
- store(loc);
- }
- lastExpr = tmpLastExpr;
- Label tmpExitLabel = exitLabel;
- if (exitLabel == null)
- exitLabel = code.DefineLabel();
-
- Label nextCase = code.DefineLabel();
- assert tags.length == bodies.length;
- for (int i = 0; i < tags.length; i++) {
- load(loc);
- loadI4(tags[i]);
- code.Emit(OpCodes.Bne_Un, nextCase);
- genLoad(bodies[i], toType);
-// if (lastExpr)
-// code.Emit(OpCodes.Ret);
-// else
- if (!unreachable)
- code.Emit(OpCodes.Br, exitLabel);
- code.MarkLabel(nextCase);
- nextCase = code.DefineLabel();
- }
- Item i = genLoad(otherwise, toType);
- if (tmpExitLabel == null)
- resolve(exitLabel);
- exitLabel = tmpExitLabel;
- return i;
-
- default:
- throw Debug.abort("Dunno what to do", tree);
- }
- } //gen()
-
- /* Generate code for conditional expressions.
- */
- private Item genIf(Tree condp, Tree thenp, Tree elsep, MSILType toType) {
- Item iThen = null;
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Label tmpExitLabel = exitLabel; exitLabel = null;
- Item.CondItem cond = mkCond(gen(condp, msilType(condp.type)));
- lastExpr = tmpLastExpr;
- exitLabel = tmpExitLabel;
-
- if (elsep == Tree.Empty && toType == MSILType.VOID) {
- if (cond.success == null) {
- Chain success = new Chain(code.DefineLabel(), null);
- branch(cond.test, success);
- iThen = genLoad(thenp, toType);
- resolve(success);
- resolve(cond.failure);
- } else {
- Chain fail = (cond.failure != null) ?
- cond.failure : new Chain(code.DefineLabel(), null);
- branch(cond.test, fail);
- resolve(cond.success);
- iThen = genLoad(thenp, toType);
- resolve(fail);
- }
- } else {
- Chain fail = cond.failure != null ?
- cond.failure : new Chain(code.DefineLabel(), null);
- branch(cond.test, fail);
- resolve(cond.success);
- if (exitLabel == null)
- exitLabel = code.DefineLabel();
- Item thenItem = gen(thenp, toType);
- iThen = load(coerce(thenItem, toType));
-// if (lastExpr)
-// code.Emit(OpCodes.Ret);
-// else
- if (!unreachable)
- code.Emit(OpCodes.Br, exitLabel);
- resolve(fail);
- Item iElse = genLoad(elsep, toType);
- if (tmpExitLabel == null)
- resolve(exitLabel);
- exitLabel = tmpExitLabel;
- }
- return iThen;
- } //genIf
-
- /* Coerce the item to the specified type. */
- private Item coerce(Item item, MSILType toType) {
- assert item != null && toType != null : "" + item + " => " + toType;
- if (item.type.equals(toType))
- return item;
- if (toType == MSILType.VOID)
- return drop(item);
- switch (item) {
- case VoidItem():
- assert toType == MSILType.VOID : "" + toType;
- return item;
- case SelfItem():
- assert item.type.isSubtypeOf(toType);
- item.type = toType;
- return item;
- case StackItem():
- MSILType utype = unboxValueType(toType);
- if (item.type.isValueType() && utype != null)
- toType = utype;
- emitConvert(item.type, toType);
- item.type = toType;
- return item;
- case LiteralItem(AConstant value):
- switch (item.type) {
- case REF(Type t):
- if (item.type.isValueType()) {
- assert t.IsEnum() || toType.equals(MSILType.OBJECT)
- : item + " => "+ toType;
- return coerce(load(item), toType);
- }
- assert (item.type.isValueType())
- || (item.type.isReferenceType()
- && item.type.isSubtypeOf(toType));
- }
- item.type = toType;
- return item;
- case ArgItem(_):
- case LocalItem(_):
- if (item.type.isSubtypeOf(toType)) {
- item.type = toType;
- return item;
- }
- break;
- case CondItem(_, _, _):
- if (item.type == MSILType.BOOL)
- return item;
- break;
- }
- return coerce(load(item), toType);
- }
-
- /***/
- private void emitConvert(MSILType fromType, MSILType toType) {
- switch (fromType) {
- case REF(Type t):
- if (t.IsValueType() && toType.isType(tc.OBJECT)) {
- code.Emit(OpCodes.Box, t);
- return;
- } else if (t.IsEnum()) {
- emitConvert(msilType(t.getUnderlyingType()), toType);
- return;
- }
- }
- if (fromType.isSubtypeOf(toType))
- return;
- switch (toType) {
- case BOOL: code.Emit(OpCodes.Conv_I4); return; // TODO: is this correct/best?
- case I1: code.Emit(OpCodes.Conv_I1); return;
- case I2: code.Emit(OpCodes.Conv_I2); return;
- case I4: code.Emit(OpCodes.Conv_I4); return;
- case I8: code.Emit(OpCodes.Conv_I8); return;
- case R4: code.Emit(OpCodes.Conv_R4); return;
- case R8: code.Emit(OpCodes.Conv_R8); return;
- case CHAR: code.Emit(OpCodes.Conv_U2); return;
- case REF(Type t):
- if (t.IsEnum()) {
- assert fromType.isType(t.getUnderlyingType());
- return;
- }
- break;
- }
- throw Debug.abort("emitConvert: " + fromType + " => " + toType
- + "; fromType.isSubtypeOf(toType) = "
- + fromType.isSubtypeOf(toType));
- }
-
- private static class LabelDescr {
- final Label label;
- final Ident[] params;
- LabelDescr(Label label, Ident[] params) {
- this.label = label;
- this.params = params;
- }
- }
-
- private Item genApply(Tree fun, Tree[] args, MSILType resType) {
- boolean tmpLastExpr = lastExpr; lastExpr = false;
- Label tmpExitLabel = exitLabel; exitLabel = null;
- Item item = genApply0(fun, args, resType);
- lastExpr = tmpLastExpr;
- exitLabel = tmpExitLabel;
- return item;
- }
- /** Generate the code for an Apply node */
- private Item genApply0(Tree fun, Tree[] args, MSILType resType) {
- Symbol sym = fun.symbol();
- switch (fun) {
- case Ident(_):
- LabelDescr ld = (LabelDescr)sym2label.get(sym);
- if (ld != null) {
- assert ld.params.length == args.length
- : ld.params.length + " != " + args.length;
- lastExpr = false;
- for (int i = 0; i < args.length; i++)
- genLoad(args[i], msilType(args[i].type));
- for (int i = args.length - 1; i >= 0; i--) {
- Item ident = gen(ld.params[i], msilType(ld.params[i]));
- store(ident);
- }
- code.Emit(OpCodes.Br, ld.label);
- unreachable = true;
- MSILType retType = msilType(sym.info().resultType());
- Item i = retType == MSILType.VOID ? items.VoidItem()
- : items.StackItem(retType);
- return coerce(i, resType);
- }
- assert sym.isStatic() : Debug.show(sym);
-
- Primitive p = primitives.getPrimitive(sym);
- switch (p) {
- case UNBOX:
- assert args.length == 1;
- MSILType t = msilType(args[0].type);
- Item i = genLoad(args[0], t);
- if (!i.type.isValueType()) {
- MethodInfo method = (MethodInfo)tc.getMethod(sym);
- code.Emit(OpCodes.Call, method);
- i = returnsVoid(method) ? items.VoidItem()
- : items.StackItem(msilType(method.ReturnType));
- return coerce(i, resType);
- }
- if (sym == primitives.UNBOX_UVALUE) {
- return items.VoidItem();
- }
- return i;
- }
- MSILType convTo = primitiveConvert(sym);
- if (convTo != null) {
- assert args.length == 1;
- genLoad(args[0], convTo);
- return items.StackItem(convTo);
- }
- // Generate delegate's reverse view
- if (sym.name == Names.view &&
- CLRTypes.instance().isDelegateType(resType.toType()))
- {
- assert args.length == 1 : Debug.show(sym);
- return createDelegateFromFunction(args[0], resType);
- }
-
- return check(invokeMethod(sym, args, resType, true));
-
- case Select(Tree qualifier, _):
- // scala.Any.==
- if (sym == defs.ANY_EQEQ) {
- return genEq(qualifier, args[0]);
- }
- // scala.Any.!=
- if (sym == defs.ANY_BANGEQ) {
- return negate(genEq(qualifier, args[0]));
- }
- // java.lang.String.substring(int start, int end) needs conversion
- // to System.String.Substring(int start, int length)
- if (sym == tc.SYM_SUBSTRING_INT_INT) {
- assert args.length == 2;
- genLoad(qualifier, MSILType.STRING);
- genLoad(args[0], MSILType.I4);
- code.Emit(OpCodes.Dup);
- code.Emit(OpCodes.Neg);
- genLoad(args[1], MSILType.I4);
- code.Emit(OpCodes.Add);
- code.Emit(OpCodes.Call, tc.SUBSTRING_INT_INT);
- return coerce(items.StackItem(MSILType.STRING), resType);
- }
-
- if (sym == tc.SYM_COMPARE_TO_IGNORE_CASE) {
- assert args.length == 1;
- genLoad(qualifier, MSILType.STRING);
- genLoad(args[0], MSILType.STRING);
- code.Emit(OpCodes.Ldc_I4_1);
- code.Emit(OpCodes.Call, tc.COMPARE_TO_IGNORE_CASE);
- return coerce(items.StackItem(MSILType.STRING), resType);
- }
-
- if (isPrimitiveArrayOp(sym)) {
- Primitive prim = primitives.getPrimitive(sym);
- loadArgs(args, tc.getMethod(sym).GetParameters());
- Type elemType = getArrayElemType(prim);
- switch (prim) {
- case ZARRAY_LENGTH: case BARRAY_LENGTH: case SARRAY_LENGTH:
- case CARRAY_LENGTH: case IARRAY_LENGTH: case LARRAY_LENGTH:
- case FARRAY_LENGTH: case DARRAY_LENGTH: case OARRAY_LENGTH:
- code.Emit(OpCodes.Ldlen);
- return items.StackItem(MSILType.I4);
- case NEW_ZARRAY:
- case NEW_BARRAY:
- case NEW_SARRAY:
- case NEW_CARRAY:
- case NEW_IARRAY:
- case NEW_LARRAY:
- case NEW_FARRAY:
- case NEW_DARRAY:
- //case NEW_OARRAY:
- code.Emit(OpCodes.Newarr, elemType);
- return items.StackItem(MSILType.ARRAY(msilType(elemType)));
- case ZARRAY_GET: case BARRAY_GET: case SARRAY_GET:
- case CARRAY_GET: case IARRAY_GET: case LARRAY_GET:
- case FARRAY_GET: case DARRAY_GET: case OARRAY_GET:
- MSILType mType = MSILArrayElemType(elemType);
- emitLdelem(mType);
- return items.StackItem(mType);
- case ZARRAY_SET: case BARRAY_SET: case SARRAY_SET:
- case CARRAY_SET: case IARRAY_SET: case LARRAY_SET:
- case FARRAY_SET: case DARRAY_SET: case OARRAY_SET:
- emitStelem(MSILArrayElemType(elemType));
- return items.VoidItem();
- }
- }
-
- if (isPrimitiveOp(sym)) {
- assert args.length <= 1;
- Tree right = args.length > 0 ? args[0] : Tree.Empty;
- return primitiveOp(primitives.getPrimitive(sym),
- qualifier, right, resType);
- }
-
- Symbol owner = sym.owner();
- Type t = tc.getType(owner);
- assert t != null;
- if (t.IsEnum()) {
- Primitive enumOp = null;
- if (sym.name == Names.EQ) enumOp = Primitive.EQ;
- else if (sym.name == Names.NE) enumOp = Primitive.NE;
- else if (sym.name == Names.LT) enumOp = Primitive.LT;
- else if (sym.name == Names.LE) enumOp = Primitive.LE;
- else if (sym.name == Names.GT) enumOp = Primitive.GT;
- else if (sym.name == Names.GE) enumOp = Primitive.GE;
- else if (sym.name == Names.OR) enumOp = Primitive.OR;
- else if (sym.name == Names.AND) enumOp = Primitive.AND;
- else if (sym.name == Names.XOR) enumOp = Primitive.XOR;
- if (enumOp != null) {
- assert args.length == 1;
- return primitiveOp(enumOp, qualifier, args[0], resType);
- }
- }
-
- switch (qualifier.type) {
- case TypeRef(_, _, _):
- case SingleType(_, _):
- case ThisType(_):
- MethodBase method = tc.getMethod(sym);
- assert method != null : Debug.show(sym);
- boolean virtualCall = false;
- if (!method.IsStatic() || becomesStatic(sym)) {
- // FIXME: after the Super attribution is correct
- switch (qualifier) {
- case Super(_, _):
- load(items.SelfItem(tc.getType(currentClass)));
- break;
- default:
- genAddr(qualifier, msilType(qualifier));
- virtualCall = !msilType(qualifier).isValueType();
- }
- }
- return check(invokeMethod(sym, args, resType,
- virtualCall || method.IsAbstract()));
-
- default:
- throw Debug.abort(Debug.show(fun));
- } // switch(qualifier.type)
-
- case TypeApply(Tree tfun, Tree[] targs):
- final Symbol tsym = tfun.symbol();
- if (primitives.isPrimitive(tsym)) {
- return primitiveOp(primitives.getPrimitive(tsym),
- ((Select)tfun).qualifier,
- targs[0], resType);
- }
- throw Debug.abort(Debug.show(fun));
-
- default:
- throw Debug.abort(Debug.show(fun));
- } // switch (fun)
- } //genApply()
-
-
- /** Generate code for scala's '==' */
- private Item genEq(Tree left, Tree right) {
- LocalBuilder tmpLocal = (LocalBuilder)locals.get(defs.ANY_EQEQ);
- if (tmpLocal == null) {
- tmpLocal = code.DeclareLocal(tc.OBJECT);
- locals.put(defs.ANY_EQEQ, tmpLocal);
- }
- Label l1 = code.DefineLabel(), l2 = code.DefineLabel();
- genLoad(left, MSILType.OBJECT);
- genLoad(right, MSILType.OBJECT);
- emitStloc(tmpLocal);
- code.Emit(OpCodes.Dup);
- code.Emit(OpCodes.Ldnull);
- code.Emit(OpCodes.Bne_Un, l1);
- emitLdloc(tmpLocal);
- code.Emit(OpCodes.Ceq);
- code.Emit(OpCodes.Br, l2);
- code.MarkLabel(l1);
- emitLdloc(tmpLocal);
- code.Emit(OpCodes.Callvirt, tc.OBJECT_EQUALS);
- code.MarkLabel(l2);
- return items.StackItem(MSILType.BOOL);
- }
-
- /** Is it a primitive (bot not an array) operation*/
- private boolean isPrimitiveOp(Symbol sym) {
- switch (primitives.getPrimitive(sym)) {
- case POS: case NEG: case NOT:
- case ADD: case SUB: case MUL: case DIV: case MOD:
- case OR: case XOR: case AND:
- case LSL: case LSR: case ASR:
- case ID: case NI: case EQ: case NE: case LT: case LE: case GT: case GE:
- case ZNOT: case ZOR: case ZAND:
- case IS: case AS:
- case CONCAT:
- case THROW:
- case SYNCHRONIZED:
- return true;
- default:
- return false;
- }
- }
-
- /* Is this a primitive Array operation. */
- private boolean isPrimitiveArrayOp(Symbol sym) {
- switch (primitives.getPrimitive(sym)) {
- case NEW_ZARRAY: case NEW_BARRAY: case NEW_SARRAY:
- case NEW_CARRAY: case NEW_IARRAY: case NEW_LARRAY:
- case NEW_FARRAY: case NEW_DARRAY: //case NEW_OARRAY:
- case ZARRAY_LENGTH: case BARRAY_LENGTH: case SARRAY_LENGTH:
- case CARRAY_LENGTH: case IARRAY_LENGTH: case LARRAY_LENGTH:
- case FARRAY_LENGTH: case DARRAY_LENGTH: case OARRAY_LENGTH:
- case ZARRAY_GET: case BARRAY_GET: case SARRAY_GET:
- case CARRAY_GET: case IARRAY_GET: case LARRAY_GET:
- case FARRAY_GET: case DARRAY_GET: case OARRAY_GET:
- case ZARRAY_SET: case BARRAY_SET: case SARRAY_SET:
- case CARRAY_SET: case IARRAY_SET: case LARRAY_SET:
- case FARRAY_SET: case DARRAY_SET: case OARRAY_SET:
- return true;
- default:
- return false;
- }
- }
-
- /* Is this a primitive conversion operation. */
- private MSILType primitiveConvert(Symbol sym) {
- switch (primitives.getPrimitive(sym)) {
- case B2B: case S2B: case C2B: case I2B: case L2B: case F2B: case D2B:
- return MSILType.I1;
- case B2S: case S2S: case C2S: case I2S: case L2S: case F2S: case D2S:
- return MSILType.I2;
- case B2C: case S2C: case C2C: case I2C: case L2C: case F2C: case D2C:
- return MSILType.CHAR;
- case B2I: case S2I: case C2I: case I2I: case L2I: case F2I: case D2I:
- return MSILType.I4;
- case B2L: case S2L: case C2L: case I2L: case L2L: case F2L: case D2L:
- return MSILType.I8;
- case B2F: case S2F: case C2F: case I2F: case L2F: case F2F: case D2F:
- return MSILType.R4;
- case B2D: case S2D: case C2D: case I2D: case L2D: case F2D: case D2D:
- return MSILType.R8;
- default:
- return null;
- }
- }
-
- /* Generate code for primitive operations. */
- private Item primitiveOp(Primitive op, Tree left, Tree right, MSILType resType)
- {
- // treat some special cases
- switch (op) {
-
- case CONCAT:
- genLoad(left, MSILType.OBJECT);
- genLoad(right, MSILType.OBJECT);
- code.Emit(OpCodes.Call, tc.CONCAT_OBJECT_OBJECT);
- return items.StackItem(MSILType.STRING);
-
- case ADD:
- if (tc.getType(right.type) == tc.STRING) {
- // TODO: check why this never gets printed
- genLoad(left, MSILType.OBJECT);
- genLoad(right, MSILType.OBJECT);
- code.Emit(OpCodes.Call, tc.CONCAT_OBJECT_OBJECT);
- return items.StackItem(MSILType.STRING);
- }
- break;
-
- case IS:
- genLoad(left, MSILType.OBJECT);
- final Type type = tc.getType(right.type);
- code.Emit(OpCodes.Isinst, type);
- return mkCond(items.StackItem(msilType(type)));
-
- case AS:
- MSILType mltype = msilType(left);
- Item item = genLoad(left, mltype);
- final Type rtype = tc.getType(right.type);
- final MSILType mrtype = msilType(rtype);
- if (mltype.isEnum()) {
- MSILType ptype = unboxValueType(mrtype);
- if (ptype != null) {
- MSILType uetype = msilType(mltype.getUnderlyingType());
- emitConvert(uetype, ptype);
- return items.StackItem(ptype);
- }
- //} else if (!item.type.equals(mrtype) && !(rtype == tc.OBJECT)) {
- } else if (!item.type.isSubtypeOf(mrtype) && !(rtype == tc.OBJECT)) {
- if (rtype.IsValueType()) {
- code.Emit(OpCodes.Unbox, rtype);
- if (rtype.IsEnum())
- emitLdind(rtype.getUnderlyingType());
- else
- code.Emit(OpCodes.Ldobj, rtype);
- } else {
- code.Emit(OpCodes.Castclass, rtype);
- }
- }
- return items.StackItem(mrtype);
-
- case SYNCHRONIZED:
- // TODO: reuse temporary local variable whenever possible
- LocalBuilder tmp = code.DeclareLocal(tc.OBJECT);
- genLoad(left, MSILType.OBJECT);
- emitStloc(tmp);
- emitLdloc(tmp);
- code.Emit(OpCodes.Call, tc.MONITOR_ENTER);
- genLoad(right, MSILType.OBJECT);
- emitLdloc(tmp);
- code.Emit(OpCodes.Call, tc.MONITOR_EXIT);
- return items.StackItem(MSILType.OBJECT);
- }
-
- Item iLeft = null;
- MSILType tleft = msilType(left);
- switch (left) {
- case Apply(Tree fun , Tree[] args):
- Primitive p = primitives.getPrimitive(fun.symbol());
- switch (p) {
- case BOX:
- assert args.length == 1;
- iLeft = gen(args[0], msilType(args[0]));
- break;
- default:
- iLeft = gen(left, tleft);
- }
- break;
- default:
- iLeft = gen(left, tleft);
- }
-
- switch (op) {
- case THROW:
- load(iLeft);
- code.Emit(OpCodes.Throw);
-// code.Emit(OpCodes.Ldnull);
-// return items.StackItem(MSILType.NULL);
- //return coerce(loadNull(), resType);
- return loadNull();
-
- case POS: return load(coerce(iLeft, resType));
- case NEG:
- iLeft = load(coerce(iLeft, resType));
- code.Emit(OpCodes.Neg);
- return iLeft;
- case NOT:
- iLeft = load(coerce(iLeft, resType));
- code.Emit(OpCodes.Not);
- return iLeft;
- case ZNOT:
- return negate(mkCond(iLeft));
- case ZOR:
- Item.CondItem lcond = mkCond(iLeft), rcond = null;
- Chain success = lcond.success, failure = lcond.failure;
- switch (lcond.test) {
- case True:
- return lcond;
- case False:
- return mkCond(gen(right, MSILType.BOOL));
- case And(Test t):
- success = (success != null) ?
- success : new Chain(code.DefineLabel(), null);
- branch(negate(lcond.test), success);
- resolve(failure);
- failure = null;
- break;
- default:
- success = (success != null) ?
- success : new Chain(code.DefineLabel(), null);
- branch(negate(lcond.test), success);
- }
- rcond = mkCond((gen(right, MSILType.BOOL)));
- rcond = items.CondItem(Test.Or(rcond.test),
- merge(success, rcond.success),
- merge(failure, rcond.failure));
- return rcond;
- case ZAND:
- Item.CondItem lcond = mkCond(iLeft), rcond = null;
- Chain success = lcond.success, failure = lcond.failure;
- switch (lcond.test) {
- case False:
- return lcond;
- case True:
- return mkCond(gen(right, MSILType.BOOL));
- case Or(Test t):
- failure = (failure != null) ?
- failure : new Chain(code.DefineLabel(), null);
- branch(lcond.test, failure);
- resolve(success);
- success = null;
- break;
- default:
- failure = (failure != null) ?
- failure : new Chain(code.DefineLabel(), null);
- branch(lcond.test, failure);
- }
- rcond = mkCond(gen(right, MSILType.BOOL));
- rcond = items.CondItem(Test.And(rcond.test),
- merge(success, rcond.success),
- merge(failure, rcond.failure));
- return rcond;
- }
-
- MSILType toType = MSILType.arithmCoercion(iLeft.type.asPrimitive(),
- primitiveType(right.type));
- load(coerce(iLeft, toType));
- genLoad(right, toType);
- Item res = null;
- switch (op) {
- case ADD: code.Emit(OpCodes.Add); res = items.StackItem(toType); break;
- case SUB: code.Emit(OpCodes.Sub); res = items.StackItem(toType); break;
- case MUL: code.Emit(OpCodes.Mul); res = items.StackItem(toType); break;
- case DIV: code.Emit(OpCodes.Div); res = items.StackItem(toType); break;
- case MOD: code.Emit(OpCodes.Rem); res = items.StackItem(toType); break;
-
- case OR: code.Emit(OpCodes.Or); res = items.StackItem(toType); break;
- case XOR: code.Emit(OpCodes.Xor); res = items.StackItem(toType); break;
- case AND: code.Emit(OpCodes.And); res = items.StackItem(toType); break;
-
- case LSL: code.Emit(OpCodes.Shl); res = items.StackItem(toType); break;
- case LSR: code.Emit(OpCodes.Shr); res = items.StackItem(toType); break;
- case ASR: code.Emit(OpCodes.Shr_Un); res = items.StackItem(toType); break;
-
- case ID: case EQ: // FIXME?: should ID be treated as EQ?
- res = items.CondItem(Test.Binary(Test.EQ, toType), null, null);
- break;
- case NI: case NE: // FIXME?: should NI be treated as NE?
- res = items.CondItem(Test.Binary(Test.NE, toType), null, null);
- break;
- case LT:
- res = items.CondItem(Test.Binary(Test.LT_IS, toType), null, null);
- break;
- case LE:
- res = items.CondItem(Test.Binary(Test.LE_IS, toType), null, null);
- break;
- case GT:
- res = items.CondItem(Test.Binary(Test.GT_IS, toType), null, null);
- break;
- case GE:
- res = items.CondItem(Test.Binary(Test.GE_IS, toType), null, null);
- break;
- default:
- throw Debug.abort(Debug.show(op));
- }
-
- return coerce(res, resType);
- }
-
- /*
- * Load function arguments on the stack.
- */
- private void loadArgs(Tree[] args, ParameterInfo[] params) {
- for (int i = 0; i < args.length; i++) {
- MSILType toType = msilType(params[i].ParameterType); //msilType(args[i].type);
- genLoad(args[i], toType);
- }
- }
-
- /*
- * Tells if a non-static method is translated to a static one.
- */
- private boolean becomesStatic(Symbol sym) {
- MethodBase method = tc.getMethod(sym);
- return !sym.isStatic() && method.IsStatic();
- }
-
- /*
- * Generate code for method invocation
- */
- private Item invokeMethod(Symbol fun, Tree[] args, MSILType resType,
- boolean virtualCall) {
- MethodBase method = tc.getMethod(fun);
- assert method != null : "Coudn't resolve method: " + Debug.show(fun);
- Item res = null;
- if (method.IsStatic()) {
- ParameterInfo[] params = method.GetParameters();
- if (becomesStatic(fun)) {
- assert params.length == args.length + 1;
- ParameterInfo[] newParams = new ParameterInfo[params.length - 1];
- for (int i = 0; i < newParams.length; i++)
- newParams[i] = params[i + 1];
- params = newParams;
- }
- loadArgs(args, params);
- code.Emit(OpCodes.Call, (MethodInfo)method);
- res = returnsVoid(method) ? items.VoidItem() :
- items.StackItem(resType);
- } else if (method.IsConstructor()) {
- // used only for calls to super constructor
- //emitThis();
- loadArgs(args, method.GetParameters());
- code.Emit(OpCodes.Call, (ConstructorInfo)method);
- res = items.VoidItem();
- } else {
- loadArgs(args, method.GetParameters());
- if (enableTailCalls && lastExpr /*&& method == currentMethod*/)
- code.Emit(OpCodes.Tailcall);
- code.Emit(virtualCall ? OpCodes.Callvirt : OpCodes.Call,
- (MethodInfo)method);
- res = returnsVoid(method) ? items.VoidItem() : items.StackItem(resType);
- }
- CLRTypes clrt = CLRTypes.instance();
- if (returnsVoid(fun) && !returnsVoid(method)
- && method != clrt.DELEGATE_COMBINE
- && method != clrt.DELEGATE_REMOVE)
- {
- res = drop(res);
- }
- return res;
- }
-
- private Item createDelegateFromFunction(Tree fun, MSILType type) {
- Item ifun = genLoad(fun, msilType(fun.type));
- // Get the apply function of the delegate object
- Symbol funSym = tc.getSymbol(ifun.type.toType());
- Symbol applySym = funSym.lookup(Names.apply);
- MethodInfo apply = (MethodInfo) tc.getDelegateApplyMethod(applySym);
-
- // Get the (object, native int) constructor of the delegate type
- Type delegateType = type.toType();
- ConstructorInfo delegCtor = delegateType.GetConstructor(
- new Type[]{tc.OBJECT, Type.GetType("System.IntPtr")});
-
- // Duplicate the object on the stack; we need its apply method
- // and Ldvirtftn uses one element.
- code.Emit(OpCodes.Dup);
- code.Emit(OpCodes.Ldvirtftn, apply);
-
- // Create a new delegate; this uses up the element duplicated above.
- code.Emit(OpCodes.Newobj, delegCtor);
-
- return items.StackItem(type);
- }
-
- /*
- * Returns the MSILType that corresponds to the given scala.symtab.Type
- */
- private MSILType msilType(scalac.symtab.Type type) {
- return type.symbol() == defs.ALLREF_CLASS ? MSILType.NULL
- : msilType(tc.getType(type));
- }
-
- /*
- * Also used from class ItemFactory.
- */
- MSILType msilType(Type type) {
- return MSILType.fromType(type);
- }
-
- /*
- * Returns the MSILType from the type atribute of a tree node
- */
- private MSILType msilType(Tree t) {
- return msilType(t.type);
- }
-
- /*
- * Treat the scala boxed types as a primitive type
- */
- private MSILType primitiveType(scalac.symtab.Type type) {
- MSILType mtype = msilType(type);
- switch (mtype) {
- case REF(Type t):
- return unboxValueType(mtype).asPrimitive();
- //case NULL:
- case ARRAY(_):
- throw Debug.abort("cannot convert " + mtype);
- default:
- return mtype;
- }
- }
-
- private MSILType unboxValueType(MSILType type) {
- switch (type) {
- case REF(Type t):
- if (t == tc.SCALA_BYTE) return MSILType.I1;
- if (t == tc.SCALA_SHORT) return MSILType.I2;
- if (t == tc.SCALA_INT) return MSILType.I4;
- if (t == tc.SCALA_LONG) return MSILType.I8;
- if (t == tc.SCALA_FLOAT) return MSILType.R4;
- if (t == tc.SCALA_DOUBLE) return MSILType.R8;
- if (t == tc.SCALA_CHAR) return MSILType.CHAR;
- //if (t == tc.SCALA_UNIT) return MSILType.VOID;
- if (t == tc.SCALA_BOOLEAN) return MSILType.BOOL;
- }
- return type;
- }
-
- /*
- * Provides a translation for some types when used as array elements.
- */
- private MSILType MSILArrayElemType(Type type) {
- MSILType mtype = msilType(type);
- switch (mtype) {
- case BOOL: return MSILType.I1;
- case CHAR: return MSILType.I4;
- default: return mtype;
- }
- }
-
- /*
- *
- */
- private Type getArrayElemType(Primitive p) {
- switch (p) {
- case NEW_ZARRAY: case ZARRAY_LENGTH: case ZARRAY_GET: case ZARRAY_SET:
- return tc.BOOLEAN;
- case NEW_BARRAY: case BARRAY_LENGTH: case BARRAY_GET: case BARRAY_SET:
- return tc.BYTE;
- case NEW_SARRAY: case SARRAY_LENGTH: case SARRAY_GET: case SARRAY_SET:
- return tc.SHORT;
- case NEW_CARRAY: case CARRAY_LENGTH: case CARRAY_GET: case CARRAY_SET:
- return tc.CHAR;
- case NEW_IARRAY: case IARRAY_LENGTH: case IARRAY_GET: case IARRAY_SET:
- return tc.INT;
- case NEW_LARRAY: case LARRAY_LENGTH: case LARRAY_GET: case LARRAY_SET:
- return tc.LONG;
- case NEW_FARRAY: case FARRAY_LENGTH: case FARRAY_GET: case FARRAY_SET:
- return tc.FLOAT;
- case NEW_DARRAY: case DARRAY_LENGTH: case DARRAY_GET: case DARRAY_SET:
- return tc.DOUBLE;
- case NEW_OARRAY: case OARRAY_LENGTH: case OARRAY_GET: case OARRAY_SET:
- return tc.OBJECT;
- }
- throw Debug.abort("unknown primitive " + Debug.show(p));
- }
-
- /*
- * Emit code to load an array elemnt of the given type on the stack.
- */
- private Item emitLdelem(MSILType type) {
- switch (type) {
- case I1: code.Emit(OpCodes.Ldelem_I1); break;
- case I2: code.Emit(OpCodes.Ldelem_I2); break;
- case I4: code.Emit(OpCodes.Ldelem_I4); break;
- case I8: code.Emit(OpCodes.Ldelem_I8); break;
- case R4: code.Emit(OpCodes.Ldelem_R4); break;
- case R8: code.Emit(OpCodes.Ldelem_R8); break;
- case ARRAY(_):
- case REF(_):
- code.Emit(OpCodes.Ldelem_Ref); break;
- }
- return items.StackItem(type);
- }
-
- /*
- * Emit code to strore the value at the top of the stack from the given type
- * to an array.
- */
- private Item emitStelem(MSILType type) {
- switch (type) {
- case I1: code.Emit(OpCodes.Stelem_I1); break;
- case I2: code.Emit(OpCodes.Stelem_I2); break;
- case I4: code.Emit(OpCodes.Stelem_I4); break;
- case I8: code.Emit(OpCodes.Stelem_I8); break;
- case R4: code.Emit(OpCodes.Stelem_R4); break;
- case R8: code.Emit(OpCodes.Stelem_R8); break;
- case ARRAY(_):
- case REF(_):
- code.Emit(OpCodes.Stelem_Ref); break;
- }
- return items.StackItem(type);
- }
-
- private Item.LiteralItem mkLiteral(MSILType type, Object value) {
- LiteralItem item = null;
- if (value instanceof Integer)
- item = items.LiteralItem(AConstant.INT(((Number)value).intValue()));
- else if (value instanceof Long)
- item = items.LiteralItem(AConstant.LONG(((Number)value).longValue()));
- else if (value instanceof Float)
- item = items.LiteralItem(AConstant.FLOAT(((Number)value).floatValue()));
- else if (value instanceof Double)
- item = items.LiteralItem(AConstant.DOUBLE(((Number)value).doubleValue()));
- else throw Debug.abort();
- item.type = type;
- return item;
- }
-
- private void emitLdarg(int slot) {
- assert slot >= 0;
- switch (slot) {
- case 0: code.Emit(OpCodes.Ldarg_0); break;
- case 1: code.Emit(OpCodes.Ldarg_1); break;
- case 2: code.Emit(OpCodes.Ldarg_2); break;
- case 3: code.Emit(OpCodes.Ldarg_3); break;
- default:
- code.Emit(slot < 256 ? OpCodes.Ldarg_S : OpCodes.Ldarg, slot);
- }
- }
-
- private void emitLdarga(int slot) {
- code.Emit(slot < 256 ? OpCodes.Ldarga_S : OpCodes.Ldarga, slot);
- }
-
- private void emitLdloc(LocalBuilder loc) {
- switch (loc.slot) {
- case 0: code.Emit(OpCodes.Ldloc_0); break;
- case 1: code.Emit(OpCodes.Ldloc_1); break;
- case 2: code.Emit(OpCodes.Ldloc_2); break;
- case 3: code.Emit(OpCodes.Ldloc_3); break;
- default:
- code.Emit(loc.slot < 256 ? OpCodes.Ldloc_S : OpCodes.Ldloc, loc);
- }
- }
-
- private void emitLdloca(LocalBuilder loc) {
- code.Emit(loc.slot < 256 ? OpCodes.Ldloca_S : OpCodes.Ldloca, loc);
- }
-
- private void emitStloc(LocalBuilder loc) {
- switch (loc.slot) {
- case 0: code.Emit(OpCodes.Stloc_0); break;
- case 1: code.Emit(OpCodes.Stloc_1); break;
- case 2: code.Emit(OpCodes.Stloc_2); break;
- case 3: code.Emit(OpCodes.Stloc_3); break;
- default:
- code.Emit(loc.slot < 256 ? OpCodes.Stloc_S : OpCodes.Stloc, loc);
- }
- }
-
- /*
- * Load the value of an item on the stack.
- */
- private Item load(Item that) {
- switch (that) {
- case VoidItem():
- return that;
-
- case StackItem():
- return (StackItem) that;
-
- case LiteralItem(AConstant value):
- return loadLiteral(value, that.type);
-
- case SelfItem():
- emitThis();
- return items.StackItem(that.type);
-
- case ArgItem(int slot):
- emitLdarg(slot);
- return items.StackItem(that.type);
-
- case LocalItem(LocalBuilder local):
- emitLdloc(local);
- return items.StackItem(that.type);
-
- case StaticItem(FieldInfo field):
- assert !field.IsLiteral() : field.toString();
- code.Emit(OpCodes.Ldsfld, field);
- return items.StackItem(that.type);
-
- case SelectItem(Item qual, FieldInfo field):
- Item i = load(qual);
- code.Emit(OpCodes.Ldfld, field);
- return items.StackItem(that.type);
-
- case CondItem(Test test, Chain success, Chain failure):
- load(test);
- switch (test) {
- case Or(_):
- case And(_):
- Label exit = null;
- /*if (lastExpr)
- code.Emit(OpCodes.Ret);
- else */ {
- exit = code.DefineLabel();
- if (!unreachable)
- code.Emit(OpCodes.Br, exit);
- }
- if (failure != null) {
- resolve(failure);
- load(FALSE_ITEM);
- if (success != null) {
- /*if (lastExpr)
- code.Emit(OpCodes.Ret);
- else*/
- if (!unreachable)
- code.Emit(OpCodes.Br, exit);
- }
- }
- if (success != null) {
- resolve(success);
- load(TRUE_ITEM);
- }
- resolve(exit);
- break;
- }
- return items.StackItem(MSILType.BOOL);
-
- default:
- throw Debug.abort("load item: " + that);
- }
- }
-
-
- /*
- * Load the value of a test on the stack.
- */
- private void load(Test test) {
- switch (test) {
- case False:
- code.Emit(OpCodes.Ldc_I4_0);
- break;
- case True:
- code.Emit(OpCodes.Ldc_I4_1);
- break;
- case Bool(boolean value):
- if (value) negate_load();
- break;
- case Binary(int opcode, MSILType type):
- code.Emit(load(opcode));
- if (negate_load(opcode)) negate_load();
- break;
- case And(Test t):
- load(t);
- break;
- case Or(Test t):
- load(t);
- break;
- default:
- throw Debug.abort(test.getClass().getName());
- }
- }
-
- /*
- * Load the value of an ALiteral on the stack.
- */
- private Item.StackItem loadLiteral(AConstant constant) {
- switch (constant) {
- case UNIT:
- return loadUnit();
- case BOOLEAN(boolean value):
- return loadBool(value);
- case BYTE(byte value):
- return loadI4(value);
- case SHORT(short value):
- return loadI4(value);
- case CHAR(char value):
- loadI4(value);
- return items.StackItem(MSILType.CHAR);
- case INT(int value):
- return loadI4(value);
- case LONG(long value):
- return loadI8(value);
- case FLOAT(float value):
- return loadR4(value);
- case DOUBLE(double value):
- return loadR8(value);
- case STRING(String value):
- return loadString(value);
- case NULL:
- return loadNull();
- default:
- throw Debug.abort("illegal case", constant);
- }
- }
-
- /*
- * Load the value of an ALiteral coerced to the given type.
- */
- private Item loadLiteral(AConstant constant, MSILType ofType) {
- switch (ofType) {
- case I1:
- case I2:
- case I4:
- loadI4(constant.intValue()); return items.StackItem(MSILType.I4);
- case CHAR:
- loadI4(constant.intValue()); return items.StackItem(MSILType.CHAR);
- case I8: loadI8(constant.longValue()); return items.StackItem(ofType);
- case R4: loadR4(constant.floatValue()); return items.StackItem(ofType);
- case R8: loadR8(constant.doubleValue()); return items.StackItem(ofType);
- case REF(Type t):
- //assert t == tc.STRING || ofType.isValueType() : "" + ofType;
- return coerce(loadLiteral(constant), ofType);
- default:
- return coerce(loadLiteral(constant), ofType);
- }
- }
-
- /*
- * Load boxed scala.Unit on the stack.
- */
- private Item.StackItem loadUnit() {
- code.Emit(OpCodes.Call, tc.RUNTIME_BOX_UNIT);
- return items.StackItem(msilType(tc.RUNTIME_BOX_UNIT.ReturnType));
- }
-
- /*
- * Load a boolean value on the stack.
- */
- private Item.StackItem loadBool(boolean value) {
- code.Emit(value ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
- return items.StackItem(MSILType.BOOL);
- }
-
- /*
- * Load a 32-bit integer literal on the stack.
- */
- private Item.StackItem loadI4(int value) {
- switch (value) {
- case -1:code.Emit(OpCodes.Ldc_I4_M1); break;
- case 0: code.Emit(OpCodes.Ldc_I4_0); break;
- case 1: code.Emit(OpCodes.Ldc_I4_1); break;
- case 2: code.Emit(OpCodes.Ldc_I4_2); break;
- case 3: code.Emit(OpCodes.Ldc_I4_3); break;
- case 4: code.Emit(OpCodes.Ldc_I4_4); break;
- case 5: code.Emit(OpCodes.Ldc_I4_5); break;
- case 6: code.Emit(OpCodes.Ldc_I4_6); break;
- case 7: code.Emit(OpCodes.Ldc_I4_7); break;
- case 8: code.Emit(OpCodes.Ldc_I4_8); break;
- default:
- if (value >= -128 && value <= 127)
- code.Emit(OpCodes.Ldc_I4_S, value);
- else
- code.Emit(OpCodes.Ldc_I4, value);
- }
- return items.StackItem(MSILType.I4);
- }
-
- /*
- * Load a 64-bit integer value on the stack.
- */
- private Item.StackItem loadI8(long value) {
- code.Emit(OpCodes.Ldc_I8, value);
- return items.StackItem(MSILType.I8);
- }
-
- /*
- * Load a single precision floating point value on the stack.
- */
- private Item.StackItem loadR4(float value) {
- code.Emit(OpCodes.Ldc_R4, value);
- return items.StackItem(MSILType.R4);
- }
-
- /*
- * Load a double precision floating point value on the stack.
- */
- private Item.StackItem loadR8(double value) {
- code.Emit(OpCodes.Ldc_R8, value);
- return items.StackItem(MSILType.R8);
- }
-
- /*
- * Load a string reference on the stack.
- */
- private Item.StackItem loadString(String value) {
- code.Emit(OpCodes.Ldstr, value);
- return items.StackItem(MSILType.STRING);
- }
-
- /*
- * Load the 'null' reference on the stack.
- */
- private Item.StackItem loadNull() {
- code.Emit(OpCodes.Ldnull);
- return items.StackItem(MSILType.NULL);
- }
-
- private void emitLdind(Type type) {
- if (type == tc.BYTE)
- code.Emit(OpCodes.Ldind_I1);
- else if (type == tc.SHORT)
- code.Emit(OpCodes.Ldind_I2);
- else if (type == tc.INT)
- code.Emit(OpCodes.Ldind_I4);
- else if (type == tc.LONG)
- code.Emit(OpCodes.Ldind_I8);
- else
- throw Debug.abort("emitLdind failed", type);
- }
-
-
- /*
- * Store the value on the stack to the location specified by the item.
- */
- private Item store(Item that) {
- switch (that) {
- case ArgItem(int slot):
- code.Emit(OpCodes.Starg, slot);
- break;
-
- case LocalItem(LocalBuilder local):
- emitStloc(local);
- break;
-
- case StaticItem(FieldInfo field):
- assert !field.IsLiteral();
- code.Emit(OpCodes.Stsfld, field);
- break;
-
- case SelectItem(Item qual, FieldInfo field):
- load(qual);
- code.Emit(OpCodes.Stfld, field);
- break;
-
- default:
- throw Debug.abort("Cannot store item: " + that);
- }
- return items.VoidItem();
- }
-
-
- /*
- * Discard the item.
- */
- private Item drop(Item that) {
- switch (that) {
- case VoidItem():
- case SelfItem():
- case LiteralItem(_):
- case ArgItem(_):
- case LocalItem(_):
- case StaticItem(_):
- break;
- case StackItem():
- code.Emit(OpCodes.Pop);
- break;
- case SelectItem(Item qual, _):
- drop(qual);
- break;
- case CondItem(Test test, _, _):
- switch (test) {
- case False:
- case True:
- break;
- case Bool(_):
- code.Emit(OpCodes.Pop);
- break;
- case And(_):
- case Or(_):
- drop(load(that));
- break;
- case Binary(_, _):
- code.Emit(OpCodes.Pop);
- code.Emit(OpCodes.Pop);
- break;
- default :
- throw Debug.abort(that.getClass().getName());
- }
- break;
- default:
- drop(load(that));
- }
- return items.VoidItem();
- }
-
- /*
- * Generate a condition corresponding to the given item.
- */
- private Item.CondItem mkCond(Item that) {
- switch (that) {
- case CondItem(_, _, _): return (Item.CondItem) that;
- default:
- load(that);
- return items.CondItem(Test.Bool(false), null, null);
- }
- }
-
- // load the address of a value type item;
- // for reference types load a reference
- private Item genAddr(Tree tree, MSILType toType) {
- Item item = gen(tree, toType);
- if (!item.type.isValueType())
- return load(item);
- switch (item) {
- case ArgItem(int slot):
- emitLdarga(slot);
- break;
- case LocalItem(LocalBuilder local):
- emitLdloca(local);
- break;
- case StaticItem(FieldInfo field):
- if (field.IsInitOnly()) {
- load(item);
- genLocalAddr(field.FieldType);
- } else
- code.Emit(OpCodes.Ldsflda, field);
- break;
- case SelectItem(Item qual, FieldInfo field):
- if (field.IsInitOnly()) {
- load(item);
- genLocalAddr(field.FieldType);
- } else {
- load(qual);
- code.Emit(OpCodes.Ldflda, field);
- }
- break;
- case StackItem():
- genLocalAddr(item.type.toType());
- break;
- default:
- throw Debug.abort(item.toString());
- }
- return items.StackItem(toType);
- }
-
- private void genLocalAddr(Type localType) {
- assert localType.IsValueType() : localType.toString();
- LocalBuilder tmpLocal = (LocalBuilder)locals.get(localType);
- if (tmpLocal == null) {
- tmpLocal = code.DeclareLocal(localType);
- locals.put(localType, tmpLocal);
- }
- emitStloc(tmpLocal);
- emitLdloca(tmpLocal);
- }
-
- /*
- * Negate a condition.
- */
- private Item.CondItem negate(Item item) {
- Item.CondItem cond = mkCond(item);
- // swap the failure and success chains
- //return items.CondItem(negate(cond.test), cond.success, cond.failure);
- return items.CondItem(negate(cond.test), cond.failure, cond.success);
- }
-
- /*
- * Emit code to negate a boolean value on the stack.
- */
- private void negate_load() {
- code.Emit(OpCodes.Ldc_I4_1);
- code.Emit(OpCodes.Xor);
- }
-
- /*
- * Negate a test.
- */
- private Test negate(Test that) {
- switch (that) {
-
- case False:
- return Test.True;
-
- case True:
- return Test.False;
-
- case Bool(boolean value):
- return Test.Bool(!value);
-
- case And(Test test):
- return Test.Or(negate(test));
-
- case Or(Test test):
- return Test.And(negate(test));
-
- case Binary(int opcode, MSILType type):
- return Test.Binary(negate(opcode), type);
-
- default:
- throw Debug.abort(that.getClass().getName());
- }
- }
-
- /*
- * Emit code for the appropriate branch.
- */
- private Label branch(Test test, Chain chain) {
- assert chain != null;
- Label label = chain.label;
- switch (test) {
- case False:
- code.Emit(OpCodes.Br, label);
- return label;
- case True:
- return null;
- case Bool(boolean value):
- code.Emit(value ? OpCodes.Brtrue : OpCodes.Brfalse, label);
- return label;
- case And(Test t):
- return branch(t, chain);
- case Or(Test t):
- return branch(t, chain);
- case Binary(int opcode, MSILType type):
- code.Emit(branch(negate(opcode)), label);
- return label;
- default:
- throw Debug.abort();
- }
- }
-
- /*
- * Merge two label chains.
- */
- private static Chain merge(Chain c1, Chain c2) {
- if (c1 == null) return c2;
- if (c2 == null) return c1;
- Chain c = c1;
- for(; c.next != null; c = c.next) ;
- c.next = c2;
- return c1;
- }
-
- /*
- * Resolve all labels int the chain to the current position in the code.
- */
- private void resolve(Chain c) {
- for (; c != null; c = c.next)
- code.MarkLabel(c.label);
- }
-
- /*
- * Resolve a label to the current position in the code.
- */
- private void resolve(Label l) {
- if (l != null)
- code.MarkLabel(l);
- }
-
- /*
- *
- */
- private static boolean negate_load(int opcode) {
- switch (opcode) {
- case Test.LT_IS: return false;
- case Test.LE_IS: return true;
- case Test.GT_IS: return false;
- case Test.GE_IS: return true;
- case Test.LT_IU: return false;
- case Test.LE_IU: return true;
- case Test.GT_IU: return false;
- case Test.GE_IU: return true;
- case Test.LT_RO: return false;
- case Test.LE_RO: return true;
- case Test.GT_RO: return false;
- case Test.GE_RO: return true;
- case Test.LT_RU: return false;
- case Test.LE_RU: return true;
- case Test.GT_RU: return false;
- case Test.GE_RU: return true;
- case Test.EQ : return false;
- case Test.NE : return true;
- default : throw Debug.abort("" + opcode);
- }
- }
-
- /*
- *
- */
- private static OpCode load(int opcode) {
- switch (opcode) {
- case Test.LT_IS: return OpCodes.Clt;
- case Test.LE_IS: return OpCodes.Cgt; // negate
- case Test.GT_IS: return OpCodes.Cgt;
- case Test.GE_IS: return OpCodes.Clt; // negate
- case Test.LT_IU: return OpCodes.Clt_Un;
- case Test.LE_IU: return OpCodes.Cgt_Un; // negate
- case Test.GT_IU: return OpCodes.Cgt_Un;
- case Test.GE_IU: return OpCodes.Clt_Un; // negate
- case Test.LT_RO: return OpCodes.Clt;
- case Test.LE_RO: return OpCodes.Cgt_Un; // negate
- case Test.GT_RO: return OpCodes.Cgt;
- case Test.GE_RO: return OpCodes.Clt_Un; // negate
- case Test.LT_RU: return OpCodes.Clt_Un;
- case Test.LE_RU: return OpCodes.Cgt; // negate
- case Test.GT_RU: return OpCodes.Cgt_Un;
- case Test.GE_RU: return OpCodes.Clt; // negate
- case Test.EQ : return OpCodes.Ceq;
- case Test.NE : return OpCodes.Ceq; // negate
- default : throw Debug.abort("" + opcode);
- }
- }
-
- /*
- *
- */
- private static int negate(int opcode) {
- switch (opcode) {
- case Test.LT_IS: return Test.GE_IS;
- case Test.LE_IS: return Test.GT_IS;
- case Test.GT_IS: return Test.LE_IS;
- case Test.GE_IS: return Test.LT_IS;
- case Test.LT_IU: return Test.GE_IU;
- case Test.LE_IU: return Test.GT_IU;
- case Test.GT_IU: return Test.LE_IU;
- case Test.GE_IU: return Test.LT_IU;
- case Test.LT_RO: return Test.GE_RU;
- case Test.LE_RO: return Test.GT_RU;
- case Test.GT_RO: return Test.LE_RU;
- case Test.GE_RO: return Test.LT_RU;
- case Test.LT_RU: return Test.GE_RO;
- case Test.LE_RU: return Test.GT_RO;
- case Test.GT_RU: return Test.LE_RO;
- case Test.GE_RU: return Test.LT_RO;
- case Test.EQ : return Test.NE;
- case Test.NE : return Test.EQ;
- default : throw Debug.abort("" + opcode);
- }
- }
-
- /*
- *
- */
- private static OpCode branch(int opcode) {
- switch (opcode) {
- case Test.LT_IS:
- case Test.LT_RO: return OpCodes.Blt;
- case Test.LE_IS:
- case Test.LE_RO: return OpCodes.Ble;
- case Test.GT_IS:
- case Test.GT_RO: return OpCodes.Bgt;
- case Test.GE_IS:
- case Test.GE_RO: return OpCodes.Bge;
- case Test.LT_IU:
- case Test.LT_RU: return OpCodes.Blt_Un;
- case Test.LE_IU:
- case Test.LE_RU: return OpCodes.Ble_Un;
- case Test.GT_IU:
- case Test.GT_RU: return OpCodes.Bgt_Un;
- case Test.GE_IU:
- case Test.GE_RU: return OpCodes.Bge_Un;
- case Test.EQ : return OpCodes.Beq;
- case Test.NE : return OpCodes.Bne_Un;
- default : throw Debug.abort("" + opcode);
- }
- }
-
- //##########################################################################
-} // class GenMSIL
-
-/**
- * Represents the supported types of the CLR.
- */
-final class MSILType {
- public case I1;
- public case I2;
- public case U2;
- public case I4;
- public case I8;
- public case R4;
- public case R8;
- public case BOOL;
- public case CHAR;
- public case VOID;
- public case NULL;
- public case REF(Type t) { assert t != null && !t.IsArray(); }
- public case ARRAY(MSILType t) { assert t != null; }
-
- private final static CLRTypes pp = CLRTypes.instance();
-
- public static final MSILType OBJECT = REF(pp.OBJECT);
- public static final MSILType STRING = REF(pp.STRING);
- public static final MSILType UNIT = REF(pp.getType("scala.Unit"));
-
- //##########################################################################
- // factory methods
-
-// public static MSILType fromKind(int kind) {
-// switch (kind) {
-// case TypeTags.BYTE: return I1;
-// case TypeTags.CHAR: return CHAR;
-// case TypeTags.SHORT: return I2;
-// case TypeTags.INT: return I4;
-// case TypeTags.LONG: return I8;
-// case TypeTags.FLOAT: return R4;
-// case TypeTags.DOUBLE: return R8;
-// case TypeTags.BOOLEAN: return BOOL;
-// case TypeTags.UNIT: return VOID;
-// case TypeTags.STRING: return STRING;
-// default:
-// throw Debug.abort("Unknown kind: " + kind);
-
-// }
-// }
-
- public static MSILType fromType(Type type) {
- if (type == pp.BYTE) return I1;
- if (type == pp.SHORT) return I2;
- if (type == pp.INT) return I4;
- if (type == pp.LONG) return I8;
- if (type == pp.FLOAT) return R4;
- if (type == pp.DOUBLE) return R8;
- if (type == pp.CHAR) return CHAR;
- if (type == pp.VOID) return VOID;
- if (type == pp.BOOLEAN)return BOOL;
- if (type == pp.STRING) return STRING;
- if (type == pp.OBJECT) return OBJECT;
- if (type.IsArray())
- return ARRAY(fromType(type.GetElementType()));
- return REF(type);
-
- }
-
- public static MSILType fromAConstant(AConstant value) {
- switch (value) {
- case UNIT:
- return UNIT; // was VOID; // FIXME
- case BOOLEAN(_):
- return BOOL;
- case BYTE(_):
- return I1;
- case SHORT(_):
- return I2;
- case CHAR(_):
- return CHAR;
- case INT(_):
- return I4;
- case LONG(_):
- return I8;
- case FLOAT(_):
- return R4;
- case DOUBLE(_):
- return R8;
- case STRING(_):
- return STRING;
- case NULL:
- return NULL;
- case ZERO:
- return I4;
- default:
- throw Debug.abort("unknown case", value);
- }
- }
-
- public Type toType() {
- switch (this) {
- case I1: return pp.BYTE;
- case I2: return pp.SHORT;
- //case U2: return ;
- case I4: return pp.INT;
- case I8: return pp.LONG;
- case R4: return pp.FLOAT;
- case R8: return pp.DOUBLE;
- case BOOL: return pp.BOOLEAN;
- case CHAR: return pp.CHAR;
- case REF(Type t): return t;
- case ARRAY(MSILType t): return pp.mkArrayType(t.toType());
- case VOID: return pp.VOID;
- //case NULL: return "NULL";
- default: throw Debug.abort(getClass().toString());
- }
-
- }
-
- //##########################################################################
-
- public boolean equals(Object that) {
- if (this == that)
- return true;
- if (that == null || !(that instanceof MSILType))
- return false;
- MSILType thatType = (MSILType)that;
- switch (this) {
- case REF(Type t1):
- switch (thatType) {
- case REF(Type t2):
- return t1.equals(t2);
- default:
- return false;
- }
- case ARRAY(MSILType t1):
- switch (thatType) {
- case ARRAY(MSILType t2):
- return t1.equals(t2);
- default:
- return false;
- }
- default:
- return false;
- }
- }
-
- public boolean isReferenceType() {
- switch (this) {
- case REF(Type t):
- return !t.IsValueType();
- case NULL:
- case ARRAY(_):
- return true;
- default:
- return false;
- }
- }
-
- public boolean isValueType() {
- return !isReferenceType();
- }
-
- public boolean isEnum() {
- switch (this) {
- case REF(Type t):
- return t.IsEnum();
- default:
- return false;
- }
- }
-
- /** Returns the underlying type of an enumeration; null otherwise */
- public Type getUnderlyingType() {
- switch (this) {
- case REF(Type t):
- return t.getUnderlyingType();
- default:
- return null;
- }
-}
-
- public boolean isType(Type type) {
- return equals(fromType(type));
- }
-
- public MSILType asPrimitive() {
- switch (this) {
- case REF(Type t):
- if (t.IsEnum()) return fromType(t.getUnderlyingType());
- else return this;
- //case NULL:
- case ARRAY(_):
- throw Debug.abort(this);
- default: return this;
- }
- }
-
- /** Is this type is a subtype of that. */
- public boolean isSubtypeOf(MSILType that) {
- assert that != null;
- if (this == that
- || (this.isReferenceType() && that.isType(pp.OBJECT)))
- return true;
- if (this.isValueType() && that.isReferenceType())
- return false;
- switch (this) {
- case BOOL: return that == I4;
- case REF(Type t1):
- switch (that) {
- case REF(Type t2):
- return t1.isSubtypeOf(t2);
- default:
- return false;
- }
- case ARRAY(MSILType t1):
- switch (that) {
- case ARRAY(MSILType t2):
- return t1.isSubtypeOf(t2);
- default:
- return false;
- }
- case NULL:
- switch (that) {
- case REF(_):
- case ARRAY(_):
- return true;
- default:
- return false;
- }
- default:
- return false;
- }
- }
-
-
- private static final MSILType [] ARITHM_PRECISION =
- new MSILType[] {I1, I2, CHAR, I4, I8, R4, R8};
-
- /**
- * @param t1
- * @param t2
- * @return the arithmetic coercion type for types t1 and t2
- */
- public static MSILType arithmCoercion(MSILType t1, MSILType t2) {
- if (t1 == t2) return t1;
- int i, j, n = ARITHM_PRECISION.length;
- for (i = 0; i < n; i++)
- if (t1 == ARITHM_PRECISION[i])
- break;
- for (j = 0; j < n; j++)
- if (t2 == ARITHM_PRECISION[j])
- break;
- int m = Math.max(i, j);
- if (m < n)
- return ARITHM_PRECISION[m];
- else if (t1.isSubtypeOf(t2)) return t2;
- else if (t2.isSubtypeOf(t1)) return t1;
- else throw Debug.abort("cannot find coercion " + t1 + " => " + t2);
- }
-
- public String toString() {
- switch (this) {
- case I1: return "I1";
- case I2: return "I2";
- case U2: return "U2";
- case I4: return "I4";
- case I8: return "I8";
- case R4: return "R4";
- case R8: return "R8";
- case BOOL: return "BOOL";
- case CHAR: return "CHAR";
- case REF(Type t): return "REF(" + t + ")";
- case ARRAY(MSILType t): return "ARRAY(" + t + ")";
- case VOID: return "VOID";
- case NULL: return "NULL";
- default: return getClass().getName();
- }
- }
-
- //##########################################################################
-}
-
-
-/**
- * The items used for deferred code generation.
- */
-class Item {
- public MSILType type;
-
- public case VoidItem();
- public case StackItem();
- public case SelfItem();
- public case LiteralItem(AConstant value);
- public case ArgItem(int slot);
- public case LocalItem(LocalBuilder local);
- public case StaticItem(FieldInfo field);
- public case SelectItem(Item qual, FieldInfo field);
- public case CondItem(Test test, Chain success, Chain failure);
-
- public String toString() {
- switch (this) {
- case VoidItem(): return "VoidItem: " + type;
- case StackItem(): return "StackItem: " + type ;
- case SelfItem(): return "this: " + type;
- case LiteralItem(AConstant value):
- return "LiteralItem(" + value + "): " + type;
- case ArgItem( int slot):
- return "ArgItem(" + slot + "): " + type;
- case LocalItem( LocalBuilder local):
- return "LocalItem(" + local + "): " + type;
- case StaticItem( FieldInfo field):
- return "StaticItem(" + field + "): " + type;
- case SelectItem(_, FieldInfo field):
- return "SelectItem(" + field + "): " +type;
- case CondItem(Test test, Chain success, Chain failure):
- return "CondItem(" + test + ", " + success
- + ", " + failure + "): " + type;
- }
- return "??Item??";
- }
-}
-
-
-/**
- * Class implementing a chain (list) of labels.
- */
-class Chain {
- Label label;
- Chain next;
- Chain(Label l, Chain n) { label = l; next = n; }
-}
-
-
-/**
- * Factory class for items.
- */
-class ItemFactory {
- GenMSIL coder;
- private static final Item.VoidItem VOID = Item.VoidItem();
- static { VOID.type = MSILType.VOID; }
-
- public ItemFactory(GenMSIL _coder) {
- coder = _coder;
- }
- public Item.VoidItem VoidItem() {
- return VOID;
- }
- public Item.StackItem StackItem(MSILType type) {
- Item.StackItem item = Item.StackItem();
- item.type = type;
- assert item.type != null;
- return item;
- }
- public Item.SelfItem SelfItem(Type t) {
- Item.SelfItem item = Item.SelfItem();
- item.type = coder.msilType(t);
- assert item.type != null;
- return item;
- }
- public Item.LiteralItem LiteralItem(AConstant value) {
- Item.LiteralItem item = Item.LiteralItem(value);
- item.type = MSILType.fromAConstant(value);
- assert item.type != null;
- return item;
- }
- public Item.ArgItem ArgItem(MSILType type, int slot) {
- Item.ArgItem item = Item.ArgItem(slot);
- item.type = type;
- assert item.type != null;
- return item;
- }
- public Item.LocalItem LocalItem(LocalBuilder local) {
- Item.LocalItem item = Item.LocalItem(local);
- item.type = coder.msilType(local.LocalType);
- assert item.type != null;
- return item;
- }
- public Item.StaticItem StaticItem(FieldInfo field) {
- assert field.IsStatic();
- Item.StaticItem item = Item.StaticItem(field);
- item.type = coder.msilType(field.FieldType);
- assert item.type != null;
- return item;
- }
- public Item.SelectItem SelectItem(Item qualifier, FieldInfo field) {
- assert !field.IsStatic();
- Item.SelectItem item = Item.SelectItem(qualifier, field);
- item.type = coder.msilType(field.FieldType);
- assert item.type != null;
- return item;
- }
- public Item.CondItem CondItem(Test test, Chain success, Chain failure) {
- Item.CondItem item = Item.CondItem(test, success, failure);
- item.type = MSILType.BOOL;
- return item;
- }
-}
-
-/**
- * Class representing the possible tests in conditional item
- */
-class Test {
-
- public case False;
- public case True;
- public case Bool(boolean value);
- public case Or(Test test);
- public case And(Test test);
- public case Binary(int opcode, MSILType type);
-
- public static final int LT_IS = 0x00;
- public static final int LE_IS = 0x01;
- public static final int GT_IS = 0x02;
- public static final int GE_IS = 0x03;
-
- public static final int LT_IU = 0x04;
- public static final int LE_IU = 0x05;
- public static final int GT_IU = 0x06;
- public static final int GE_IU = 0x07;
-
- public static final int LT_RO = 0x08;
- public static final int LE_RO = 0x09;
- public static final int GT_RO = 0x0A;
- public static final int GE_RO = 0x0B;
-
- public static final int LT_RU = 0x0C;
- public static final int LE_RU = 0x0D;
- public static final int GT_RU = 0x0E;
- public static final int GE_RU = 0x0F;
-
- public static final int EQ = 0x10;
- public static final int NE = 0x11;
-
- public static String toString(int opcode) {
- switch (opcode) {
- case LT_IS: return "GE_IS";
- case LE_IS: return "GT_IS";
- case GT_IS: return "LE_IS";
- case GE_IS: return "LT_IS";
- case LT_IU: return "GE_IU";
- case LE_IU: return "GT_IU";
- case GT_IU: return "LE_IU";
- case GE_IU: return "LT_IU";
- case LT_RO: return "GE_RU";
- case LE_RO: return "GT_RU";
- case GT_RO: return "LE_RU";
- case GE_RO: return "LT_RU";
- case LT_RU: return "GE_RO";
- case LE_RU: return "GT_RO";
- case GT_RU: return "LE_RO";
- case GE_RU: return "LT_RO";
- case EQ : return "NE";
- case NE : return "EQ";
- default : throw Debug.abort("" + opcode);
- }
- }
-
- public String toString() {
- switch (this) {
-
- case False:
- return "False";
- case True:
- return "True";
- case Bool(boolean value):
- return "Test(" + value + ")";
- case Or(Test test):
- return "Or(" + test + ")";
- case And(Test test):
- return "And(" + test + ")";
- case Binary(int opcode, MSILType type):
- return "Binary(" + toString(opcode) +"," + type + ")";
-
- default:
- throw Debug.abort(getClass().getName());
- }
- }
-} // class Test
diff --git a/sources/scalac/backend/msil/TypeCreator.java b/sources/scalac/backend/msil/TypeCreator.java
deleted file mode 100644
index de0bd4a264..0000000000
--- a/sources/scalac/backend/msil/TypeCreator.java
+++ /dev/null
@@ -1,1449 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.backend.msil;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.CompilationUnit;
-import scalac.ApplicationError;
-import scalac.ast.Tree;
-import scalac.ast.Traverser;
-import scalac.atree.AConstant;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.SourceRepresentation;
-import scalac.symtab.Kinds;
-import scalac.symtab.TypeTags;
-import scalac.symtab.Symbol;
-import scalac.symtab.Scope;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Definitions;
-import scalac.symtab.AttributeInfo;
-import scalac.symtab.classfile.CLRTypes;
-import scala.tools.util.Position;
-import scala.tools.util.SourceFile;
-
-import Tree.*;
-
-import ch.epfl.lamp.compiler.msil.*;
-import ch.epfl.lamp.compiler.msil.emit.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteOrder;
-import java.nio.ByteBuffer;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-
-/**
- * Creates System.Reflection objects corresponding to
- * Scala symbols
- *
- * @author Nikolay Mihaylov
- * @version 1.1
- */
-
-final class TypeCreator {
-
- //private final GenMSIL gen;
- private final Global global;
- private final Definitions defs;
-
- private final ArrayList typeBuilders = new ArrayList();
-
- // for every method of an object give the corresponding static method
- // of the accompanying class
- private final Map/*<Symbol, MethodBuilder>*/ syms2staticMethods = new HashMap();
-
- private final Map types2symbols = new HashMap();
- private final Map symbols2types = new HashMap();
- private final Map symbols2fields = new HashMap();
- private final Map symbols2methods = new HashMap();
- private final Map symbols2moduleFields = new HashMap();
- private final Set specialAttrs = new HashSet();
-
- public static final String MODULE_S = "$MODULE";
-
- public final Type BYTE;
- public final Type CHAR;
- public final Type SHORT;
- public final Type INT;
- public final Type LONG;
- public final Type FLOAT;
- public final Type DOUBLE;
- public final Type BOOLEAN;
- public final Type VOID;
- public final Type ENUM;
-
- public final Type OBJECT;
- public final Type STRING;
- public final Type STRING_ARRAY;
- public final Type ICLONEABLE;
-
- private final Type MONITOR;
-
- public final MethodInfo CONCAT_OBJECT_OBJECT;
- public final MethodInfo OBJECT_EQUALS;
- public final MethodInfo MONITOR_ENTER;
- public final MethodInfo MONITOR_EXIT;
- public final MethodInfo MEMBERWISE_CLONE;
-// private final MethodInfo MONITOR_PULSE;
-// private final MethodInfo MONITOR_PULSE_ALL;
-// private final MethodInfo MONITOR_WAIT;
-// private final MethodInfo MONITOR_WAIT_TIMEOUT;
-
- public final Type SCALA_BYTE;
- public final Type SCALA_SHORT;
- public final Type SCALA_INT;
- public final Type SCALA_LONG;
- public final Type SCALA_FLOAT;
- public final Type SCALA_DOUBLE;
- public final Type SCALA_CHAR;
- public final Type SCALA_BOOLEAN;
- public final Type SCALA_UNIT;
-
- public final MethodInfo RUNTIME_BOX_UNIT ;
-
- public Symbol SYM_SUBSTRING_INT_INT;
- public MethodInfo SUBSTRING_INT_INT;
- public Symbol SYM_COMPARE_TO_IGNORE_CASE;
- public MethodInfo COMPARE_TO_IGNORE_CASE;
-
- public ConstructorInfo SYMTAB_CONSTR;
- public ConstructorInfo SYMTAB_DEFAULT_CONSTR;
-
- private scalac.symtab.Type MAIN_METHOD_TYPE;
-
- private final Symbol SYSTEM_SERIALIZABLE_CONSTR;
- private final Symbol SYSTEM_NONSERIALIZED_CONSTR;
-
- private final CLRTypes ti;
-
- private final Phase backPhase;
-
- //##########################################################################
-
- TypeCreator(Global global) {
- this.global = global;
- this.defs = global.definitions;
- this.backPhase = global.PHASE.ADDINTERFACES.phase();
-
- ti = CLRTypes.instance();
-
- BYTE = ti.BYTE;
- CHAR = ti.CHAR;
- SHORT = ti.SHORT;
- INT = ti.INT;
- LONG = ti.LONG;
- FLOAT = ti.FLOAT;
- DOUBLE = ti.DOUBLE;
- BOOLEAN = ti.BOOLEAN;
- VOID = ti.VOID;
- ENUM = ti.ENUM;
-
- OBJECT = ti.OBJECT;
- STRING = ti.STRING;
- STRING_ARRAY = Type.GetType("System.String[]");
- ICLONEABLE = Type.GetType("System.ICloneable");
- MONITOR = Type.GetType("System.Threading.Monitor");
-
- final Type[] sObject1 = new Type[] {OBJECT};
-
- //CONCAT_OBJECT = STRING.GetMethod("Concat", new Type[] {OBJECT});
- //CONCAT_STRING_STRING = STRING.GetMethod("Concat", new Type[] {STRING, STRING});
- CONCAT_OBJECT_OBJECT =
- STRING.GetMethod("Concat", new Type[] {OBJECT, OBJECT});
- OBJECT_EQUALS = OBJECT.GetMethod("Equals", sObject1);
-// MONITOR_PULSE = MONITOR.GetMethod("Pulse", sObject1);
-// MONITOR_PULSE_ALL = MONITOR.GetMethod("PulseAll", sObject1);
-// MONITOR_WAIT = MONITOR.GetMethod("Wait", sObject1);
-// MONITOR_WAIT_TIMEOUT = MONITOR.GetMethod("Wait", new Type[] {OBJECT, INT});
- MONITOR_ENTER = MONITOR.GetMethod("Enter", sObject1);
- MONITOR_EXIT = MONITOR.GetMethod("Exit", sObject1);
- MEMBERWISE_CLONE = ti.MEMBERWISE_CLONE;
-
- SCALA_BYTE = getType("scala.Byte");
- SCALA_SHORT = getType("scala.Short");
- SCALA_INT = getType("scala.Int");
- SCALA_LONG = getType("scala.Long");
- SCALA_FLOAT = getType("scala.Float");
- SCALA_DOUBLE = getType("scala.Double");
- SCALA_CHAR = getType("scala.Char");
- SCALA_BOOLEAN = getType("scala.Boolean");
- SCALA_UNIT = getType("scala.Unit");
-
- RUNTIME_BOX_UNIT = getType("scala.runtime.RunTime")
- .GetMethod("box_uvalue", Type.EmptyTypes);
- ti.map(defs.OBJECT_CLONE, MEMBERWISE_CLONE);
-
- SYSTEM_SERIALIZABLE_CONSTR = defs.getClass("System.SerializableAttribute")
- .primaryConstructor();
- SYSTEM_NONSERIALIZED_CONSTR = defs.getClass("System.NonSerializedAttribute")
- .primaryConstructor();
-
- }
-
- private boolean initialized = false;
-
- /*
- * Called from GenMSILPhase
- */
- public void init() {
- if (initialized)
- return;
- final Symbol JOBJECT = defs.OBJECT_CLASS; //defs.getClass("java.lang.Object");
- final Symbol JSTRING = defs.STRING_CLASS;
-
- // initialize type mappings
- map(defs.ANY_CLASS, OBJECT);
- map(defs.ANYREF_CLASS, OBJECT);
- map(JOBJECT, OBJECT);
- map(JSTRING, STRING);
-
- // constants useful for method mappings
- final scalac.symtab.Type UNBOXED_LONG =
- new scalac.symtab.Type.UnboxedType(TypeTags.LONG);
- final scalac.symtab.Type UNBOXED_INT =
- new scalac.symtab.Type.UnboxedType(TypeTags.INT);
- final scalac.symtab.Type UNBOXED_CHAR =
- new scalac.symtab.Type.UnboxedType(TypeTags.CHAR);
-
- final scalac.symtab.Type[] jEmpty = scalac.symtab.Type.EMPTY_ARRAY;
- final scalac.symtab.Type[] jString1 = new scalac.symtab.Type[]
- {defs.STRING_TYPE()};
- final scalac.symtab.Type[] jInt1 = new scalac.symtab.Type[]
- {UNBOXED_INT};
- final scalac.symtab.Type[] jInt2 = new scalac.symtab.Type[]
- {UNBOXED_INT, UNBOXED_INT};
- final scalac.symtab.Type[] jStringInt = new scalac.symtab.Type[]
- {defs.STRING_TYPE(), UNBOXED_INT};
- final scalac.symtab.Type[] jChar2 = new scalac.symtab.Type[]
- {UNBOXED_CHAR, UNBOXED_CHAR};
-
- final Type[] sObject1 = new Type[] {OBJECT};
- final Type[] sString1 = new Type[] {STRING};
- final Type[] sString2 = new Type[] {STRING, STRING};
- final Type[] sChar1 = new Type[] {CHAR};
- final Type[] sCharInt2 = new Type[] {CHAR, INT};
-
- final Type ObjectImpl = Type.GetType("com.ms.vjsharp.lang.ObjectImpl");
-
- // map methods of java.lang.Object
- translateMethod(JOBJECT, "equals", OBJECT, "Equals");
- translateMethod(JOBJECT, "hashCode", OBJECT, "GetHashCode");
- translateMethod(JOBJECT, "toString", OBJECT, "ToString");
- translateMethod(JOBJECT, "finalize", OBJECT, "Finalize");
- translateMethod(JOBJECT, "wait", jEmpty, MONITOR, "Wait", sObject1);
- translateMethod(JOBJECT, "wait", new scalac.symtab.
- Type[] {UNBOXED_LONG}, // defs.LONG_TYPE
- MONITOR, "Wait",
- new Type[] {OBJECT, INT});
- translateMethod(JOBJECT, "notify", jEmpty, MONITOR, "Pulse", sObject1);
- translateMethod(JOBJECT, "notifyAll", jEmpty, MONITOR, "PulseAll", sObject1);
- //translateMethod(JOBJECT, "getClass", jEmpty, ObjectImpl, "getClass", sObject1);
-
- // map methods of java.lang.String
- //translateMethod(JSTRING, "equals", STRING, "Equals");
- //translateMethod(JSTRING, "toString", STRING, "ToString");
- translateMethod(JSTRING, "compareTo", STRING, "CompareTo");
- translateMethod(JSTRING, "length", STRING, "get_Length");
- translateMethod(JSTRING, "charAt", STRING, "get_Chars");
- translateMethod(JSTRING, "concat", jString1, STRING, "Concat", sString2);
- translateMethod(JSTRING, "indexOf", jInt1, STRING, "IndexOf", sChar1);
- translateMethod(JSTRING, "indexOf", jInt2, STRING, "IndexOf", sCharInt2);
- translateMethod(JSTRING, "indexOf", jString1, STRING, "IndexOf");
- translateMethod(JSTRING, "indexOf", jStringInt, STRING, "IndexOf");
- translateMethod(JSTRING, "lastIndexOf", jInt1, STRING, "LastIndexOf", sChar1);
- translateMethod(JSTRING, "lastIndexOf", jInt2, STRING, "LastIndexOf", sCharInt2);
- translateMethod(JSTRING, "lastIndexOf", jString1, STRING, "LastIndexOf");
- translateMethod(JSTRING, "lastIndexOf", jStringInt, STRING, "LastIndexOf");
- translateMethod(JSTRING, "toLowerCase", jEmpty, STRING, "ToLower");
- translateMethod(JSTRING, "toUpperCase", jEmpty, STRING, "ToUpper");
- translateMethod(JSTRING, "startsWith", jString1, STRING, "StartsWith");
- translateMethod(JSTRING, "endsWith", jString1, STRING, "EndsWith");
- translateMethod(JSTRING, "substring", jInt1, STRING, "Substring");
- translateMethod(JSTRING, "intern", jEmpty, STRING, "Intern", sString1);
- translateMethod(JSTRING, "replace", jChar2, STRING, "Replace");
- translateMethod(JSTRING, "toCharArray", STRING, "ToCharArray");
-
-// translateMethod(defs.getModule("java.lang.Byte").moduleClass()
-// , "parseByte", jString1, BYTE, "Parse");
-// translateMethod(defs.getModule("java.lang.Short").moduleClass()
-// , "parseShort", jString1, SHORT, "Parse");
-// translateMethod(defs.getModule("java.lang.Integer").moduleClass()
-// , "parseInt", jString1, INT, "Parse");
-// translateMethod(defs.getModule("java.lang.Long").moduleClass()
-// , "parseLong", jString1, LONG, "Parse");
-// translateMethod(defs.getModule("java.lang.Float").moduleClass()
-// , "parseFloat", jString1, FLOAT, "Parse");
-// translateMethod(defs.getModule("java.lang.Double").moduleClass()
-// , "parseDouble", jString1, DOUBLE, "Parse");
-
- SYM_SUBSTRING_INT_INT = lookupMethod(JSTRING, "substring", jInt2);
- SUBSTRING_INT_INT =
- STRING.GetMethod("Substring", new Type[]{INT,INT});
- SYM_COMPARE_TO_IGNORE_CASE =
- lookupMethod(JSTRING, "compareToIgnoreCase", jString1);
- COMPARE_TO_IGNORE_CASE =
- STRING.GetMethod("Compare", new Type[]{STRING, STRING, BOOLEAN});
- initialized = true;
-
- SYMTAB_CONSTR = ti.SYMTAB_CONSTR;
- SYMTAB_DEFAULT_CONSTR = ti.SYMTAB_DEFAULT_CONSTR;
-
- scalac.symtab.Type argument = defs.array_TYPE(defs.STRING_TYPE());
- scalac.symtab.Type result = defs.void_TYPE();
- Symbol formal = Symbol.NONE.newTerm // !!! should be newVParam
- (Position.NOPOS, Modifiers.PARAM, Name.fromString("args"));
- formal.setInfo(argument);
- MAIN_METHOD_TYPE =
- scalac.symtab.Type.MethodType(new Symbol[] {formal}, result);
-
- specialAttrs.add(defs.SCALA_SERIALIZABLE_CONSTR);
- specialAttrs.add(defs.SCALA_TRANSIENT_CONSTR);
- specialAttrs.add(SYSTEM_SERIALIZABLE_CONSTR);
- specialAttrs.add(SYSTEM_NONSERIALIZED_CONSTR);
- specialAttrs.add(defs.SCALA_CLONEABLE_CONSTR);
- specialAttrs.add(defs.SCALA_VOLATILE_CONSTR);
- specialAttrs.add(defs.getClass("scala.SerialVersionUID")
- .primaryConstructor());
- specialAttrs.add(defs.getClass("scala._trait_")
- .primaryConstructor());
- } // init()
-
- /*
- * Looks up the method with the corresponding signature
- */
- private Symbol lookupMethod(Symbol clazz, String name,
- scalac.symtab.Type[] paramTypes)
- {
- Symbol[] methods = clazz.members().
- lookup(Name.fromString(name)).alternativeSymbols();
- search:
- for (int i = 0; i < methods.length; i++) {
- switch (methods[i].info()) {
- case MethodType(Symbol[] vparams, _):
- if (paramTypes.length != vparams.length)
- continue;
- for (int j = 0; j < vparams.length; j++) {
- if (!paramTypes[j].isSameAs(vparams[j].info()))
- continue search;
- }
- return methods[i];
- default:
- continue;
- }
- }
- return null;
- } // Symbol lookupMethod(...)
-
- /*
- * Format the signature of a method for better diagnostic printing.
- */
- private static String methodSignature(Symbol sym) {
- switch (sym.info()) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- StringBuffer s = new StringBuffer();
- s.append(result); s.append(' ');
- s.append(Debug.show(sym.owner())); s.append('.');
- s.append(sym.name.toString());s.append('(');
- for (int i = 0; i < vparams.length; i++) {
- if (i > 0) s.append(", ");
- //s.append(Debug.show(vparams[i].info()));
- s.append(vparams[i].info());
- }
- s.append(")");
- return s.toString();
- default:
- return "Symbol doesn't have a method type: " + Debug.show(sym);
- }
- }
-
- private static String methodSignature(Type[] params) {
- StringBuffer s = new StringBuffer();
- s.append('(');
- for (int i = 0; i < params.length; i++) {
- if (i > 0)
- s.append(", ");
- s.append(params[i]);
- }
- s.append(')');
- return s.toString();
- }
-
- /**
- * Create a mapping from method with symbol 'sym'
- * to the method newClazz.newName(params)
- */
- private void mapMethod(Symbol sym, Type newClazz, String name, Type[] params) {
- MethodInfo method = newClazz.GetMethod(name, params);
- assert method != null : "Cannot find translation for: "
- + methodSignature(sym) + "->" + newClazz
- + "::" + name + methodSignature(params);
- symbols2methods.put(sym, method);
- }
-
- /**
- * Create mapping between the specified two methods only
- */
- private void translateMethod(Symbol clazz, String name,
- scalac.symtab.Type[] paramTypes,
- Type newClazz, String newName, Type[] newParamTypes)
- {
- Symbol sym = lookupMethod(clazz, name, paramTypes);
- assert sym != null : "Cannot find method: " + name + " in class " +
- Debug.show(clazz) + "; scope = " + Debug.show(clazz.members());
- mapMethod(sym, newClazz, newName, newParamTypes);
- }
-
- /**
- * Lookup the method and create mapping for all overloaded alternatives
- * to the corresponding methods in 'newClazz'
- */
- private void translateMethod(Symbol clazz, String name,
- Type newClazz, String newName)
- {
- Symbol sym = clazz.lookup(Name.fromString(name));
- assert sym != null : "Cannot find method: " + name;
- translateMethod(sym, newClazz, newName);
- }
-
- /**
- *
- */
- private void translateMethod(Symbol clazz, String name,
- scalac.symtab.Type[] paramTypes,
- Type newClazz, String newName)
- {
- Type[] newParamTypes = new Type[paramTypes.length];
- for (int i = 0; i < paramTypes.length; i++)
- newParamTypes[i] = getType(paramTypes[i]);
- translateMethod(clazz, name, paramTypes,
- newClazz, newName, newParamTypes);
- }
-
- /*
- * Create a mapping for the two methods.
- */
- private void translateMethod(Symbol sym, Type newClazz, String newName) {
- switch (sym.info()) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- Type[] params = new Type[vparams.length];
- for (int i = 0; i < params.length; i++)
- params[i] = getType(vparams[i]);
- mapMethod(sym, newClazz, newName, params);
- break;
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++)
- translateMethod(alts[i], newClazz, newName);
- return;
- default:
- throw Debug.abort(Debug.show(sym, sym.info()));
- }
- }
-
- //##########################################################################
- // tree treversal
-
- private static final Name MAIN_N = Name.fromString("main");
-
- private final Set types2create = new LinkedHashSet();
-
- private String assemName;
-
- private File outDir;
-
- private Symbol entryPoint;
-
- private boolean moreThanOneEntryPoint;
- public boolean moreThanOneEntryPoint() {
- return moreThanOneEntryPoint;
- }
-
- private CompilationUnit entryPointUnit;
-
- private int entryPointPos;
-
- /** - collects the symbols of all classes defined in the program
- * - collects all entry points
- * - gives the name of the new assembly
- */
- public void collectSymbols(CompilationUnit[] units) {
- types2create.clear();
- entryPoint = null;
- new CollectSymbols().traverse(units);
-
- // the assembly name supplied with the -o option (or null)
- assemName = global.args.assemname.value;
-
- if (assemName == null) {
- // assembly name not supplied with the -o option
- if (entryPoint != null) {
- // assume the name of the object defining the first entry point
- assemName = entryPoint.owner().name.toString();
- } else {
- // assume the name of the first source file
- assemName = entryPointUnit.source.getFile().getName();
- assert assemName.endsWith(".scala") : assemName;
- assemName = assemName.substring(0, assemName.length() - 6);
- }
- } else {
- File f = new File(assemName);
- outDir = f.getParentFile();
- assemName = f.getName();
- }
- if (outDir == null)
- outDir = new File(".");
- }
-
- /** Determines if the given symbol is an entry point:
- * - the name is "main"
- * - belongs to a top-level class
- * - the type is Array[String] => Unit
- */
- public boolean isEntryPoint(Symbol main) {
- return main.name == MAIN_N
- && main.owner().isModuleClass()
- && main.owner().owner().isPackageClass()
- && MAIN_METHOD_TYPE.isSameAs(main.info());
- }
-
- /** A traverser that collects the symbols of all classes defined
- * in the program and all entry points.
- */
- private final class CollectSymbols extends Traverser {
- private CompilationUnit currUnit;
- public void traverse(CompilationUnit unit) {
- currUnit = unit;
- if (entryPointUnit == null)
- entryPointUnit = unit;
- super.traverse(unit);
- }
- public void traverse(Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, Template impl):
- types2create.add(tree.symbol());
- traverse(impl);
- return;
- case DefDef(_, _, _, _, _, _):
- Symbol sym = tree.symbol();
- if (isEntryPoint(sym)) {
- if (entryPoint == null) {
- entryPoint = sym;
- entryPointUnit = currUnit;
- entryPointPos = tree.pos;
- } else
- moreThanOneEntryPoint = true;
- }
- return;
- case ValDef(_, _, _, _):
- return;
- default:
- super.traverse(tree);
- }
- }
- }
-
- //##########################################################################
-
- // the Assembly the program is compiled into.
- private AssemblyBuilder msilAssembly;
-
- // the main module of the assembly
- private ModuleBuilder msilModule;
-
- /** Create the output assembly
- */
- void initAssembly() {
- AssemblyName an = new AssemblyName();
- an.Name = assemName;
- String moduleName = assemName + (entryPoint == null ? ".dll" : ".exe");
- msilAssembly = AssemblyBuilder.DefineDynamicAssembly(an);
- msilModule = msilAssembly.DefineDynamicModule
- (moduleName, new File(outDir, moduleName).getAbsolutePath());
-
- for (Iterator classes = types2create.iterator(); classes.hasNext();) {
- Symbol clazz = (Symbol)classes.next();
- createType(clazz);
- }
- }
-
- /** Finilize the code generation. Called from GenMSILPhase
- * after processing all compilation units.
- */
- public void saveAssembly() {
- if (entryPoint != null) {
- MethodInfo mainMethod = (MethodInfo)getMethod(entryPoint);
- assert mainMethod != null : Debug.show(entryPoint);
- FieldInfo moduleField = getModuleField(entryPoint.owner());
- assert moduleField != null : Debug.show(entryPoint.owner());
- MethodBuilder main = msilModule.DefineGlobalMethod
- ("Main", MethodAttributes.Public | MethodAttributes.Static,
- VOID, new Type[] {STRING_ARRAY} );
- main.DefineParameter(0, 0, "args");
- msilAssembly.SetEntryPoint(main);
- ILGenerator code = main.GetILGenerator();
- if (global.args.debuginfo.value) {
- String fname = SourceRepresentation
- .escape(entryPointUnit.source.getFile().getPath());
- code.setPosition(Position.line(entryPointPos), fname);
- }
-
- code.Emit(OpCodes.Ldsfld, moduleField);
- code.Emit(OpCodes.Ldarg_0);
- code.Emit(OpCodes.Callvirt, mainMethod);
- code.Emit(OpCodes.Ret);
- }
- createTypes();
- File fassem = new File(outDir, assemName + ".il");
- String assemblyFilename = fassem.getPath();
- try {
- msilAssembly.Save(assemblyFilename);
- if (moreThanOneEntryPoint())
- global.warning("Setting " + Debug.show(entryPoint) +
- " as an entry point");
- } catch (IOException e) {
- global.error("Could not save " + assemblyFilename);
- }
- }
-
- /**
- * Finalizes ('bakes') the newly created types
- */
- private void createTypes() {
- Iterator iter = typeBuilders.iterator();
- while (iter.hasNext())
- ((TypeBuilder)iter.next()).CreateType();
- }
-
- //##########################################################################
- /**
- * Creates bidirectional mapping from symbols to types.
- */
- private Type map(Symbol sym, Type type) {
- symbols2types.put(sym, type);
- if (sym.isClass())
- types2symbols.put(type, sym);
- return type;
- }
-
- /**
- * Return the System.Type object with the given name.
- */
- private Type getType(String name) {
- return ti.getType(name);
- }
-
- /**
- * Return the System.Type object corresponding to the type of the symbol
- */
- public Type getType(Symbol sym) {
- if (sym == null) return null; // FIXME: assert sym != null ?
- if (sym == defs.ANY_CLASS || sym == defs.ANYREF_CLASS || sym == defs.OBJECT_CLASS)
- return OBJECT;
- if (sym == defs.STRING_CLASS)
- return STRING;
-
- Type type = (Type) symbols2types.get(sym);
- if (type != null) {
- if (sym.isExternal()) {
- assert !(type instanceof TypeBuilder)
- : Debug.show(sym) + " -> " + type.toString();
- return type;
- } else if (types2create.contains(sym) && type instanceof TypeBuilder)
- return type;
- } else if (types2create.contains(sym))
- type = createType(sym);
- if (type != null)
- return type;
-
- type = (Type)ti.getMember(sym);
- if (type != null)
- return map(sym, type);
-
- if (sym.isClass()) {
- final Symbol owner = sym.owner();
- if (owner.isClass()) {
- Type ownerType = getType(owner);
- assert ownerType != null : Debug.show(owner);
- type = ownerType.GetNestedType(sym.name.toString());
- } else {
- String name = global.primitives.getCLRClassName(sym);
- type = getType(sym.isModuleClass() && !sym.isJava()
- ? name + "$" : name);
- }
- } else {
- type = getType(sym.info());
- }
- if (type != null)
- return map(sym, type);
-
- throw Debug.abort("Type resolution failed for " + Debug.show(sym));
- }
-
- /** Retrieve the System.Type from the scala type.
- */
- public Type getType(scalac.symtab.Type type) {
- switch (type) {
- case ThisType(Symbol s):
- return getType(s);
- case TypeRef(_, Symbol s, _):
- return getType(s);
- case CompoundType(_, _):
- return getType(type.symbol());
- case UnboxedType(int kind):
- return getTypeFromKind(kind);
- case UnboxedArrayType(scalac.symtab.Type elemtp):
- return ti.mkArrayType(getType(elemtp));
- case NoType:
- return VOID;
- default:
- throw Debug.abort(Debug.show(type));
- }
- }
-
- /** Retrieves the primitive datatypes given their kind
- */
- private Type getTypeFromKind(int kind) {
- switch (kind) {
- case TypeTags.CHAR: return CHAR;
- case TypeTags.BYTE: return BYTE;
- case TypeTags.SHORT: return SHORT;
- case TypeTags.INT: return INT;
- case TypeTags.LONG: return LONG;
- case TypeTags.FLOAT: return FLOAT;
- case TypeTags.DOUBLE: return DOUBLE;
- case TypeTags.BOOLEAN: return BOOLEAN;
- case TypeTags.UNIT: return VOID;
- case TypeTags.STRING: return STRING;
- default:
- throw new ApplicationError("Unknown kind: " + kind);
- }
- }
-
- public Symbol getSymbol(Type type) {
- return (Symbol) types2symbols.get(type);
- }
-
- public Type createType(Symbol clazz) {
- try { return createType0(clazz); }
- catch (Error e) {
- throw Debug.abort(Debug.show(clazz), e);
- }
- }
-
- /**
- * Creates the TypeBuilder for a class.
- */
- public Type createType0(Symbol clazz) {
- assert types2create.contains(clazz) : Debug.show(clazz);
- Type type = (Type)symbols2types.get(clazz);
- if (type != null && type instanceof TypeBuilder)
- return type;
-
- TypeBuilder staticType = null;
- final Symbol owner = clazz.owner();
- final String staticTypeName = owner.isClass()
- ? clazz.nameString()
- : global.primitives.getCLRClassName(clazz);
- final String typeName =
- staticTypeName + (clazz.isModuleClass() ? "$" : "");
- final scalac.symtab.Type classType = clazz.info();
- switch (classType) {
- case CompoundType(scalac.symtab.Type[] baseTypes, _):
- Type superType = null;
- Type[] interfaces = null;
- int inum = baseTypes.length;
- if (clazz.isInterface()) {
- int baseIndex = 0;
- if (baseTypes[0].symbol() == defs.ANY_CLASS) {
- --inum;
- baseIndex = 1;
- }
- interfaces = new Type[inum];
- for (int i = 0; i < inum; i++) {
- assert baseTypes[i + baseIndex].symbol().isInterface();
- interfaces[i] = getType(baseTypes[i + baseIndex].symbol());
- }
- } else {
- boolean cloneable = isCloneable(clazz);
- superType = getType(baseTypes[0].symbol());
- assert inum > 0;
- interfaces = new Type[inum - 1 + (cloneable ? 1 : 0)];
- for (int i = 1; i < inum; i++)
- interfaces[i - 1] = getType(baseTypes[i].symbol());
- if (cloneable)
- interfaces[inum - 1] = ICLONEABLE;
- }
-
- type = (TypeBuilder) symbols2types.get(clazz);
- if (type != null)
- return type;
-
- if (owner.isPackageClass()) { // i.e. top level class
- type = msilModule.DefineType
- (typeName, translateTypeAttributes(clazz, false),
- superType, interfaces);
- if (clazz.isModuleClass()) {
- Symbol module = owner.members().lookup(clazz.name.toTermName());
- Symbol linkedClass = module.linkedClass();
-
- if (linkedClass == null || linkedClass.info().isError()) {
- staticType = msilModule.DefineType
- (staticTypeName,
- translateTypeAttributes(clazz, false),
- OBJECT, Type.EmptyTypes);
- }
- }
- } else {
- final Type outerType = (Type) getType(owner);
- // check if the type have not been created by
- // the (possible) creation of the outer type
- type = (TypeBuilder) symbols2types.get(clazz);
- if (type != null)
- return type;
-
- assert outerType instanceof TypeBuilder : Debug.show(clazz);
- type = ((TypeBuilder)outerType).DefineNestedType
- (typeName, translateTypeAttributes(clazz, true),
- superType, interfaces);
- }
- break;
-
- default:
- throw Debug.abort("Symbol does not have a CompoundType", clazz);
- }
- typeBuilders.add(type);
- map(clazz, type);
- if (clazz.isModuleClass() && staticType != null) {
- syms2staticTypes.put(clazz, staticType);
- }
- for (Scope.SymbolIterator syms = clazz.members().iterator();
- syms.hasNext(); )
- {
- Symbol member = syms.next();
- if (member.isMethod()) {
- MethodBase m = createMethod(member);
- if (staticType != null && m.IsPublic() && !m.IsConstructor()) {
- MethodBase sm = createMethod(staticType, member, true);
- syms2staticMethods.put(member, sm);
- }
- }
- else if (!member.isClass() && !member.isModule()
- && !member.isType())
- createField(member);
- }
-
- // adapted from Erasure; creates abstract method declarations
- // for the interface methods for which the class doesn't provide
- // implementation (requirement of the CLR)
- if (clazz.isClass() && !clazz.isInterface()) {
- Set ifaces = new HashSet(getInterfacesOf(clazz));
- Symbol svper = clazz.parents()[0].symbol();
- ifaces.removeAll(getInterfacesOf(svper));
- for (Iterator i = ifaces.iterator(); i.hasNext(); ) {
- Symbol iface = (Symbol)i.next();
- for (Scope.SymbolIterator members =
- iface.members().iterator();
- members.hasNext(); )
- {
- Symbol method = members.next();
- if (!method.isTerm() || !method.isDeferred()) continue;
- Symbol overriding =
- method.overridingSymbol(clazz.info(), true);
- if (overriding != method) continue;
- Symbol overridden = method
- .overriddenSymbol(clazz.parents()[0], clazz, true);
- if (overridden.isNone()) {
- Symbol newMethod = method.cloneSymbol(clazz);
- newMethod.flags = (newMethod.flags & ~Modifiers.JAVA)
- | Modifiers.SYNTHETIC | Modifiers.DEFERRED;
- createMethod(newMethod);
- }
- }
- }
- }
- setAttributes((TypeBuilder)type, global.getAttributes(clazz));
- return type;
- } // createType()
-
- private final Map interfaces/*<Symbol,Set<Symbol>>*/ = new HashMap();
-
- /** Adapted from Erasure. Returns a set of the interfaces
- * implemented by the class.
- */
- private Set getInterfacesOf(Symbol clasz) {
- assert clasz.isClass(): Debug.show(clasz);
- Set set = (Set)interfaces.get(clasz);
- if (set == null) {
- set = new HashSet();
- interfaces.put(clasz, set);
- scalac.symtab.Type parents[] = clasz.parents();
- for (int i = 0; i < parents.length; i++)
- set.addAll(getInterfacesOf(parents[i].symbol()));
- if (clasz.isInterface()) set.add(clasz);
- }
- return set;
- }
-
- public boolean isCloneable(Symbol clazz) {
- return global.getAttrArguments(clazz, defs.SCALA_CLONEABLE_CONSTR)
- != null;
- }
-
- //##########################################################################
- // find/create methods
-
- public MethodBase getMethod(Symbol sym) {
- MethodBase method = null;
- try {
- method = getMethod0(sym);
- } catch (Throwable e) {
- printMapping(sym, symbols2methods);
- throw Debug.abort(Debug.show(sym), e);
- }
- return method;
- }
-
- private static String dumpSymbol(Symbol sym) {
- return Debug.show(sym) + " : " + Integer.toHexString(sym.flags);
- }
- private void printMapping(Symbol sym, Map map) {
- System.out.println("For symbol " + dumpSymbol(sym));
- for (Iterator entries = map.entrySet().iterator();
- entries.hasNext(); )
- {
- Map.Entry entry = (Map.Entry)entries.next();
- Symbol sentry = (Symbol)entry.getKey();
- if (sentry.owner() == sym.owner()
- && sentry.name == sym.name)
- {
- System.out.println("Existing mapping "
- + dumpSymbol(sentry) + " => "
- + entry.getValue());
- }
- }
- System.out.println("Scope of owner: " + sym.owner().members());
- }
-
- /**
- * Returns the MethodBase object corresponding to the symbol.
- */
- public MethodBase getMethod0(Symbol sym) {
- MethodBase method = (MethodBase) symbols2methods.get(sym);
- if (method != null)
- return method;
- MemberInfo m = ti.getMember(sym);
- if (m != null && m instanceof MethodBase) {
- method = (MethodBase) m;
- } else {
- // force the creation of the declaring type
- Type owner = getType(sym.owner());
- assert owner != null : Debug.show(sym);
- method = (MethodBase) symbols2methods.get(sym);
- if (method != null)
- return method;
- switch (sym.info()) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- Type[] params = new Type[vparams.length];
- Type resType = getType(result);
- for (int i = 0; i < params.length; i++)
- params[i] = getType(vparams[i]);
- if (sym.isInitializer()) {
- // The owner of a constructor is the outer class
- // so get the result type of the constructor
- method = owner.GetConstructor(params);
- assert method != null : "cannot find " + owner
- + "::.ctor" + methodSignature(params);
- } else {
- method = owner instanceof TypeBuilder
- ? findMethod(sym.owner(), sym)
- : owner.GetMethod
- (getMethodName(sym.name, params), params, resType);
- }
- break;
- default:
- throw Debug.abort("Symbol doesn't have a method type", sym);
- }
- assert method != null
- : Debug.show(owner) + " => Cannot find method: " + methodSignature(sym);
- }
- symbols2methods.put(sym, method);
-
- return method;
- }
-
- /**
- * Returns all MethodBase objects corresponding to the symbol.
- */
- private MethodBase[] getMethods(Symbol sym) {
- MethodBase method = (MethodBase) symbols2methods.get(sym);
- if (method != null)
- return new MethodBase[]{method};
- MemberInfo m = ti.getMember(sym);
- if (m != null && m instanceof MethodBase) {
- method = (MethodBase) m;
- } else {
- // force the creation of the declaring type
- Type owner = getType(sym.owner());
- assert owner != null : Debug.show(sym);
- method = (MethodBase) symbols2methods.get(sym);
- if (method != null)
- return new MethodBase[]{method};
- switch (sym.info()) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- Type[] params = new Type[vparams.length];
- Type resType = getType(result);
- for (int i = 0; i < params.length; i++)
- params[i] = getType(vparams[i]);
- if (sym.isInitializer()) {
- // The owner of a constructor is the outer class
- // so get the result type of the constructor
- method = owner.GetConstructor(params);
- assert method != null : "cannot find " + owner
- + "::.ctor" + methodSignature(params);
- } else {
- method = owner instanceof TypeBuilder
- ? findMethod(sym.owner(), sym)
- : owner.GetMethod
- (getMethodName(sym.name, params), params, resType);
- }
- break;
- case OverloadedType(Symbol[] alts, scalac.symtab.Type[] alttypes):
- MethodBase[] methods = new MethodBase[alts.length];
- for (int i = 0; i < alts.length; i++)
- methods[i] = getMethod(alts[i]);
- return methods;
-
- default:
- throw Debug.abort("Symbol doesn't have a method type", sym);
- }
- assert method != null
- : Debug.show(owner) + " => Cannot find method: " + methodSignature(sym);
- }
- symbols2methods.put(sym, method);
- return new MethodBase[]{method};
- }
-
- /**
- * Returns the exactest apply method.
- * The exactest method is taken to be the first method that doesn't have
- * an 'object' return type and all 'object' parameter types.
- */
- public MethodBase getDelegateApplyMethod(Symbol sym) {
- MethodBase methods[] = getMethods(sym);
- if(methods.length > 1) {
- assert methods.length == 2;
- for (int i = 0; i < methods.length; i++) {
- if(((MethodInfo)methods[i]).ReturnType != OBJECT)
- return methods[i];
- ParameterInfo pi[] = methods[i].GetParameters();
- for (int j = 0; j < pi.length; j++) {
- if(pi[j].ParameterType != OBJECT)
- return methods[i];
- }
- }
- throw Debug.abort("Expected apply method not found", sym);
- } else {
- return methods[0];
- }
- }
-
- private String getMethodName(Name name, Type[] params) {
- if (name == Names.finalize && params.length == 0)
- return "Finalize";
- if (name == Names.toString && params.length == 0)
- return "ToString";
- if (name == Names.hashCode && params.length == 0)
- return "GetHashCode";
- if (name == Names.equals && params.length == 1 && params[0] == OBJECT)
- return "Equals";
- if (name == Names.clone && params.length == 0)
- return "Clone";
- return name.toString();
- }
-
- private MethodBase findMethod(Symbol owner, Symbol member) {
- Symbol[] ms = owner.lookup(member.name).alternativeSymbols();
- for (int i = 0; i < ms.length; i++)
- if (member.info().isSameAs(ms[i].info())) {
- MethodBase m = getMethod(ms[i]);
- if (m != null)
- return m;
- }
- throw Debug.abort("Couldn't find mapping for " + Debug.show(member));
- }
-
- private MethodBase createMethod(Symbol sym) {
- MethodBase method =
- createMethod((TypeBuilder)getType(sym.owner()), sym, false);
- symbols2methods.put(sym, method);
- setAttributes((ICustomAttributeSetter)method, global.getAttributes(sym));
- return method;
- }
-
-
- /**
- * Create the method corresponding to the symbol.
-
- * @param isStatic - forces the created method to be static
- */
- private MethodBase createMethod(TypeBuilder type, Symbol sym, boolean isStatic)
- {
- MethodBase method = null;
- switch (sym.info()) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- short attr = translateMethodAttributes(sym);
- if (isStatic)
- attr = (short)((attr & ~MethodAttributes.Virtual
- & ~MethodAttributes.Final)
- | MethodAttributes.Static);
- Phase bkpCurrent = global.currentPhase;
- global.currentPhase = backPhase;
- Name name = sym.name; String sname = name.toString();
- switch (sym.info()) {
- case PolyType(Symbol[] tparams, _):
- if (tparams.length == 0) {
- name = Name.fromString("get_" + name);
- }
- break;
- default:
- if (sname.endsWith("_$eq")) {
- name = Name.fromString("set_" + sname
- .substring(0, sname.length() - 4));
- }
- }
- global.currentPhase = bkpCurrent;
-
- return createMethod(type, name, sym.info(), attr);
- default:
- throw Debug.abort("Symbol doesn't have a method type: "
- + Debug.show(sym));
- }
- }
-
-
- /**
- * Helper method to createMethod(Symbol)
- */
- private MethodBase createMethod(TypeBuilder type, Name name,
- scalac.symtab.Type symType, short attr)
- {
- MethodBase method = null;
- switch (symType) {
- case MethodType(Symbol[] vparams, scalac.symtab.Type result):
- Type[] params = new Type[vparams.length];
- for (int i = 0; i < params.length; i++)
- params[i] = getType(vparams[i]);
-
- if (name == Names.CONSTRUCTOR) {
- ConstructorBuilder constructor = type.DefineConstructor
- (attr, CallingConventions.Standard, params);
-
- for (int i = 0; i < vparams.length; i++)
- constructor.DefineParameter
- (i, ParameterAttributes.None, vparams[i].name.toString());
- return constructor;
- } else {
- final String sname = getMethodName(name, params);
- MethodBuilder methodBuilder = type.DefineMethod
- (sname, attr, getType(result), params);
-
- for (int i = 0; i < vparams.length; i++)
- methodBuilder.DefineParameter
- (i, 0/*ParameterAttributes.In*/, vparams[i].name.toString());
- return methodBuilder;
- }
- default:
- throw Debug.abort("Method type expected: " + Debug.show(symType));
- }
- }
-
- //##########################################################################
- // find/create fields
-
- /** Returns the FieldInfo object corresponing to the symbol
- */
- public FieldInfo getField(Symbol sym) {
- FieldInfo field = (FieldInfo) symbols2fields.get(sym);
- if (field != null) return field;
- MemberInfo m = ti.getMember(sym);
- if (m != null && m instanceof FieldInfo) {
- field = (FieldInfo)m;
- } else {
- Type owner = getType(sym.owner());
- field = owner.GetField(sym.name.toString());
- if (field == null) {
- System.out.println("Fields of class " + owner);
- int bindingFlags = BindingFlags.DeclaredOnly
- | BindingFlags.Instance | BindingFlags.Static
- | BindingFlags.Public | BindingFlags.NonPublic;
- FieldInfo[] fields = owner.GetFields(bindingFlags);
- for (int i = 0; i < fields.length; i ++)
- System.out.println("\t" + fields[i]);
- }
- }
- assert field != null : "Cannot find field: " + Debug.show(sym);
- symbols2fields.put(sym, field);
- return field;
- }
-
- /*
- *
- */
- public FieldInfo createField(Symbol sym) {
- TypeBuilder owner = (TypeBuilder) getType(sym.owner());
- FieldInfo field = (FieldInfo) symbols2fields.get(sym);
- if (field != null) {
- assert field instanceof FieldBuilder;
- return field;
- }
- field = owner.DefineField(sym.name.toString(), getType(sym.type()),
- translateFieldAttributes(sym));
- Object o = symbols2fields.put(sym, field);
- assert o == null : "Cannot re-define field: " + Debug.show(sym);
- return field;
- }
-
- /*
- *
- */
- private FieldInfo getModuleField(Type type) {
- Symbol sym = (Symbol) types2symbols.get(type);
- assert sym != null;
- return getModuleField(sym);
- }
-
- /**
- *
- */
- public MethodBuilder getStaticObjectMethod(Symbol sym) {
- assert sym.owner().isModuleClass() : Debug.show(sym);
- MethodBuilder method = (MethodBuilder)syms2staticMethods.get(sym);
- assert sym != null : Debug.show(sym);
- return method;
- }
-
- private Map syms2staticTypes = new HashMap();
-
- public TypeBuilder getStaticType(Symbol moduleClass) {
- getType(moduleClass); // force the creation of the Type
- TypeBuilder staticType = (TypeBuilder)syms2staticTypes.get(moduleClass);
-// assert staticType != null : Debug.show(moduleClass)
-// + " : " + syms2staticTypes;
- return staticType;
- }
-
- /*
- *
- */
- private Symbol getTypeSymbol(scalac.symtab.Type type) {
- switch (type) {
- case TypeRef(_, Symbol s, _):
- return s;
- default:
- throw new ApplicationError("Cannot get symbol for: "
- + Debug.show(type));
- }
- }
-
- /**
- * @return the field descriptor of the object instance
- */
- public FieldInfo getModuleField(Symbol sym) {
- assert sym.isModule() || sym.isModuleClass() : Debug.show(sym);
- FieldInfo moduleField = (FieldInfo) symbols2moduleFields.get(sym);
- if (moduleField == null) {
- Symbol s = getTypeSymbol(sym.type());
- if (sym != s) {
- moduleField = getModuleField(s);
- } else {
- Type type = getType(sym);
- if (type instanceof TypeBuilder) {
- TypeBuilder module = (TypeBuilder) type;
- moduleField = module.DefineField
- (MODULE_S,
- module,
- (short)(FieldAttributes.Public
- | FieldAttributes.InitOnly
- | FieldAttributes.Static));
- } else {
- moduleField = type.GetField(MODULE_S);
- assert moduleField != null;
- }
- }
- symbols2moduleFields.put(sym, moduleField);
- }
- assert moduleField != null : Debug.show(sym);
- return moduleField;
- }
-
- //##########################################################################
- // translate Scala modifiers into attributes
-
- /** Translates Scala modifiers into TypeAttributes
- */
- private int translateTypeAttributes(Symbol clazz, boolean nested) {
- int mods = clazz.flags;
- int attr = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass;
-
- if (Modifiers.Helper.isInterface(mods))
- attr |= TypeAttributes.Interface;
- else
- attr |= TypeAttributes.Class;
-
- if (Modifiers.Helper.isAbstract(mods))
- attr |= TypeAttributes.Abstract;
- if (Modifiers.Helper.isFinal(mods))
- attr |= TypeAttributes.Sealed;
-
- if (nested) {
- if (Modifiers.Helper.isPrivate(mods))
- //attr |= TypeAttributes.NestedPrivate;
- // Inner classes end up in the interface of a Scala class
- // and are not accessible from the implementation class.
- // Giving them assembly visibility fixes the problem.
- attr |= TypeAttributes.NestedAssembly;
- else if (Modifiers.Helper.isProtected(mods))
- attr |= TypeAttributes.NestedFamORAssem;
- else
- attr |= TypeAttributes.NestedPublic;
- } else {
- if (Modifiers.Helper.isPrivate(mods))
- attr |= TypeAttributes.NotPublic;
- else
- attr |= TypeAttributes.Public;
- }
- boolean serializable =
- global.getAttrArguments(clazz, defs.SCALA_SERIALIZABLE_CONSTR) != null
- || global.getAttrArguments(clazz, SYSTEM_SERIALIZABLE_CONSTR) != null;
- if (serializable)
- attr |= TypeAttributes.Serializable;
- return attr;
- }
-
- /*
- * Translates Scala modifiers into FieldAttributes
- */
- private short translateFieldAttributes(Symbol field) {
- int mods = field.flags;
- int attr = 0;
-
- if (Modifiers.Helper.isFinal(mods))
- attr |= FieldAttributes.InitOnly;
- if (Modifiers.Helper.isPrivate(mods))
- attr |= FieldAttributes.Private;
- else if (Modifiers.Helper.isProtected(mods))
- attr |= FieldAttributes.FamORAssem;
- else
- attr |= FieldAttributes.Public;
-
- if (field.owner().isJava() && field.owner().isModuleClass())
- attr |= FieldAttributes.Static;
- boolean tranzient =
- global.getAttrArguments(field, defs.SCALA_TRANSIENT_CONSTR) != null
- || global.getAttrArguments(field, SYSTEM_NONSERIALIZED_CONSTR) != null;
- if (tranzient)
- attr |= FieldAttributes.NotSerialized;
-
- return (short)attr;
- }
-
- /*
- * Translates Scala modifiers into MethodAttributes
- */
- private static short translateMethodAttributes(Symbol method)
- {
- int mods = method.flags;
- if (method.owner().isInterface())
- mods |= Modifiers.DEFERRED;
- int attr = MethodAttributes.HideBySig;
- if (!method.isInitializer()) {
- attr |= MethodAttributes.Virtual;
- if (Modifiers.Helper.isFinal(mods))
- attr |= MethodAttributes.Final;
- if (Modifiers.Helper.isAbstract(mods))
- attr |= MethodAttributes.Abstract;
- }
-
- if (Modifiers.Helper.isPrivate(mods))
- attr |= MethodAttributes.Private;
- else if (Modifiers.Helper.isProtected(mods))
- attr |= MethodAttributes.Family;
- else
- attr |= MethodAttributes.Public;
-
- return (short)attr;
- }
-
- //##########################################################################
-
- byte[] attributeArgs(AConstant[] args) {
- ByteBuffer buf = ByteBuffer.allocate(1024);
- buf.order(ByteOrder.LITTLE_ENDIAN);
- buf.putShort((short)1); // write signature
- for (int i = 0; i < args.length; i++) {
- switch (args[i]) {
- case BOOLEAN(boolean value): buf.put((byte)(value ? 1 : 0)); break;
- case BYTE(byte value): buf.put(value); break;
- case SHORT(short value): buf.putShort(value); break;
- case CHAR(char value): buf.putChar(value); break;
- case INT(int value): buf.putInt(value); break;
- case LONG(long value): buf.putLong(value); break;
- case FLOAT(float value): buf.putFloat(value); break;
- case DOUBLE(double value): buf.putDouble(value); break;
- case STRING(String value):
- int length = value.length();
- if (length < 128)
- buf.put((byte)length);
- else if (length < 2<<14) {
- buf.put((byte)((length >> 8) | 0x80));
- buf.put((byte)(length & 0xff));
- } else if (length < 2<<29) {
- buf.put((byte)((length >> 24) | 0xc0));
- buf.put((byte)((length >> 16) & 0xff));
- buf.put((byte)((length >> 8) & 0xff));
- buf.put((byte)((length ) & 0xff));
- } else
- throw Debug.abort("String too long: " + length);
- try {
- buf.put(value.getBytes("UTF-8"));
- } catch (java.io.UnsupportedEncodingException e) {
- throw Debug.abort(e);
- }
- break;
- default:
- throw Debug.abort("Cannot handle attribute argument " + args[i]);
- }
- }
- buf.putShort((short)0); // count of named parameters == 0
- int length = buf.position();
- byte[] arr = new byte[length];
- System.arraycopy(buf.array(), 0, arr, 0, length);
- return arr;
- }
-
- private void setAttributes(ICustomAttributeSetter icas, AttributeInfo attr) {
- for (; attr != null; attr = attr.next) {
- if (!specialAttrs.contains(attr.constr)) {
- ConstructorInfo constr =
- (ConstructorInfo)getMethod(attr.constr);
- byte[] args = attributeArgs(attr.args);
- icas.SetCustomAttribute(constr, args);
- }
- }
- }
-
-} // class TypeCreator
diff --git a/sources/scalac/checkers/CheckTreeNodes.java.tmpl b/sources/scalac/checkers/CheckTreeNodes.java.tmpl
deleted file mode 100644
index ca07b23cbd..0000000000
--- a/sources/scalac/checkers/CheckTreeNodes.java.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.checkers;
-
-import scalac.Global;
-import scalac.CompilerPhases;
-{#Imports#}
-
-/** Class to check tree nodes. */
-public class CheckTreeNodes {
-
- //########################################################################
- // Public Constants
-
- public static final CheckTreeNodes instance = new CheckTreeNodes();
-
- //########################################################################
- // Private Fields
-
- private final Global global = Global.instance;
- private final CompilerPhases phases = global.PHASE;
-
- //########################################################################
- // Public Methods
-
- public void check(Tree tree) {
- {#TreeSwitch#}
- }
-
- public boolean checkNode(Tree tree) {
- check(tree);
- return true;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/checkers/TreeChecker.java b/sources/scalac/checkers/TreeChecker.java
deleted file mode 100644
index d5e7aac987..0000000000
--- a/sources/scalac/checkers/TreeChecker.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.checkers;
-
-import java.util.Iterator;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.Stack;
-
-import scala.tools.util.Position;
-
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-import scalac.ast.Tree.AbsTypeDef;
-import scalac.ast.Tree.Ident;
-import scalac.ast.Tree.Template;
-import scalac.ast.Tree.ValDef;
-import scalac.ast.TreeInfo;
-import scalac.symtab.Definitions;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/**
- * This checker checks that trees are well-formed. It checks both the
- * shape and the attribution of the trees. WARNING: currently, the
- * checks are valid only for trees generated by phase AddConstructors.
- */
-public class TreeChecker {
-
- //########################################################################
- // Private Fields
-
- /** The global definitions */
- private final Definitions definitions;
-
- /** The stack of current units */
- private final Stack/*<CompilationUnit>*/ units = new Stack();
-
- /** The stack of current classes */
- private final Stack/*<Symbol>*/ classes = new Stack();
-
- /** The stack of current members */
- private final Stack/*<Symbol>*/ members = new Stack();
-
- /** The stack of current owners */
- private final Stack/*<Symbol>*/ owners = new Stack();
-
- /** The currently visible type variables */
- private final Set/*<Symbol>*/ tvars = new HashSet();
-
- /** The currently visible value variables */
- private final Set/*<Symbol>*/ vvars = new HashSet();
-
- /** The currently visible labels */
- private final Set/*<Symbol>*/ labels = new HashSet();
-
- /** The currently defined symbols */
- private final Set/*<Symbol>*/ symbols = new HashSet();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public TreeChecker(Definitions definitions) {
- this.definitions = definitions;
- }
-
- //########################################################################
- // Public Methods - Checking units
-
- /** Checks the unit. Returns true. */
- public boolean check(CompilationUnit unit) {
- pushUnit(unit);
- template(unit.body);
- popUnit();
- return true;
- }
-
- //########################################################################
- // Private Methods - Checking templates
-
- /** Checks the templates. Returns true. */
- private boolean template(Tree[] trees) {
- for (int i = 0; i < trees.length; i++) template(trees[i]);
- return true;
- }
-
- /** Checks the template. Returns true. */
- private boolean template(Tree tree) {
- switch (tree) {
-
- case Empty:
- return true;
-
- case ClassDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, _, Template(_, Tree[] body)):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isClass(): show(tree);
- assert vparams.length == 1: show(tree);
- containSymbols(tparams, symbol.typeParams());
- containSymbols(vparams[0],symbol.valueParams());
- registerSymbol(symbol);
- scopeInsertParametersOf(symbol);
- pushClass(symbol);
- member(body);
- popClass();
- scopeRemoveParametersOf(symbol);
- return true;
-
- case PackageDef(Tree packaged, Template(Tree[] bases, Tree[] body)):
- Symbol symbol = packaged.symbol();
- assert symbol != null && symbol.isPackage(): show(packaged);
- assert bases.length == 0: show(tree);
- pushOwner(symbol);
- template(body);
- popOwner();
- return true;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Checking members
-
- /** Checks the members. Returns true. */
- private boolean member(Tree[] trees) {
- for (int i = 0; i < trees.length; i++) member(trees[i]);
- return true;
- }
-
- /** Checks the member. Returns true. */
- private boolean member(Tree tree) {
- switch (tree) {
-
- case Empty:
- return true;
-
- case ClassDef(_, _, _, _, _, _):
- return template(tree);
-
- case ValDef(_, _, _, Tree rhs):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isTerm(): show(tree);
- assert rhs == Tree.Empty: show(tree);
- registerSymbol(symbol);
- pushMember(symbol);
- popMember();
- return true;
-
- case DefDef(_, _, AbsTypeDef[]tparams, ValDef[][]vparams, _, Tree rhs):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isMethod(): show(tree);
- assert vparams.length == 1: show(tree);
- containSymbols(tparams, symbol.typeParams());
- containSymbols(vparams[0],symbol.valueParams());
- assert symbol.isDeferred() == (rhs == Tree.Empty): show(tree);
- registerSymbol(symbol);
- scopeInsertParametersOf(symbol);
- pushMember(symbol);
- if (!symbol.isDeferred()) expression(rhs, symbol.resultType());
- popMember();
- scopeRemoveParametersOf(symbol);
- return true;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Checking statements
-
- /** Checks the statement. Returns true. */
- private boolean statement(Set locals, Tree tree) {
- switch (tree) {
-
- case Empty:
- return true;
-
- case ValDef(_, _, _, Tree rhs):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isTerm(): show(tree);
- scopeInsertVVariable(symbol, false);
- locals.add(symbol);
- pushOwner(symbol);
- expression(rhs, symbol.type());
- popOwner();
- return true;
-
- default:
- return expression(tree, tree.type());
- }
- }
-
- //########################################################################
- // Private Methods - Checking expressions
-
- /** Checks the expression of given expected type. Returns true. */
- private boolean expression(Tree tree, Type expected) {
- // !!! conforms(tree, expected);
- expected = tree.type();
- switch (tree) {
-
- case LabelDef(_, Ident[] idents, Tree rhs):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isLabel(): show(tree);
- Symbol[] params = symbol.type().valueParams();
- assert params.length == idents.length: show(tree)
- + format("params", Debug.show(params));
- for (int i = 0; i < idents.length; i++) {
- location(idents[i]);
- conforms(idents[i], definitions.ANY_TYPE(), params[i].type());
- Symbol local = idents[i].symbol();
- assert local != null && !local.isModule(): show(idents[i]);
- }
- conforms(tree, symbol.resultType());
- scopeInsertLabel(symbol);
- expression(rhs, symbol.resultType());
- scopeRemoveLabel(symbol);
- return true;
-
- case Block(Tree[] statements, Tree value):
- Set locals = new HashSet();
- for (int i = 0; i < statements.length; i++)
- statement(locals, statements[i]);
- expression(value, expected);
- for (Iterator i = locals.iterator(); i.hasNext(); )
- scopeRemoveVVariable((Symbol)i.next());
- return true;
-
- case Assign(Tree lhs, Tree rhs):
- location(lhs);
- expression(rhs, lhs.type().widen());
- return true;
-
- case If(Tree cond, Tree thenp, Tree elsep):
- expression(cond, definitions.boolean_TYPE());
- expression(thenp, expected);
- expression(elsep, expected);
- return true;
-
- case Switch(Tree test, _, Tree[] bodies, Tree otherwise):
- expression(test, definitions.int_TYPE());
- for (int i = 0; i < bodies.length; i++)
- expression(bodies[i], expected);
- expression(otherwise, expected);
- return true;
-
- case Return(Tree value):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isMethod(): show(tree);
- assert currentMember() == symbol: show(tree);
- return expression(value, currentMember().resultType());
-
- case Throw(Tree value):
- return expression(value, definitions.THROWABLE_TYPE());
-
- case New(Tree init):
- switch (init) {
- case Apply(Select(Create(_, Tree[] targs), _), Tree[] vargs):
- return expression(init, definitions.void_TYPE());
- default:
- throw Debug.abort("illegal case", show(tree));
- }
-
- case Create(Tree qualifier, Tree[] targs):
- assert qualifier == Tree.Empty: show(tree);
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isClass(): show(tree);
- return true;
-
- case Apply(Tree vfun, Tree[] vargs):
- vapply(tree, vfun.type(), vargs);
- switch (vfun) {
- case TypeApply(Tree tfun, Tree[] targs):
- Symbol symbol = tfun.symbol();
- assert symbol != null && !symbol.isLabel(): show(tree);
- tapply(tree, tfun.type(), targs);
- return function(tfun);
- default:
- return function(vfun);
- }
-
- case Super(_, _):
- case This(_):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isClass(): show(tree);
- assert symbol == currentClass(): show(tree);
- return true;
-
- case Select(_, _):
- case Ident(_):
- return location(tree);
-
- case Literal(_):
- return true;
-
- default:
- throw Debug.abort("illegal case", show(tree));
- }
- }
-
- /** Checks the type application. Returns true. */
- private boolean tapply(Tree tree, Type function, Tree[] args) {
- Symbol[] params = function.typeParams();
- assert params.length == args.length: show(tree)
- + format("params", Debug.show(params));
- Type.Map subst = Type.getSubst(params, Tree.typeOf(args));
- for (int i = 0; i < args.length; i++) {
- Type expected = subst.apply(params[i].info());
- Type loBound = subst.apply(params[i].loBound());
- conforms(args[i], expected, loBound);
- }
- conforms(tree, subst.apply(function.resultType()));
- return true;
- }
-
- /** Checks the value application. Returns true. */
- private boolean vapply(Tree tree, Type function, Tree[] args) {
- Symbol[] params = function.valueParams();
- assert params.length == args.length: show(tree)
- + format("params", Debug.show(params));
- for (int i = 0; i < args.length; i++)
- expression(args[i], params[i].type());
- conforms(tree, function.resultType());
- return true;
- }
-
- //########################################################################
- // Private Methods - Checking functions
-
- /** Checks the function. Returns true. */
- private boolean function(Tree tree) {
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isTerm(): show(tree);
- assert symbol.isMethod(): show(tree);
- switch (tree) {
-
- case Select(Tree qualifier, _):
- if (qualifier instanceof Tree.Create)
- assert symbol.isInitializer(): show(tree);
- return selection(tree);
-
- case Ident(_):
- if (!symbol.isLabel() && symbol.isStatic()) return true;
- assert labels.contains(symbol): show(tree);
- assert symbol.owner() == currentMember(): show(tree);
- return true;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- /** Checks the location. Returns true. */
- private boolean location(Tree tree) {
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isTerm(): show(tree);
- assert !symbol.isMethod(): show(tree);
- switch (tree) {
-
- case Select(_, _):
- return selection(tree);
-
- case Ident(_):
- if (symbol.isStatic()) return true;
- assert vvars.contains(symbol): show(tree);
- assert symbol.owner() == currentMember(): show(tree);
- return true;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Checking selection
-
- /** Checks the selection. Returns true. */
- private boolean selection(Tree tree) {
- switch (tree) {
-
- case Select(Tree qualifier, _):
- Symbol symbol = tree.symbol();
- assert symbol != null && symbol.isTerm(): show(tree);
- Symbol owner = symbol.owner();
- assert owner.isClass() && !owner.isStaticOwner(): show(tree);
- assert qualifier.type().baseType(owner) != Type.NoType:
- show(tree) + format("qual.type", qualifier.type());
- return expression(qualifier, qualifier.type());
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- //########################################################################
- // Private Methods - Checking helpers
-
- /** Do the trees contain the given symbols? */
- private void containSymbols(Tree[] trees, Symbol[] symbols) {
- boolean ok = trees.length == symbols.length;
- for (int i = 0; ok && i < trees.length; i++)
- ok &= trees[i].symbol() == symbols[i];
- assert ok: show() + format("trees", trees) + format("symbols",symbols);
- }
-
- /** Does the type conform to the expected type and lower bound? */
- private void conforms(Tree tree, Type expected, Type loBound) {
- conforms(tree, expected);
- if (false && !loBound.isSubType(tree.type())) { // !!! false &&
- Type.explainSwitch = true;
- assert loBound.isSubType(tree.type()): show(tree)
- + format("loBound", expected);
- Type.explainSwitch = false;
- }
- }
-
- /** Does the type conform to the expected type? */
- private void conforms(Tree tree, Type expected) {
- if (!tree.type().isSubType(expected)) {
- Type.explainSwitch = true;
- assert tree.type().isSubType(expected): show(tree)
- + format("expected", expected);
- Type.explainSwitch = false;
- }
- }
-
- //########################################################################
- // Private Methods - Declaring symbols
-
- /** Remove parameters of symbol from current scope. */
- private void scopeInsertParametersOf(Symbol symbol) {
- Symbol[] tparams = symbol.typeParams();
- for (int i = 0; i < tparams.length; i++)
- scopeInsertTVariable(tparams[i], true);
- Symbol[] vparams = symbol.valueParams();
- for (int i = 0; i < vparams.length; i++)
- scopeInsertVVariable(vparams[i], true);
- }
-
- /** Adds the type variable to the current scope. */
- private void scopeInsertTVariable(Symbol symbol, boolean isParameter) {
- assert !symbol.owner().isClass(): show(symbol);
- assert symbol.isParameter() == isParameter: show(symbol);
- registerSymbol(symbol);
- tvars.add(symbol);
- }
-
- /** Adds the value variable to the current scope. */
- private void scopeInsertVVariable(Symbol symbol, boolean isParameter) {
- assert !symbol.owner().isClass(): show(symbol);
- assert symbol.isParameter() == isParameter: show(symbol);
- registerSymbol(symbol);
- vvars.add(symbol);
- }
-
- /** Adds the label to current scope. */
- private void scopeInsertLabel(Symbol symbol) {
- assert !symbol.owner().isClass(): show(symbol);
- registerSymbol(symbol);
- labels.add(symbol);
- }
-
- /** Remove parameters of symbol from current scope. */
- private void scopeRemoveParametersOf(Symbol symbol) {
- Symbol[] tparams = symbol.typeParams();
- for (int i = 0; i < tparams.length; i++)
- scopeRemoveTVariable(tparams[i]);
- Symbol[] vparams = symbol.valueParams();
- for (int i = 0; i < vparams.length; i++)
- scopeRemoveVVariable(vparams[i]);
- }
-
- /** Removes the type variable from current scope. */
- private void scopeRemoveTVariable(Symbol symbol) {
- boolean removed = tvars.remove(symbol);
- assert removed: show(symbol);
- }
-
- /** Removes the value variable from current scope. */
- private void scopeRemoveVVariable(Symbol symbol) {
- boolean removed = vvars.remove(symbol);
- assert removed: show(symbol);
- }
-
- /** Removes the label symbol from current scope. */
- private void scopeRemoveLabel(Symbol symbol) {
- boolean removed = labels.remove(symbol);
- assert removed: show(symbol);
- }
-
- /** Registers the symbol. */
- private void registerSymbol(Symbol symbol) {
- boolean added = symbols.add(symbol);
- assert added: show(symbol);
- }
-
- //########################################################################
- // Private Methods - Managing current context
-
- /** Returns the current unit. */
- private CompilationUnit currentUnit() {
- return units.size() > 0 ? (CompilationUnit)units.peek() : null;
- }
-
- /** Returns the current class. */
- private Symbol currentClass() {
- return classes.size() > 0 ? (Symbol)classes.peek() : null;
- }
-
- /** Returns the current member. */
- private Symbol currentMember() {
- return members.size() > 0 ? (Symbol)members.peek() : null;
- }
-
- /** Returns the current owner. */
- private Symbol currentOwner() {
- return owners.size() > 0 ? (Symbol)owners.peek() : null;
- }
-
- /** Sets the current unit to the given one. */
- private void pushUnit(CompilationUnit unit) {
- assert units.size() == 0: showPush(unit);
- assert classes.size() == 0: showPush(unit);
- assert members.size() == 0: showPush(unit);
- units.push(unit);
- }
-
- /** Sets the current class to the given one. */
- private void pushClass(Symbol clasz) {
- assert clasz.isClass(): showPush(clasz);
- assert members.size() == 0: showPush(clasz);
- classes.push(clasz);
- pushOwner(clasz);
- }
-
- /** Sets the current member to the given one. */
- private void pushMember(Symbol member) {
- assert member.isTerm(): showPush(member);
- assert members.size() == 0: showPush(member);
- assert member.owner() == currentClass(): showPush(member);
- members.push(member);
- pushOwner(member);
- }
-
- /** Sets the current owner to the given one. */
- private void pushOwner(Symbol owner) {
- owners.push(owner);
- }
-
- /** Sets the current unit to the previous one. */
- private void popUnit() {
- assert units.size() > 0: show();
- units.pop();
- }
-
- /** Sets the current class to the previous one. */
- private void popClass() {
- assert members.size() == 0: show();
- assert classes.size() > 0: show();
- popOwner();
- classes.pop();
- }
-
- /** Sets the current member to the previous one. */
- private void popMember() {
- assert members.size() > 0: show();
- popOwner();
- members.pop();
- }
-
- /** Sets the current owner to the previous one. */
- private void popOwner() {
- assert owners.size() > 0: show();
- owners.pop();
- }
-
- //########################################################################
- // Private Methods - Showing errors
-
- /** Returns the current position. */
- private String show() {
- return format("unit", currentUnit())
- + format("clasz", currentClass())
- + format("member", currentMember())
- + format("owner", currentOwner());
- }
-
- /** Returns the current position and given header and value. */
- private String show(String header, Object value) {
- return show() + format(header, value);
- }
-
- /** Returns the current position and given symbol. */
- private String show(Symbol symbol) {
- return show("symbol", symbol)
- + format("symbol.pos", Position.toString(symbol.pos))
- + format("symbol.info", symbol.info());
- }
-
- /** Returns the current position and given tree. */
- private String show(Tree tree) {
- return show("tree", tree)
- + format("tree.pos", Position.toString(tree.pos))
- + format("tree.symbol", tree.symbol())
- + format("tree.type", tree.type());
- }
-
- /** Returns the current position and given pushed value. */
- private String showPush(Object value) {
- return show("pushing", value);
- }
-
- /** Returns a string with the given header and value. */
- private String format(String header, Object value) {
- while (header.length() < 12) header = header + ' ';
- return "\n" + header + ": " + toString(value);
- }
-
- /** Returns a string representation of the given value. */
- private String toString(Object value) {
- if (value instanceof Symbol) return Debug.show(value);
- if (value instanceof Object[]) return Debug.show(value);
- return String.valueOf(value);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/framework/History.java b/sources/scalac/framework/History.java
deleted file mode 100644
index ce0800358d..0000000000
--- a/sources/scalac/framework/History.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.framework;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.util.Debug;
-
-/**
- * This class implements a value history. It stores phase dependent
- * values.
- *
- * Implementation: the value "values[n]" is valid from start of phase
- * "starts[n]" to end of phase "(n == 0 ? limit : starts[n-1].prev)"
- * and the promised value "next" is valid from start of phase
- * "limit.next".
- */
-public class History {
-
- //########################################################################
- // Private Constants
-
- /** An empty array of objects */
- private static final Object[] NO_VALUES = new Object[0];
-
- /** An empty array of phases */
- private static final Phase[] NO_STARTS = new Phase[0];
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
-
- /** The successive values of this history */
- private Object[] values;
-
- /** The start phases of the successive values */
- private Phase[] starts;
-
- /** The last known valid phase of the last value */
- private Phase limit;
-
- /** A promise of the next value (may be null) */
- private Promise next;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance with current phase as first one. */
- public History() {
- this(Global.instance);
- }
-
- /** Initializes this instance with current phase as first one. */
- public History(Global global) {
- this(global, global.currentPhase);
- }
-
- /** Initializes this instance with given first phase. */
- public History(Phase first) {
- this(first.global, first);
- }
-
- /** Initializes this instance with given first phase. */
- public History(Global global, Phase first) {
- this.global = global;
- reset(first);
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the first phase of this history. */
- public final Phase getFirstPhase() {
- return starts.length > 0 ? starts[starts.length - 1] : limit.next;
- }
-
- /** Returns the value at current phase. */
- public final Object getValue(Object owner) {
- return getValueAt(owner, getPhase());
- }
-
- /** Returns the value at next phase. */
- public final Object getNextValue(Object owner) {
- return getValueAt(owner, getNextPhase());
- }
-
- /** Returns the value at given phase. */
- public final Object getValueAt(Object owner, Phase phase) {
- assert phase != null: show(owner, phase);
- while (limit.id < phase.id) incrementLimit(owner);
- for (int i = 0; i < starts.length; i++)
- if (starts[i].id <= phase.id) return values[i];
- throw Debug.abort("prehistoric phase", show(owner, phase));
- }
-
- /** Sets the value at current phase. */
- public final History setValue(Object owner, Object value) {
- return setValueAt(owner, getPhase(), value);
- }
-
- /** Sets the value at next phase. */
- public final History setNextValue(Object owner, Object value) {
- return setValueAt(owner, getNextPhase(), value);
- }
-
- /** Sets the value at given phase. */
- public final History setValueAt(Object owner, Phase phase, Object value) {
- assert phase != null: show(owner, phase);
- assert phase == limit.next && next == null: show(owner, phase);
- if (values.length == 0 || values[0] != value) {
- this.values = append(value, values);
- this.starts = append(phase, starts);
- }
- this.limit = phase;
- return this;
- }
-
- /** Sets a value promise at current phase. */
- public final History setPromise(Object owner, Promise promise) {
- return setPromiseAt(owner, getPhase(), promise);
- }
-
- /** Sets a value promise at next phase. */
- public final History setNextPromise(Object owner, Promise promise) {
- return setPromiseAt(owner, getNextPhase(), promise);
- }
-
- /** Sets a value promise at given phase. */
- public final History setPromiseAt(Object owner, Phase phase,
- Promise promise)
- {
- assert phase != null: show(owner, phase);
- assert phase == limit.next && next == null: show(owner, phase);
- this.next = promise;
- return this;
- }
-
- /** Erases all values. */
- public final void reset() {
- reset(getFirstPhase());
- }
-
- /** Erases all values and sets first phase to given one. */
- public final void reset(Phase first) {
- assert first != null && first.prev != null: this + " - " + first;
- this.values = NO_VALUES;
- this.starts = NO_STARTS;
- this.limit = first.prev;
- this.next = null;
- }
-
- /** Returns a string representation of this history. */
- public String toString() {
- StringBuffer buffer = new StringBuffer("[");
- for (int i = 0; i < values.length; i++) {
- buffer.append(starts[i]).append(" -> ");
- buffer.append(Debug.show(values[i])).append(", ");
- }
- buffer.append(limit);
- if (next != null) buffer.append(" - ").append(next);
- return buffer.append("]").toString();
- }
-
- //########################################################################
- // Protected Methods
-
- /**
- * Computes the value at phase following given one by transforming
- * the given value (which is the value at given phase). The
- * default implementation changes the current phase to given one
- * and then forwards the call to method "transformValue".
- */
- protected Object transformValueAt(Object owner, Phase phase, Object value){
- Phase current = global.currentPhase;
- global.currentPhase = phase;
- Object result = transformValue(owner, value);
- global.currentPhase = current;
- return result;
- }
-
- /**
- * Computes the value at next phase by transforming the given
- * value (which is the value at current phase). The default
- * implementation forwards the call to method "computeValueAt".
- */
- protected Object transformValue(Object owner, Object value) {
- return computeValueAt(owner, global.currentPhase.next);
- }
-
- /**
- * Computes the value at given phase. The default implementation
- * changes the current phase to given one and then forwards the
- * call to method "computeValue".
- */
- protected Object computeValueAt(Object owner, Phase phase) {
- Phase current = global.currentPhase;
- global.currentPhase = phase;
- Object result = computeValue(owner);
- global.currentPhase = current;
- return result;
- }
-
- /**
- * Computes the value at current phase. The default implementation
- * throws an exception.
- */
- protected Object computeValue(Object owner) {
- throw Debug.abort("undefined value", show(owner, getPhase()));
- }
-
- //########################################################################
- // Private Methods
-
- /** Returns the current phase. */
- private Phase getPhase() {
- return global.currentPhase;
- }
-
- /** Returns the next phase. */
- private Phase getNextPhase() {
- return getPhase().next;
- }
-
- /** Increments the limit of this history. */
- private void incrementLimit(Object owner) {
- Phase phase = limit;
- Object value;
- if (next != null) {
- value = next.forceAt(owner, global, phase.next);
- if (limit == phase) next = null;
- } else if (values.length > 0) {
- value = transformValueAt(owner, phase, values[0]);
- } else {
- value = computeValueAt(owner, phase.next);
- }
- if (limit == phase) setValueAt(owner, phase.next, value);
- }
-
- /** Returns a string of this history and given owner. */
- private String show(Object owner) {
- return this + " @ " + Debug.show(owner);
- }
-
- /** Returns a string of this history and given owner and phase. */
- private String show(Object owner, Phase phase) {
- return show(owner) + " - " + phase;
- }
-
- //########################################################################
- // Private Functions
-
- /** Returns the concatenation of given values. */
- private static Object[] append(Object value, Object[] values) {
- Object[] array = new Object[1 + values.length];
- array[0] = value;
- for (int i = 1; i < array.length; i++) array[i] = values[i - 1];
- return array;
- }
-
- /** Returns the concatenation of given phases. */
- private static Phase[] append(Phase phase, Phase[] phases) {
- Phase[] array = new Phase[1 + phases.length];
- array[0] = phase;
- for (int i = 1; i < array.length; i++) array[i] = phases[i - 1];
- return array;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/framework/Promise.java b/sources/scalac/framework/Promise.java
deleted file mode 100644
index 7a1a521512..0000000000
--- a/sources/scalac/framework/Promise.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.framework;
-
-import scalac.Global;
-import scalac.Phase;
-
-/**
- * This abstract class represents a value promise (a lazy value). The
- * promised value is obtained by invoking the method "force" which
- * will detect any cyclic definition. Note that this class does not
- * store evaluated values. Therefore, successive calls to "force" will
- * trigger successive evaluations of the promise.
- */
-public abstract class Promise {
-
- //########################################################################
- // Private Fields
-
- /** The current number of evaluation cycles */
- private int cycles;
-
- //########################################################################
- // Public Methods
-
- /** Forces this promise and returns its value. */
- public final Object force(Object owner) {
- int cycles = this.cycles;
- this.cycles++;
- Object value = cycles > 0
- ? evaluate(owner)
- : getCyclicValue(owner, cycles);
- this.cycles--;
- return value;
- }
-
- /** Forces this promise at given phase and returns its value. */
- public final Object forceAt(Object owner, Global global, Phase phase) {
- Phase current = global.currentPhase;
- global.currentPhase = phase;
- Object value = force(owner);
- global.currentPhase = current;
- return value;
- }
-
- //########################################################################
- // Protected Methods
-
- /**
- * Evaluates this promise. This method is invoked by non-cyclic
- * calls to the method "force".
- */
- protected abstract Object evaluate(Object owner);
-
- /**
- * Returns the value to use in case of a cyclic definition. This
- * method is invoked by cyclic calls to the method "force". The
- * current (strictly positive) number of cycles is passed as an
- * argument.
- */
- protected abstract Object getCyclicValue(Object owner, int cycles);
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/AttributeInfo.java b/sources/scalac/symtab/AttributeInfo.java
deleted file mode 100644
index 00d7c22d5a..0000000000
--- a/sources/scalac/symtab/AttributeInfo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import scalac.atree.AConstant;
-import scalac.util.Debug;
-
-public class AttributeInfo {
-
- public final Symbol constr;
- public final AConstant[] args;
- public final AttributeInfo next;
-
- public AttributeInfo(Symbol constr, AConstant[] args, AttributeInfo next) {
- this.constr = constr;
- this.args = args;
- this.next = next;
- assert constr.isConstructor() : Debug.show(constr);
- }
-
- public AConstant[] getAttrArguments(Symbol sym) {
- for (AttributeInfo attr = this; attr != null; attr = attr.next)
- if (attr.constr == sym)
- return attr.args;
- return null;
- }
-
- public String toString() {
- StringBuffer str = new StringBuffer("[");
- for (AttributeInfo attr = this; attr != null; attr = attr.next) {
- str.append(Debug.show(attr.constr.constructorClass()));
- int n = attr.args.length;
- if (n > 0) {
- str.append('(');
- for (int i = 0; i < n; i++) {
- if (i > 0) str.append(", ");
- str.append(attr.args[i]);
- }
- str.append(')');
- }
- if (attr.next != null) {
- str.append(", ");
- }
- }
- str.append(']');
- return str.toString();
- }
-
-}
diff --git a/sources/scalac/symtab/ClosureHistory.java b/sources/scalac/symtab/ClosureHistory.java
deleted file mode 100644
index 0f5073cd89..0000000000
--- a/sources/scalac/symtab/ClosureHistory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.util.Iterator;
-import java.util.TreeMap;
-
-import scalac.Global;
-import scalac.framework.History;
-import scalac.util.Debug;
-import scalac.util.ArrayApply;
-
-/** This class implements a closure history. */
-public class ClosureHistory extends History {
-
- //########################################################################
- // Protected Methods
-
- /** Transforms given closure into closure at next phase. */
- protected Object transformValue(Object owner, Object value){
- Type[] closure = (Type[])value;
- for (int i = 0; i < closure.length; i++) {
- Symbol symbol = closure[i].symbol();
- // !!! symbol.nextInfoHasChanged() would be better
- if (symbol.info() != symbol.nextInfo())
- return super.transformValue(owner, closure);
- }
- return closure;
- }
-
- /** Computes the closure at current phase. */
- protected Object computeValue(Object owner) {
- Symbol clasz = (Symbol)owner;
- TreeMap parents = new TreeMap(SymbolComparator.instance);
- addParents(parents, clasz.info());
- Type[] closure = new Type[1 + parents.size()];
- Iterator types = parents.values().iterator();
- closure[0] = clasz.type();
- for (int i = 1; i < closure.length; i++)
- closure[i] = (Type)types.next();
- //System.out.println("closure(" + owner + ") = " + ArrayApply.toString(closure));//DEBUG
- return closure;
- }
-
- //########################################################################
- // Private Functions
-
- /** Adds all parents of given type to given parent table. */
- private static void addParents(TreeMap/*<Symbol,Type>*/ table, Type type) {
- switch (type) {
- case ErrorType: case NoType:
- return;
- case TypeRef(_, Symbol symbol, _):
- Type.Map map = Type.getThisTypeMap(symbol, type);
- Type[] closure = symbol.closure();
- for (int i = 0; i < closure.length; i++)
- table.put(closure[i].symbol(), map.apply(closure[i]));
- return;
- case CompoundType(Type[] parents, _):
- for (int i = 0; i < parents.length; i++)
- addParents(table, parents[i]);
- return;
- case SingleType(_, _):
- case ThisType(_):
- addParents(table, type.singleDeref());
- return;
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java
deleted file mode 100644
index d100e911c8..0000000000
--- a/sources/scalac/symtab/Definitions.java
+++ /dev/null
@@ -1,1194 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab;
-
-import scala.tools.util.Position;
-
-import scalac.Global;
-import scalac.atree.ATreeTyper;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-
-public class Definitions {
-
- //########################################################################
- // Public Fields - Root module
-
- /** The attributed tree typer */
- public final ATreeTyper atyper;
-
- //########################################################################
- // Public Fields & Methods - Root class and some standard packages
-
- /** The root class */
- public final Symbol ROOT_CLASS;
-
- /** The java.lang package */
- public final Symbol JAVALANG;
-
- /** The scala package */
- public final Symbol SCALA;
-
- //########################################################################
- // Public Fields & Methods - Top and bottom classes
-
- /** The scala.Any class */
- public final Symbol ANY_CLASS;
- public final Type ANY_TYPE() {return ANY_CLASS.staticType();}
-
- /** The scala.AnyVal class */
- public final Symbol ANYVAL_CLASS;
- public final Type ANYVAL_TYPE() {return ANYVAL_CLASS.staticType();}
-
- /** The scala.AnyRef class */
- public final Symbol ANYREF_CLASS;
- public final Type ANYREF_TYPE() {return ANYREF_CLASS.staticType();}
-
- /** The scala.AllRef class */
- public final Symbol ALLREF_CLASS;
- public final Type ALLREF_TYPE() {return ALLREF_CLASS.staticType();}
-
- /** The scala.All class */
- public final Symbol ALL_CLASS;
- public final Type ALL_TYPE() {return ALL_CLASS.staticType();}
-
- //########################################################################
- // Public Fields & Methods - Java classes
-
- /** The java.lang.Object class */
- public final Symbol OBJECT_CLASS;
- public final Type OBJECT_TYPE() {return OBJECT_CLASS.staticType();}
-
- /** The java.lang.String class */
- public final Symbol STRING_CLASS;
- public final Type STRING_TYPE() {return STRING_CLASS.staticType();}
-
- /** The java.lang.Throwable class */
- public final Symbol THROWABLE_CLASS;
- public final Type THROWABLE_TYPE() {return THROWABLE_CLASS.staticType();}
-
- //########################################################################
- // Public Fields & Methods - Scala value classes
-
- /** The scala.Unit class */
- public final Symbol UNIT_CLASS;
- public final Type UNIT_TYPE() {return UNIT_CLASS.staticType();}
-
- /** The scala.Boolean class */
- public final Symbol BOOLEAN_CLASS;
- public final Type BOOLEAN_TYPE() {return BOOLEAN_CLASS.staticType();}
-
- /** The scala.Byte class */
- public final Symbol BYTE_CLASS;
- public final Type BYTE_TYPE() {return BYTE_CLASS.staticType();}
-
- /** The scala.Short class */
- public final Symbol SHORT_CLASS;
- public final Type SHORT_TYPE() {return SHORT_CLASS.staticType();}
-
- /** The scala.Char class */
- public final Symbol CHAR_CLASS;
- public final Type CHAR_TYPE() {return CHAR_CLASS.staticType();}
-
- /** The scala.Int class */
- public final Symbol INT_CLASS;
- public final Type INT_TYPE() {return INT_CLASS.staticType();}
-
- /** The scala.Long class */
- public final Symbol LONG_CLASS;
- public final Type LONG_TYPE() {return LONG_CLASS.staticType();}
-
- /** The scala.Float class */
- public final Symbol FLOAT_CLASS;
- public final Type FLOAT_TYPE() {return FLOAT_CLASS.staticType();}
-
- /** The scala.Double class */
- public final Symbol DOUBLE_CLASS;
- public final Type DOUBLE_TYPE() {return DOUBLE_CLASS.staticType();}
-
-
- //########################################################################
- // Public Fields & Methods - Scala reference classes
-
- /** The scala.ScalaObject class */
- public final Symbol SCALAOBJECT_CLASS;
- public final Type SCALAOBJECT_TYPE() {return SCALAOBJECT_CLASS.staticType();}
-
- /** The scala.Attribute class */
- public final Symbol ATTRIBUTE_CLASS;
- public final Type ATTRIBUTE_TYPE() {return ATTRIBUTE_CLASS.staticType();}
-
- /** The scala.Ref class */
- public final Symbol REF_CLASS;
- public final Type REF_TYPE(Type element) {
- return REF_CLASS.staticType(element);
- }
-
- /** The scala.TupleX classes */
- public final int TUPLE_COUNT = 10;
- public final Symbol[] TUPLE_CLASS = new Symbol[TUPLE_COUNT];
- public final Type TUPLE_TYPE(Type[] args) {
- assert 0 < args.length && args.length < TUPLE_COUNT: args.length;
- return TUPLE_CLASS[args.length].staticType(args);
- }
-
- /** The scala.FunctionX classes */
- public final int FUNCTION_COUNT = 10;
- public final Symbol[] FUNCTION_CLASS = new Symbol[FUNCTION_COUNT];
- public final Type FUNCTION_TYPE(Type[] args, Type result) {
- assert 0 <= args.length;
- if (args.length >= FUNCTION_COUNT)
- throw new Type.Error("function has too many arguments; limit = " + (FUNCTION_COUNT-1));
- args = Type.cloneArray(args, 1);
- args[args.length - 1] = result;
- return FUNCTION_CLASS[args.length - 1].staticType(args);
- }
-
- /** The scala.PartialFunction class */
- public final Symbol PARTIALFUNCTION_CLASS;
- public final Type PARTIALFUNCTION_TYPE(Type argument, Type result) {
- return PARTIALFUNCTION_CLASS.staticType(argument, result);
- }
-
- /** The scala.Iterable class */
- public final Symbol ITERABLE_CLASS;
- public final Type ITERABLE_TYPE(Type element) {
- return ITERABLE_CLASS.staticType(element);
- }
-
- /** The scala.Iterator class */
- public final Symbol ITERATOR_CLASS;
- public final Type ITERATOR_TYPE(Type element) {
- return ITERATOR_CLASS.staticType(element);
- }
-
- /** The scala.Seq class */
- public final Symbol SEQ_CLASS;
- public final Type SEQ_TYPE(Type element) {
- return SEQ_CLASS.staticType(element);
- }
-
- /** The scala.List class */
- public final Symbol LIST_CLASS;
- public final Type LIST_TYPE(Type element) {
- return LIST_CLASS.staticType(element);
- }
-
- /** The scala.Nil module
- * evaluated on demand to make bootstrap possible.
- */
- public final Symbol NIL() {
- return getModule("scala.Nil");
- }
-
- /** The scala.:: class
- * evaluated on demand to make bootstrap possible.
- */
- public final Symbol CONS_CLASS() {
- return getClass("scala.$colon$colon");
- }
- public final Type CONS_TYPE(Type element) {
- return CONS_CLASS().staticType(element);
- }
-
- /** The scala.Array class */
- public final Symbol ARRAY_CLASS;
- public final Type ARRAY_TYPE(Type element) {
- return ARRAY_CLASS.staticType(element);
- }
-
- /** The scala.Type class & its subclasses */
- public final Symbol TYPE_CLASS;
- public final Type TYPE_TYPE() {
- return TYPE_CLASS.staticType();
- }
-
- public final Symbol CLASSTYPE_CLASS;
- public final Type CLASSTYPE_TYPE() {
- return CLASSTYPE_CLASS.staticType();
- }
-
- public final Symbol JAVACLASSTYPE_CLASS;
- public final Symbol JAVAREFARRAYTYPE_CLASS;
-
- public final Symbol SCALACLASSTYPE_CLASS;
- public final Type SCALACLASSTYPE_TYPE() {
- return SCALACLASSTYPE_CLASS.staticType();
- }
-
- public final Symbol SINGLETYPE_CLASS;
-
- public final Symbol TYPECONSTRUCTOR_CLASS;
- public final Type TYPECONSTRUCTOR_TYPE() {
- return TYPECONSTRUCTOR_CLASS.staticType();
- }
-
- public final Symbol COMPOUNDTYPE_CLASS;
-
- public final Symbol LAZYPARENTS_CLASS;
- public final Type LAZYPARENTS_TYPE() {
- return LAZYPARENTS_CLASS.staticType();
- }
-
- /** The scala.Predef module */
- public final Symbol PREDEF;
-
- /** The scala.Console module */
- public final Symbol CONSOLE;
-
- /** The scala.MatchError module */
- public final Symbol MATCHERROR;
-
- //########################################################################
- // attributes
-
- public final Symbol SCALA_SERIALIZABLE_CONSTR;
- public final Symbol SCALA_TRANSIENT_CONSTR;
- public final Symbol SCALA_VOLATILE_CONSTR;
- public final Symbol SCALA_CLONEABLE_CONSTR;
-
- //########################################################################
- // Public Fields & Methods - Scala primitive types
-
- /** Returns the primitive type void. */
- public final Type void_TYPE() {
- return void_TYPE.type().resultType();
- }
-
- /** Returns the primitive type boolean. */
- public final Type boolean_TYPE() {
- return boolean_TYPE.type().resultType();
- }
-
- /** Returns the primitive type byte. */
- public final Type byte_TYPE() {
- return byte_TYPE.type().resultType();
- }
-
- /** Returns the primitive type short. */
- public final Type short_TYPE() {
- return short_TYPE.type().resultType();
- }
-
- /** Returns the primitive type char. */
- public final Type char_TYPE() {
- return char_TYPE.type().resultType();
- }
-
- /** Returns the primitive type int. */
- public final Type int_TYPE() {
- return int_TYPE.type().resultType();
- }
-
- /** Returns the primitive type long. */
- public final Type long_TYPE() {
- return long_TYPE.type().resultType();
- }
-
- /** Returns the primitive type float. */
- public final Type float_TYPE() {
- return float_TYPE.type().resultType();
- }
-
- /** Returns the primitive type double. */
- public final Type double_TYPE() {
- return double_TYPE.type().resultType();
- }
-
- /** Returns the primitive array type of given element type. */
- public final Type array_TYPE(Type element) {
- Type type = array_TYPE.type().resultType();
- switch (type) {
- case TypeRef(Type prefix, Symbol clasz, _):
- return Type.typeRef(prefix, clasz, new Type[]{element});
- case UnboxedArrayType(_):
- return Type.UnboxedArrayType(element);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- //########################################################################
- // Public Fields & Methods - Top and bottom class methods
-
- /** Some scala.Any methods */
- public final Symbol ANY_EQEQ;
- public final Symbol ANY_BANGEQ;
- public final Symbol ANY_EQUALS;
- public final Symbol ANY_HASHCODE;
- public final Symbol ANY_TOSTRING;
- //public final Symbol ANY_PLUS;
- public final Symbol ANY_IS;
- public final Symbol ANY_IS_ERASED;
- public final Symbol ANY_AS;
- public final Symbol ANY_AS_ERASED;
- public final Symbol ANY_MATCH;
-
- //########################################################################
- // Public Fields & Methods - Java class methods
-
- /** Some java.lang.Object methods */
- public final Symbol OBJECT_EQ;
- public final Symbol OBJECT_NE;
- public final Symbol OBJECT_CLONE;
- public final Symbol OBJECT_SYNCHRONIZED;
-
- /** Some java.lang.String methods */
- public final Symbol STRING_PLUS;
-
- /** Some java.lang.Throwable methods */
- public final Symbol THROWABLE_THROW;
-
- //########################################################################
- // Public Fields & Methods - Scala value class methods
-
- /** Some scala.Boolean methods */
- private Symbol BOOLEAN_OR;
- private Symbol BOOLEAN_AND;
- private Symbol BOOLEAN_NOT;
-
- public Symbol BOOLEAN_OR() {
- if (BOOLEAN_OR == null)
- BOOLEAN_OR = loadTerm(BOOLEAN_CLASS, Names.BARBAR);
- return BOOLEAN_OR;
- }
- public Symbol BOOLEAN_AND() {
- if (BOOLEAN_AND == null)
- BOOLEAN_AND = loadTerm(BOOLEAN_CLASS, Names.AMPAMP);
- return BOOLEAN_AND;
- }
- public Symbol BOOLEAN_NOT() {
- if (BOOLEAN_NOT == null)
- BOOLEAN_NOT = loadTerm(BOOLEAN_CLASS, Names.BANG);
- return BOOLEAN_NOT;
- }
-
- //########################################################################
- // Public Fields & Methods - Scala reference class methods
-
- /** Some scala.ScalaObject methods */
- private Symbol SCALAOBJECT_TAG;
-
- public Symbol SCALAOBJECT_TAG() {
- if (SCALAOBJECT_TAG == null)
- SCALAOBJECT_TAG = loadTerm(SCALAOBJECT_CLASS, Names.tag);
- return SCALAOBJECT_TAG;
- }
-
- private Symbol SCALAOBJECT_GETTYPE;
-
- public Symbol SCALAOBJECT_GETTYPE() {
- if (SCALAOBJECT_GETTYPE == null)
- SCALAOBJECT_GETTYPE = loadTerm(SCALAOBJECT_CLASS, Names.getScalaType);
- return SCALAOBJECT_GETTYPE;
- }
-
- /** Some scala.Ref methods */
- private Symbol REF_ELEM;
-
- public Symbol REF_ELEM() {
- if (REF_ELEM == null)
- REF_ELEM = loadTerm(REF_CLASS, Names.elem);
- return REF_ELEM;
- }
-
- /** Some scala.TupleX methods */
- private final Symbol[][] TUPLE_FIELD = new Symbol[TUPLE_COUNT][];
-
- public Symbol TUPLE_FIELD(int arity, int index) {
- assert 0 < arity && arity < TUPLE_COUNT: arity;
- assert 0 < index && index <= arity: arity + " - " + index;
- if (TUPLE_FIELD[arity][index - 1] == null)
- TUPLE_FIELD[arity][index - 1] = loadTerm(TUPLE_CLASS[arity],Names.TUPLE_FIELD(index));
- return TUPLE_FIELD[arity][index - 1];
- }
-
- /** Some scala.FunctionX methods */
- private final Symbol[] FUNCTION_APPLY = new Symbol[FUNCTION_COUNT];
-
- public Symbol FUNCTION_APPLY(int arity) {
- assert 0 <= arity && arity < FUNCTION_COUNT: arity;
- if (FUNCTION_APPLY[arity] == null)
- FUNCTION_APPLY[arity] = loadTerm(FUNCTION_CLASS[arity],Names.apply);
- return FUNCTION_APPLY[arity];
- }
-
- /** Some scala.PartialFunction methods */
- private Symbol PARTIALFUNCTION_ISDEFINEDAT;
-
- public Symbol PARTIALFUNCTION_ISDEFINEDAT() {
- if (PARTIALFUNCTION_ISDEFINEDAT == null)
- PARTIALFUNCTION_ISDEFINEDAT = loadTerm(PARTIALFUNCTION_CLASS, Names.isDefinedAt);
- return PARTIALFUNCTION_ISDEFINEDAT;
- }
-
- /** Some scala.Iterable methods */
- private Symbol ITERABLE_ELEMENTS;
-
- public Symbol ITERABLE_ELEMENTS() {
- if (ITERABLE_ELEMENTS == null)
- ITERABLE_ELEMENTS = loadTerm(ITERABLE_CLASS, Names.elements);
- return ITERABLE_ELEMENTS;
- }
-
- /** Some scala.Iterator methods */
- private Symbol ITERATOR_NEXT;
- private Symbol ITERATOR_HASNEXT;
-
- public Symbol ITERATOR_NEXT() {
- if (ITERATOR_NEXT == null)
- ITERATOR_NEXT = loadTerm(ITERATOR_CLASS, Names.next);
- return ITERATOR_NEXT;
- }
- public Symbol ITERATOR_HASNEXT() {
- if (ITERATOR_HASNEXT == null)
- ITERATOR_HASNEXT = loadTerm(ITERATOR_CLASS, Names.hasNext);
- return ITERATOR_HASNEXT;
- }
-
- /** Some scala.Seq methods */
- private Symbol SEQ_LENGTH;
-
- public Symbol SEQ_LENGTH() {
- if (SEQ_LENGTH == null)
- SEQ_LENGTH = loadTerm(SEQ_CLASS, Names.length);
- return SEQ_LENGTH;
- }
-
- /** Some scala.List methods */
- private Symbol LIST_ISEMPTY;
- private Symbol LIST_HEAD;
- private Symbol LIST_TAIL;
-
- public Symbol LIST_ISEMPTY() {
- if (LIST_ISEMPTY == null)
- LIST_ISEMPTY = loadTerm(LIST_CLASS, Names.isEmpty);
- return LIST_ISEMPTY;
- }
- public Symbol LIST_HEAD() {
- if (LIST_HEAD == null)
- LIST_HEAD = loadTerm(LIST_CLASS, Names.head);
- return LIST_HEAD;
- }
- public Symbol LIST_TAIL() {
- if (LIST_TAIL == null)
- LIST_TAIL = loadTerm(LIST_CLASS, Names.tail);
- return LIST_TAIL;
- }
-
- /** The scala.Array class */
- private Symbol ARRAY_LENGTH;
- private Symbol ARRAY_GET;
- private Symbol ARRAY_SET;
-
- public Symbol ARRAY_LENGTH() {
- if (ARRAY_LENGTH == null)
- ARRAY_LENGTH = loadTerm(ARRAY_CLASS, Names.length);
- return ARRAY_LENGTH;
- }
-
- public Symbol ARRAY_GET() {
- if (ARRAY_GET == null)
- ARRAY_GET = loadTerm(ARRAY_CLASS, Names.apply, new Type[]{int_TYPE()});
- return ARRAY_GET;
- }
-
- public Symbol ARRAY_SET() {
- if (ARRAY_SET == null)
- ARRAY_SET = loadTerm(ARRAY_CLASS, Names.update);
- return ARRAY_SET;
- }
-
- /** Some scala.Predef methods */
- private Symbol PREDEF_ARRAY;
-
- public Symbol PREDEF_ARRAY() {
- if (PREDEF_ARRAY == null)
- PREDEF_ARRAY = PREDEF.lookup(Names.Array).firstAlternative();
- return PREDEF_ARRAY;
- }
-
- /** Some scala.Console methods */
- private Symbol CONSOLE_PRINT;
-
- public Symbol CONSOLE_PRINT() {
- if (CONSOLE_PRINT == null)
- CONSOLE_PRINT = loadTerm(CONSOLE, Names.print);
- return CONSOLE_PRINT;
- }
-
- /** Some scala.MatchError methods */
- private Symbol MATCHERROR_FAIL;
-
- public Symbol MATCHERROR_FAIL() {
- if (MATCHERROR_FAIL == null)
- MATCHERROR_FAIL = loadTerm(MATCHERROR, Names.fail);
- return MATCHERROR_FAIL;
- }
-
- private Symbol MATCHERROR_REPORT;
-
- public Symbol MATCHERROR_REPORT() {
- if (MATCHERROR_REPORT == null)
- MATCHERROR_REPORT = loadTerm(MATCHERROR, Names.report);
- return MATCHERROR_REPORT;
- }
-
- /** The scala.Type class (and subclasses) */
- private Symbol TYPE_DEFAULTVALUE;
- public Symbol TYPE_DEFAULTVALUE() {
- if (TYPE_DEFAULTVALUE == null)
- TYPE_DEFAULTVALUE = loadTerm(TYPE_CLASS, Names.defaultValue);
- return TYPE_DEFAULTVALUE;
- }
-
- private Symbol TYPE_NEWARRAY;
- public Symbol TYPE_NEWARRAY() {
- if (TYPE_NEWARRAY == null)
- TYPE_NEWARRAY = loadTerm(TYPE_CLASS, Names.newArray);
- return TYPE_NEWARRAY;
- }
-
- private Symbol TYPE_ISINSTANCE;
- public Symbol TYPE_ISINSTANCE() {
- if (TYPE_ISINSTANCE == null)
- TYPE_ISINSTANCE = loadTerm(TYPE_CLASS, Names.isInstance);
- assert TYPE_ISINSTANCE != Symbol.NONE;
- return TYPE_ISINSTANCE;
- }
-
- private Symbol TYPE_CAST;
- public Symbol TYPE_CAST() {
- if (TYPE_CAST == null)
- TYPE_CAST = loadTerm(TYPE_CLASS, Names.cast);
- return TYPE_CAST;
- }
-
- private Symbol RTT_DOUBLE;
- public Symbol RTT_DOUBLE() {
- if (RTT_DOUBLE == null)
- RTT_DOUBLE = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Double);
- return RTT_DOUBLE;
- }
-
- private Symbol RTT_FLOAT;
- public Symbol RTT_FLOAT() {
- if (RTT_FLOAT == null)
- RTT_FLOAT = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Float);
- return RTT_FLOAT;
- }
-
- private Symbol RTT_LONG;
- public Symbol RTT_LONG() {
- if (RTT_LONG == null)
- RTT_LONG = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Long);
- return RTT_LONG;
- }
-
- private Symbol RTT_INT;
- public Symbol RTT_INT() {
- if (RTT_INT == null)
- RTT_INT = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Int);
- return RTT_INT;
- }
-
- private Symbol RTT_SHORT;
- public Symbol RTT_SHORT() {
- if (RTT_SHORT == null)
- RTT_SHORT = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Short);
- return RTT_SHORT;
- }
-
- private Symbol RTT_CHAR;
- public Symbol RTT_CHAR() {
- if (RTT_CHAR == null)
- RTT_CHAR = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Char);
- return RTT_CHAR;
- }
-
- private Symbol RTT_BYTE;
- public Symbol RTT_BYTE() {
- if (RTT_BYTE == null)
- RTT_BYTE = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Byte);
- return RTT_BYTE;
- }
-
- private Symbol RTT_BOOLEAN;
- public Symbol RTT_BOOLEAN() {
- if (RTT_BOOLEAN == null)
- RTT_BOOLEAN = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Boolean);
- return RTT_BOOLEAN;
- }
-
- private Symbol RTT_UNIT;
- public Symbol RTT_UNIT() {
- if (RTT_UNIT == null)
- RTT_UNIT = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Unit);
- return RTT_UNIT;
- }
-
- private Symbol RTT_ANY;
- public Symbol RTT_ANY() {
- if (RTT_ANY == null)
- RTT_ANY = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.Any);
- return RTT_ANY;
- }
-
- private Symbol RTT_ANYVAL;
- public Symbol RTT_ANYVAL() {
- if (RTT_ANYVAL == null)
- RTT_ANYVAL = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.AnyVal);
- return RTT_ANYVAL;
- }
-
- private Symbol RTT_ALLREF;
- public Symbol RTT_ALLREF() {
- if (RTT_ALLREF == null)
- RTT_ALLREF = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.AllRef);
- return RTT_ALLREF;
- }
-
- private Symbol RTT_ALL;
- public Symbol RTT_ALL() {
- if (RTT_ALL == null)
- RTT_ALL = loadTerm(TYPE_CLASS.linkedModule().moduleClass(), Names.All);
- return RTT_ALL;
- }
-
- private Symbol TYPECONSTRUCTOR_GETINSTANTIATION;
- public Symbol TYPECONSTRUCTOR_GETINSTANTIATION() {
- if (TYPECONSTRUCTOR_GETINSTANTIATION == null) {
- TYPECONSTRUCTOR_GETINSTANTIATION =
- loadTerm(TYPECONSTRUCTOR_CLASS, Names.getInstantiation);
- }
- return TYPECONSTRUCTOR_GETINSTANTIATION;
- }
-
- private Symbol TYPECONSTRUCTOR_INSTANTIATE;
- public Symbol TYPECONSTRUCTOR_INSTANTIATE() {
- if (TYPECONSTRUCTOR_INSTANTIATE == null)
- TYPECONSTRUCTOR_INSTANTIATE =
- loadTerm(TYPECONSTRUCTOR_CLASS, Names.instantiate);
- return TYPECONSTRUCTOR_INSTANTIATE;
- }
-
- private Symbol TYPECONSTRUCTOR_FUNCTIONOUTER;
- public Symbol TYPECONSTRUCTOR_FUNCTIONOUTER() {
- if (TYPECONSTRUCTOR_FUNCTIONOUTER == null)
- TYPECONSTRUCTOR_FUNCTIONOUTER =
- loadTerm(TYPECONSTRUCTOR_CLASS.linkedModule().moduleClass(), Names.functionOuter);
- return TYPECONSTRUCTOR_FUNCTIONOUTER;
- }
-
- private Symbol CLASSTYPE_ISNONTRIVIALINSTANCE;
- public Symbol CLASSTYPE_ISNONTRIVIALINSTANCE() {
- if (CLASSTYPE_ISNONTRIVIALINSTANCE == null)
- CLASSTYPE_ISNONTRIVIALINSTANCE =
- loadTerm(CLASSTYPE_CLASS, Names.isNonTrivialInstance);
- return CLASSTYPE_ISNONTRIVIALINSTANCE;
- }
-
- private Symbol SCALACLASSTYPE_SETPARENTS;
- public Symbol SCALACLASSTYPE_SETPARENTS() {
- if (SCALACLASSTYPE_SETPARENTS == null)
- SCALACLASSTYPE_SETPARENTS =
- loadTerm(SCALACLASSTYPE_CLASS, Names.setParents);
- return SCALACLASSTYPE_SETPARENTS;
- }
-
- private Symbol SCALACLASSTYPE_EMPTYARRAY;
- public Symbol SCALACLASSTYPE_EMPTYARRAY() {
- if (SCALACLASSTYPE_EMPTYARRAY == null)
- SCALACLASSTYPE_EMPTYARRAY =
- loadTerm(SCALACLASSTYPE_CLASS.linkedModule().moduleClass(),
- Names.emptyArray);
- return SCALACLASSTYPE_EMPTYARRAY;
- }
-
- private Symbol JAVACLASSTYPE_JAVACLASSTYPE;
- public Symbol JAVACLASSTYPE_JAVACLASSTYPE() {
- if (JAVACLASSTYPE_JAVACLASSTYPE == null)
- JAVACLASSTYPE_JAVACLASSTYPE =
- loadTerm(JAVACLASSTYPE_CLASS.linkedModule().moduleClass(),
- Names.javaClassType);
- return JAVACLASSTYPE_JAVACLASSTYPE;
- }
-
- private Symbol JAVACLASSTYPE_JAVAARRAYTYPE;
- public Symbol JAVACLASSTYPE_JAVAARRAYTYPE() {
- if (JAVACLASSTYPE_JAVAARRAYTYPE == null)
- JAVACLASSTYPE_JAVAARRAYTYPE =
- loadTerm(JAVACLASSTYPE_CLASS.linkedModule().moduleClass(),
- Names.javaArrayType);
- return JAVACLASSTYPE_JAVAARRAYTYPE;
- }
-
- private Symbol JAVAREFARRAYTYPE_JAVAREFARRAYTYPE;
- public Symbol JAVAREFARRAYTYPE_JAVAREFARRAYTYPE() {
- if (JAVAREFARRAYTYPE_JAVAREFARRAYTYPE == null)
- JAVAREFARRAYTYPE_JAVAREFARRAYTYPE =
- loadTerm(JAVAREFARRAYTYPE_CLASS.linkedModule().moduleClass(),
- Names.javaRefArrayType);
- return JAVAREFARRAYTYPE_JAVAREFARRAYTYPE;
- }
-
- // MSIL delegate types
- public final Symbol DELEGATE_CLASS;
- public final Type DELEGATE_TYPE() {
- return DELEGATE_CLASS != null ? DELEGATE_CLASS.staticType() : null;
- }
-
- //########################################################################
- // Public Fields - Global values
-
- /** The universal pattern */
- public final Symbol PATTERN_WILDCARD;
-
- //########################################################################
- // Private Fields - Symbol
-
- private final Symbol void_TYPE;
- private final Symbol boolean_TYPE;
- private final Symbol byte_TYPE;
- private final Symbol short_TYPE;
- private final Symbol char_TYPE;
- private final Symbol int_TYPE;
- private final Symbol long_TYPE;
- private final Symbol float_TYPE;
- private final Symbol double_TYPE;
- private final Symbol array_TYPE;
-
- //########################################################################
- // Public Constructor
-
- /** Initializes this instance. */
- public Definitions(Global global) {
- // make definitions accessible earlier to other components
- global.definitions = this;
- // create attributed tree typer
- atyper = new ATreeTyper(global, this);
-
- final boolean forMSIL = global.target == Global.TARGET_MSIL;
-
- // the root class
- ROOT_CLASS = ClassSymbol.newRootClass(global);
-
- // the java, java.lang and scala packages
- JAVALANG = getModule(forMSIL ? "System" : "java.lang");
- SCALA = getModule("scala");
-
- // the top and bottom classes
- Symbol SCALA_CLASS = SCALA.moduleClass();
- ANY_CLASS = newClass(SCALA_CLASS, Names.Any, 0);
- ANYVAL_CLASS = getClass("scala.AnyVal");
- ANYREF_CLASS = newAlias(SCALA_CLASS, Names.AnyRef, 0);
- ALLREF_CLASS = newClass(SCALA_CLASS, Names.AllRef, Modifiers.ABSTRACT | Modifiers.FINAL);
- ALL_CLASS = newClass(SCALA_CLASS, Names.All, Modifiers.ABSTRACT | Modifiers.FINAL);
-
- // the java classes
- OBJECT_CLASS = getClass(forMSIL ? "System.Object" : "java.lang.Object");
- STRING_CLASS = getClass(forMSIL ? "System.String" : "java.lang.String");
- THROWABLE_CLASS =
- getClass(forMSIL ? "System.Exception" : "java.lang.Throwable");
- // .NET delegate class
- DELEGATE_CLASS = forMSIL ? getClass("System.MulticastDelegate") : null;
-
- // the scala value classes
- UNIT_CLASS = getClass("scala.Unit");
- BOOLEAN_CLASS = getClass("scala.Boolean");
- BYTE_CLASS = getClass("scala.Byte");
- SHORT_CLASS = getClass("scala.Short");
- CHAR_CLASS = getClass("scala.Char");
- INT_CLASS = getClass("scala.Int");
- LONG_CLASS = getClass("scala.Long");
- FLOAT_CLASS = getClass("scala.Float");
- DOUBLE_CLASS = getClass("scala.Double");
-
- // the scala reference classes
- SCALAOBJECT_CLASS = getClass("scala.ScalaObject");
- ATTRIBUTE_CLASS = getClass("scala.Attribute");
- REF_CLASS = getClass("scala.Ref");
- for (int i = 1; i < TUPLE_COUNT; i++) {
- TUPLE_CLASS[i] = getClass("scala.Tuple" + i);
- TUPLE_FIELD[i] = new Symbol[i];
- }
- for (int i = 0; i < FUNCTION_COUNT; i++)
- FUNCTION_CLASS[i] = getClass("scala.Function" + i);
- PARTIALFUNCTION_CLASS = getClass("scala.PartialFunction");
- ITERABLE_CLASS = getClass("scala.Iterable");
- ITERATOR_CLASS = getClass("scala.Iterator");
- SEQ_CLASS = getClass("scala.Seq");
- LIST_CLASS = getClass("scala.List");
- ARRAY_CLASS = getClass("scala.Array");
- TYPE_CLASS = getJVMClass("scala.Type");
-
- CLASSTYPE_CLASS = getJVMClass("scala.runtime.types.ClassType");
- JAVACLASSTYPE_CLASS = getJVMClass("scala.runtime.types.JavaClassType");
- JAVAREFARRAYTYPE_CLASS = getJVMClass("scala.runtime.types.JavaRefArrayType");
- SCALACLASSTYPE_CLASS = getJVMClass("scala.runtime.types.ScalaClassType");
- SINGLETYPE_CLASS = getJVMClass("scala.runtime.types.SingleType");
- TYPECONSTRUCTOR_CLASS = getJVMClass("scala.runtime.types.TypeConstructor");
- COMPOUNDTYPE_CLASS = getJVMClass("scala.runtime.types.CompoundType");
- LAZYPARENTS_CLASS = getJVMClass("scala.runtime.types.LazyParents");
-
- PREDEF = getModule("scala.Predef");
- CONSOLE = getModule("scala.Console");
- MATCHERROR = getModule("scala.MatchError");
-
- SCALA_SERIALIZABLE_CONSTR = getClass("scala.serializable")
- .primaryConstructor();
- SCALA_TRANSIENT_CONSTR = getClass("scala.transient")
- .primaryConstructor();
- SCALA_VOLATILE_CONSTR = getClass("scala.volatile")
- .primaryConstructor();
- SCALA_CLONEABLE_CONSTR = getClass("scala.cloneable")
- .primaryConstructor();
-
- // initialize generated classes and aliases
- initClass(ANY_CLASS, Type.EMPTY_ARRAY);
- initAlias(ANYREF_CLASS, OBJECT_TYPE());
- initClass(ALLREF_CLASS, new Type[]{ANYREF_TYPE()});
- initClass(ALL_CLASS, new Type[]{ANY_TYPE()});
-
- // create type symbols
- void_TYPE = newTypeMethod(Names.Unit ,UNIT_TYPE());
- boolean_TYPE = newTypeMethod(Names.Boolean,BOOLEAN_TYPE());
- byte_TYPE = newTypeMethod(Names.Byte ,BYTE_TYPE());
- short_TYPE = newTypeMethod(Names.Short ,SHORT_TYPE());
- char_TYPE = newTypeMethod(Names.Char ,CHAR_TYPE());
- int_TYPE = newTypeMethod(Names.Int ,INT_TYPE());
- long_TYPE = newTypeMethod(Names.Long ,LONG_TYPE());
- float_TYPE = newTypeMethod(Names.Float ,FLOAT_TYPE());
- double_TYPE = newTypeMethod(Names.Double ,DOUBLE_TYPE());
- array_TYPE = newTypeMethod(Names.Array ,ARRAY_TYPE(ANYREF_TYPE()));
-
- // add members to scala.Any
- ANY_EQEQ = newMethod(ANY_CLASS,Names.EQEQ ,Modifiers.FINAL);
- ANY_BANGEQ = newMethod(ANY_CLASS,Names.BANGEQ ,Modifiers.FINAL);
- ANY_EQUALS = newMethod(ANY_CLASS,Names.equals ,0);
- ANY_HASHCODE = newMethod(ANY_CLASS,Names.hashCode ,0);
- ANY_TOSTRING = newMethod(ANY_CLASS,Names.toString ,0);
- // ANY_PLUS = newMethod(ANY_CLASS,Names.PLUS ,Modifiers.FINAL);
- ANY_IS = newMethod(ANY_CLASS,Names.isInstanceOf,Modifiers.FINAL);
- ANY_IS_ERASED= newMethod(ANY_CLASS,Names.isInstanceOfE,Modifiers.FINAL);
- ANY_AS = newMethod(ANY_CLASS,Names.asInstanceOf,Modifiers.FINAL);
- ANY_AS_ERASED= newMethod(ANY_CLASS,Names.asInstanceOfE,Modifiers.FINAL);
- ANY_MATCH = newMethod(ANY_CLASS,Names._match ,Modifiers.FINAL);
-
- initMethod(ANY_EQEQ , new Type[]{ANY_TYPE()} , boolean_TYPE());
- initMethod(ANY_BANGEQ , new Type[]{ANY_TYPE()} , boolean_TYPE());
- initMethod(ANY_EQUALS , new Type[]{ANY_TYPE()} , boolean_TYPE());
- initMethod(ANY_HASHCODE, new Type[]{} , int_TYPE());
- initMethod(ANY_TOSTRING, new Type[]{} , STRING_TYPE());
- // initMethod(ANY_PLUS , new Type[]{STRING_TYPE()}, STRING_TYPE());
-
- Symbol[] ANY_IS_TPARAMS = {newTParam(ANY_IS, 0, ANY_TYPE())};
- ANY_IS.setInfo(Type.PolyType(ANY_IS_TPARAMS, boolean_TYPE()));
- Symbol[] ANY_IS_ERASED_TPARAMS =
- {newTParam(ANY_IS_ERASED, 0, ANY_TYPE())};
- ANY_IS_ERASED.setInfo(Type.PolyType(ANY_IS_ERASED_TPARAMS,
- boolean_TYPE()));
-
- Symbol[] ANY_AS_TPARAMS = {newTParam(ANY_AS, 0, ANY_TYPE())};
- ANY_AS.setInfo(Type.PolyType(ANY_AS_TPARAMS,ANY_AS_TPARAMS[0].type()));
- Symbol[] ANY_AS_ERASED_TPARAMS =
- {newTParam(ANY_AS_ERASED, 0, ANY_TYPE())};
- ANY_AS_ERASED.setInfo(Type.PolyType(ANY_AS_ERASED_TPARAMS,
- ANY_AS_ERASED_TPARAMS[0].type()));
-
- Symbol[] ANY_MATCH_TPARAMS = {
- newTParam(ANY_MATCH, 0, ANY_TYPE()),
- newTParam(ANY_MATCH, 1, ANY_TYPE())};
- Symbol[] ANY_MATCH_VPARAMS = {
- newVParam(ANY_MATCH, 0, FUNCTION_TYPE(
- new Type[]{ANY_MATCH_TPARAMS[0].type()},
- ANY_MATCH_TPARAMS[1].type()))};
- ANY_MATCH.setInfo(
- Type.PolyType(
- ANY_MATCH_TPARAMS,
- Type.MethodType(
- ANY_MATCH_VPARAMS,
- ANY_MATCH_TPARAMS[1].type())));
-
- // add members to java.lang.Object
- OBJECT_EQ =
- newMethod(OBJECT_CLASS, Names.eq, Modifiers.FINAL);
- OBJECT_NE =
- newMethod(OBJECT_CLASS, Names.ne, Modifiers.FINAL);
- OBJECT_SYNCHRONIZED =
- newMethod(OBJECT_CLASS, Names.synchronized_, Modifiers.FINAL);
-
- initMethod(OBJECT_EQ, new Type[]{ANYREF_TYPE()}, boolean_TYPE());
- initMethod(OBJECT_NE, new Type[]{ANYREF_TYPE()}, boolean_TYPE());
- Symbol OBJECT_SYNCHRONIZED_TPARAM =
- newTParam(OBJECT_SYNCHRONIZED,0,ANY_TYPE());
- Symbol OBJECT_SYNCHRONIZED_VPARAM =
- newVParam(OBJECT_SYNCHRONIZED,0,OBJECT_SYNCHRONIZED_TPARAM.type());
- OBJECT_SYNCHRONIZED.setInfo(
- Type.PolyType(
- new Symbol[] {OBJECT_SYNCHRONIZED_TPARAM},
- Type.MethodType(
- new Symbol[] {OBJECT_SYNCHRONIZED_VPARAM},
- OBJECT_SYNCHRONIZED_TPARAM.type())));
-
- if (forMSIL) {
- OBJECT_CLONE = newMethod(OBJECT_CLASS, Names.clone, Modifiers.PROTECTED);
- initMethod(OBJECT_CLONE, Type.EMPTY_ARRAY, ANYREF_TYPE());
-
- Symbol WAIT0 = newMethod(OBJECT_CLASS, Names.wait, Modifiers.FINAL);
- initMethod(WAIT0, Type.EMPTY_ARRAY, UNIT_TYPE());
-
- Symbol WAIT1 = newMethod(OBJECT_CLASS, Names.wait, Modifiers.FINAL);
- initMethod(WAIT1, new Type[]{LONG_TYPE()}, UNIT_TYPE());
-
- Symbol WAIT2 = newMethod(OBJECT_CLASS, Names.wait, Modifiers.FINAL);
- initMethod(WAIT2, new Type[]{LONG_TYPE(), INT_TYPE()}, UNIT_TYPE());
-
- Symbol NOTIFY =
- newMethod(OBJECT_CLASS, Names.notify, Modifiers.FINAL);
- initMethod(NOTIFY, Type.EMPTY_ARRAY, UNIT_TYPE());
-
- Symbol NOTIFY_ALL =
- newMethod(OBJECT_CLASS, Names.notifyAll, Modifiers.FINAL);
- initMethod(NOTIFY_ALL, Type.EMPTY_ARRAY, UNIT_TYPE());
- } else {
- OBJECT_CLONE = null;
- }
-
- // add members to java.lang.String
- STRING_PLUS = newMethod(STRING_CLASS, Names.PLUS, Modifiers.FINAL);
- initMethod(STRING_PLUS, new Type[]{ANY_TYPE()}, STRING_TYPE());
-
- if (forMSIL) {
- Symbol s = newMethod(STRING_CLASS, Name.fromString("length"), 0);
- initMethod(s, Type.EMPTY_ARRAY, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("compareTo"), 0);
- initMethod(s, new Type[] {STRING_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("charAt"), 0);
- initMethod(s, new Type[] {INT_TYPE()}, CHAR_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("concat"), 0);
- initMethod(s, new Type[] {STRING_TYPE()}, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("indexOf"), 0);
- initMethod(s, new Type[] {INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("indexOf"), 0);
- initMethod(s, new Type[] {INT_TYPE(), INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("indexOf"), 0);
- initMethod(s, new Type[] {STRING_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("indexOf"), 0);
- initMethod(s, new Type[] {STRING_TYPE(), INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("lastIndexOf"), 0);
- initMethod(s, new Type[] {INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("lastIndexOf"), 0);
- initMethod(s, new Type[] {INT_TYPE(), INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("lastIndexOf"), 0);
- initMethod(s, new Type[] {STRING_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("lastIndexOf"), 0);
- initMethod(s, new Type[] {STRING_TYPE(), INT_TYPE()}, INT_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("toLowerCase"), 0);
- initMethod(s, Type.EMPTY_ARRAY, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("toUpperCase"), 0);
- initMethod(s, Type.EMPTY_ARRAY, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("startsWith"), 0);
- initMethod(s, new Type[]{STRING_TYPE()}, BOOLEAN_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("endsWith"), 0);
- initMethod(s, new Type[]{STRING_TYPE()}, BOOLEAN_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("substring"), 0);
- initMethod(s, new Type[]{INT_TYPE()}, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("substring"), 0);
- initMethod(s, new Type[]{INT_TYPE(), INT_TYPE()}, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("intern"), 0);
- initMethod(s, Type.EMPTY_ARRAY, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("replace"), 0);
- initMethod(s, new Type[]{CHAR_TYPE(), CHAR_TYPE()}, STRING_TYPE());
-
- s = newMethod(STRING_CLASS, Name.fromString("toCharArray"), 0);
- initMethod(s, Type.EMPTY_ARRAY, array_TYPE(CHAR_TYPE()));
- }
-
- // add members to java.lang.Throwable
- THROWABLE_THROW =
- newMethod(THROWABLE_CLASS, Names.throw_, Modifiers.FINAL);
- THROWABLE_THROW.setInfo(Type.PolyType(Symbol.EMPTY_ARRAY, ALL_TYPE()));
-
- // create global values
- PATTERN_WILDCARD = Symbol.NONE.newTerm(
- Position.NOPOS, 0, Names.PATTERN_WILDCARD);
- PATTERN_WILDCARD.setInfo(ALL_TYPE());
-
- // initialize unboxed types in class Type
- Type.initializeUnboxedTypes(this);
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the symbol of the module with the given fullname. */
- public Symbol getModule(String fullname) {
- Scope scope = ROOT_CLASS.members();
- int i = 0;
- int j = fullname.indexOf('.', i);
- while (j >= 0) {
- Name name = Name.fromString(fullname.substring(i, j));
- scope = scope.lookup(name).members();
- i = j + 1;
- j = fullname.indexOf('.', i);
- }
- Name name = Name.fromString(fullname.substring(i, fullname.length()));
- Symbol sym = scope.lookup(name);
- if (!sym.isModule()) {
- switch (sym.type()) {
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int k = 0; k < alts.length; k++)
- if ((sym = alts[k]).isModule()) break;
- }
- }
- return sym;
- }
-
- /** Returns the symbol of the class with the given fullname. */
- public Symbol getClass(String fullname) {
- Scope scope = ROOT_CLASS.members();
- int i = 0;
- int j = fullname.indexOf('.', i);
- while (j >= 0) {
- Name name = Name.fromString(fullname.substring(i, j));
- scope = scope.lookup(name).members();
- i = j + 1;
- j = fullname.indexOf('.', i);
- }
- Name name = Name.fromString(fullname.substring(i, fullname.length()));
- Symbol sym = scope.lookup(name.toTypeName());
- assert sym.kind != Kinds.NONE : "no class '" + fullname + "'";
- return sym;
- }
-
- private Symbol getJVMClass(String fullname) {
- return Global.instance.target == Global.TARGET_MSIL ? null :
- getClass(fullname);
- }
-
- //########################################################################
- // Private Methods
-
- /** Creates a new class */
- private Symbol newClass(Symbol owner, Name name, int flags) {
- name = name.toTypeName();
- Symbol clasz = owner.newClass(Position.NOPOS, flags, name);
- owner.members().enter(clasz);
- return clasz;
- }
-
- /** Creates a new type alias */
- private Symbol newAlias(Symbol owner, Name name, int flags) {
- name = name.toTypeName();
- Symbol alias = owner.newTypeAlias(Position.NOPOS, flags, name);
- owner.members().enter(alias);
- return alias;
- }
-
- /** Creates a new method */
- private Symbol newMethod(Symbol owner, Name name, int flags) {
- assert owner.isClassType(): Debug.show(owner) + " -- " + name;
- Symbol term = owner.newMethod(Position.NOPOS, flags, name);
- owner.members().enterOrOverload(term);
- return term;
- }
-
- /** Creates a new type parameter */
- private Symbol newTParam(Symbol owner, int index, Type bound) {
- Name name = Name.fromString("T" + index).toTypeName();
- return owner.newTParam(Position.NOPOS, 0, name, bound);
- }
-
- /** Creates a new value parameter */
- private Symbol newVParam(Symbol owner, int index, Type type) {
- Name name = Name.fromString("v" + index);
- return owner.newVParam(Position.NOPOS, 0, name, type);
- }
-
- /** Creates a new type method */
- private Symbol newTypeMethod(Name name, Type type) {
- Symbol symbol = ANY_CLASS.newMethod(Position.NOPOS, 0, name);
- initMethod(symbol, Type.EMPTY_ARRAY, type);
- return symbol;
- }
-
- /** Initializes the given class */
- private void initClass(Symbol clasz, Type[] parents) {
- clasz.setInfo(Type.compoundType(parents, new Scope(), clasz));
- clasz.primaryConstructor().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, clasz.typeConstructor()));
- }
-
- /** Initializes the given type alias */
- private void initAlias(Symbol alias, Type aliased) {
- alias.setInfo(aliased);
- alias.primaryConstructor().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, aliased));
- }
-
- /** Initializes the given method */
- private void initMethod(Symbol method, Type[] vargs, Type result) {
- Symbol[] vparams = new Symbol[vargs.length];
- for (int i = 0; i < vargs.length; i++)
- vparams[i] = newVParam(method, i, vargs[i]);
- method.setInfo(Type.MethodType(vparams, result));
- }
-
- /** Returns the term member of given class with given name. */
- private Symbol loadTerm(Symbol clasz, Name name) {
- Symbol sym = clasz.lookup(name);
- assert sym.isTerm(): clasz+"."+name+" -> "+sym;
- assert !sym.isOverloaded(): clasz+"."+name+" -> "+sym;
- return sym;
- }
-
- /**
- * Returns the term member of given class with given name and
- * value argument types.
- */
- private Symbol loadTerm(Symbol clasz, Name name, Type[] vargs) {
- Symbol sym = clasz.lookup(name);
- assert sym.isTerm(): Debug.show(clasz, name, vargs, sym);
- Symbol[] alts = sym.alternativeSymbols();
- for (int i = 0; i < alts.length; i++) {
- switch (alts[i].type()) {
- case PolyType(_, MethodType(Symbol[] vparams, _)):
- if (Type.isSameAs(Symbol.type(vparams), vargs)) return alts[i];
- continue;
- case MethodType(Symbol[] vparams, _):
- if (Type.isSameAs(Symbol.type(vparams), vargs)) return alts[i];
- continue;
- }
- }
- throw Debug.abort(Debug.show(clasz, name, vargs, alts));
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/EntryTags.java b/sources/scalac/symtab/EntryTags.java
deleted file mode 100644
index ca6f0bd294..0000000000
--- a/sources/scalac/symtab/EntryTags.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id: EntryTags.java
-
-package scalac.symtab;
-
-public interface EntryTags {
-
-/***************************************************
- * Symbol table attribute format:
- * Symtab = nentries_Nat {Entry}
- * Entry = 1 TERMNAME len_Nat NameInfo
- * | 2 TYPENAME len_Nat NameInfo
- * | 3 NUMBER lenNat NumInfo
- * | 4 NONEsym len_Nat
- * | 5 TYPEsym len_Nat SymbolInfo lobound_Ref
- * | 6 ALIASsym len_Nat SymbolInfo constrsym_Ref
- * | 7 CLASSsym len_Nat SymbolInfo [modulesym_Ref]
- * thistype_Ref constrsym_Ref
- * | 8 VALsym len_Nat SymbolInfo [classsym_Ref]
- * | 9 EXTref len_Nat name_Ref [owner_Ref]
- * | 10 EXTMODCLASSref len_Nat name_Ref [owner_Ref]
- * | 11 NOtpe len_Nat
- * | 12 THIStpe len_Nat sym_Ref
- * | 13 SINGLEtpe len_Nat type_Ref sym_Ref
- * | 14 CONSTANTtpe len_Nat type_Ref constant_Ref
- * | 15 TYPEREFtpe len_Nat type_Ref sym_Ref {targ_Ref}
- * | 16 COMPOUNDtpe len_Nat
- * iscompoundsym_Byte [owner_Ref] classsym_Ref {tpe_Ref}
- * | 17 METHODtpe len_Nat tpe_Ref {tpe_Ref}
- * | 18 POLYTtpe len_Nat tpe_Ref {sym_Ref}
- * | 19 OVERLOADEDtpe len_Nat {sym_Ref} {tpe_Ref}
- * | 22 FLAGGEDtpe len_Nat flags_Nat tpe_Ref
- * | 24 LITERALunit len_Nat
- * | 25 LITERALboolean len_Nat value_Byte
- * | 26 LITERALbyte len_Nat value_Long
- * | 27 LITERALshort len_Nat value_Long
- * | 28 LITERALchar len_Nat value_Long
- * | 29 LITERALint len_Nat value_Long
- * | 30 LITERALlong len_Nat value_Long
- * | 31 LITERALfloat len_Nat value_Long
- * | 32 LITERALdouble len_Nat value_Long
- * | 33 LITERALstring len_Nat name_Ref
- * | 34 LITERALnull len_Nat
- * | 35 LITERALzero len_Nat
- * SymbolInfo = name_Ref owner_Ref flags_Nat info_Ref
- * NameInfo = <character sequence of length len_Nat in Utf8 format>
- * NumInfo = <len_Nat-byte signed number in big endian format>
- * Ref = Nat
- *
- * len is remaining length after `len'.
- */
-
- int TERMname = 1,
- TYPEname = 2,
- NONEsym = 4,
- TYPEsym = 5,
- ALIASsym = 6,
- CLASSsym = 7,
- VALsym = 8,
- EXTref = 9,
- EXTMODCLASSref = 10,
- NOtpe = 11,
- THIStpe = 12,
- SINGLEtpe = 13,
- CONSTANTtpe = 14,
- TYPEREFtpe = 15,
- COMPOUNDtpe = 16,
- METHODtpe = 17,
- POLYtpe = 18,
- OVERLOADEDtpe = 19,
- UNBOXEDtpe = 20,
- UNBOXEDARRAYtpe = 21,
- FLAGGEDtpe = 22,
- ERRORtpe = 23,
- LITERALunit = 24,
- LITERALboolean = 25,
- LITERALbyte = 26,
- LITERALshort = 27,
- LITERALchar = 28,
- LITERALint = 29,
- LITERALlong = 30,
- LITERALfloat = 31,
- LITERALdouble = 32,
- LITERALstring = 33,
- LITERALnull = 34,
- LITERALzero = 35,
- NOpre = 36;
-
- int firstSymTag = NONEsym, lastSymTag = VALsym;
- int firstTypeTag = NOtpe, lastTypeTag = FLAGGEDtpe;
-
-// flag encodings
-
- int REPEATEDflag = 4, DEFflag = 8;
-}
diff --git a/sources/scalac/symtab/Kinds.java b/sources/scalac/symtab/Kinds.java
deleted file mode 100644
index b99c8fa8d0..0000000000
--- a/sources/scalac/symtab/Kinds.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab;
-
-
-public interface Kinds {
-
- /** kind of non-existent symbol
- */
- int NONE = 1;
-
- /** definition kinds
- */
- int ALIAS = 2;
- int CLASS = 3;
- int TYPE = 4;
- int VAL = 5;
-}
diff --git a/sources/scalac/symtab/Modifiers.java b/sources/scalac/symtab/Modifiers.java
deleted file mode 100644
index ab222e723f..0000000000
--- a/sources/scalac/symtab/Modifiers.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab;
-
-public interface Modifiers {
-
- // modifiers
- int DEFERRED = 0x00000001; // was `abstract' for members
- int FINAL = 0x00000002;
- int PRIVATE = 0x00000004;
- int PROTECTED = 0x00000008;
-
- int SEALED = 0x00000010;
- int OVERRIDE = 0x00000020;
- int CASE = 0x00000040;
- int ABSTRACT = 0x00000080; // abstract class, or used in conjunction
- // with abstract override.
- // Note difference to DEFERRED!
-
- int DEF = 0x00000100; // a def parameter
- int REPEATED = 0x00000200; // a repeated parameter
- int SYNTHETIC = 0x00000400;
- int DEPRECATED = 0x00000800;
-
- int JAVA = 0x00001000; // symbol was defined by a Java class
- int MODUL = 0x00002000; // symbol is module or class implementing a module
- int MUTABLE = 0x00004000; // symbol is a mutable variable.
- int VIEWBOUND = 0x00004000; // type symbol has a <% bound.
- int PARAM = 0x00008000; // symbol is a (type) parameter to a method
-
- int INITIALIZED = 0x00010000; // symbol's definition is complete
- int LOCKED = 0x00020000; // temporary flag to catch cyclic dependencies
- int ACCESSED = 0x00040000; // symbol was accessed at least once
- int SELECTOR = 0x00080000; // symbol was used as selector in Select
-
- int PACKAGE = 0x00100000; // symbol is a java package.
- int STABLE = 0x00800000; // functions that are assumed to be stable
- // (typically, access methods for valdefs)
-
- int CAPTURED = 0x01000000; // variables is accessed from
- // nested function. Set by LambdaLift
- int INCONSTRUCTOR = 0x01000000; // transient flag for Analyzer
- int PARAMACCESSOR = 0x02000000; // for methods: is an access method for a val parameter
- // for parameters: is a val parameter
- int CLOSURELOCK = PARAMACCESSOR;
- // secondary meaning: a lock to test that closures of type
- // symbols are non-cyclic.
-
- int ACCESSOR = 0x04000000; // function is an access function for a
- // value or variable
- int BRIDGE = 0x08000000; // function is a bridge method.
- int LIFTED = BRIDGE; // transient flag for lambdalift
- int ALTERNATIVE = BRIDGE; // transient flag for pickle/unpickle
- int SNDTIME = BRIDGE; // debug
-
- int INTERFACE = 0x10000000; // symbol is a Java interface
- int TRAIT = 0x20000000; // symbol is a Trait
-
- int COVARIANT = 0x40000000; // symbol is a covariant type variable
- int CONTRAVARIANT = 0x80000000; // symbol is a contravariant type variable
-
- // masks
- int SOURCEFLAGS = 0x00000077 | DEF | REPEATED | MODUL | MUTABLE | PACKAGE | PARAM | TRAIT | COVARIANT | CONTRAVARIANT; // these modifiers can be set in source programs.
- int ACCESSFLAGS = PRIVATE | PROTECTED;
- int VARIANCES = COVARIANT | CONTRAVARIANT;
- int CONSTRFLAGS = CASE | JAVA;
- /** Module flags inherited by their module-class */
- int MODULE2CLASSFLAGS = ACCESSFLAGS | DEPRECATED | SYNTHETIC | JAVA | PACKAGE | CASE;
-
- public static class Helper {
-
- public static boolean isAbstract(int flags) {
- // todo: ABSTRACT and DEFERRED should be separated.
- return (flags & DEFERRED) != 0 ||
- (flags & (ABSTRACT | OVERRIDE)) == ABSTRACT;
- }
-
- public static boolean isFinal(int flags) {
- return (flags & FINAL) != 0;
- }
-
- public static boolean isPrivate(int flags) {
- return (flags & PRIVATE) != 0;
- }
-
- public static boolean isProtected(int flags) {
- return (flags & PROTECTED) != 0;
- }
-
- public static boolean isSealed(int flags) {
- return (flags & SEALED) != 0;
- }
-
- public static boolean isOverride(int flags) {
- return (flags & OVERRIDE) != 0;
- }
-
- public static boolean isCase(int flags) {
- return (flags & CASE) != 0;
- }
-
- public static boolean isCaseAccessor(int flags) {
- return (flags & PARAMACCESSOR) != 0;
- }
-
- public static boolean isInterface(int flags) {
- return (flags & INTERFACE) != 0;
- }
-
- public static boolean isDef(int flags) {
- return (flags & DEF) != 0;
- }
-
- public static boolean isModClass(int flags) {
- return (flags & MODUL) != 0;
- }
-
- public static boolean isJava(int flags) {
- return (flags & JAVA) != 0;
- }
-
- public static boolean isNoVal(int flags) {
- return (flags & PACKAGE) != 0;
- }
-
- public static String toString(int flags) {
- StringBuffer buffer = new StringBuffer();
- toString(buffer, flags);
- return buffer.toString();
- }
-
- public static void toString(StringBuffer buffer, int flags) {
- //buffer.append(flags).append(": ");//debug
- int marker = buffer.length();
- if (isPrivate(flags)) buffer.append("private ");
- if (isProtected(flags)) buffer.append("protected ");
- if (isAbstract(flags)) buffer.append("abstract ");
- if (isFinal(flags)) buffer.append("final ");
- if (isSealed(flags)) buffer.append("sealed ");
- if (isInterface(flags)) buffer.append("interface ");
- if (isCase(flags)) buffer.append("case ");
- if (isDef(flags)) buffer.append("def ");
- if (isOverride(flags)) buffer.append("override ");
- int length = buffer.length();
- buffer.setLength(length - (length == marker ? 0 : 1));
- }
- }
-}
diff --git a/sources/scalac/symtab/Scope.java b/sources/scalac/symtab/Scope.java
deleted file mode 100644
index 7206a9ca02..0000000000
--- a/sources/scalac/symtab/Scope.java
+++ /dev/null
@@ -1,332 +0,0 @@
- /* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab;
-
-import scalac.util.*;
-import scalac.ApplicationError;
-
-public class Scope {
-
- public abstract static class SymbolIterator {
- public abstract boolean hasNext();
- public abstract Symbol next();
- }
-
- public static class Entry {
-
- /** the absent entry
- */
- public static final Entry NONE = new Entry();
-
- /** the symbol of the entry (this is the symbol containing the name)
- */
- public Symbol sym;
-
- /** the next entry in the hash bucket
- */
- public Entry tail;
-
- /** the next entry in this scope
- */
- private Entry next;
-
- /** The owner of the entry;
- */
- public final Scope owner;
-
- public Entry(Symbol sym, Scope owner) {
- this.sym = sym;
- this.owner = owner;
- this.next = owner.elems;
- if (sym == null) throw new ApplicationError();
- owner.elems = this;
- }
-
- private Entry() {
- this.sym = Symbol.NONE;
- this.owner = null;
- }
-
- public Entry setSymbol(Symbol sym) {
- this.sym = sym;
- owner.elemsCache = null;
- return this;
- }
-
- public int hashCode() {
- return sym.name.index;
- }
-
- public String toString() {
- return sym.toString();
- }
- }
-
- /** all elements of this scope
- */
- private Entry elems;
-
- /** the hash table
- */
- private Entry[] hashtable;
-
- /** a cache for all elements, to be used by symbol iterator.
- */
- private Symbol[] elemsCache = null;
-
- public Symbol[] getElemsCache() {
- return elemsCache;
- }
-
- /** size and mask of hash tables
- * todo: make hashtables grow?
- */
- private final int HASHSIZE = 0x80;
- private final int HASHMASK = 0x7f;
-
- /** the threshold number of entries from which a hashtable is constructed.
- */
- private final int MIN_HASH = 6;
-
- /** construct a new name space
- */
- public Scope() {
- this.elems = Entry.NONE;
- }
-
- public Scope(Entry elems) {
- this.elems = elems;
- if (size() >= MIN_HASH) createHash();
- }
-
- public Scope(Scope base) {
- this.elems = base.elems;
- if (base.hashtable != null) {
- this.hashtable = new Entry[HASHSIZE];
- for (int i = 0; i < HASHSIZE; i++)
- hashtable[i] = base.hashtable[i];
- }
- }
-
- public Scope(Symbol[] members) {
- this();
- for (int i = 0; i < members.length; i++)
- enter(members[i]);
- }
-
- /** Returns a new scope with the same content as this one. */
- public Scope cloneScope() {
- int size = 0;
- Scope clone = new Scope();
- for (Entry e = elems; e != Entry.NONE; e = e.next, size++)
- new Entry(e.sym, clone);
- if (size >= MIN_HASH) clone.createHash();
- return clone;
- }
-
- /** is the scope empty?
- */
- public boolean isEmpty() {
- return elems == Entry.NONE;
- }
-
- /** the number of entries in this scope
- */
- int size() {
- int s = 0;
- for (Entry e = elems; e != Entry.NONE; e = e.next) s++;
- return s;
- }
-
- public Scope enter(Entry e) {
- assert this != Scope.EMPTY: Debug.show(e.sym);
- elems = e;
- elemsCache = null;
- if (hashtable != null) {
- int i = e.sym.name.index & HASHMASK;
- elems.tail = hashtable[i];
- hashtable[i] = elems;
- } else if (size() >= MIN_HASH) {
- createHash();
- }
- return this;
- }
-
- /** enter a symbol
- */
- public Scope enter(Symbol sym) {
- // assert !sym.isConstructor();
- return enter(new Entry(sym, this));
- }
-
- public final Scope enterNoHide(Symbol sym) {
- assert lookupEntry(sym.name) == Entry.NONE:
- sym + " hides " + lookup(sym.name);
- return enter(sym);
- }
-
- public Scope enterOrOverload(Symbol sym) {
- Entry e = lookupEntry(sym.name);
- if (e.owner == this/* && (sym.flags & Modifiers.PRIVATE) == 0*/) {
- e.setSymbol(e.sym.overloadWith(sym));
- return this;
- } else {
- return enter(sym);
- }
- }
-
- private void createHash() {
- hashtable = new Entry[HASHSIZE];
- for (int i = 0; i < HASHSIZE; i++)
- hashtable[i] = Entry.NONE;
- enterInHash(elems);
- }
-
- private void enterInHash(Entry e) {
- if (e != Entry.NONE) {
- enterInHash(e.next);
- int i = e.sym.name.index & HASHMASK;
- e.tail = hashtable[i];
- hashtable[i] = e;
- }
- }
-
- /** remove entry
- */
- public void unlink(Entry e) {
- if (elems == e) {
- elems = e.next;
- } else {
- Entry e1 = elems;
- while (e1.next != e) e1 = e1.next;
- e1.next = e.next;
- }
- if (hashtable != null) {
- Entry e1 = hashtable[e.sym.name.index & HASHMASK];
- if (e1 == e) {
- hashtable[e.sym.name.index & HASHMASK] = e.tail;
- } else {
- while (e1.tail != e) e1 = e1.tail;
- e1.tail = e.tail;
- }
- }
- elemsCache = null;
- }
-
- public boolean contains(Symbol sym) {
- Entry e = lookupEntry(sym.name);
- if (e.sym == sym) return true;
- switch (e.sym.type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++)
- if (alts[i] == sym) return true;
- }
- return false;
- }
-
- /** lookup a symbol
- */
- public Symbol lookup(Name name) {
- return lookupEntry(name).sym;
- }
-
- /** lookup a symbol entry.
- */
- public Entry lookupEntry(Name name) {
- Entry e;
- if (hashtable != null) {
- e = hashtable[name.index & HASHMASK];
- while (e != Entry.NONE && e.sym.name != name) e = e.tail;
- } else {
- e = elems;
- while (e != Entry.NONE && e.sym.name != name) e = e.next;
- }
- return e;
- }
-
- /** return all symbols as an array,
- * in the order they were entered in this scope.
- */
- public Symbol[] elements() {
- if (elemsCache == null) {
- int s = size();
- elemsCache = new Symbol[s];
- for (Entry e = elems; e != Entry.NONE; e = e.next)
- elemsCache[--s] = e.sym;
- }
- return elemsCache;
- }
-
- class MySymbolIterator extends SymbolIterator {
- private Symbol[] alternatives = Symbol.EMPTY_ARRAY;
- private int altindex = 0;
- private int elemindex = 0;
-
- public MySymbolIterator() {
- elements();
- }
-
- public boolean hasNext() {
- return altindex < alternatives.length ||
- elemindex < elemsCache.length;
- }
-
- public Symbol next() {
- if (altindex < alternatives.length)
- return alternatives[altindex++];
- else {
- Symbol sym = elemsCache[elemindex++];
- switch (sym.type()) {
- case OverloadedType(Symbol[] alts, _):
- alternatives = alts;
- altindex = 0;
- return next();
- default:
- return sym;
- }
- }
- }
- }
-
- /** return all symbols as an iterator,
- * in the order they were entered in this scope.
- */
- public SymbolIterator iterator() {
- return new MySymbolIterator();
- }
-
-
- public String toString() {
- return new SymbolTablePrinter().printScope(this).toString();
- }
-
- public static Scope EMPTY = new Scope();
-}
-
-public class ErrorScope extends Scope {
-
- private final Symbol owner;
-
- public ErrorScope(Symbol owner) {
- this.owner = owner;
- }
-
- public Entry lookupEntry(Name name) {
- Entry entry = super.lookupEntry(name);
- if (entry.sym.isNone()) {
- Symbol symbol = name.isTermName()
- ? owner.newErrorValue(name)
- : owner.newErrorClass(name);
- enter(symbol);
- entry = super.lookupEntry(name);
- }
- return entry;
- }
-
-}
diff --git a/sources/scalac/symtab/SourceCompleter.java b/sources/scalac/symtab/SourceCompleter.java
deleted file mode 100644
index 73596724bd..0000000000
--- a/sources/scalac/symtab/SourceCompleter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.io.IOException;
-
-import scala.tools.util.AbstractFile;
-
-import scalac.Global;
-import scalac.symtab.Symbol;
-
-/** This class implements a SymbolLoader that reads a source file. */
-public class SourceCompleter extends SymbolLoader {
-
- //########################################################################
- // Private Fields
-
- /** The source file to read */
- private final AbstractFile file;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance with the specified source file. */
- public SourceCompleter(Global global, AbstractFile file) {
- super(global);
- this.file = file;
- }
-
- //########################################################################
- // Protected Methods
-
- /** Completes the specified symbol by reading the source file. */
- protected String doComplete(Symbol root) throws IOException {
- global.compileLate(global.getSourceFile(file), false);
- return "source file '" + file + "'";
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymSet.java b/sources/scalac/symtab/SymSet.java
deleted file mode 100644
index 0f91985386..0000000000
--- a/sources/scalac/symtab/SymSet.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-/** Sets of symbols, implemented as binary trees.
- */
-public class SymSet {
- private SymSet l, r;
- private Symbol sym;
-
- public SymSet() {}
-
- private SymSet(Symbol sym, SymSet l, SymSet r) {
- this.sym = sym; this.l = l; this.r = r;
- }
-
- /** Union of this set and `{sym}'.
- */
- public SymSet incl(Symbol sym) {
- if (this == EMPTY) {
- return new SymSet(sym, EMPTY, EMPTY);
- } else if (sym == this.sym) {
- return this;
- } else if (less(sym, this.sym)) {
- return new SymSet(this.sym, l.incl(sym), r);
- } else {
- assert less(this.sym, sym);
- return new SymSet(this.sym, l, r.incl(sym));
- }
- }
-
- /** Remove the element <code>sym</code> from the symbol set
- */
- public SymSet excl(Symbol sym) {
- if (sym == this.sym) {
- if (l == EMPTY) return r;
- if (r == EMPTY) return l;
- SymSet m = r;
- if (m.l != EMPTY) {
- SymSet p;
- do {
- p = m;
- m = m.l;
- } while (m.l != EMPTY);
- p.l = m.r;
- m.r = r;
- }
- m.l = l;
- return m;
- } else if (less(sym, this.sym)) {
- return new SymSet(this.sym, l.excl(sym), r);
- } else {
- assert less(this.sym, sym);
- return new SymSet(this.sym, l, r.excl(sym));
- }
- }
-
- /** Is `sym' an element of this set?
- */
- public boolean contains(Symbol sym) {
- if (this == EMPTY) {
- return false;
- } else if (sym == this.sym) {
- return true;
- } else if (less(sym, this.sym)) {
- return l.contains(sym);
- } else {
- assert less(this.sym, sym);
- return r.contains(sym);
- }
- }
-
- /** The number of elements in ths set.
- */
- public int size() {
- if (this == EMPTY) {
- return 0;
- } else {
- return 1 + l.size() + r.size();
- }
- }
-
- /** Copy elements of this set into `ss', starting at index `from'.
- * Return index one past last element copied.
- */
- public int copyToArray(Symbol[] ss, int from) {
- if (this == EMPTY) {
- return from;
- } else {
- from = l.copyToArray(ss, from);
- ss[from] = sym;
- return r.copyToArray(ss, from + 1);
- }
- }
-
- /** Return all elements of this set as an array.
- */
- public Symbol[] toArray() {
- int s = size();
- if (s == 0) return Symbol.EMPTY_ARRAY;
- Symbol[] ss = new Symbol[s];
- copyToArray(ss, 0);
- return ss;
- }
-
- /** The empty set.
- */
- public final static SymSet EMPTY = new SymSet();
-
- private boolean less(Symbol s1, Symbol s2) {
- return s1.isLess(s2);
- }
-}
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
deleted file mode 100644
index ad3710ff82..0000000000
--- a/sources/scalac/symtab/Symbol.java
+++ /dev/null
@@ -1,2573 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-//todo check significance of JAVA flag.
-
-package scalac.symtab;
-
-import scala.tools.util.AbstractFile;
-import scala.tools.util.Position;
-
-import scalac.ApplicationError;
-import scalac.CompilationUnit;
-import scalac.Global;
-import scalac.Phase;
-import scalac.framework.History;
-import scalac.util.ArrayApply;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.NameTransformer;
-
-
-public abstract class Symbol implements Modifiers, Kinds {
-
- /** An empty symbol array */
- public static final Symbol[] EMPTY_ARRAY = new Symbol[0];
-
- /** An empty array of symbol arrays */
- public static final Symbol[][] EMPTY_ARRAY_ARRAY = new Symbol[0][];
-
- /** The absent symbol */
- public static final Symbol NONE = new NoSymbol();
-
-// Attribues -------------------------------------------------------------
-
- public static final int IS_ROOT = 0x00000001;
- public static final int IS_ANONYMOUS = 0x00000002;
- public static final int IS_LABEL = 0x00000010;
- public static final int IS_CONSTRUCTOR = 0x00000020;
- public static final int IS_ACCESSMETHOD = 0x00000100;
- public static final int IS_STATIC = 0x00000200;
- public static final int IS_ERROR = 0x10000000;
- public static final int IS_THISTYPE = 0x20000000;
- public static final int IS_LOCALDUMMY = 0x40000000;
- public static final int IS_COMPOUND = 0x80000000;
-
-// Fields -------------------------------------------------------------
-
- /** The unique identifier generator */
- private static int ids;
-
- /** The kind of the symbol */
- public int kind;
-
- /** The position of the symbol */
- public int pos;
-
- /** The name of the symbol */
- public Name name;
-
- /** The modifiers of the symbol */
- public int flags;
-
- /** The owner of the symbol */
- private Symbol owner;
-
- /** The infos of the symbol */
- private TypeIntervalList infos;
-
- /** The attributes of the symbol */
- private final int attrs;
-
- /** The unique identifier */
- public final int id;
-
-
-// Constructors -----------------------------------------------------------
-
- /** Generic symbol constructor */
- public Symbol(int kind, Symbol owner, int pos, int flags, Name name, int attrs) {
- this.kind = kind;
- this.pos = pos;
- this.name = name;
- this.owner = owner == null ? this : owner;
- this.flags = flags & ~(INITIALIZED | LOCKED); // safety first
- this.attrs = attrs;
- this.id = ids++;
- }
-
-// Factories --------------------------------------------------------------
-
- /** Creates a new term owned by this symbol. */
- public final Symbol newTerm(int pos, int flags, Name name) {
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new constructor of this symbol. */
- public final Symbol newConstructor(int pos, int flags) {
- assert isType(): Debug.show(this);
- return new ConstructorSymbol(this, pos, flags);
- }
-
- /** Creates a new method owned by this symbol. */
- public final Symbol newMethod(int pos, int flags, Name name) {
- assert isClass(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new static method owned by this symbol. */
- public final Symbol newStaticMethod(int pos, int flags, Name name) {
- assert isClass(): Debug.show(this);
- return newTerm(pos, flags, name, IS_STATIC);
- }
-
- /** Creates a new access method owned by this symbol. */
- public final Symbol newAccessMethod(int pos, Name name) {
- assert isClass(): Debug.show(this);
- int flags = PRIVATE | FINAL | SYNTHETIC;
- return newTerm(pos, flags, name, IS_ACCESSMETHOD);
- }
-
- /** Creates a new function owned by this symbol. */
- public final Symbol newFunction(int pos, int flags, Name name) {
- assert isTerm(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new method or function owned by this symbol. */
- public final Symbol newMethodOrFunction(int pos, int flags, Name name){
- assert isClass() || isTerm(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new label owned by this symbol. */
- public final Symbol newLabel(int pos, Name name) {
- assert isTerm(): Debug.show(this);
- return newTerm(pos, 0, name, IS_LABEL);
- }
-
- /** Creates a new field owned by this symbol. */
- public final Symbol newField(int pos, int flags, Name name) {
- assert isClass(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new static field owned by this symbol. */
- public final Symbol newStaticField(int pos, int flags, Name name) {
- assert isClass(): Debug.show(this);
- return newTerm(pos, flags, name, IS_STATIC);
- }
-
- /** Creates a new variable owned by this symbol. */
- public final Symbol newVariable(int pos, int flags, Name name) {
- assert isTerm(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new variable owned by this symbol. */
- public final Symbol newFieldOrVariable(int pos, int flags, Name name) {
- assert isClass() || isTerm(): Debug.show(this);
- return newTerm(pos, flags, name, 0);
- }
-
- /** Creates a new pattern variable owned by this symbol. */
- public final Symbol newPatternVariable(int pos, Name name) {
- return newVariable(pos, 0, name);
- }
-
- /** Creates a new value parameter owned by this symbol. */
- public final Symbol newVParam(int pos, int flags, Name name) {
- assert isTerm(): Debug.show(this);
- return newTerm(pos, flags | PARAM, name);
- }
-
- /**
- * Creates a new value parameter owned by this symbol and
- * initializes it with the type.
- */
- public final Symbol newVParam(int pos, int flags, Name name, Type type) {
- Symbol tparam = newVParam(pos, flags, name);
- tparam.setInfo(type);
- return tparam;
- }
-
- /**
- * Creates a new initialized dummy symbol for template of this
- * class.
- */
- public final Symbol newLocalDummy() {
- assert isClass(): Debug.show(this);
- Symbol local = newTerm(pos, 0, Names.LOCAL(this), IS_LOCALDUMMY);
- local.setInfo(Type.NoType);
- return local;
- }
-
- /** Creates a new module owned by this symbol. */
- public final Symbol newModule(int pos, int flags, Name name) {
- return new ModuleSymbol(this, pos, flags, name);
- }
-
- /**
- * Creates a new package owned by this symbol and initializes it
- * with an empty scope.
- */
- public final Symbol newPackage(int pos, Name name) {
- return newPackage(pos, name, null);
- }
-
- /**
- * Creates a new package owned by this symbol, initializes it with
- * the loader and enters it in the scope if it's non-null.
- */
- public final Symbol newLoadedPackage(Name name, SymbolLoader loader,
- Scope scope, SymbolOrigin origin)
- {
- assert loader != null: Debug.show(this) + " - " + name;
- Symbol peckage = newPackage(Position.NOPOS, name, loader);
- peckage.moduleClass().setOrigin(origin);
- if (scope != null) scope.enterNoHide(peckage);
- return peckage;
- }
-
- /**
- * Creates a new error value owned by this symbol and initializes
- * it with an error type.
- */
- public Symbol newErrorValue(Name name) {
- Symbol symbol = newTerm(pos, SYNTHETIC, name, IS_ERROR);
- symbol.setInfo(Type.ErrorType);
- return symbol;
- }
-
- /** Creates a new type alias owned by this symbol. */
- public final Symbol newTypeAlias(int pos, int flags, Name name) {
- return new AliasTypeSymbol(this, pos, flags, name, 0);
- }
-
- /** Creates a new abstract type owned by this symbol. */
- public final Symbol newAbstractType(int pos, int flags, Name name) {
- return new AbsTypeSymbol(this, pos, flags, name, 0);
- }
-
- /** Creates a new type parameter owned by this symbol. */
- public final Symbol newTParam(int pos, int flags, Name name) {
- assert isTerm(): Debug.show(this);
- return newAbstractType(pos, flags | PARAM, name);
- }
-
- /**
- * Creates a new type parameter owned by this symbol and
- * initializes it with the type.
- */
- public final Symbol newTParam(int pos, int flags, Name name, Type type) {
- Symbol tparam = newTParam(pos, flags, name);
- tparam.setInfo(type);
- return tparam;
- }
-
- /**
- * Creates a new type alias owned by this symbol and initializes
- * it with the info.
- */
- public final Symbol newTypeAlias(int pos, int flags, Name name, Type info){
- Symbol alias = newTypeAlias(pos, flags, name);
- alias.setInfo(info);
- alias.allConstructors().setInfo(Type.MethodType(EMPTY_ARRAY, info));
- return alias;
- }
-
- /** Creates a new class owned by this symbol. */
- public final ClassSymbol newClass(int pos, int flags, Name name) {
- return newClass(pos, flags, name, 0);
- }
-
- /** Creates a new anonymous class owned by this symbol. */
- public final ClassSymbol newAnonymousClass(int pos, Name name) {
- assert isTerm(): Debug.show(this);
- return newClass(pos, 0, name, IS_ANONYMOUS);
- }
-
- /**
- * Creates a new class with a linked module, both owned by this
- * symbol, initializes them with the loader and enters the class
- * and the module in the scope if it's non-null.
- */
- public final ClassSymbol newLoadedClass(int flags, Name name,
- SymbolLoader loader, Scope scope, SymbolOrigin origin)
- {
- assert loader != null: Debug.show(this) + " - " + name;
- ClassSymbol clasz = new LinkedClassSymbol(this, flags, name);
- clasz.setInfo(loader);
- clasz.setOrigin(origin);
- clasz.allConstructors().setInfo(loader);
- clasz.linkedModule().setInfo(loader);
- clasz.linkedModule().moduleClass().setInfo(loader);
- clasz.linkedModule().moduleClass().setOrigin(origin);
- if (scope != null) scope.enterNoHide(clasz);
- if (scope != null) scope.enterNoHide(clasz.linkedModule());
- return clasz;
- }
-
- /**
- * Creates a new error class owned by this symbol and initializes
- * it with an error type.
- */
- public ClassSymbol newErrorClass(Name name) {
- ClassSymbol symbol = newClass(pos, SYNTHETIC, name, IS_ERROR);
- Scope scope = new ErrorScope(this);
- symbol.setInfo(Type.compoundType(Type.EMPTY_ARRAY, scope, this));
- symbol.allConstructors().setInfo(Type.ErrorType);
- return symbol;
- }
-
- /** Creates a new term owned by this symbol. */
- final Symbol newTerm(int pos, int flags, Name name, int attrs) {
- return new TermSymbol(this, pos, flags, name, attrs);
- }
-
- /** Creates a new package owned by this symbol. */
- final Symbol newPackage(int pos, Name name, Type info) {
- assert isPackageClass(): Debug.show(this);
- Symbol peckage = newModule(pos, JAVA | PACKAGE, name);
- if (info == null) info = Type.compoundType(
- Type.EMPTY_ARRAY, new Scope(), peckage.moduleClass());
- peckage.moduleClass().setInfo(info);
- return peckage;
- }
-
- /** Creates a new class owned by this symbol. */
- final ClassSymbol newClass(int pos, int flags, Name name, int attrs) {
- return new ClassSymbol(this, pos, flags, name, attrs);
- }
-
- /** Creates a new compound class owned by this symbol. */
- final ClassSymbol newCompoundClass(Type info) {
- int pos = Position.FIRSTPOS;
- Name name = Names.COMPOUND_NAME.toTypeName();
- int flags = ABSTRACT | SYNTHETIC;
- int attrs = IS_COMPOUND;
- ClassSymbol clasz = newClass(pos, flags, name, attrs);
- clasz.setInfo(info);
- clasz.primaryConstructor().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, clasz.typeConstructor()));
- return clasz;
- }
-
-// Copying & cloning ------------------------------------------------------
-
- /** Returns a fresh symbol with the same fields as this one.
- */
- public final Symbol cloneSymbol() {
- return cloneSymbol(owner);
- }
-
- /** Returns a fresh symbol with the same fields as this one and the
- * given owner.
- */
- public final Symbol cloneSymbol(Symbol owner) {
- Symbol clone = cloneSymbolImpl(owner, attrs);
- clone.setInfo(info());
- return clone;
- }
-
- protected abstract Symbol cloneSymbolImpl(Symbol owner, int attrs);
-
- /** Returns a shallow copy of the given array. */
- public static Symbol[] cloneArray(Symbol[] array) {
- return cloneArray(0, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items.
- */
- public static Symbol[] cloneArray(int prefix, Symbol[] array) {
- return cloneArray(prefix, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array suffixed by "suffix"
- * null items.
- */
- public static Symbol[] cloneArray(Symbol[] array, int suffix) {
- return cloneArray(0, array, suffix);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items and suffixed by "suffix" null items.
- */
- public static Symbol[] cloneArray(int prefix, Symbol[] array, int suffix) {
- assert prefix >= 0 && suffix >= 0: prefix + " - " + suffix;
- int size = prefix + array.length + suffix;
- if (size == 0) return EMPTY_ARRAY;
- Symbol[] clone = new Symbol[size];
- for (int i = 0; i < array.length; i++) clone[prefix + i] = array[i];
- return clone;
- }
-
- /** Returns the concatenation of the two arrays. */
- public static Symbol[] concat(Symbol[] array1, Symbol[] array2) {
- if (array1.length == 0) return array2;
- if (array2.length == 0) return array1;
- Symbol[] clone = cloneArray(array1.length, array2);
- for (int i = 0; i < array1.length; i++) clone[i] = array1[i];
- return clone;
- }
-
-// Setters ---------------------------------------------------------------
-
- /** Set owner */
- public Symbol setOwner(Symbol owner) {
- assert !isConstructor() && !isNone() && !isError(): Debug.show(this);
- setOwner0(owner);
- return this;
- }
- protected void setOwner0(Symbol owner) {
- this.owner = owner;
- }
-
- /** Set type -- this is an alias for setInfo(Type info) */
- public final Symbol setType(Type info) { return setInfo(info); }
-
- /**
- * Set initial information valid from start of current phase. This
- * information is visible in the current phase and will be
- * transformed by the current phase (except if current phase is
- * the first one).
- */
- public Symbol setInfo(Type info) {
- return setInfoAt(info, Global.instance.currentPhase);
- }
-
- /**
- * Set initial information valid from start of given phase. This
- * information is visible in the given phase and will be
- * transformed by the given phase.
- */
- private final Symbol setInfoAt(Type info, Phase phase) {
- assert info != null: Debug.show(this);
- assert phase != null: Debug.show(this);
- assert !isConstructor()
- || info instanceof Type.LazyType
- || info == Type.NoType
- || info == Type.ErrorType
- || info instanceof Type.MethodType
- || info instanceof Type.OverloadedType
- || info instanceof Type.PolyType
- : "illegal type for " + this + ": " + info;
- infos = new TypeIntervalList(null, info, phase);
- if (info instanceof Type.LazyType) flags &= ~INITIALIZED;
- else flags |= INITIALIZED;
- return this;
- }
-
- /**
- * Set new information valid from start of next phase. This
- * information is only visible in next phase or through
- * "nextInfo". It will not be transformed by the current phase.
- */
- public final Symbol updateInfo(Type info) {
- return updateInfoAt(info, Global.instance.currentPhase.next);
- }
-
- /**
- * Set new information valid from start of given phase. This
- * information is only visible from the start of the given phase
- * which is also the first phase that will transform this
- * information.
- */
- private final Symbol updateInfoAt(Type info, Phase phase) {
- assert info != null: Debug.show(this);
- assert phase != null: Debug.show(this);
- assert infos != null: Debug.show(this);
- assert !phase.precedes(infos.limit()) :
- Debug.show(this) + " -- " + phase + " -- " + infos.limit();
- if (infos.limit() == phase) {
- if (infos.start == phase)
- infos = infos.prev;
- else
- infos.setLimit(infos.limit().prev);
- }
- infos = new TypeIntervalList(infos, info, phase);
- return this;
- }
-
- /** Set type of `this' in current class
- */
- public Symbol setTypeOfThis(Type tp) {
- throw new ApplicationError(this + ".setTypeOfThis");
- }
-
- /** Set the low bound of this type variable
- */
- public Symbol setLoBound(Type lobound) {
- throw new ApplicationError("setLoBound inapplicable for " + this);
- }
-
- /** Set the view bound of this type variable
- */
- public Symbol setVuBound(Type lobound) {
- throw new ApplicationError("setVuBound inapplicable for " + this);
- }
-
- /** Add an auxiliary constructor to class.
- */
- public void addConstructor(Symbol constr) {
- throw new ApplicationError("addConstructor inapplicable for " + this);
- }
-
-// Symbol classification ----------------------------------------------------
-
- /** Does this symbol denote an error symbol? */
- public final boolean isError() {
- return (attrs & IS_ERROR) != 0;
- }
-
- /** Does this symbol denote the none symbol? */
- public final boolean isNone() {
- return kind == Kinds.NONE;
- }
-
- /** Does this symbol denote a type? */
- public final boolean isType() {
- return kind == TYPE || kind == CLASS || kind == ALIAS;
- }
-
- /** Does this symbol denote a term? */
- public final boolean isTerm() {
- return kind == VAL;
- }
-
- /** Does this symbol denote a value? */
- public final boolean isValue() {
- preInitialize();
- return kind == VAL && !(isModule() && isJava()) && !isPackage();
- }
-
- /** Does this symbol denote a stable value? */
- public final boolean isStable() {
- return kind == VAL &&
- ((flags & DEF) == 0) &&
- ((flags & STABLE) != 0 ||
- (flags & MUTABLE) == 0 && type().isObjectType());
- }
-
- /** Does this symbol have the STABLE flag? */
- public final boolean hasStableFlag() {
- return (flags & STABLE) != 0;
- }
-
- /** Is this symbol captured? */
- public final boolean isCaptured() {
- return (flags & CAPTURED) != 0;
- }
-
- /** Is this symbol static (i.e. with no outer instance)? */
- public final boolean isStatic() {
- return isRoot() || hasStaticAttribute() || owner.isStaticOwner();
- }
-
- public final boolean hasStaticAttribute() {
- return (attrs & IS_STATIC) != 0;
- }
-
- /** Does this symbol denote a class that defines static symbols? */
- public final boolean isStaticOwner() {
- // !!! remove "isJava()"? translation does not work (yet?)
- return isPackageClass() || (isJava() && isModuleClass() && isStatic());
- }
-
- /** Is this symbol final?
- */
- public final boolean isFinal() {
- return
- (flags & (FINAL | PRIVATE)) != 0 || isLocal() || owner.isModuleClass();
- }
-
- /** Does this symbol denote a variable? */
- public final boolean isVariable() {
- return kind == VAL && (flags & MUTABLE) != 0;
- }
-
- /** Does this symbol denote a view bounded type variable? */
- public final boolean isViewBounded() {
- Global global = Global.instance;
- return kind == TYPE && (flags & VIEWBOUND) != 0 &&
- global.currentPhase.id <= global.PHASE.REFCHECK.id();
- }
-
- /**
- * Does this symbol denote a final method? A final method is one
- * that can't be overridden in a subclass. This method assumes
- * that this symbol denotes a method. It doesn't test it.
- */
- public final boolean isMethodFinal() {
- return (flags & FINAL) != 0 || isPrivate() || isLifted();
- }
-
- /** Does this symbol denote a sealed class symbol? */
- public final boolean isSealed() {
- return (flags & SEALED) != 0;
- }
-
- /** Does this symbol denote a method?
- */
- public final boolean isInitializedMethod() {
- if (infos == null) return false;
- switch (rawInfo()) {
- case MethodType(_, _):
- case PolyType(_, _):
- return true;
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++)
- if (alts[i].isMethod()) return true;
- return false;
- default:
- return false;
- }
- }
-
- public final boolean isMethod() {
- initialize();
- return isInitializedMethod();
- }
-
- public final boolean isCaseFactory() {
- return isMethod() && !isConstructor() && (flags & CASE) != 0;
- }
-
- public final boolean isAbstractClass() {
- preInitialize();
- return kind == CLASS && (flags & ABSTRACT) != 0 &&
- this != Global.instance.definitions.ARRAY_CLASS;
- }
-
- public final boolean isOverride() {
- preInitialize();
- return (flags & OVERRIDE) != 0;
- }
-
- public final boolean isAbstractOverride() {
- preInitialize();
- return (flags & (ABSTRACT | OVERRIDE)) == (ABSTRACT | OVERRIDE);
- }
-
- /* Does this symbol denote an anonymous class? */
- public final boolean isAnonymousClass() {
- return isClass() && (attrs & IS_ANONYMOUS) != 0;
- }
-
- /** Does this symbol denote the root class or root module?
- */
- public final boolean isRoot() {
- return (attrs & IS_ROOT) != 0;
- }
-
- /** Does this symbol denote something loaded from a Java class? */
- public final boolean isJava() {
- preInitialize();
- return (flags & JAVA) != 0;
- }
-
- /** Does this symbol denote a Java package? */
- public final boolean isPackage() {
- return kind == VAL && (flags & PACKAGE) != 0;
- }
-
- /** Does this symbol denote a Java package class? */
- public final boolean isPackageClass() {
- return kind == CLASS && (flags & PACKAGE) != 0;
- }
-
- /** Does this symbol have the PACKAGE flag? */
- public final boolean hasPackageFlag() {
- return (flags & PACKAGE) != 0;
- }
-
- /** Does this symbol denote a module? */
- public final boolean isModule() {
- return kind == VAL && (flags & MODUL) != 0;
- }
-
- /** Does this symbol denote a module class? */
- public final boolean isModuleClass() {
- return kind == CLASS && (flags & MODUL) != 0;
- }
-
- /** Does this symbol denote a class? */
- public final boolean isClass() {
- return kind == CLASS && (flags & PACKAGE) == 0;
- }
-
- /** Does this symbol denote a case class? */
- public final boolean isCaseClass() {
- preInitialize();
- return kind == CLASS && (flags & CASE) != 0;
- }
-
- /** Does this symbol denote a case object? */
- public final boolean isCaseModuleClass() {
- return isModuleClass() && isCaseClass();
- }
-
- /** Does this symbol denote a uniform (i.e. parameterless) class? */
- public final boolean isTrait() {
- //preInitialize(); todo: enable, problem is that then we cannot print
- // during unpickle
- return kind == CLASS && (flags & TRAIT) != 0;
- }
-
- /** Does this class symbol denote a compound type symbol? */
- public final boolean isCompoundSym() {
- return (attrs & IS_COMPOUND) != 0;
- }
-
- /** Does this symbol denote a this symbol? */
- public final boolean isThisSym() {
- return (attrs & IS_THISTYPE) != 0;
- }
-
- /** Does this symbol denote an interface? */
- public final boolean isInterface() {
- info(); // force delayed transformInfos that may change this flag
- return (flags & INTERFACE) != 0;
- }
-
- /** Does this symbol denote a type alias? */
- public final boolean isTypeAlias() {
- return kind == ALIAS;
- }
-
- /** Does this symbol denote an abstract type? */
- public final boolean isAbstractType() {
- return kind == TYPE;
- }
-
- /** Does this symbol denote a class type? */
- public final boolean isClassType() {
- return kind == CLASS;
- }
-
- /** Does this symbol denote a public symbol? */
- public final boolean isPublic() {
- return !isProtected() && !isPrivate();
- }
-
- /** Does this symbol denote a protected symbol? */
- public final boolean isProtected() {
- preInitialize();
- return (flags & PROTECTED) != 0;
- }
-
- /** Does this symbol denote a private symbol? */
- public final boolean isPrivate() {
- preInitialize();
- return (flags & PRIVATE) != 0;
- }
-
- /** Has this symbol been lifted? */
- public final boolean isLifted() {
- preInitialize();
- return (flags & LIFTED) != 0;
- }
-
- /** Does this symbol denote a deferred symbol? */
- public final boolean isDeferred() {
- return (flags & DEFERRED) != 0;
- }
-
- /** Does this symbol denote a synthetic symbol? */
- public final boolean isSynthetic() {
- return (flags & SYNTHETIC) != 0;
- }
-
- /** Does this symbol denote an accessor? */
- public final boolean isAccessor() {
- return (flags & ACCESSOR) != 0;
- }
-
- /** Has this symbol the PARAMACCESSOR flag? */
- public final boolean hasParamAccessorFlag() {
- return (flags & PARAMACCESSOR) != 0;
- }
-
- /** Does this symbol denote an access method? (a method to access
- * private of protected members from inner classes) */
- public final boolean isAccessMethod() {
- return (attrs & IS_ACCESSMETHOD) != 0;
- }
-
- /** Is this symbol locally defined? I.e. not a member of a class or module */
- public final boolean isLocal() {
- return owner.kind == VAL &&
- !((flags & PARAM) != 0 && owner.isPrimaryConstructor());
- }
-
- /** Is this symbol a parameter? Includes type parameters of methods.
- */
- public final boolean isParameter() {
- return (flags & PARAM) != 0;
- }
-
- /** Is this symbol a type parameter?
- */
- public final boolean isTypeParameter() {
- return kind == TYPE && (flags & PARAM) != 0;
- }
-
- /** Is this symbol a def parameter?
- */
- public final boolean isDefParameter() {
- return (flags & (PARAM | DEF)) == (PARAM | DEF);
- }
-
- /** Is this class locally defined?
- * A class is local, if
- * - it is anonymous, or
- * - its owner is a value
- * - it is defined within a local class
- */
- public final boolean isLocalClass() {
- return isClass() &&
- (isAnonymousClass() ||
- owner.isValue() ||
- owner.isLocalClass());
- }
-
- /** Is this symbol an instance initializer? */
- public boolean isInitializer() {
- return false;
- }
-
- /** Is this symbol a constructor? */
- public final boolean isConstructor() {
- return (attrs & IS_CONSTRUCTOR) != 0;
- }
-
- /** Is this symbol the primary constructor of a type? */
- public final boolean isPrimaryConstructor() {
- return isConstructor() && this == constructorClass().primaryConstructor();
- }
-
- /** Symbol was preloaded from package
- */
- public final boolean isExternal() {
- return pos == Position.NOPOS;
- }
-
- /** Is this symbol an overloaded symbol? */
- public final boolean isOverloaded() {
- Type tp = rawInfo();
- return
- tp instanceof Type.OverloadedType ||
- tp instanceof LazyOverloadedType;
- }
-
- /** Does this symbol denote a label? */
- public final boolean isLabel() {
- return (attrs & IS_LABEL) != 0;
- }
-
- /** Is this symbol accessed? */
- public final boolean isAccessed() {
- return (flags & ACCESSED) != 0;
- }
-
- /** The variance of this symbol as an integer
- */
- public int variance() {
- if ((flags & COVARIANT) != 0) return 1;
- else if ((flags & CONTRAVARIANT) != 0) return -1;
- else return 0;
- }
-
-// Symbol names ----------------------------------------------------------------
-
- /** Get the simple name of this Symbol (this is always a term name)
- */
- public Name simpleName() {
- if (isConstructor()) return constructorClass().name.toTermName();
- return name;
- }
-
-// Symbol origin --------------------------------------------------------------
-
- /** Returns the origin of this symbol. */
- public SymbolOrigin getOrigin() {
- Symbol clasz = getMainClassOrNone();
- return (clasz != this ? clasz : owner()).getOrigin();
- }
-
- /** Sets the origin of this symbol. */
- public void setOrigin(SymbolOrigin origin) {
- throw Debug.abort("not a class", this);
- }
-
- /**
- * Returns the main owner of this symbol. The main owner of a
- * symbol is:
- * - its module class for modules
- * - its constructed class for constructors and factory methods
- * - its owner for other symbols
- *
- * @see Symbol#getMainClassOrNone()
- */
- public Symbol getMainOwner() {
- if (isModule())
- return moduleClass();
- if (isConstructor())
- return constructorClass();
- if (isCaseFactory())
- return type().resultType().symbol();
- return owner();
- }
-
- /**
- * Returns the main class of this symbol. The main class of a
- * symbol is:
- * - itself for non-compound classes and NONE
- * - the main class of its main owner for other symbols
- *
- * This implies that the main class of a symbol is the first
- * enclosing class of that symbol excepted for modules,
- * constructors and factory methods. The main class of modules is
- * their module class and the main class of constructors and
- * factory methods is their constructed class. If a the symbol is
- * not linked to a class through its owner, the method returns
- * the symbol NONE.
- *
- * The main class of a symbol can be understood as the class that
- * declared that symbol.
- *
- * @see Symbol@getMainOwner()
- */
- public Symbol getMainClassOrNone() {
- if (isNone() || (isClassType() && !isCompoundSym()))
- return this;
- return getMainOwner().getMainClassOrNone();
- }
-
- /**
- * Determines the enclosing package of this symbol and returns the
- * module class of that package. Note that the enclosing package
- * of a package is itself. If a symbol has no enclosing package,
- * the method returns the symbol NONE.
- */
- public Symbol getEnclosingPackageClassOrNone() {
- Symbol clasz = getMainClassOrNone();
- while (!clasz.isNone() && !clasz.isPackageClass())
- clasz = clasz.owner().getMainClassOrNone();
- return clasz;
- }
-
- /**
- * Returns the source directory of this symbol or "null" if it is
- * unknown. The source directory of a symbol is the directory
- * corresponding to the enclosing package of that symbol.
- *
- * @see Symbol@getEnclosingPackageClassOrNone()
- */
- public final AbstractFile getSourceDirectoryOrNull() {
- if (isNone()) return null;
- if (!isPackageClass())
- return getEnclosingPackageClassOrNone().getSourceDirectoryOrNull();
-
- switch (getOrigin()) {
- case Directory(AbstractFile file):
- return file;
- default:
- AbstractFile parent = owner().getSourceDirectoryOrNull();
- if (parent == null) return null;
- return parent.lookupName(name.toString(), true);
- }
- }
-
- /**
- * Returns the source file of this symbol or "null" if it is
- * unknown.
- */
- public final AbstractFile getSourceFileOrNull() {
- switch (getOrigin()) {
- case ClassFile(_, String sourcefile):
- if (sourcefile == null) return null;
- AbstractFile parent = getSourceDirectoryOrNull();
- if (parent == null) return null;
- return parent.lookupName(sourcefile, false);
- case ScalaFile(AbstractFile file):
- return file;
- case ScalaUnit(CompilationUnit unit):
- return unit.source.getFile();
- default:
- return null;
- }
- }
-
- /**
- * Returns the compilation unit of this symbol or "null" if it is
- * unknown or if the symbol has no associated compilation unit.
- */
- public final CompilationUnit getUnitOrNull() {
- switch (getOrigin()) {
- case ScalaUnit(CompilationUnit unit):
- return unit;
- default:
- return null;
- }
- }
-
-// Acess to related symbols -----------------------------------------------------
-
- /** Get type parameters */
- public Symbol[] typeParams() {
- return EMPTY_ARRAY;
- }
-
- /** Get value parameters */
- public Symbol[] valueParams() {
- return EMPTY_ARRAY;
- }
-
- /** Get result type */
- public final Type resultType() {
- return type().resultType();
- }
-
- /** Get type parameters at start of next phase */
- public final Symbol[] nextTypeParams() {
- Global.instance.nextPhase();
- Symbol[] tparams = typeParams();
- Global.instance.prevPhase();
- return tparams;
- }
-
- /** Get value parameters at start of next phase */
- public final Symbol[] nextValueParams() {
- Global.instance.nextPhase();
- Symbol[] vparams = valueParams();
- Global.instance.prevPhase();
- return vparams;
- }
-
- /** Get result type at start of next phase */
- public final Type nextResultType() {
- return nextType().resultType();
- }
-
- /** Get all constructors of class */
- public Symbol allConstructors() {
- return NONE;
- }
-
- /** Get primary constructor of class */
- public Symbol primaryConstructor() {
- return NONE;
- }
-
- /**
- * Returns the class linked to this module or null if there is no
- * such class. The returned value remains the same for the whole
- * life of the symbol.
- *
- * See method "linkedModule" to learn more about linked modules
- * and classes.
- */
- public ClassSymbol linkedClass() {
- assert isModule(): "not a module: " + Debug.show(this);
- return null;
- }
-
- /**
- * Returns the module linked to this class or null if there is no
- * such module. The returned value remains the same for the whole
- * life of the symbol.
- *
- * Linked modules and classes are intended to be used by the
- * symbol table loader. They are needed because it is impossible
- * to know from the name of a class or source file if it defines a
- * class or a module. For that reason a class and a module (each
- * linked to the other) are created for each of those files. Once
- * the file is read the class, the module or both are initialized
- * depending on what the file defines.
- *
- * It is guaranteed that if a class "c" has a linked module then
- * "c.linkedModule().linkedClasss() == c" and that if a module "m"
- * has a linked class then "m.linkedClasss().linkedModule() == m".
- *
- * The linked module of a Java class, is the module that contains
- * the static members of that class. A Java class has always a
- * linked module.
- *
- * The linked module of a Scala class, is the module with the same
- * name declared in the same scope. A Scala class may or may not
- * have a linked module. However, this does not depend on the
- * presence or absence of a module with the same name but on how
- * the class is created. Therefore a Scala class may have no
- * linked module even though there exists a module with the same
- * name in the same scope. A Scala class may also have a linked
- * module even though there exists no module with the same name in
- * the same scope. In the latter case, the linked would be
- * initialized to NoType (which prevents accesses to it).
- *
- * There is a last catch about linked modules. It may happen that
- * the symbol returned by "linkedModule" is not a module (and that
- * method "linkedClass" works on a non-module symbol). At creation
- * time, linked modules are always modules, but at initialization
- * time, it may be discovered that the module is in fact a case
- * class factory method. In that case, the module is downgraded to
- * a non-module term. This implies that from then on calls to its
- * method "moduleClass" will fail, but the links defined by the
- * methods "linkedModule" and "linkedClass" remain unchanged.
- */
- public ModuleSymbol linkedModule() {
- assert isClassType(): "not a class: " + Debug.show(this);
- return null;
- }
-
- /** Get owner */
- public Symbol owner() {
- return owner;
- }
-
- /** Get owner, but if owner is primary constructor of a class,
- * get class symbol instead. This is useful for type parameters
- * and value parameters in classes which have the primary constructor
- * as owner.
- */
- public Symbol classOwner() {
- Symbol owner = owner();
- Symbol clazz = owner.constructorClass();
- if (clazz.primaryConstructor() == owner) return clazz;
- else return owner;
- }
-
- /** The next enclosing class */
- public Symbol enclClass() {
- return owner().enclClass();
- }
-
- /** The next enclosing method */
- public Symbol enclMethod() {
- return isMethod() ? this : owner().enclMethod();
- }
-
- /** If this is a constructor, return the class it constructs.
- * Otherwise return the symbol itself.
- */
- public Symbol constructorClass() {
- return this;
- }
-
- /**
- * Returns the class of this module. This method may be invoked
- * only on module symbols. It returns always a non-null module
- * class symbol whose identity never changes.
- */
- public ModuleClassSymbol moduleClass() {
- throw Debug.abort("not a module", this);
- }
-
- /**
- * Returns the source module of this module class. This method may
- * be invoked only on module class symbols. It returns always a
- * non-null module symbol whose identity never changes.
- *
- * This method should be used with great care. If possible, one
- * should always use moduleClass instead. For example, one should
- * write "m.moduleClass()==c" rather than "m==c.sourceModule()".
- *
- * This method is problematic because the module - module-class
- * relation is not a one - one relation. There might be more than
- * one module that share the same module class. In that case, the
- * source module of the module class is the module that created
- * the class. This implies that "m.moduleClass().sourceModule()"
- * may be different of "m". However, its is guaranteed that
- * "c.sourceModule().moduleClass()" always returns "c".
- *
- * Phases like "AddInterfaces" and "ExpandMixins" are two examples
- * of phases that create additional modules referring the same
- * module class.
- *
- * Even if a module class is related to only one module, the use
- * of this method may still be dangerous. The problem is that
- * modules and module classes are not always as related as one
- * might expect. For example, modules declared in a function are
- * lifted out of the function by phase "LambdaLift". During this
- * process, the module value is transformed into a module method
- * with a "Ref" argument. If the "sourceModule" method is used to
- * replace references to module classes by references to their
- * source modules and this is done it naively with the class of a
- * lifted module, it will yield wrong code because the the "Ref"
- * argument will be missing.
- */
- public ModuleSymbol sourceModule() {
- throw Debug.abort("not a module class", this);
- }
-
- /** if type is a (possibly lazy) overloaded type, return its alternatves
- * else return array consisting of symbol itself
- */
- public Symbol[] alternativeSymbols() {
- Symbol[] alts = type().alternativeSymbols();
- if (alts.length == 0) return new Symbol[]{this};
- else return alts;
- }
-
- /** if type is a (possibly lazy) overloaded type, return its alternatves
- * else return array consisting of type itself
- */
- public Type[] alternativeTypes() {
- return type().alternativeTypes();
- }
-
- /** if type is a overloaded type, return first stable alternative
- * else return symbol itself
- */
- public Symbol stableAlternative() {
- switch (type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++)
- if (alts[i].isStable()) return alts[i];
- }
- return this;
- }
-
- /** The symbol accessed by this accessor function.
- */
- public Symbol accessed() {
- assert (flags & ACCESSOR) != 0;
- String name1 = name.toString();
- if (name1.endsWith(Names._EQ.toString()))
- name1 = name1.substring(0, name1.length() - Names._EQ.length());
- return owner.lookup(Name.fromString(name1 + "$"));
- }
-
- /** The members of this class or module symbol
- */
- public Scope members() {
- return info().members();
- }
-
- /** Lookup symbol with given name; return Symbol.NONE if not found.
- */
- public Symbol lookup(Name name) {
- return info().lookup(name);
- }
-
-// Symbol types --------------------------------------------------------------
-
- /** Was symbol's type updated during given phase? */
- public final boolean isUpdatedAt(Phase phase) {
- Phase next = phase.next;
- TypeIntervalList infos = this.infos;
- while (infos != null) {
- if (infos.start == next) return true;
- if (infos.limit().precedes(next)) return false;
- infos = infos.prev;
- }
- return false;
- }
-
- /** Is this symbol locked? */
- public final boolean isLocked() {
- return (flags & LOCKED) != 0;
- }
-
- /** Is this symbol initialized? */
- public final boolean isInitialized() {
- return (flags & INITIALIZED) != 0;
- }
-
- /** Initialize the symbol */
- public final Symbol initialize() {
- info();
- return this;
- }
-
- /** Make sure symbol is entered
- */
- public final void preInitialize() {
- //todo: clean up
- if (infos.info instanceof SymbolLoader)
- infos.info.complete(this);
- }
-
- /** Get info at start of current phase; This is:
- * for a term symbol, its type
- * for a type variable, its bound
- * for a type alias, its right-hand side
- * for a class symbol, the compound type consisting of
- * its baseclasses and members.
- */
- public final Type info() {
- //if (isModule()) moduleClass().initialize();
- if ((flags & INITIALIZED) == 0) {
- Global global = Global.instance;
- Phase current = global.currentPhase;
- global.currentPhase = rawFirstInfoStartPhase();
- Type info = rawFirstInfo();
- assert info != null : this;
- if ((flags & LOCKED) != 0) {
- setInfo(Type.ErrorType);
- flags |= INITIALIZED;
- throw new CyclicReference(this, info);
- }
- flags |= LOCKED;
- //System.out.println("completing " + this);//DEBUG
- info.complete(this);
- flags = flags & ~LOCKED;
- if (info instanceof SourceCompleter && (flags & SNDTIME) == 0) {
- flags |= SNDTIME;
- Type tp = info();
- flags &= ~SNDTIME;
- } else {
- assert !(rawInfo() instanceof Type.LazyType) : this;
- //flags |= INITIALIZED;
- }
- //System.out.println("done: " + this);//DEBUG
- global.currentPhase = current;
- }
- return rawInfo();
- }
-
- /** Get info at start of next phase
- */
- public final Type nextInfo() {
- Global.instance.nextPhase();
- Type info = info();
- Global.instance.prevPhase();
- return info;
- }
-
- /** Get info at start of given phase
- */
- protected final Type infoAt(Phase phase) {
- Global global = phase.global;
- Phase current = global.currentPhase;
- global.currentPhase = phase;
- Type info = info();
- global.currentPhase = current;
- return info;
- }
-
- /** Get info at start of current phase, without forcing lazy types.
- */
- public final Type rawInfo() {
- return rawInfoAt(Global.instance.currentPhase);
- }
-
- /** Get info at start of next phase, without forcing lazy types.
- */
- public final Type rawNextInfo() {
- Global.instance.nextPhase();
- Type info = rawInfo();
- Global.instance.prevPhase();
- return info;
- }
-
- /** Get info at start of given phase, without forcing lazy types.
- */
- private final Type rawInfoAt(Phase phase) {
- //if (infos == null) return Type.NoType;//DEBUG
- assert infos != null : this;
- assert phase != null : this;
- if (infos.limit().id <= phase.id) {
- switch (infos.info) {
- case LazyType():
- // don't force lazy types
- return infos.info;
- }
- while (infos.limit() != phase) {
- Phase limit = infos.limit();
- Type info = transformInfo(limit, infos.info);
- assert info != null: Debug.show(this) + " -- " + limit;
- if (info != infos.info) {
- infos = new TypeIntervalList(infos, info, limit.next);
- } else {
- infos.setLimit(limit.next);
- }
- }
- return infos.info;
- } else {
- TypeIntervalList infos = this.infos;
- while (phase.id < infos.start.id && infos.prev != null)
- infos = infos.prev;
- return infos.info;
- }
- }
- // where
- private Type transformInfo(Phase phase, Type info) {
- Global global = phase.global;
- Phase current = global.currentPhase;
- boolean keepInheritedOverloaded = current.id <= global.PHASE.UNCURRY.id();
- switch (info) {
- case ErrorType:
- case NoType:
- return info;
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- global.currentPhase = phase.next;
- int n = 0;
- boolean altChanged = false;
- for (int i = 0; i < alts.length; i++) {
- Type type = alts[i].info();
- if (keepInheritedOverloaded ||
- alts[i].owner() == owner()) n++;
- if (alts[i].info() != alttypes[i]) altChanged = true;
- }
- Type result;
- if (n < alts.length) {
- Symbol[] symbols = new Symbol[n];
- Type[] types = new Type[n];
- int j = 0;
- for (int i = 0; i < alts.length; i++) {
- if (keepInheritedOverloaded ||
- alts[i].owner() == owner()) {
- symbols[j] = alts[i];
- types[j] = alts[i].info();
- j++;
- } else
- if (Global.instance.debug) Global.instance.log("removing inherited alternatve " + alts[i] + ":" + alttypes[i]);//debug
- }
- result = Type.OverloadedType(symbols, types);
- } else if (altChanged) {
- Type[] types = new Type[alttypes.length];
- for (int i = 0; i < alts.length; i++) {
- types[i] = alts[i].info();
- }
- result = Type.OverloadedType(alts, types);
- } else {
- result = info;
- }
- global.currentPhase = current;
- return result;
- default:
- global.currentPhase = phase;
- info = phase.transformInfo(this, info);
- global.currentPhase = current;
- return info;
- }
- }
-
- /** Get first defined info, without forcing lazy types.
- */
- public final Type rawFirstInfo() {
- TypeIntervalList infos = this.infos;
- assert infos != null : this;
- while (infos.prev != null) infos = infos.prev;
- return infos.info;
- }
-
- /** Get phase that first defined an info, without forcing lazy types.
- */
- public final Phase rawFirstInfoStartPhase() {
- TypeIntervalList infos = this.infos;
- assert infos != null : this;
- while (infos.prev != null) infos = infos.prev;
- return infos.start;
- }
-
- /** Get type at start of current phase. The type of a symbol is:
- * for a type symbol, the type corresponding to the symbol itself
- * for a term symbol, its usual type
- */
- public Type type() {
- return info();
- }
- public Type getType() {
- return info();
- }
-
- /** Get type at start of next phase
- */
- public final Type nextType() {
- Global.instance.nextPhase();
- Type type = type();
- Global.instance.prevPhase();
- return type;
- }
-
- /** The infos of these symbols as an array.
- */
- static public Type[] info(Symbol[] syms) {
- Type[] tps = new Type[syms.length];
- for (int i = 0; i < syms.length; i++)
- tps[i] = syms[i].info();
- return tps;
- }
-
- /** The types of these symbols as an array.
- */
- static public Type[] type(Symbol[] syms) {
- Type[] tps = new Type[syms.length];
- for (int i = 0; i < syms.length; i++)
- tps[i] = syms[i].type();
- return tps;
- }
- static public Type[] getType(Symbol[] syms) {
- return type(syms);
- }
-
- /** Get static type. */
- public final Type staticType() {
- return staticType(Type.EMPTY_ARRAY);
- }
- /** Get static type with given type argument. */
- public final Type staticType(Type arg0) {
- return staticType(new Type[]{arg0});
- }
- /** Get static type with given type arguments. */
- public final Type staticType(Type arg0, Type arg1) {
- return staticType(new Type[]{arg0, arg1});
- }
- /** Get static type with given type arguments. */
- public final Type staticType(Type[] args) {
- Type prefix = owner.staticPrefix();
- if (isType()) return Type.typeRef(prefix, this, args);
- assert args.length == 0: Debug.show(this, args);
- return prefix.memberType(this);
- }
-
- /** Get static prefix. */
- public final Type staticPrefix() {
- assert isStaticOwner(): Debug.show(this) + " - " + isTerm() + " - " + isModuleClass() + " - " + owner().isStaticOwner() + " - " + isJava();
- Global global = Global.instance;
- if (global.PHASE.EXPLICITOUTER.id() < global.currentPhase.id)
- return Type.NoPrefix;
- if (isRoot()) return thisType();
- assert sourceModule().owner() == owner(): Debug.show(this);
- assert sourceModule().type().isObjectType(): Debug.show(this);
- return Type.singleType(owner.staticPrefix(), sourceModule());
- }
-
- /** The type constructor of a symbol is:
- * For a type symbol, the type corresponding to the symbol itself, excluding
- * parameters.
- * Not applicable for term symbols.
- */
- public Type typeConstructor() {
- throw new ApplicationError("typeConstructor inapplicable for " + this);
- }
-
- /** The low bound of this type variable
- */
- public Type loBound() {
- return Global.instance.definitions.ALL_TYPE();
- }
-
- /** The view bound of this type variable
- */
- public Type vuBound() {
- return Global.instance.definitions.ANY_TYPE();
- }
-
- /** Get this.type corresponding to this symbol
- */
- public Type thisType() {
- return Type.NoPrefix;
- }
-
- /** Get type of `this' in current class.
- */
- public Type typeOfThis() {
- return type();
- }
-
- /** Get this symbol of current class
- */
- public Symbol thisSym() { return this; }
-
-
- /** A total ordering between symbols that refines the class
- * inheritance graph (i.e. subclass.isLess(superclass) always holds).
- */
- public boolean isLess(Symbol that) {
- if (this == that) return false;
- int diff;
- if (this.isType()) {
- if (that.isType()) {
- diff = this.closure().length - that.closure().length;
- if (diff > 0) return true;
- if (diff < 0) return false;
- } else {
- return true;
- }
- } else if (that.isType()) {
- return false;
- }
- return this.id < that.id;
- }
-
- /** Return the symbol's type itself followed by all its direct and indirect
- * base types, sorted by isLess(). Overridden for class symbols.
- */
- public Type[] closure() {
- return info().closure();
- }
-
- /** Return position of `c' in the closure of this type; -1 if not there.
- */
- public int closurePos(Symbol c) {
- if (this == c) return 0;
- if (c.isCompoundSym()) return -1;
- Type[] closure = closure();
- int lo = 0;
- int hi = closure.length - 1;
- while (lo <= hi) {
- int mid = (lo + hi) / 2;
- Symbol clsym = closure[mid].symbol();
- if (c == clsym) return mid;
- else if (c.isLess(clsym)) hi = mid - 1;
- else if (clsym.isLess(c)) lo = mid + 1;
- else throw new ApplicationError();
- }
- return -1;
- }
-
- public Type baseType(Symbol sym) {
- int i = closurePos(sym);
- if (i >= 0) return closure()[i];
- else return Type.NoType;
- }
-
- /** Is this class a subclass of `c'? I.e. does it have a type instance
- * of `c' as indirect base class?
- */
- public boolean isSubClass(Symbol c) {
- return this == c ||
- c.isError() ||
- closurePos(c) >= 0 ||
- this == Global.instance.definitions.ALL_CLASS ||
- (this == Global.instance.definitions.ALLREF_CLASS &&
- c != Global.instance.definitions.ALL_CLASS &&
- c.isSubClass(Global.instance.definitions.ANYREF_CLASS));
- }
-
- /** Get base types of this symbol */
- public Type[] parents() {
- return info().parents();
- }
-
-// ToString -------------------------------------------------------------------
-
- /** String representation of symbol's simple name.
- * Translates expansions of operators back to operator symbol. E.g.
- * $eq => =.
- */
- public String nameString() {
- return NameTransformer.decode(simpleName());
- }
-
- /** String representation, including symbol's kind
- * e.g., "class Foo", "function Bar".
- */
- public String toString() {
- return new SymbolTablePrinter().printSymbolKindAndName(this).toString();
- }
-
- /** String representation of location.
- */
- public String locationString() {
- if (owner.kind == CLASS &&
- !owner.isAnonymousClass() && !owner.isCompoundSym() ||
- Global.instance.debug)
- return " in " +
- (owner.isModuleClass() ? owner.sourceModule() : owner);
- else
- return "";
- }
-
- /** String representation of definition.
- */
- public String defString() {
- return new SymbolTablePrinter().printSignature(this).toString();
- }
-
- public static String[] defString(Symbol[] defs) {
- String[] strs = new String[defs.length];
- for (int i = 0; i < defs.length; i++)
- strs[i] = defs[i].defString();
- return strs;
- }
-
-// Overloading and Overriding -------------------------------------------
-
- /** Return first alternative if this has a (possibly lazy)
- * overloaded type, otherwise symbol itself.
- * Needed in ClassSymbol.primaryConstructor() and in UnPickle.
- */
- public Symbol firstAlternative() {
- if (infos == null)
- return this;
- else if (infos.info instanceof Type.OverloadedType) {
- Symbol result = infos.info.alternativeSymbols()[0];
- assert !result.isOverloaded();
- return result;
- } else if (infos.info instanceof LazyOverloadedType)
- return ((LazyOverloadedType) infos.info).sym1.firstAlternative();
- else
- return this;
- }
-
- /** Add another overloaded alternative to this symbol.
- */
- public Symbol overloadWith(Symbol that) {
- throw new ApplicationError("overloadWith inapplicable for " + this);
- }
-
- /** A lazy type which, when forced computed the overloaded type
- * of symbols `sym1' and `sym2'. It also checks that this type is well-formed.
- */
- public static class LazyOverloadedType extends Type.LazyType {
- Symbol sym1;
- Symbol sym2;
- LazyOverloadedType(Symbol sym1, Symbol sym2) {
- this.sym1 = sym1;
- this.sym2 = sym2;
- }
-
- public Symbol[] alternativeSymbols() {
- Symbol[] alts1 = sym1.alternativeSymbols();
- Symbol[] alts2 = sym2.alternativeSymbols();
- Symbol[] alts3 = new Symbol[alts1.length + alts2.length];
- System.arraycopy(alts1, 0, alts3, 0, alts1.length);
- System.arraycopy(alts2, 0, alts3, alts1.length, alts2.length);
- return alts3;
- }
-
- public Type[] alternativeTypes() {
- Type[] alts1 = sym1.alternativeTypes();
- Type[] alts2 = sym2.alternativeTypes();
- Type[] alts3 = new Type[alts1.length + alts2.length];
- System.arraycopy(alts1, 0, alts3, 0, alts1.length);
- System.arraycopy(alts2, 0, alts3, alts1.length, alts2.length);
- return alts3;
- }
-
- public void complete(Symbol overloaded) {
- overloaded.setInfo(
- Type.OverloadedType(
- alternativeSymbols(), alternativeTypes()));
- }
-
- public String toString() {
- return "LazyOverloadedType(" + sym1 + "," + sym2 + ")";
- }
- }
-
- /**
- * Returns the symbol in type "base" which is overridden by this
- * symbol in class "this.owner()". Returns "NONE" if no such
- * symbol exists. The type "base" must be a supertype of class
- * "this.owner()". If "exact" is true, overriding is restricted to
- * symbols that have the same type. The method may return this
- * symbol only if "base.symbol()" is equal to "this.owner()".
- */
- public final Symbol overriddenSymbol(Type base, boolean exact) {
- return overriddenSymbol(base, owner(), exact);
- }
- public final Symbol overriddenSymbol(Type base) {
- return overriddenSymbol(base, false);
- }
-
- /**
- * Returns the symbol in type "base" which is overridden by this
- * symbol in "clasz". Returns "NONE" if no such symbol exists. The
- * type "base" must be a supertype of "clasz" and "this.owner()"
- * must be a superclass of "clasz". If "exact" is true, overriding
- * is restricted to symbols that have the same type. The method
- * may return this symbol if "base.symbol()" is a subclass of
- * "this.owner()".
- */
- public final Symbol overriddenSymbol(Type base, Symbol clasz, boolean exact) {
- Type.Relation relation = exact
- ? Type.Relation.SameType
- : Type.Relation.SuperType;
- return base.lookup(this, clasz.thisType(), relation);
- }
- public final Symbol overriddenSymbol(Type base, Symbol clasz) {
- return overriddenSymbol(base, clasz, false);
- }
-
- /**
- * Returns the symbol in type "sub" which overrides this symbol in
- * class "sub.symbol()". Returns this symbol if no such symbol
- * exists. The class "sub.symbol()" must be a subclass of
- * "this.owner()". If "exact" is true, overriding is restricted to
- * symbols that have the same type.
- */
- public final Symbol overridingSymbol(Type sub, boolean exact) {
- Type.Relation relation = exact
- ? Type.Relation.SameType
- : Type.Relation.SubType;
- return sub.lookup(this, sub, relation);
- }
- public final Symbol overridingSymbol(Type sub) {
- return overridingSymbol(sub, false);
- }
-
- /** Does this symbol override that symbol?
- */
- public boolean overrides(Symbol that) {
- return
- ((this.flags | that.flags) & PRIVATE) == 0 &&
- this.name == that.name &&
- owner.thisType().memberType(this).derefDef().isSubType(
- owner.thisType().memberType(that).derefDef());
- }
-
- /** Reset symbol to initial state
- */
- public void reset(Type completer) {
- this.flags &= SOURCEFLAGS;
- this.pos = 0;
- this.infos = null;
- this.setInfo(completer);
- }
-
- /**
- * Returns the symbol to use in case of a rebinding due to a more
- * precise type prefix.
- */
- public Symbol rebindSym() {
- return this;
- }
-
- /** return a tag which (in the ideal case) uniquely identifies
- * class symbols
- */
- public int tag() {
- return name.toString().hashCode();
- }
-
- public void addInheritedOverloaded(Type owntype) {
- Symbol sym = Type.lookupNonPrivate(owner.parents(), name);
- if (sym.kind == VAL) {
- Type symtype = owner.thisType().memberType(sym);
- switch (symtype) {
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int i = 0; i < alts.length; i++)
- addInheritedOverloaded(owntype, alts[i], alttypes[i]);
- break;
- default:
- addInheritedOverloaded(owntype, sym, symtype);
- }
- }
- }
-
- public void addInheritedOverloaded(Type owntype, Symbol sym, Type symtype) {
- if (!owntype.overrides(symtype)) {
- if (Global.instance.debug) Global.instance.log(owner() + " inherits overloaded: " + sym + ":" + symtype + sym.locationString());//debug
- owner().members().lookupEntry(name).setSymbol(overloadWith(sym));
- //System.out.println("type is now: " + owner().members().lookup(name).type());
- }
- }
-
- public Type removeInheritedOverloaded(Type owntype) {
- switch (owntype) {
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- int n = 0;
- for (int i = 0; i < alts.length; i++)
- if (alts[i].owner() == owner()) n++;
- if (n < alts.length) {
- Symbol[] alts1 = new Symbol[n];
- Type[] alttypes1 = new Type[n];
- int j = 0;
- for (int i = 0; i < alts.length; i++) {
- if (alts[i].owner() == owner()) {
- alts1[j] = alts[i];
- alttypes1[j] = alttypes[i];
- j++;
- } else
- if (Global.instance.debug) Global.instance.log("removing inherited alternatve " + alts[i] + ":" + alttypes[i]);//debug
- }
- return Type.OverloadedType(alts1, alttypes1);
- } else {
- return owntype;
- }
- default:
- return owntype;
- }
- }
-}
-
-/** A class for term symbols
- */
-public // !!! for java -Xfuture
-class TermSymbol extends Symbol {
-
- /** Constructor */
- TermSymbol(Symbol owner, int pos, int flags, Name name, int attrs) {
- super(VAL, owner, pos, flags, name, attrs);
- assert name.isTermName(): Debug.show(this);
- }
-
- public boolean isInitializer() {
- return name == Names.INITIALIZER;
- }
-
- public Symbol[] typeParams() {
- return type().typeParams();
- }
-
- public Symbol[] valueParams() {
- return type().valueParams();
- }
-
- protected Symbol cloneSymbolImpl(Symbol owner, int attrs) {
- return new TermSymbol(owner, pos, flags, name, attrs);
- }
-
- /** Add another overloaded alternative to this symbol.
- */
- public Symbol overloadWith(Symbol that) {
- assert this.name == that.name : Debug.show(this) + " <> " + Debug.show(that);
- //assert this.owner == that.owner : Debug.show(this) + " != " + Debug.show(that);
- assert this.isConstructor() == that.isConstructor();
-
- int overflags;
- //if (this.owner == that.owner)
- overflags = (this.flags & that.flags &
- (JAVA | ACCESSFLAGS | DEFERRED | PARAM | SYNTHETIC)) |
- ((this.flags | that.flags) & ACCESSOR);
- // else // it's an inherited overloaded alternative
- // overflags = this.flags & SOURCEFLAGS;
- Symbol overloaded = (this.isConstructor())
- ? this.constructorClass().newConstructor(this.constructorClass().pos, overflags)
- : owner().newTerm(pos, overflags, name, 0);
- overloaded.setInfo(new LazyOverloadedType(this, that));
- return overloaded;
- }
-}
-
-/** A class for constructor symbols */
-final class ConstructorSymbol extends TermSymbol {
-
- /** The constructed class */
- private final Symbol clasz;
-
- /** Initializes this instance. */
- ConstructorSymbol(Symbol clasz, int pos, int flags) {
- super(clasz.owner(), pos, flags, Names.CONSTRUCTOR, IS_CONSTRUCTOR);
- this.clasz = clasz;
- }
-
- public boolean isInitializer() {
- return false;
- }
-
- public Symbol constructorClass() {
- return clasz;
- }
-
- protected final Symbol cloneSymbolImpl(Symbol owner, int attrs) {
- throw Debug.abort("illegal clone of constructor", this);
- }
-
-}
-
-/** A class for module symbols */
-public class ModuleSymbol extends TermSymbol {
-
- /** The module class */
- private final ModuleClassSymbol clasz;
-
- /** Initializes this instance. */
- private ModuleSymbol(Symbol owner, int pos, int flags, Name name,
- int attrs, ModuleClassSymbol clasz)
- {
- super(owner, pos, flags | MODUL | FINAL | STABLE, name, attrs);
- this.clasz = clasz != null ? clasz : new ModuleClassSymbol(this);
- setType(Type.typeRef(owner().thisType(), this.clasz,Type.EMPTY_ARRAY));
- }
-
- /** Initializes this instance. */
- ModuleSymbol(Symbol owner, int pos, int flags, Name name) {
- this(owner, pos, flags, name, 0, null);
- }
-
- public ModuleClassSymbol moduleClass() {
- // test may fail because loaded modules may be downgraded to
- // case class factory methods (see Symbol#linkedModule())
-
- assert isModule(): Debug.show(this);
- return clasz;
- }
-
- protected final Symbol cloneSymbolImpl(Symbol owner, int attrs) {
- return new ModuleSymbol(owner, pos, flags, name, attrs, clasz);
- }
-
-}
-
-/**
- * A class for linked module symbols
- *
- * @see Symbol#linkedModule()
- */
-public // !!! for java -Xfuture
-final class LinkedModuleSymbol extends ModuleSymbol {
-
- /** The linked class */
- private final LinkedClassSymbol clasz;
-
- /** Initializes this instance. */
- LinkedModuleSymbol(LinkedClassSymbol clasz) {
- super(clasz.owner(), clasz.pos, clasz.flags & JAVA,
- clasz.name.toTermName());
- this.clasz = clasz;
- }
-
- public ClassSymbol linkedClass() {
- return clasz;
- }
-
-}
-
-/** A base class for all type symbols.
- * It has AliasTypeSymbol, AbsTypeSymbol, ClassSymbol as subclasses.
- */
-public // !!! for java -Xfuture
-abstract class TypeSymbol extends Symbol {
-
- /** The history of closures of this symbol */
- private final History/*<Type[]>*/ closures;
-
- /** A cache for type constructors
- */
- private Type tycon = null;
-
- /** The primary constructor of this type */
- private Symbol constructor;
-
- /** Constructor */
- public TypeSymbol(int kind, Symbol owner, int pos, int flags, Name name, int attrs) {
- super(kind, owner, pos, flags, name, attrs);
- this.closures = new ClosureHistory();
- assert name.isTypeName() : this;
- this.constructor = newConstructor(pos, flags & CONSTRFLAGS);
- }
-
- protected final void copyConstructorInfo(TypeSymbol other) {
- {
- Type info = primaryConstructor().info().cloneType(
- primaryConstructor(), other.primaryConstructor());
- if (!isTypeAlias()) info = fixConstrType(info, other);
- other.primaryConstructor().setInfo(info);
- }
- Symbol[] alts = allConstructors().alternativeSymbols();
- for (int i = 1; i < alts.length; i++) {
- Symbol constr = other.newConstructor(alts[i].pos, alts[i].flags);
- other.addConstructor(constr);
- Type info = alts[i].info().cloneType(alts[i], constr);
- if (!isTypeAlias()) info = fixConstrType(info, other);
- constr.setInfo(info);
- }
- }
-
- private final Type fixConstrType(Type type, Symbol clone) {
- switch (type) {
- case MethodType(Symbol[] vparams, Type result):
- result = fixConstrType(result, clone);
- return new Type.MethodType(vparams, result);
- case PolyType(Symbol[] tparams, Type result):
- result = fixConstrType(result, clone);
- return new Type.PolyType(tparams, result);
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym != this && isTypeAlias() && owner().isCompoundSym())
- return type;
- assert sym == this: Debug.show(sym) + " != " + Debug.show(this);
- return Type.typeRef(pre, clone, args);
- case LazyType():
- return type;
- default:
- throw Debug.abort("unexpected constructor type:" + clone + ":" + type);
- }
- }
-
- /** add a constructor
- */
- public final void addConstructor(Symbol constr) {
- assert constr.isConstructor(): Debug.show(constr);
- constructor = constructor.overloadWith(constr);
- }
-
- /** Get primary constructor */
- public final Symbol primaryConstructor() {
- return constructor.firstAlternative();
- }
-
- /** Get all constructors */
- public final Symbol allConstructors() {
- return constructor;
- }
-
- /** Get type parameters */
- public final Symbol[] typeParams() {
- return primaryConstructor().info().typeParams();
- }
-
- /** Get value parameters */
- public final Symbol[] valueParams() {
- return (kind == CLASS) ? primaryConstructor().info().valueParams()
- : Symbol.EMPTY_ARRAY;
- }
-
- /** Get type constructor */
- public final Type typeConstructor() {
- if (tycon == null)
- tycon = Type.typeRef(owner().thisType(), this, Type.EMPTY_ARRAY);
- return tycon;
- }
-
- public Symbol setOwner(Symbol owner) {
- tycon = null;
- constructor.setOwner0(owner);
- switch (constructor.type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++) alts[i].setOwner0(owner);
- }
- return super.setOwner(owner);
- }
-
- /** Get type */
- public final Type type() {
- return primaryConstructor().type().resultType();
- }
- public final Type getType() {
- return primaryConstructor().type().resultType();
- }
-
- /**
- * Get closure at start of current phase. The closure of a symbol
- * is a list of types which contains the type of the symbol
- * followed by all its direct and indirect base types, sorted by
- * isLess().
- */
- public final Type[] closure() {
- if (kind == ALIAS) return info().symbol().closure();
- if ((flags & CLOSURELOCK) != 0 && Global.instance.currentPhase.id <= Global.instance.PHASE.REFCHECK.id())
- throw new Type.Error("illegal cyclic reference involving " + this);
- flags |= CLOSURELOCK;
- Type[] result = (Type[])closures.getValue(this);
- flags &= ~CLOSURELOCK;
- return result;
- }
-
- public void reset(Type completer) {
- super.reset(completer);
- closures.reset();
- tycon = null;
- }
-
-
- protected final Symbol cloneSymbolImpl(Symbol owner, int attrs) {
- TypeSymbol clone = cloneTypeSymbolImpl(owner, attrs);
- copyConstructorInfo(clone);
- return clone;
- }
-
- protected abstract TypeSymbol cloneTypeSymbolImpl(Symbol owner, int attrs);
-}
-
-public // !!! for java -Xfuture
-final class AliasTypeSymbol extends TypeSymbol {
-
- /** Initializes this instance. */
- AliasTypeSymbol(Symbol owner, int pos, int flags, Name name, int attrs) {
- super(ALIAS, owner, pos, flags, name, attrs);
- }
-
- protected TypeSymbol cloneTypeSymbolImpl(Symbol owner, int attrs) {
- return new AliasTypeSymbol(owner, pos, flags, name, attrs);
- }
-
-}
-
-final class AbsTypeSymbol extends TypeSymbol {
-
- private Type lobound = null;
- private Type vubound = null;
-
- /** Initializes this instance. */
- AbsTypeSymbol(Symbol owner, int pos, int flags, Name name, int attrs) {
- super(TYPE, owner, pos, flags, name, attrs);
- allConstructors().setInfo(Type.MethodType(EMPTY_ARRAY, Type.typeRef(owner.thisType(), this, Type.EMPTY_ARRAY)));
- }
-
- public Type loBound() {
- initialize();
- return lobound == null ? Global.instance.definitions.ALL_TYPE() : lobound;
- }
-
- public Type vuBound() {
- initialize();
- return !isViewBounded() || vubound == null
- ? Global.instance.definitions.ANY_TYPE() : vubound;
- }
-
- public Symbol setLoBound(Type lobound) {
- this.lobound = lobound;
- return this;
- }
-
- public Symbol setVuBound(Type vubound) {
- this.vubound = vubound;
- return this;
- }
-
- protected TypeSymbol cloneTypeSymbolImpl(Symbol owner, int attrs) {
- TypeSymbol clone = new AbsTypeSymbol(owner, pos, flags, name, attrs);
- clone.setLoBound(loBound());
- clone.setVuBound(vuBound());
- return clone;
- }
-
-}
-
-/** A class for class symbols. */
-public class ClassSymbol extends TypeSymbol {
-
- /** The origin of this symbol */
- private SymbolOrigin origin;
-
- /** The given type of self, or NoType, if no explicit type was given.
- */
- private Symbol thisSym = this;
-
- public Symbol thisSym() { return thisSym; }
-
- /** A cache for this.thisType()
- */
- final private Type thistp = Type.ThisType(this);
-
- private final Symbol rebindSym;
-
- /** Initializes this instance. */
- ClassSymbol(Symbol owner, int pos, int flags, Name name, int attrs) {
- super(CLASS, owner, pos, flags, name, attrs);
- this.rebindSym = owner.newTypeAlias(pos, 0, Names.ALIAS(this));
- Type rebindType = new ClassAliasLazyType();
- this.rebindSym.setInfo(rebindType);
- this.rebindSym.primaryConstructor().setInfo(rebindType);
- }
-
- private class ClassAliasLazyType extends Type.LazyType {
- public void complete(Symbol ignored) {
- Symbol clasz = ClassSymbol.this;
- Symbol alias = rebindSym;
- Type prefix = clasz.owner().thisType();
- Type constrtype = clasz.type();
- constrtype = Type.MethodType(Symbol.EMPTY_ARRAY, constrtype);
- constrtype = Type.PolyType(clasz.typeParams(), constrtype);
- constrtype = constrtype.cloneType(
- clasz.primaryConstructor(), alias.primaryConstructor());
- alias.primaryConstructor().setInfo(constrtype);
- alias.setInfo(constrtype.resultType());
- }
- }
-
- /** Creates the root class. */
- public static Symbol newRootClass(Global global) {
- int pos = Position.NOPOS;
- Name name = Names.ROOT.toTypeName();
- Symbol owner = Symbol.NONE;
- int flags = JAVA | PACKAGE | FINAL;
- int attrs = IS_ROOT;
- Symbol clasz = new ClassSymbol(owner, pos, flags, name, attrs);
- clasz.setInfo(global.getRootLoader());
- clasz.primaryConstructor().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, clasz.typeConstructor()));
- // !!! Type.MethodType(Symbol.EMPTY_ARRAY, clasz.thisType()));
- return clasz;
- }
-
- /** Creates the this-type symbol associated to this class. */
- private final Symbol newThisType() {
- return newTerm(pos, SYNTHETIC, Names.this_, IS_THISTYPE);
- }
-
- /** Returns the origin of this symbol. */
- public SymbolOrigin getOrigin() {
- return origin != null ? origin : super.getOrigin();
- }
-
- /** Sets the origin of this symbol. */
- public void setOrigin(SymbolOrigin origin) {
- this.origin = origin;
- }
-
- public Type thisType() {
- Global global = Global.instance;
- if (global.currentPhase.id > global.PHASE.ERASURE.id()) return type();
- return thistp;
- }
-
- public Type typeOfThis() {
- return thisSym.type();
- }
-
- public Symbol setTypeOfThis(Type tp) {
- thisSym = newThisType();
- thisSym.setInfo(tp);
- return this;
- }
-
- /** Return the next enclosing class */
- public Symbol enclClass() {
- return this;
- }
-
- public Symbol caseFieldAccessor(int index) {
- assert (flags & CASE) != 0 : this;
- Scope.SymbolIterator it = info().members().iterator();
- Symbol sym = null;
- if ((flags & JAVA) == 0) {
- for (int i = 0; i <= index; i++) {
- do {
- sym = it.next();
- } while (sym != NONE && sym.kind != VAL || !sym.hasParamAccessorFlag() || !sym.isMethod());
- }
- //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG
- } else {
- sym = it.next();
- while (sym != NONE && (sym.flags & SYNTHETIC) == 0) {
- //System.out.println("skipping " + sym);
- sym = it.next();
- }
- for (int i = 0; i < index; i++)
- sym = it.next();
- //System.out.println("field accessor = " + sym);//DEBUG
- }
- assert sym != null : this;
- return sym.stableAlternative();
- }
-
- public final Symbol rebindSym() {
- return rebindSym;
- }
-
- public void reset(Type completer) {
- super.reset(completer);
- thisSym = this;
- }
-
- protected final TypeSymbol cloneTypeSymbolImpl(Symbol owner, int attrs) {
- assert !isModuleClass(): Debug.show(this);
- ClassSymbol clone = new ClassSymbol(owner, pos, flags, name, attrs);
- if (thisSym != this) clone.setTypeOfThis(new ClonedThisSymLazyType());
- return clone;
- }
-
- private final class ClonedThisSymLazyType extends Type.LazyType {
-
- public Type fix(Type type, Symbol clasz, Symbol clone, Type.Map map) {
- switch (type) {
- case ThisType(_):
- return type;
- case SingleType(_, _):
- return map.apply(type);
- case TypeRef(Type prefix, Symbol symbol, Type[] args):
- if (symbol == clasz) type = Type.typeRef(prefix, clone, args);
- return map.apply(type);
- default:
- throw Debug.abortIllegalCase(type);
- }
- }
-
- public Type getTypeFor(Symbol symbol) {
- Symbol clasz = ClassSymbol.this;
- Symbol clone = symbol.owner();
- Type.Map map =
- Type.getSubst(clasz.typeParams(), clone.typeParams());
- Type self = clasz.type();
- Type type = clasz.typeOfThis();
- switch (type) {
- case CompoundType(Type[] parents1, Scope members):
- assert members.isEmpty(): Debug.show(clasz, type);
- int length = parents1.length;
- Type[] parents2 = new Type[parents1.length];
- boolean has_self = false;
- for (int i = 0; i < parents2.length; i++) {
- if (self.isSameAs(parents1[i])) {
- assert !has_self: Debug.show(clasz, clone, type,""+i);
- parents2[i] = clone.type();
- has_self = true;
- } else {
- parents2[i] = fix(parents1[i], clasz, clone, map);
- }
- }
- if (!has_self) {
- parents2 = Type.cloneArray(parents2, 1);
- parents2[parents2.length - 1] = clone.type();
- }
- return Type.compoundTypeWithOwner(clone, parents2, members);
- default:
- if (self.isSameAs(type)) return clone.type();
- Type[] parents = {fix(type, clasz, clone, map), clone.type()};
- return Type.compoundTypeWithOwner(clone, parents, new Scope());
- }
- }
-
- public void complete(Symbol symbol) {
- symbol.setInfo(getTypeFor(symbol));
- }
-
- }
-
-}
-
-/**
- * A class for module class symbols
- *
- * @see Symbol#sourceModule()
- */
-public final class ModuleClassSymbol extends ClassSymbol {
-
- /** The source module */
- private final ModuleSymbol module;
-
- /** Initializes this instance. */
- ModuleClassSymbol(ModuleSymbol module) {
- super(module.owner(), module.pos,
- (module.flags & MODULE2CLASSFLAGS) | MODUL | FINAL,
- module.name.toTypeName(), 0);
- primaryConstructor().flags |= PRIVATE;
- primaryConstructor().setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, typeConstructor()));
- this.module = module;
- }
-
- public ModuleSymbol sourceModule() {
- return module;
- }
-
-}
-
-/**
- * A class for linked class symbols
- *
- * @see Symbol#linkedModule()
- */
-public // !!! for java -Xfuture
-final class LinkedClassSymbol extends ClassSymbol {
-
- /** The linked module */
- private final LinkedModuleSymbol module;
-
- /** Initializes this instance. */
- LinkedClassSymbol(Symbol owner, int flags, Name name) {
- super(owner, Position.NOPOS, flags, name, 0);
- this.module = new LinkedModuleSymbol(this);
- }
-
- public ModuleSymbol linkedModule() {
- return module;
- }
-
-}
-
-/** The class of Symbol.NONE
- */
-public // !!! for java -Xfuture
-final class NoSymbol extends Symbol {
-
- /** Constructor */
- public NoSymbol() {
- super(Kinds.NONE, null, Position.NOPOS, 0, Names.NOSYMBOL, 0);
- super.setInfo(Type.NoType);
- }
-
- /** Returns the origin of this symbol. */
- public SymbolOrigin getOrigin() {
- return SymbolOrigin.Unknown;
- }
-
- /** Set type */
- public Symbol setInfo(Type info) {
- assert info == Type.NoType : info;
- return this;
- }
-
- /** Return the next enclosing class */
- public Symbol enclClass() {
- return this;
- }
-
- /** Return the next enclosing method */
- public Symbol enclMethod() {
- return this;
- }
-
- public Symbol owner() {
- throw new ApplicationError();
- }
-
- public Type thisType() {
- return Type.NoPrefix;
- }
-
- public void reset(Type completer) {
- }
-
- protected Symbol cloneSymbolImpl(Symbol owner, int attrs) {
- throw Debug.abort("illegal clone", this);
- }
-
-}
-
-/** An exception for signalling cyclic references.
- */
-public class CyclicReference extends Type.Error {
- public Symbol sym;
- public Type info;
- public CyclicReference(Symbol sym, Type info) {
- super("illegal cyclic reference involving " + sym);
- this.sym = sym;
- this.info = info;
- }
-}
-
-/** A base class for values indexed by phases. */
-public // !!! for java -Xfuture
-abstract class IntervalList {
-
- /** Interval starts at start of phase "start" (inclusive) */
- public final Phase start;
- /** Interval ends at start of phase "limit" (inclusive) */
- private Phase limit;
-
- public IntervalList(IntervalList prev, Phase start) {
- this.start = start;
- this.limit = start;
- assert start != null && (prev == null || prev.limit.next == start) :
- Global.instance.currentPhase + " - " + prev + " - " + start;
- }
-
- public Phase limit() {
- return limit;
- }
-
- public void setLimit(Phase phase) {
- assert phase != null && !phase.precedes(start) : start + " - " + phase;
- limit = phase;
- }
-
- public String toString() {
- return "[" + start + "->" + limit + "]";
- }
-
-}
-
-/** A class for types indexed by phases. */
-public // !!! for java -Xfuture
-class TypeIntervalList extends IntervalList {
-
- /** Previous interval */
- public final TypeIntervalList prev;
- /** Info valid during this interval */
- public final Type info;
-
- public TypeIntervalList(TypeIntervalList prev, Type info, Phase start) {
- super(prev, start);
- this.prev = prev;
- this.info = info;
- assert info != null;
- }
-
-}
diff --git a/sources/scalac/symtab/SymbolCloner.java b/sources/scalac/symtab/SymbolCloner.java
deleted file mode 100644
index d07717bdc7..0000000000
--- a/sources/scalac/symtab/SymbolCloner.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import scalac.util.Debug;
-
-/**
- * This class implements a symbol cloner. It automatically determines
- * the new owner of cloned symbols, clones their type and keeps track
- * of all cloned symbols. Clone a type means clone all symbol declared
- * in that type (for example parameters of a MethodType).
- */
-public class SymbolCloner {
-
- //########################################################################
- // Public Fields
-
- /** A table that maps owners of symbols to owners of cloned symbols */
- public final Map/*<Symbol,Symbol*/ owners;
-
- /** A map<cloned,clone> into which cloned symbols are stored */
- public final Map/*<Symbol,Symbol*/ clones;
-
- //########################################################################
- // Public Constructor
-
- /** Initializes a new instance. */
- public SymbolCloner() {
- this(new HashMap());
- }
-
- /** Initializes a new instance. */
- public SymbolCloner(Map owners) {
- this(owners, new HashMap());
- }
-
- /** Initializes a new instance. */
- public SymbolCloner(Map owners, Map clones) {
- this.owners = owners;
- this.clones = clones;
- }
-
- //########################################################################
- // Public Methods - Cloning symbols
-
- /**
- * Returns the owner for the clone of the given symbol. The
- * default implementation returns the clone of the symbol's owner
- * if that owner has been cloned or else returns the owner
- * associated to the symbol's owner in the owner table.
- */
- public Symbol getOwnerFor(Symbol symbol) {
- Symbol oldowner = symbol.owner();
- Object newowner = clones.get(oldowner);
- if (newowner == null) newowner = owners.get(oldowner);
- assert newowner != null : Debug.show(symbol);
- return (Symbol)newowner;
- }
-
- /** Clones the given symbol but not its type. */
- public Symbol cloneSymbolWithoutType(Symbol symbol) {
- assert !symbol.isPrimaryConstructor(): Debug.show(symbol);
- assert !symbol.isClassType() || symbol.isCompoundSym(): Debug.show(symbol); // !!! isCompoundSym()
- assert !owners.containsKey(symbol): Debug.show(symbol);
- assert !clones.containsKey(symbol):
- Debug.show(symbol) + " -> " + Debug.show(clones.get(symbol));
- Symbol clone = symbol.cloneSymbol(getOwnerFor(symbol));
- clones.put(symbol, clone);
- return clone;
- }
-
- /** Clones the given symbols but not their types. */
- public Symbol[] cloneSymbolsWithoutTypes(Symbol[] symbols) {
- if (symbols.length == 0) return Symbol.EMPTY_ARRAY;
- Symbol[] clones = new Symbol[symbols.length];
- for (int i = 0; i < clones.length; i++)
- clones[i] = cloneSymbolWithoutType(symbols[i]);
- return clones;
- }
-
- /** Clones the given scope but not the type of its members. */
- public Scope cloneScopeWithoutTypes(Scope scope) {
- Scope clone = new Scope();
- for (Scope.SymbolIterator i = scope.iterator();
- i.hasNext(); ) {
- clone.enterOrOverload(cloneSymbolWithoutType(i.next()));
- }
- return clone;
- }
-
- /** Clones the given symbol and its type. */
- public Symbol cloneSymbol(Symbol symbol) {
- Symbol clone = cloneSymbolWithoutType(symbol);
- clone.setType(cloneType(symbol.info()));
- return clone;
- }
-
- /** Clones the given symbols and their types. */
- public Symbol[] cloneSymbols(Symbol[] symbols) {
- Symbol[] clones = cloneSymbolsWithoutTypes(symbols);
- for (int i = 0; i < clones.length; i++)
- clones[i].setType(cloneType(symbols[i].info()));
- return clones;
- }
-
- /** Clones the given scope and the type of its members. */
- public Scope cloneScope(Scope scope) {
- Scope clone = cloneScopeWithoutTypes(scope);
- for (Scope.SymbolIterator i = scope.iterator();
- i.hasNext(); ) {
- Symbol member = i.next();
- member.setType(cloneType(member.info()));
- }
- return clone;
- }
-
- /** Clones the given type. */
- public Type cloneType(Type type) {
- return cloner.apply(type);
- }
-
- /** Clones the given types. */
- public Type[] cloneTypes(Type[] types) {
- Type[] clones = new Type[types.length];
- for (int i = 0; i < types.length; i++)
- clones[i] = cloner.apply(types[i]);
- return clones;
- }
-
- //########################################################################
- // Public Methods - Mapping symbols
-
- /**
- * Returns the clone of the specified symbol if it has been cloned
- * and the specified symbol otherwise.
- */
- public Symbol mapSymbol(Symbol symbol) {
- Object clone = clones.get(symbol);
- return clone != null ? (Symbol)clone : symbol;
- }
-
- /** Replaces all cloned symbols by clones in given type. */
- public Type mapType(Type type) {
- return mapper.apply(type);
- }
-
- /** Returns the type map built during symbol cloning. */
- // used in scalac/ast/TreeCloner.java
- public Type.Map getTypeMap() {
- return cloner;
- }
-
- //########################################################################
- // Private Method
-
- private Symbol getCompoundClone(Symbol symbol) {
- assert symbol.isCompoundSym(): Debug.show(symbol);
- assert !owners.containsKey(symbol): Debug.show(symbol);
- assert !clones.containsKey(symbol):
- Debug.show(symbol) + " -> " + Debug.show(clones.get(symbol));
- Symbol owner = (Symbol)clones.get(symbol.owner());
- if (owner == null) owner = (Symbol)owners.get(symbol.owner());
- if (owner == null) owner = symbol.owner();
- Symbol clone = symbol.cloneSymbol(owner);
- clones.put(symbol, clone);
- return clone;
- }
-
- //########################################################################
- // Private Class - Type mapper
-
- /** The type mapper Type.Map */
- private final Type.Map mapper = new TypeMapper();
- private class TypeMapper extends Type.Map { public Type apply(Type type) {
- switch (type) {
- case ErrorType:
- case NoType:
- case NoPrefix:
- return type;
- case ThisType(Symbol symbol):
- Symbol clone = (Symbol)clones.get(symbol);
- if (clone == null) return type;
- return Type.ThisType(clone);
- case SingleType(Type prefix, Symbol symbol):
- Symbol clone = (Symbol)clones.get(symbol);
- if (clone == null) return map(type);
- return Type.singleType(apply(prefix), clone);
- case ConstantType(_, _):
- return map(type);
- case TypeRef(Type prefix, Symbol symbol, Type[] args):
- Symbol clone = (Symbol)clones.get(symbol);
- if (clone == null) return map(type);
- return Type.typeRef(apply(prefix), clone, map(args));
- case CompoundType(Type[] parts, Scope members):
- Symbol clone = (Symbol)clones.get(type.symbol());
- // !!! if (clone == null) return map(type);
- if (clone == null) clone = type.symbol();
- return Type.compoundType(map(parts), members, clone);
- case MethodType(Symbol[] vparams, Type result):
- return Type.MethodType(vparams, apply(result));
- case PolyType(Symbol[] tparams, Type result):
- return Type.PolyType(tparams, apply(result));
- case UnboxedType(_):
- return type;
- case UnboxedArrayType(_):
- return map(type);
- default:
- throw Debug.abort("illegal case", type);
- }
- }}
-
- //########################################################################
- // Private Class - Type cloner
-
- /** The type cloner Type.Map */
- private final Type.Map cloner = new TypeCloner();
- private class TypeCloner extends TypeMapper { public Type apply(Type type){
- switch (type) {
- case CompoundType(Type[] parts, Scope members):
- Symbol clone = /* !!! getCompoundClone */(type.symbol());
- return Type.compoundType(map(parts), /* !!! cloneScope */(members), clone);
- case MethodType(Symbol[] vparams, Type result):
- Symbol[] clones = cloneSymbols(vparams);
- return Type.MethodType(clones, apply(result));
- case PolyType(Symbol[] tparams, Type result):
- Symbol[] clones = cloneSymbols(tparams);
- return Type.PolyType(clones, apply(result));
- default:
- return super.apply(type);
- }
- }}
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolComparator.java b/sources/scalac/symtab/SymbolComparator.java
deleted file mode 100644
index c703663bf4..0000000000
--- a/sources/scalac/symtab/SymbolComparator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.util.Comparator;
-
-/** This class implements a symbol comparator. */
-public class SymbolComparator implements Comparator {
-
- //########################################################################
- // Public Constants
-
- /** The unique instance of this class */
- public static final Comparator instance = new SymbolComparator();
-
- //########################################################################
- // Private Constructors
-
- /** Initializes this instance. */
- private SymbolComparator() {}
-
- //########################################################################
- // Public Methods
-
- /** Compares the two arguments which must inherit from Symbol. */
- public int compare(Object lf, Object rg) {
- return lf == rg ? 0 : ((Symbol)lf).isLess((Symbol)rg) ? -1 : 1;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolLoader.java b/sources/scalac/symtab/SymbolLoader.java
deleted file mode 100644
index 2f656c92e0..0000000000
--- a/sources/scalac/symtab/SymbolLoader.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.io.IOException;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/**
- * This class implements common behaviors of lazy types used to load
- * symbols from external sources (containing source or compiled code).
- */
-public abstract class SymbolLoader extends Type.LazyType {
-
- //########################################################################
- // Public Fields
-
- /** The global environment */
- public final Global global;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public SymbolLoader(Global global) {
- this.global = global;
- }
-
- //########################################################################
- // Public Methods
-
- /**
- * Completes the specified symbol. More precisely, it completes
- * all symbols related to the root symbol of the specified
- * symbol. It is guaranteed that after this method call all these
- * symbols are initialized (or at least that their info does no
- * longer contain this lazy type).
- *
- * The root symbol of a symbol is:
- * - the root symbol of the constructed class, if it's a
- * constructor,
- * - the root symbol of the source module, if it's a module class,
- * - the linked class, if it's a module with a linked class,
- * - itself if it's a class or a module with no linked class,
- * - undefined otherwise.
- *
- * The symbols related to a symbol include:
- * - the symbol itself,
- * - its constructor (allConstructors()), if it's a class,
- * - the symbols related to its linked module, if there is one.
- * - the symbols related to its module class, if it's a module,
- */
- public final void complete(Symbol symbol) {
- Symbol root = getRootSymbol(symbol);
- try {
- Phase phase = global.currentPhase;
- global.currentPhase = global.PHASE.ANALYZER.phase();
- global.timer.start();
- String source = doComplete(root);
- global.timer.stop("loaded " + source);
- global.currentPhase = phase;
- checkValidity(root, source);
- } catch (IOException exception) {
- global.timer.drop();
- if (global.debug) exception.printStackTrace();
- String error = "error while loading " + symbol;
- String message = exception.getMessage();
- error = message != null ? error + ", " + message : "i/o " + error;
- global.error(error);
- }
- initializeRoot(root);
- }
-
- //########################################################################
- // Protected Methods
-
- /**
- * Performs the actual loading and returns the name of the
- * external source. It is guaranteed that the argument of this
- * method is always a root symbol
- *
- * @see complete(Symbol)
- */
- protected abstract String doComplete(Symbol root) throws IOException;
-
- //########################################################################
- // Private Methods
-
- /**
- * Returns the root symbol of the specified symbol.
- *
- * @see complete(Symbol)
- */
- private Symbol getRootSymbol(Symbol symbol) {
- if (symbol.isConstructor())
- return getRootSymbol(symbol.constructorClass());
- if (symbol.isModuleClass())
- return getRootSymbol(symbol.sourceModule());
- if (symbol.isModule() && symbol.linkedClass() != null)
- return symbol.linkedClass();
- assert symbol.isClassType() || symbol.isModule(): Debug.show(symbol);
- return symbol;
- }
-
- /**
- * Checks that at least the specified root symbol or its linked
- * module, if any, has been initialized and signals an error
- * otherwise.
- *
- * @see complete(Symbol)
- */
- private void checkValidity(Symbol root, String source) {
- if (root.rawInfo() != this) return;
- String what;
- if (!root.isClassType() || root.linkedModule() == null) {
- what = "does not define " + root;
- } else {
- if (root.linkedModule().moduleClass().rawInfo() != this) return;
- what = "defines neither " + root + " nor " + root.linkedModule();
- }
- global.error(source + " " + what);
- }
-
- /**
- * Initializes all symbols related to the specified root symbol
- * and whose info is this instance.
- *
- * @see complete(Symbol)
- */
- private void initializeRoot(Symbol root) {
- if (root.isClassType()) {
- initializeClass(root);
- if (root.linkedModule() != null)
- initializeRoot(root.linkedModule());
- } else {
- initializeSymbol(root);
- if (root.isModule()) initializeClass(root.moduleClass());
- }
- }
-
- /**
- * Initializes the specified class and its constructor if their
- * info is this instance.
- */
- private void initializeClass(Symbol clasz) {
- initializeSymbol(clasz);
- initializeSymbol(clasz.allConstructors());
- }
-
- /** Initializes the symbol if its info is this instance. */
- private void initializeSymbol(Symbol symbol) {
- if (symbol.rawInfo() != this) return;
- symbol.setInfo(symbol.isModule() ? Type.NoType : Type.ErrorType);
- if (symbol.isConstructor()) symbol.flags |= Modifiers.PRIVATE;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolNameWriter.java b/sources/scalac/symtab/SymbolNameWriter.java
deleted file mode 100644
index af57b23933..0000000000
--- a/sources/scalac/symtab/SymbolNameWriter.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import scalac.Global;
-import scalac.util.NameTransformer;
-
-/**
- * This class provides methods to turn symbol names into strings.
- *
- * There are several kinds of owner/symbol relationships:
- * - root/symbol
- * - package/symbol
- * - class/class
- * - class/member
- * - owner/parameter
- * - none/symbol
- * - error/symbol
- * - other relationships
- *
- * The separator to use for each of these relationships are specified
- * independently. When a separator is set to '\0' the corresponding
- * owners are dropped from the resulting string. ROOT, NONE and ERROR
- * owners are also dropped. The choice of the separator to use is done
- * by the method "getOwnerSymbolSeparator(Symbol)"
- *
- * Symbol names are usually encoded. There is support to decode these
- * names.
- *
- * Each symbol has an unique identifier. There is support to print
- * these unique identifiers.
- */
-public class SymbolNameWriter {
-
- //########################################################################
- // Private Fields
-
- /** The string buffer */
- private StringBuffer buffer;
-
- /** The root/symbol separator */
- private char root;
-
- /** The package/symbol separator */
- private char peckage;
-
- /** The class/class separator */
- private char clasz;
-
- /** The class/member separator */
- private char member;
-
- /** The owner/parameter separator */
- private char parameter;
-
- /** The none/symbol separator */
- private char none;
-
- /** The error/symbol separator */
- private char error;
-
- /** The other relationships separator */
- private char other;
-
- /** The name decoding status */
- private boolean decode;
-
- /** The symbol/unique-identifier separator */
- private char unique;
-
- /** The number of pending characters */
- private int pending;
-
- /** The prefix for the current operation (null if none) */
- private String prefix;
-
- //########################################################################
- // Public Constructors
-
- /**
- * Initializes this instance with an empty string buffer. This is
- * equivalent to calling "SymbolStringifier(null)".
- */
- public SymbolNameWriter() {
- this(null);
- }
-
- /**
- * Initializes this instance with given string buffer. All
- * separators are set to '.' excepted the root/symbol separator
- * which is set to '\0'. The symbol name decoding is disabled. The
- * unique identifier printing is disabled.
- */
- public SymbolNameWriter(StringBuffer buffer) {
- setStringBuffer(buffer).setAllSeparators('.').setRootSeparator('\0');
- }
-
- //########################################################################
- // Public Method - Configuration operations
-
- /** Sets the string buffer. */
- public SymbolNameWriter setStringBuffer(StringBuffer buffer) {
- this.buffer = buffer;
- return this;
- }
-
- /** Sets all separators. */
- public SymbolNameWriter setAllSeparators(char separator) {
- setRootSeparator(separator);
- setPackageSeparator(separator);
- setClassSeparator(separator);
- setMemberSeparator(separator);
- setParameterSeparator(separator);
- setNoneSeparator(separator);
- setErrorSeparator(separator);
- setOtherSeparator(separator);
- return this;
- }
-
- /** Sets the root/symbol separator. */
- public SymbolNameWriter setRootSeparator(char separator) {
- this.root = separator;
- return this;
- }
-
- /** Sets the package/symbol separator. */
- public SymbolNameWriter setPackageSeparator(char separator) {
- this.peckage = separator;
- return this;
- }
-
- /** Sets the class/class separator. */
- public SymbolNameWriter setClassSeparator(char separator) {
- this.clasz = separator;
- return this;
- }
-
- /** Sets the class/member separator. */
- public SymbolNameWriter setMemberSeparator(char separator) {
- this.member = separator;
- return this;
- }
-
- /** Sets the owner/parameter separator. */
- public SymbolNameWriter setParameterSeparator(char separator) {
- this.parameter = separator;
- return this;
- }
-
- /** Sets the none/symbol separator. */
- public SymbolNameWriter setNoneSeparator(char separator) {
- this.none = separator;
- return this;
- }
-
- /** Sets the error/symbol separator. */
- public SymbolNameWriter setErrorSeparator(char separator) {
- this.error = separator;
- return this;
- }
-
- /** Sets the other relationships separator. */
- public SymbolNameWriter setOtherSeparator(char separator) {
- this.other = separator;
- return this;
- }
-
- /** Sets the name decoding status. */
- public SymbolNameWriter setNameDecoding(boolean decode) {
- this.decode = decode;
- return this;
- }
-
- /** Sets the symbol/unique-identifier separator. */
- public SymbolNameWriter setUniqueSeparator(char separator) {
- this.unique = separator;
- return this;
- }
-
- //########################################################################
- // Public Method - To string operations
-
- /** Returns the string formed by the symbol. */
- public String toString(Symbol symbol) {
- assert buffer == null;
- String string = appendSymbol(symbol).toString();
- setStringBuffer(null);
- return string;
- }
-
- /** Returns the string formed by the prefix and symbol. */
- public String toString(String prefix, Symbol symbol) {
- assert buffer == null;
- String string = appendSymbol(prefix, symbol).toString();
- setStringBuffer(null);
- return string;
- }
-
- /** Returns the string formed by the symbol and suffix. */
- public String toString(Symbol symbol, String suffix) {
- assert buffer == null;
- String string = appendSymbol(symbol, suffix).toString();
- setStringBuffer(null);
- return string;
- }
-
- /** Returns the string formed by the prefix, symbol and suffix. */
- public String toString(String prefix, Symbol symbol, String suffix) {
- assert buffer == null;
- String string = appendSymbol(prefix, symbol, suffix).toString();
- setStringBuffer(null);
- return string;
- }
-
- //########################################################################
- // Public Method - Append operations
-
- /** Appends given symbol. */
- public StringBuffer appendSymbol(Symbol symbol) {
- String name = getSymbolName(symbol);
- this.pending += name.length();
- char separator = getSymbolSeparator(symbol);
- return appendPrefix(symbol.owner(), separator).append(name);;
- }
-
- /** Appends given prefix and symbol. */
- public StringBuffer appendSymbol(String prefix, Symbol symbol) {
- assert this.prefix == null && prefix != null;
- this.prefix = prefix;
- return appendSymbol(symbol);
- }
-
- /** Appends given symbol and suffix. */
- public StringBuffer appendSymbol(Symbol symbol, String suffix) {
- this.pending += suffix.length();
- return appendSymbol(symbol).append(suffix);
- }
-
- /** Appends given prefix, symbol and suffix. */
- public StringBuffer appendSymbol(String prefix, Symbol symbol,
- String suffix)
- {
- assert this.prefix == null && prefix != null;
- this.prefix = prefix;
- this.pending += suffix.length();
- return appendSymbol(symbol).append(suffix);
- }
-
- /** Appends prefix formed by given owner and separator. */
- public StringBuffer appendPrefix(Symbol owner, char separator) {
- if (separator == 0) return getStringBuffer();
- this.pending += 1;
- return appendSymbol(owner).append(separator);
- }
-
- //########################################################################
- // Public Method - Query operations
-
- /** Returns the name to use for given symbol. */
- public String getSymbolName(Symbol symbol) {
- String name = symbol.name.toString();
- if (decode) name = NameTransformer.decode(name);
- if (unique != 0) name = name + unique + symbol.id;
- return name;
- }
-
- /** Returns the owner/symbol separator to use for given symbol. */
- public char getSymbolSeparator(Symbol symbol) {
- if (symbol.isRoot() || symbol.isNone() || symbol.isError()) return 0;
- if (symbol.isParameter()) return parameter;
- Symbol owner = symbol.owner();
- if (owner.isRoot()) return root;
- if (owner.isNone()) return none;
- if (owner.isError()) return error;
- if (owner.isPackageClass()) return peckage;
- if (owner.isClass()) return symbol.isClass() ? clasz : member;
- return other;
- }
-
- /** Returns the string buffer. */
- public StringBuffer getStringBuffer() {
- if (prefix != null) pending += prefix.length();
- if (buffer == null) {
- this.buffer = new StringBuffer(pending);
- } else {
- buffer.ensureCapacity(buffer.length() + pending);
- }
- if (prefix != null) buffer.append(prefix);
- this.pending = 0;
- this.prefix = null;
- return buffer;
- }
-
- /** Returns the content of the string buffer. */
- public String toString() {
- return buffer == null ? "" : buffer.toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolOrigin.java b/sources/scalac/symtab/SymbolOrigin.java
deleted file mode 100644
index 29baa08a79..0000000000
--- a/sources/scalac/symtab/SymbolOrigin.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import ch.epfl.lamp.compiler.msil.Assembly;
-import scala.tools.util.AbstractFile;
-import scalac.CompilationUnit;
-
-/** Instances of this class designate the origin of a symbol. */
-public class SymbolOrigin {
-
- //########################################################################
- // Public Cases
-
- /** Designates an unknown source */
- public case Unknown;
-
- /** Designates a directory */
- public case Directory(AbstractFile file);
-
- /** Designates a JVM class file (the source file may be null) */
- public case ClassFile(AbstractFile file, String sourcefile);
-
- /** Designates a Scala symbl file */
- public case SymblFile(AbstractFile file);
-
- /** Designates a Scala source file */
- public case ScalaFile(AbstractFile file);
-
- /** Designates a Scala compilation unit */
- public case ScalaUnit(CompilationUnit unit);
-
- /** Designates a CLR assembly */
- public case CLRAssembly(Assembly assembly);
-
- //########################################################################
- // Public Methods
-
- /** Records the source file attribute. */
- public void setSourceFileAttribute(String sourcefile) {
- if (this instanceof SymbolOrigin.ClassFile)
- ((SymbolOrigin.ClassFile)this).sourcefile = sourcefile;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolSubstTypeMap.java b/sources/scalac/symtab/SymbolSubstTypeMap.java
deleted file mode 100644
index 144181faac..0000000000
--- a/sources/scalac/symtab/SymbolSubstTypeMap.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-
-import ch.epfl.lamp.util.ForwardingMap;
-
-import scalac.util.Debug;
-
-/** A type map that substitues symbols and types for symbols. */
-public class SymbolSubstTypeMap extends Type.Map {
-
- //########################################################################
- // Private Fields
-
- /** A table containing the symbol to symbol substitutions */
- private Map/*<Symbol, Symbol>*/ symbols;
-
- /** A table containing the symbol to type substitutions */
- private Map/*<Symbol, Type>*/ types;
-
- //########################################################################
- // Public Constructors
-
- public SymbolSubstTypeMap() {
- this.symbols = new HashMap();
- this.types = new HashMap();
- }
-
- public SymbolSubstTypeMap(Map symbols, Map types) {
- this();
- insertSymbol(symbols);
- insertType(types);
- }
-
- public SymbolSubstTypeMap(SymbolSubstTypeMap other) {
- this();
- insertSymbol(other.symbols);
- insertType(other.types);
- }
-
- //########################################################################
- // Public Methods - Inserting and removing symbol to symbol substitutions
-
- public void insertSymbol(Symbol[] keys, Symbol[] values) {
- assert keys.length == values.length : keys.length+" != "+values.length;
- for (int i = 0; i < keys.length; i++) insertSymbol(keys[i], values[i]);
- }
-
- public void insertSymbol(Symbol key, Symbol value) {
- assert !symbols.containsKey(key) : Debug.show(key);
- assert !types.containsKey(key) : Debug.show(key);
- symbols.put(key, value);
- }
-
- public void insertSymbol(Map map) {
- assert checkLeftContainsNoKeyFromRight(symbols, map);
- assert checkLeftContainsNoKeyFromRight(types, map);
- symbols.putAll(map);
- }
-
- public void removeSymbol(Symbol[] keys) {
- for (int i = 0; i < keys.length; i++) removeSymbol(keys[i]);
- }
-
- public void removeSymbol(Symbol key) {
- symbols.remove(key);
- }
-
- public void removeSymbol(Set keys) {
- symbols.keySet().removeAll(keys);
- }
-
- public Symbol lookupSymbol(Symbol key) {
- return (Symbol)symbols.get(key);
- }
-
- public Map getSymbols() {
- return new ForwardingMap(symbols) {
- public Object put(Object key, Object value) {
- insertSymbol((Symbol)key, (Symbol)value);
- return null;
- }
- public void putAll(Map map) {
- insertSymbol(map);
- }
- };
- }
-
- //########################################################################
- // Public Methods - Inserting and removing symbol to type substitutions
-
- public void insertType(Symbol[] keys, Type[] values) {
- assert keys.length == values.length : keys.length+" != "+values.length;
- for (int i = 0; i < keys.length; i++) insertType(keys[i], values[i]);
- }
-
- public void insertType(Symbol key, Type value) {
- assert !symbols.containsKey(key) : Debug.show(key);
- assert !types.containsKey(key) : Debug.show(key);
- types.put(key, value);
- }
-
- public void insertType(Map map) {
- assert checkLeftContainsNoKeyFromRight(symbols, map);
- assert checkLeftContainsNoKeyFromRight(types, map);
- types.putAll(map);
- }
-
- public void removeType(Symbol[] keys) {
- for (int i = 0; i < keys.length; i++) removeType(keys[i]);
- }
-
- public void removeType(Symbol key) {
- types.remove(key);
- }
-
- public void removeType(Set keys) {
- types.keySet().removeAll(keys);
- }
-
- public Type lookupType(Symbol key) {
- return (Type)types.get(key);
- }
-
- public Map getTypes() {
- return new ForwardingMap(types) {
- public Object put(Object key, Object value) {
- insertType((Symbol)key, (Type)value);
- return null;
- }
- public void putAll(Map map) {
- insertType(map);
- }
- };
- }
-
- //########################################################################
- // Public Methods - Applying the substitutions
-
- public Type apply(Type type) {
- switch (type) {
-
- case TypeRef(NoPrefix, Symbol symbol, Type[] args):
- Object value = types.get(symbol);
- if (value != null) return (Type)value;
- value = symbols.get(symbol);
- if (value == null) return super.map(type);
- Type prefix = ((Type.TypeRef)type).pre;
- return Type.typeRef(apply(prefix), (Symbol)value, map(args));
-
- case SingleType(NoPrefix, Symbol symbol):
- Object value = types.get(symbol);
- if (value != null) return (Type)value;
- value = symbols.get(symbol);
- if (value == null) return super.map(type);
- Type prefix = ((Type.SingleType)type).pre;
- return Type.singleType(apply(prefix), (Symbol)value);
-
- case ThisType(Symbol symbol):
- Object value = symbols.get(symbol);
- if (value == null) return super.map(type);
- return Type.ThisType((Symbol)value);
-
- default:
- return super.map(type);
- }
- }
-
- //########################################################################
- // Public Methods - Printing
-
- public String toString() {
- return "{ symbols=" + symbols + " types=" + types + " }";
- }
-
- //########################################################################
- // Private Function
-
- private static boolean checkLeftContainsNoKeyFromRight(Map lf, Map rg) {
- for (Iterator i = rg.keySet().iterator(); i.hasNext(); ) {
- Object key = i.next();
- assert !lf.containsKey(key) : Debug.show(key);
- }
- return true;
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/SymbolTablePrinter.java b/sources/scalac/symtab/SymbolTablePrinter.java
deleted file mode 100644
index ad6fdbf1cd..0000000000
--- a/sources/scalac/symtab/SymbolTablePrinter.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab;
-
-import java.io.StringWriter;
-
-import ch.epfl.lamp.util.CodePrinter;
-
-import scalac.Global;
-import scalac.atree.AConstant;
-import scalac.symtab.Type.Constraint;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.util.Name;
-import scalac.util.NameTransformer;
-import scalac.util.Debug;
-
-/** This class provides methods to print symbols and types. */
-public class SymbolTablePrinter {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
-
- /** The underlying code printer */
- private final CodePrinter printer;
-
- //########################################################################
- // Public Constructors
-
- /** Creates a new instance */
- public SymbolTablePrinter() {
- this((String)null);
- }
-
- /** Creates a new instance */
- public SymbolTablePrinter(String step) {
- this(Global.instance, new CodePrinter(step));
- }
-
- /** Creates a new instance */
- public SymbolTablePrinter(CodePrinter printer) {
- this(Global.instance, printer);
- }
-
- /** Creates a new instance */
- public SymbolTablePrinter(Global global, CodePrinter printer) {
- this.global = global;
- this.printer = printer;
- }
-
- //########################################################################
- // Public Methods - Getting & Setting
-
- /** Returns the underlying code printer. */
- public CodePrinter getCodePrinter() {
- return printer;
- }
-
- //########################################################################
- // Public Methods - Formatting
-
- /** Increases the indentation level by one. */
- public SymbolTablePrinter indent() {
- printer.indent();
- return this;
- }
-
- /** Decreases the indentation level by one. */
- public SymbolTablePrinter undent() {
- printer.undent();
- return this;
- }
-
- /** Inserts a new line. */
- public SymbolTablePrinter line() {
- printer.line();
- return this;
- }
-
- /** Inserts a white space. */
- public SymbolTablePrinter space() {
- printer.space();
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing simple values
-
- /** Prints a new line. */
- public SymbolTablePrinter println() {
- printer.println();
- return this;
- }
-
- /** Prints the boolean value followed by a new line. */
- public SymbolTablePrinter println(boolean value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the byte value followed by a new line. */
- public SymbolTablePrinter println(byte value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the short value followed by a new line. */
- public SymbolTablePrinter println(short value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the char value followed by a new line. */
- public SymbolTablePrinter println(char value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the int value followed by a new line. */
- public SymbolTablePrinter println(int value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the long value followed by a new line. */
- public SymbolTablePrinter println(long value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the float value followed by a new line. */
- public SymbolTablePrinter println(float value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the double value followed by a new line. */
- public SymbolTablePrinter println(double value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the string followed by a new line. */
- public SymbolTablePrinter println(String value) {
- printer.println(value);
- return this;
- }
-
- /** Prints the boolean value. */
- public SymbolTablePrinter print(boolean value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the byte value. */
- public SymbolTablePrinter print(byte value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the short value. */
- public SymbolTablePrinter print(short value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the char value. */
- public SymbolTablePrinter print(char value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the int value. */
- public SymbolTablePrinter print(int value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public SymbolTablePrinter print(long value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the float value. */
- public SymbolTablePrinter print(float value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the long value. */
- public SymbolTablePrinter print(double value) {
- printer.print(value);
- return this;
- }
-
- /** Prints the string. */
- public SymbolTablePrinter print(String value) {
- printer.print(value);
- return this;
- }
-
- //########################################################################
- // Public Methods - Printing scopes
-
- /** Prints the members of the given scope. */
- public SymbolTablePrinter printScope(Scope scope) {
- return printScope(scope, false);
- }
-
- /** Prints the members of the given scope. */
- public SymbolTablePrinter printScope(Scope scope, boolean lazy) {
- boolean first = true;
- for (SymbolIterator i = scope.iterator(); i.hasNext(); ) {
- Symbol member = i.next();
- if (!mustShowMember(member)) continue;
- if (first) print("{").indent(); else print(", ");
- first = false;
- line().printSignature(member);
- }
- if (!first) line().undent().print("}"); else if (!lazy) print("{}");
- return this;
- }
-
- /**
- * Returns true iff the given member must be printed. The default
- * implementation always returns true.
- */
- public boolean mustShowMember(Symbol member) {
- return true;
- }
-
- //########################################################################
- // Public Methods - Printing symbols
-
- /**
- * Returns the string representation of the kind of the given
- * symbol or null if there is no such representation.
- */
- public String getSymbolKind(Symbol symbol) {
- switch (symbol.kind) {
- case Kinds.NONE:
- return null;
- case Kinds.CLASS:
- if (symbol.isPackageClass()) return "package class";
- if (symbol.isModuleClass()) return "object class";
- if (symbol.isTrait()) return "trait";
- return "class";
- case Kinds.TYPE:
- case Kinds.ALIAS:
- return "type";
- case Kinds.VAL:
- if (symbol.isVariable()) return "variable";
- if (symbol.isPackage()) return "package";
- if (symbol.isModule()) return "object";
- if (symbol.isConstructor()) return "constructor";
- if (symbol.isInitializedMethod())
- if (global.debug || (symbol.flags & Modifiers.STABLE) == 0)
- return "method";
- return "value";
- default:
- throw Debug.abort("unknown kind " + symbol.kind);
- }
- }
-
- /**
- * Returns the definition keyword associated to the given symbol
- * or null if there is no such keyword.
- */
- public String getSymbolKeyword(Symbol symbol) {
- if (symbol.isParameter()) return null;
- switch (symbol.kind) {
- case Kinds.NONE:
- return null;
- case Kinds.CLASS:
- if (symbol.isTrait()) return "trait";
- return "class";
- case Kinds.TYPE:
- case Kinds.ALIAS:
- return "type";
- case Kinds.VAL:
- if (symbol.isVariable()) return "var";
- if (symbol.isPackage()) return "package";
- if (symbol.isModule()) return "object";
- if (symbol.isInitializedMethod()) return "def";
- return "val";
- default:
- throw Debug.abort("unknown kind " + symbol.kind);
- }
- }
-
- /** Returns the name of the given symbol. */
- public String getSymbolName(Symbol symbol) {
- String name = symbol.simpleName().toString();
- if (!global.debug) name = NameTransformer.decode(name);
- return name;
- }
-
- /** Returns the inner string of the given symbol. */
- public String getSymbolInnerString(Symbol symbol) {
- switch (symbol.kind) {
- case Kinds.NONE : return ": ";
- case Kinds.ALIAS: return " = ";
- case Kinds.CLASS: return " extends ";
- case Kinds.TYPE : return " <: ";
- case Kinds.VAL : return symbol.isModule() ? " extends " :
- symbol.isDefParameter() ? ": => " : ": ";
- default : throw Debug.abort("unknown kind " + symbol.kind);
- }
- }
-
- /** Prints the unique identifier of the given symbol */
- public SymbolTablePrinter printSymbolUniqueId(Symbol symbol) {
- if (global.uniqid) print('#').print(symbol.id);
- return this;
- }
-
- /** Prints the name of the given symbol */
- public SymbolTablePrinter printSymbolName(Symbol symbol) {
- print(getSymbolName(symbol));
- return printSymbolUniqueId(symbol);
- }
-
- /** Prints the kind and the name of the given symbol. */
- public SymbolTablePrinter printSymbolKindAndName(Symbol symbol) {
- if (symbol.isAnonymousClass()) {
- print("<template>");
- return printSymbolUniqueId(symbol);
- } else {
- String kind = getSymbolKind(symbol);
- if (kind != null) print(kind).space();
- return printSymbolName(symbol);
- }
- }
-
- /** Prints the type of the given symbol with the given inner string. */
- public SymbolTablePrinter printSymbolType(Symbol symbol, String inner) {
- Type type = symbol.rawFirstInfo();
- if (!(type instanceof Type.LazyType)) type = symbol.info();
- boolean star = false;
- if ((symbol.flags & Modifiers.REPEATED) != 0 &&
- type.symbol() == global.definitions.SEQ_CLASS &&
- type.typeArgs().length == 1)
- {
- type = type.typeArgs()[0];
- star = true;
- }
- printType(type, inner);
- if (star) print("*");
- return this;
- }
-
- /** Prints the signature of the given symbol. */
- public SymbolTablePrinter printSignature(Symbol symbol) {
- String keyword = getSymbolKeyword(symbol);
- if (keyword != null) print(keyword).space();
- String inner = getSymbolInnerString(symbol);
- return printSymbolName(symbol)
- .printType(symbol.loBound(), " >: ")
- .printSymbolType(symbol, inner);
- }
-
-
- /** Prints the given type parameter section. */
- public SymbolTablePrinter printTypeParams(Symbol[] tparams) {
- print('[');
- for (int i = 0; i < tparams.length; i++) {
- if (i > 0) print(",");
- printSignature(tparams[i]);
- }
- return print(']');
- }
-
- /** Prints the given value parameter section. */
- public SymbolTablePrinter printValueParams(Symbol[] vparams) {
- print('(');
- for (int i = 0; i < vparams.length; i++) {
- if (i > 0) print(",");
- printSymbolType(vparams[i],
- vparams[i].isDefParameter() ? "=> " : "");
- }
- return print(')');
- }
-
- //########################################################################
- // Public Methods - Printing types
-
- /** Returns the type to print for the given type (transitive). */
- public Type getTypeToPrintForType(Type type) {
- while (true) {
- Type result = getTypeToPrintForType0(type);
- if (result == type) return result;
- type = result;
- }
- }
-
- /** Returns the type to print for the given type (non-transitive). */
- public Type getTypeToPrintForType0(Type type) {
- switch (type) {
- case ThisType(Symbol clasz):
- if (global.debug || !clasz.isModuleClass()) return type;
- Type prefix = getTypeToPrintForType(clasz.owner().thisType());
- Symbol module = clasz.sourceModule();
- if (module.owner() != clasz.owner()) return type;
- if (!module.type().isObjectType()) return type;
- return Type.singleType(prefix, module);
- case SingleType(_, Symbol sym):
- if (global.debug) return type;
- if (sym.isSynthetic()) return type.widen();
- return type;
- case CompoundType(Type[] parts, Scope members):
- if (global.debug) return type;
- if (type.isFunctionType()) return parts[1];
- return type;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != Type.NoType) return constr.inst;
- return type;
- default:
- return type;
- }
- }
-
- /** Prints the given types separated by infix. */
- public SymbolTablePrinter printTypes(Type[] types, String infix) {
- for (int i = 0; i < types.length; i++) {
- if (i > 0) print(infix);
- printType(types[i]);
- }
- return this;
- }
-
- /** Prints the given type. */
- public SymbolTablePrinter printType(Type type) {
- return printType0(getTypeToPrintForType(type));
- }
- public SymbolTablePrinter printType0(Type type) {
- printCommonPart(type);
- switch (type) {
- case ThisType(_):
- case SingleType(_,_):
- return print(".type");
- default:
- return this;
- }
- }
-
- /** Prints the given type with the given inner string. */
- public SymbolTablePrinter printType(Type type, String inner) {
- if (" <: ".equals(inner) && type.symbol() == global.definitions.ANY_CLASS ||
- " >: ".equals(inner) && type.symbol() == global.definitions.ALL_CLASS)
- return this;
- else
- return printType0(getTypeToPrintForType(type), inner);
- }
- public SymbolTablePrinter printType0(Type type, String inner) {
- switch (type) {
- case PolyType(Symbol[] tparams, Type result):
- if (tparams.length != 0 || global.debug) printTypeParams(tparams);
- return printType(result, inner);
- case MethodType(Symbol[] vparams, Type result):
- return printValueParams(vparams).printType(result, inner);
- default:
- print(inner);
- return printType0(type);
- }
- }
-
- /** Prints a function type with the given type arguments. */
- public SymbolTablePrinter printFunctionType(Type[] types) {
- Type[] args = new Type[types.length - 1];
- for (int i = 0; i < args.length; i++) args[i] = types[i];
- print('(').printTypes(args, ",").print(") => ");
- printType(types[types.length - 1]);
- return this;
- }
-
- /** Prints a template type with the given base types. */
- public SymbolTablePrinter printTemplateType(Type[] types) {
- print("<template: ").printTypes(types, " with ").print(" {...}>");
- return this;
- }
-
- /** Prints the type and prefix common part of the given type. */
- public SymbolTablePrinter printCommonPart(Type type) {
- switch (type) {
- case ErrorType:
- return print("<error>");
- case AnyType:
- return print("<any type>");
- case NoType:
- return print("<notype>");
- case NoPrefix:
- return print("<noprefix>");
- case ThisType(Symbol sym):
- if ((sym.isAnonymousClass() || sym.isCompoundSym()) && !global.debug)
- return print("this");
- return printSymbolName(sym).print(".this");
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (!global.debug) {
- if (type.isFunctionType())
- return printFunctionType(args);
- if (sym.isAnonymousClass() || sym.isCompoundSym())
- return printTemplateType(pre.memberInfo(sym).parents());
- }
- printPrefix(pre).printSymbolName(sym);
- //print("{" + sym.owner() + "}");//DEBUG
- if (args.length != 0) print('[').printTypes(args, ",").print(']');
- return this;
- case SingleType(Type pre, Symbol sym):
- return printPrefix(pre).printSymbolName(sym);
- case ConstantType(Type base, AConstant value):
- return printType(base).printConstantValue(value);
- case CompoundType(Type[] parts, Scope members):
- return printTypes(parts," with ").space()
- .printScope(members,true)
- .printSymbolUniqueId(type.symbol());
- case MethodType(_, _):
- return printType0(type, "" /*null*/);
- case PolyType(_, _):
- return printType0(type, "" /*null*/);
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- return printTypes(alttypes, " <and> ");
- case TypeVar(Type origin, Constraint constr):
- return printType(origin).print("?");
- case UnboxedType(int kind):
- return print(type.unboxedName(kind).toString());
- case UnboxedArrayType(Type elemtp):
- return printType(elemtp).print("[]");
- case LazyType():
- if (!global.debug) return print("?");
- String classname = type.getClass().getName();
- return print("<lazy type ").print(classname).print(">");
- default:
- String classname = type.getClass().getName();
- return print("<unknown type ").print(classname).print(">");
- }
- }
-
- //########################################################################
- // Public Methods - Printing prefixes
-
- /** Returns the type to print for the given prefix (transitive). */
- public Type getTypeToPrintForPrefix(Type prefix) {
- while (true) {
- Type result = getTypeToPrintForPrefix0(prefix);
- if (result == prefix || result == null) return result;
- prefix = result;
- }
- }
-
- /** Returns the type to print for the given prefix (non-transitive). */
- public Type getTypeToPrintForPrefix0(Type prefix) {
- if (!global.debug) {
- if (prefix.symbol().isNone()) return null;
- if (prefix.symbol().isRoot()) return null;
- }
- return getTypeToPrintForType0(prefix);
- }
-
- /** Prints the given type as a prefix. */
- public SymbolTablePrinter printPrefix(Type prefix) {
- prefix = getTypeToPrintForPrefix(prefix);
- return prefix == null ? this : printPrefix0(prefix);
- }
- public SymbolTablePrinter printPrefix0(Type prefix) {
- printCommonPart(prefix);
- switch (prefix) {
- case NoPrefix:
- case ThisType(_):
- case SingleType(_,_):
- return print(".");
- default:
- return print("#");
- }
- }
-
- //########################################################################
- // Public Methods - Printing constants
-
- /** Prints the given constant value. */
- public SymbolTablePrinter printConstantValue(AConstant value) {
- return print("(").print(value.toString()).print(")");
- }
-
- //########################################################################
- // Public Methods - Converting
-
- /** Returns the string representation of this printer. */
- public String toString() {
- return printer.toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java
deleted file mode 100644
index 0461525710..0000000000
--- a/sources/scalac/symtab/Type.java
+++ /dev/null
@@ -1,3736 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-**
-** $Id$
-\* */
-//todo: T {} == T
-
-package scalac.symtab;
-
-import java.util.HashMap;
-
-import scala.tools.util.Position;
-import scalac.ApplicationError;
-import scalac.atree.AConstant;
-import scalac.util.*;
-import scalac.Global;
-
-public class Type implements Modifiers, Kinds, TypeTags, EntryTags {
-
- public static boolean explainSwitch = false;
- private static int indent = 0;
-
- public case ErrorType; // not used after analysis
- public case AnyType; // not used after analysis
- public case NoType;
- public case NoPrefix;
-
- /** C.this.type
- */
- public case ThisType(Symbol sym) {
- assert sym.isClassType(): Debug.show(sym);
- }
-
- /** pre.sym.type
- * sym represents a valueS
- */
- public case SingleType(Type pre, Symbol sym) {
- assert this instanceof ExtSingleType;
- }
-
- /** Type for a numeric or string constant.
- */
- public case ConstantType(Type base, AConstant value);
-
- /** pre.sym[args]
- * sym represents a type
- * for example: scala.List[java.lang.String] is coded as
- *
- * TypeRef(
- * SingleType(ThisType(definitions.ROOT_CLASS), definitions.SCALA),
- * <List>,
- * new Type[]{
- * TypeRef(
- * SingleType(
- * SingleType(ThisType(definitions.ROOT_CLASS), definitions.JAVA),
- * definitions.LANG),
- * definitions.STRING,
- * new Type[]{})}).
- *
- */
- public case TypeRef(Type pre, Symbol sym, Type[] args) {
- assert this instanceof ExtTypeRef: this;
- }
-
- /** parts_1 with ... with parts_n { members }
- */
- public case CompoundType(Type[] parts, Scope members) {
- assert this instanceof ExtCompoundType;
- }
-
- /** synthetic type of a method def ...(vparams): result = ...
- */
- public case MethodType(Symbol[] vparams, Type result) {
- for (int i = 0; i < vparams.length; i++)
- assert vparams[i].isParameter() && vparams[i].isTerm(): this;
- }
-
- /** synthetic type of a method def ...[tparams]result
- * For instance, given def f[a](x: a): a
- * f has type PolyType(new Symbol[]{<a>},
- * MethodType(new Symbol[]{<x>}, <a>.type()))
- *
- * if tparams is empty, this is the type of a parameterless method
- * def ... =
- * For instance, given def f = 1
- * f has type PolyType(new Symbol[]{}, <scala.Int>.type())
- */
- public case PolyType(Symbol[] tparams, Type result) {
- for (int i = 0; i < tparams.length; i++)
- assert tparams[i].isParameter()&&tparams[i].isAbstractType(): this;
- }
-
- /** synthetic type of an overloaded value whose alternatives are
- * alts_1, ..., alts_n, with respective types alttypes_1, ..., alttypes_n
- *
- * For instance, if there are two definitions of `f'
- * def f: int
- * def f: String
- * then there are three symbols:
- * ``f1'' corresponding to def f: int
- * ``f2'' corresponding to def f: String
- * ``f3'' corresponding to both
- * f3 has type
- * OverloadedType(
- * new Symbol[]{<f1>, <f2>},
- * new Type[]{PolyType(new Symbol[]{}, <int>),
- * PolyType(new Symbol[]{}, <String>),
- *
- */
- public case OverloadedType(Symbol[] alts, Type[] alttypes);
-
- /** Hidden case to implement delayed evaluation of types.
- * No need to pattern match on this type; it will never come up.
- */
- public case LazyType();
-
- /** Hidden case to implement local type inference.
- * Later phases do not need to match on this type.
- */
- public case TypeVar(Type origin, Constraint constr);
-
- /** Hidden cases to implement type erasure.
- * Earlier phases do not need to match on these types.
- */
- public case UnboxedType(int tag);
- public case UnboxedArrayType(Type elemtp);
-
- /** Force evaluation of a lazy type. No cycle
- * check is needed; since this is done in Symbol.
- * @see Symbol.info().
- */
- public void complete(Symbol p) {}
-
-// Creators ---------------------------------------------------------------------
-
- /** An empty Type array */
- public static final Type[] EMPTY_ARRAY = new Type[0];
-
- public static SingleType singleType(Type pre, Symbol sym) {
- assert sym.isTerm() && !sym.isNone(): pre + " -- " + Debug.show(sym);
- rebind:
- {
- Symbol owner = sym.owner();
- if (!owner.isClass()) break rebind;
- if (owner == pre.symbol()) break rebind;
- // !!! add if (owner is sealed/final) break rebind ?
- // !!! add if (owner is module class) break rebind ?
- if (sym.isFinal() || sym.isPrivate()) break rebind;
- Symbol rebind = pre.lookupNonPrivate(sym.name);
- if (rebind.isNone()) break rebind;
- if (rebind.isLocked()) throw new Type.Error(
- "illegal cyclic reference involving " + rebind);
- sym = rebind.rebindSym().stableAlternative();
- }
- if (pre.isStable() || pre.isError()) {
- return new ExtSingleType(pre, sym);
- } else {
- throw new Type.Malformed(pre, sym.nameString() + ".type");
- }
- }
-
- public static Type constantType(AConstant value) {
- return Global.instance.definitions.atyper.type(value);
- }
-
- public static Type singleTypeMethod(Type pre, Symbol sym) {
- Global global = Global.instance;
- if (global.currentPhase.id <= global.PHASE.UNCURRY.id())
- return singleType(pre, sym);
- else if (global.currentPhase.id <= global.PHASE.ERASURE.id())
- return sym.type().singleTypeMethod0(pre, sym);
- else
- return pre.memberType(sym);
- }
-
- private Type singleTypeMethod0(Type pre, Symbol sym) {
- switch (this) {
- case PolyType(Symbol[] args, Type result):
- return PolyType(args, result.singleTypeMethod0(pre, sym));
- case MethodType(Symbol[] args, Type result):
- return MethodType(args, result.singleTypeMethod0(pre, sym));
- default:
- return singleType(pre, sym);
- }
- }
-
- public static Type appliedType(Type tycon, Type[] args) {
- switch (tycon) {
- case TypeRef(Type pre, Symbol sym, Type[] args1):
- if (args == args1) return tycon;
- else return Type.typeRef(pre, sym, args);
- default:
- throw Debug.abort("illegal case", tycon);
- }
- }
-
- public static Type typeRef(Type pre, Symbol sym, Type[] args) {
- rebind:
- if (sym.isAbstractType()) {
- Symbol owner = sym.owner();
- if (!owner.isClass()) break rebind;
- if (owner == pre.symbol()) break rebind;
- // !!! add if (owner is sealed/final) break rebind ?
- // !!! add if (owner is module class) break rebind ?
- if (sym.isFinal() || sym.isPrivate()) break rebind;
- Symbol rebind = pre.lookupNonPrivate(sym.name);
- if (rebind.isNone()) break rebind;
- if (rebind.isLocked()) throw new Type.Error(
- "illegal cyclic reference involving " + rebind);
- sym = rebind.rebindSym();
- }
- if (sym.isAbstractType() && !pre.isLegalPrefix() && !pre.isError())
- throw new Type.Malformed(pre, sym.nameString());
- if (sym.isTypeAlias()) {
- Symbol[] params = sym.typeParams();
- if (args.length == params.length) {
- if (sym.isLocked()) throw new Type.Error(
- "illegal cyclic reference involving " + sym);
- sym.flags |= LOCKED;
- Type result = pre.memberInfo(sym).subst(params, args);
- sym.flags &= ~LOCKED;
- return result;
- }
- assert args.length == 0 || args.length == params.length:
- Debug.show(pre, sym, args, params);
- }
- assert isLegalTypeRef(pre, sym, args):
- Debug.show(pre, sym, args, sym.typeParams());
- return new ExtTypeRef(pre, sym, args);
- }
- private static boolean isLegalTypeRef(Type pre, Symbol sym, Type[] args) {
- if (sym.kind == TYPE && !pre.isLegalPrefix() && !pre.isError()) return false;
- if (!sym.isType() && !sym.isError()) return false;
- // !!! return args.length == 0 || args.length == sym.typeParams().length;
- return true;
- }
-
- public static Type newTypeRefUnsafe(Type pre, Symbol sym, Type[] args) {
- return new ExtTypeRef(pre, sym, args);
- }
-
- public static CompoundType compoundType(Type[] parts, Scope members,
- Symbol clazz) {
- return new ExtCompoundType(parts, members, clazz);
- }
-
- public static CompoundType compoundTypeWithOwner(Symbol owner, Type[] parts, Scope members) {
- return new ExtCompoundType(owner, parts, members);
- }
-
- static class ExtSingleType extends SingleType {
- Type tp = null;
- int definedId = -1;
- ExtSingleType(Type pre, Symbol sym) {
- super(pre, sym);
- }
- public Type singleDeref() {
- if (definedId != Global.instance.currentPhase.id) {
- definedId = Global.instance.currentPhase.id;
- tp = pre.memberType(sym).resultType();
- }
- return tp;
- }
- }
-
- static class ExtTypeRef extends TypeRef {
- ExtTypeRef(Type pre, Symbol sym, Type[] args) {
- super(pre, sym, args);
- }
- }
-
- private static final class ExtCompoundType extends CompoundType {
- private final Symbol clasz;
- public ExtCompoundType(Symbol owner, Type[] parts, Scope members) {
- super(parts, members);
- this.clasz = owner.newCompoundClass(this);
- }
- public ExtCompoundType(Type[] parts, Scope members, Symbol clasz) {
- super(parts, members);
- this.clasz = clasz;
- }
- public Symbol symbol() {
- return clasz;
- }
- }
-
-// Access methods ---------------------------------------------------------------
-
- /** If this is a thistype, named type, applied type, singleton type, or compound type,
- * its symbol, otherwise Symbol.NONE.
- */
- public Symbol symbol() {
- switch (this) {
- case ThisType(Symbol sym):
- return sym;
- case TypeRef(_, Symbol sym, _):
- return sym;
- case SingleType(_, Symbol sym):
- return sym;
- case ConstantType(Type base, _):
- return base.symbol();
- case TypeVar(Type origin, _):
- return origin.symbol();
- case CompoundType(_, _):
- // overridden in ExtCompoundType
- throw new ApplicationError();
- default:
- return Symbol.NONE;
- }
- }
-
- public static Symbol[] symbol(Type[] tps) {
- Symbol[] syms = new Symbol[tps.length];
- for (int i = 0; i < syms.length; i++)
- syms[i] = tps[i].symbol();
- return syms;
- }
-
- /** If this is a reference to a type constructor, add its
- * type parameters as arguments
- */
- public Type withDefaultArgs() {
- switch (this) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (args.length == 0 && sym.typeParams().length != 0)
- return Type.typeRef(pre, sym, Symbol.type(sym.typeParams()));
- }
- return this;
- }
-
- /** The upper bound of this type. Returns always a TypeRef whose
- * symbol is a class.
- */
- public Type bound() {
- switch (unalias()) {
- case TypeRef(Type pre, Symbol sym, _):
- if (sym.kind == TYPE) return pre.memberInfo(sym).bound();
- assert sym.isClass() : Debug.show(sym) + " -- " + this;
- return this;
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().bound();
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.bound();
- else return this;
- default:
- throw Debug.abort("illegal case", this);
- }
- }
-
- /** If this type is a thistype or singleton type, its type,
- * otherwise the type itself.
- */
- public Type singleDeref() {
- switch (this) {
- case ThisType(Symbol sym):
- return sym.typeOfThis();
- case SingleType(Type pre, Symbol sym):
- // overridden in ExtSingleType
- throw new ApplicationError();
- case ConstantType(Type base, _):
- return base;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.singleDeref();
- else return this;
- default:
- return this;
- }
- }
-
- /** If this type is a thistype or singleton type, its underlying object type,
- * otherwise the type itself.
- */
- public Type widen() {
- Type tp = singleDeref();
- switch (tp) {
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return tp.widen();
- default:
- return tp;
- }
- }
-
- private static Map widenMap = new Map() {
- public Type apply(Type t) {
- return t.widen();
- }
- };
-
- public static Type[] widen(Type[] tps) {
- return widenMap.map(tps);
- }
-
- /** The thistype or singleton type corresponding to values of this type.
- */
- public Type narrow() {
- switch (unalias()) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym.kind == CLASS) return sym.thisType();
- else return ThisType(sym);
- case CompoundType(_, _):
- return symbol().thisType();
- default:
- return this;
- }
- }
-
- /** If this type is a constant type, its underlying basetype;
- * otherwise the type itself
- */
- public Type deconst() {
- switch (this) {
- case ConstantType(Type base, _):
- return base;
- default:
- return this;
- }
- }
-
- /** If this type is a parameterless method, its underlying resulttype;
- * otherwise the type itself
- */
- public Type derefDef() {
- switch (this) {
- case PolyType(Symbol[] tparams, Type restp):
- if (tparams.length == 0) return restp;
- }
- return this;
- }
-
- /** The lower approximation of this type (which must be a typeref)
- */
- public Type loBound() {
- switch (unalias()) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Type lb = Global.instance.definitions.ALL_TYPE();
- if (sym.kind == TYPE) {
- lb = pre.memberLoBound(sym);
- }
- if (lb.symbol() == Global.instance.definitions.ALL_CLASS &&
- this.symbol() != Global.instance.definitions.ALL_CLASS &&
- this.isSubType(Global.instance.definitions.ANYREF_TYPE())) {
- lb = Global.instance.definitions.ALLREF_TYPE();
- }
- return lb;
- default:
- throw new ApplicationError();
- }
- }
-
- /** If this is a this-type, named-type, applied type or single-type, its prefix,
- * otherwise NoType.
- */
- public Type prefix() {
- switch (this) {
- case ThisType(Symbol sym): return sym.owner().thisType();
- case TypeRef(Type pre, _, _): return pre;
- case SingleType(Type pre, _): return pre;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.prefix();
- else return NoType;
- default: return NoType;
- }
- }
-
- /** Get all type arguments of this type.
- */
- public Type[] typeArgs() {
- switch (unalias()) {
- case TypeRef(_, _, Type[] args):
- return args;
- default:
- return Type.EMPTY_ARRAY;
- }
- }
-
- /** Get type of `this' symbol corresponding to this type, extend
- * homomorphically to function types and poly types.
- */
- public Type instanceType() {
- switch (unalias()) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym != sym.thisSym())
- return sym.typeOfThis()
- .asSeenFrom(pre, sym.owner())
- .subst(sym.typeParams(), args);
- break;
- case MethodType(Symbol[] params, Type restp):
- Type restp1 = restp.instanceType();
- if (restp1 != restp)
- return MethodType(params, restp1);
- break;
- case PolyType(Symbol[] tparams, Type restp):
- Type restp1 = restp.instanceType();
- if (restp1 != restp)
- return PolyType(tparams, restp1);
- break;
- }
- return this;
- }
-
- /** Remove all aliases
- */
- public Type unalias() {
- Type result = unalias(0);//debug
- //if (this != result) System.out.println(this + " ==> " + result);//DEBUG
- return result;
- }
-
- private Type unalias(int n) {
- if (n == 100)
- throw new Type.Error("alias chain too long (recursive type alias?): " + this);
- switch (this) {
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.unalias(n + 1);
- else return this;
- }
- return this;
- }
-
- /** The (prefix/argument-adapted) parents of this type.
- */
- public Type[] parents() {
- switch (unalias()) {
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().parents();
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym.kind == CLASS) {
- assert sym.typeParams().length == args.length : sym + " " + ArrayApply.toString(args) + " " + sym.primaryConstructor().info();//debug
- return subst(asSeenFrom(sym.info().parents(), pre, sym.owner()),
- sym.typeParams(), args);
- } else {
- return new Type[]{sym.info().asSeenFrom(pre, sym.owner())};
- }
- case CompoundType(Type[] parts, _):
- return parts;
- default:
- return Type.EMPTY_ARRAY;
- }
- }
-
- /** Get type parameters of method type (a PolyType or MethodType)
- * or EMPTY_ARRAY if method type is not polymorphic.
- */
- public Symbol[] typeParams() {
- switch (this) {
- case PolyType(Symbol[] tparams, _):
- return tparams;
- case MethodType(Symbol[] vparams, _):
- return Symbol.EMPTY_ARRAY;
- case TypeRef(_, Symbol sym, Type[] args):
- if (args.length == 0) return sym.typeParams();
- else return Symbol.EMPTY_ARRAY;
- default:
- return Symbol.EMPTY_ARRAY;
- }
- }
-
- /** Get value parameters of method type (a PolyType or MethodType)
- * or EMPTY_ARRAY if method type has no value parameter section.
- */
- public Symbol[] valueParams() {
- return valueParams(false);
- }
- private Symbol[] valueParams(boolean ok) {
- switch (this) {
- case PolyType(_, Type result):
- return result.valueParams(true);
- case MethodType(Symbol[] vparams, _):
- return vparams;
- default:
- if (ok) return Symbol.EMPTY_ARRAY;
- throw Debug.abort("illegal case", this);
- }
- }
-
- /** If this type is a (possibly polymorphic) method type, its result type
- * after applying all method argument sections,
- * otherwise the type itself.
- */
- public Type resultType() {
- switch (this) {
- case PolyType(_, Type tpe):
- return tpe.resultType();
- case MethodType(_, Type tpe):
- return tpe.resultType();
- default:
- return this;
- }
- }
-
- /** The number of value parameter sections of this type.
- */
- public int paramSectionCount() {
- switch (this) {
- case PolyType(_, Type restpe):
- return restpe.paramSectionCount();
- case MethodType(_, Type restpe):
- return restpe.paramSectionCount() + 1;
- default: return 0;
- }
- }
-
- /** The first parameter section of this type.
- */
- public Symbol[] firstParams() {
- switch (this) {
- case PolyType(_, Type restpe):
- return restpe.firstParams();
- case MethodType(Symbol[] params, _):
- return params;
- default: return Symbol.EMPTY_ARRAY;
- }
- }
-
- /** If this type is overloaded, its alternative types,
- * otherwise an array consisting of this type itself.
- */
- public Type[] alternativeTypes() {
- switch (this) {
- case OverloadedType(_, Type[] alttypes):
- return alttypes;
- default:
- return new Type[]{this};
- }
- }
-
- /** If this type is overloaded, its alternative symbols,
- * otherwise an empty array.
- */
- public Symbol[] alternativeSymbols() {
- switch (this) {
- case OverloadedType(Symbol[] alts, _):
- return alts;
- default:
- return Symbol.EMPTY_ARRAY;
- }
- }
-
-// Tests --------------------------------------------------------------------
-
- /** Is this type a an error type?
- */
- public boolean isError() {
- switch (this) {
- case ErrorType:
- return true;
- case ThisType(Symbol clasz):
- return clasz.isError();
- case SingleType(_, Symbol symbol):
- return symbol.isError();
- case TypeRef(_, Symbol symbol, _):
- return symbol.isError();
- case CompoundType(Type[] parts, Scope members):
- return symbol().isError();
- default:
- return false;
- }
- }
-
- /** Is this type a this type or singleton type?
- */
- public boolean isStable() {
- switch (unalias()) {
- case NoPrefix:
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return true;
- case TypeRef(_, Symbol sym, _):
- if (sym.isParameter() && sym.isSynthetic() && sym.hasStableFlag()) return true;
- return false;
- default:
- return false;
- }
- }
-
- /** Is this type a legal prefix?
- */
- public boolean isLegalPrefix() {
- switch (unalias()) {
- case NoPrefix:
- case ThisType(_):
- case SingleType(_, _):
- return true;
- case TypeRef(_, Symbol sym, _):
- if (sym.isParameter() && sym.isSynthetic()) return true;
- return false;
- /*
- return sym.kind == CLASS &&
- ((sym.flags & JAVA) != 0 ||
- (sym.flags & (TRAIT | ABSTRACT)) == 0);
- */
- default:
- return false;
- }
- }
-
- /** Is this type a s thistype or singletype?
- */
- public boolean isSingletonType() {
- switch (this) {
- case ThisType(_): case SingleType(_, _): return true;
- default: return false;
- }
- }
-
- /** Is this type a reference to an object type?
- * todo: replace by this.isSubType(global.definitions.ANY_TYPE())?
- */
- public boolean isObjectType() {
- switch (unalias()) {
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- case CompoundType(_, _):
- case TypeRef(_, _, _):
- return true;
- default:
- return false;
- }
- }
-
- /** Is this type of the form scala.FunctionN[T_1, ..., T_n, +T] or
- * scala.AnyRef with scala.FunctionN[T_1, ..., T_n, +T] or
- * java.lang.Object with scala.FunctionN[T_1, ..., T_n, +T]?
- */
- public boolean isFunctionType() {
- switch (this) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Definitions definitions = Global.instance.definitions;
- return args.length > 0
- && args.length <= definitions.FUNCTION_COUNT
- && sym == definitions.FUNCTION_CLASS[args.length - 1];
- case CompoundType(Type[] parents, Scope members):
- Definitions definitions = Global.instance.definitions;
- return members.isEmpty() &&
- parents.length == 2 &&
- (parents[0].symbol() == definitions.OBJECT_CLASS ||
- parents[0].symbol() == definitions.ANYREF_CLASS) &&
- parents[1].isFunctionType();
- }
- return false;
- }
-
- /** Is this a polymorphic method type?
- */
- public boolean isPolymorphic() {
- return typeParams().length > 0;
- }
-
- /** Is this a parameterized or polymorphic method type?
- */
- public boolean isParameterized() {
- switch (this) {
- case MethodType(_, _): return true;
- default: return isPolymorphic();
- }
- }
-
-// Members and Lookup -------------------------------------------------------
-
- /** Get the scope containing the local members of this type.
- * Symbols in this scope are not prefix-adapted!
- */
- public Scope members() {
- switch (this) {
- case ErrorType:
- return new Scope();
- case TypeRef(_, Symbol sym, _):
- return sym.info().members();
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().members();
- case CompoundType(Type[] basetypes, Scope members):
- return members;
- default:
- return Scope.EMPTY;
- }
- }
-
- /** Lookup symbol with given name among all local and inherited members
- * of this type; return Symbol.NONE if not found.
- */
- public Symbol lookup(Name name) {
- // The code below does the same as the following line but is
- // slightly faster
- // return lookup(new NameSearch(name, false));
-
- switch (this) {
- case ErrorType:
- return new ErrorScope(Symbol.NONE).lookup(name);
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().lookup(name);
- case TypeRef(_, Symbol sym, _):
- return sym.info().lookup(name);
- case CompoundType(Type[] parts, Scope members):
- Symbol sym = members.lookup(name);
- if (sym.kind != NONE) return sym;
- else return lookupNonPrivate(name);
- default:
- return Symbol.NONE;
- }
- }
-
- /** Lookup non-private symbol with given name among all local and
- * inherited members of this type; return Symbol.NONE if not found.
- */
- public Symbol lookupNonPrivate(Name name) {
- // The code below does the same as the following line but is
- // slightly faster
- // return lookup(new NameSearch(name, true));
-
- switch (this) {
- case ErrorType:
- return new ErrorScope(Symbol.NONE).lookup(name);
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().lookupNonPrivate(name);
- case TypeRef(_, Symbol sym, _):
- return sym.info().lookupNonPrivate(name);
- case CompoundType(Type[] parts, Scope members):
- Symbol sym = members.lookup(name);
- if (sym.kind != NONE && (sym.flags & PRIVATE) == 0) return sym;
- else return lookupNonPrivate(parts, name);
- default:
- return Symbol.NONE;
- }
- }
-
- public static Symbol lookupNonPrivate(Type[] parts, Name name) {
- // The code below does the same as the following line but is
- // slightly faster
- // return lookup(parts, new NameSearch(name, true));
-
- // search base types in reverse; non-abstract members
- // take precedence over abstract ones.
- int i = parts.length;
- Symbol sym = Symbol.NONE;
- while (i > 0) {
- i--;
- Symbol sym1 = parts[i].lookupNonPrivate(name);
- if (sym1.kind != NONE &&
- (sym.kind == NONE
- ||
- (sym.flags & DEFERRED) != 0 &&
- (sym1.flags & DEFERRED) == 0
- ||
- (sym.flags & DEFERRED) == (sym1.flags & DEFERRED) &&
- sym1.owner().isSubClass(sym.owner())))
- sym = sym1;
- }
- return sym;
- }
-
- /**
- * Looks up in the current type a symbol with the same name as the
- * given symbol and whose type (as seen from the given prefix) is
- * in the given relation to the type (as seen from the given
- * prefix) of the given symbol. If no such symbol is found,
- * returns NONE. Note that in some cases, the returned symbol may
- * be equal to the given one. The main purpose of this method is
- * look up overridden and overriding symbols.
- */
- public Symbol lookup(Symbol symbol, Type prefix, Relation relation) {
- assert !symbol.isOverloaded(): Debug.show(symbol);
- if (symbol.isPrivate() || symbol.isInitializer())
- return symbol().isSubClass(symbol.owner()) ? symbol : Symbol.NONE;
- Symbol best = search(new SymbolSearch(symbol, prefix, relation));
- return best == null ? Symbol.NONE : best;
- }
-
- /**
- * Applies the given search to this type. Returns NONE on failure.
- */
- public Symbol lookup(Search search) {
- Symbol symbol = search(search);
- return symbol == null ? Symbol.NONE : symbol;
- }
-
- /**
- * Applies the given search to the given types. Returns NONE on
- * failure.
- */
- public static Symbol lookup(Type[] parents, Search search) {
- Symbol symbol = search(parents, search);
- return symbol == null ? Symbol.NONE : symbol;
- }
-
- /**
- * Applies the given search to this type. Returns null on failure.
- */
- public Symbol search(Search search) {
- return search(this, search, null, false);
- }
-
- /**
- * Applies the given search to the given types. Returns null on
- * failure.
- */
- public static Symbol search(Type[] parents, Search search) {
- Symbol best = null;
- for (int i = parents.length - 1; 0 <= i; i--)
- best = search(parents[i], search, best, true);
- return best;
- }
-
- /**
- * Applies the given search to the given type. The symbol "best"
- * is the best symbol found until now. It may be null. If no
- * better symbol is found, the method returns this symbol. The
- * flag "inherited" indicates whether the given type is the
- * initial type (false) or is a type inherited by it (true).
- */
- private static Symbol search(Type type, Search search, Symbol best,
- boolean inherited)
- {
- while (true) {
- switch (type) {
- case ErrorType:
- return best != null ? best : search.error();
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- type = type.singleDeref();
- continue;
- case TypeRef(_, Symbol symbol, _):
- type = symbol.info();
- continue;
- case CompoundType(Type[] parents, Scope members):
- // The following code could be used to cut the search, but
- // it is unclear whether it is faster
- // if (best != null && !best.isDeferred())
- // if (!type.symbol().isSubClass(best.owner())) return best;
- Symbol symbol = search.apply(members, inherited);
- if (symbol != null) {
- // !!! This assertion fails for "pos/clsrefine".
- // There might be a bug in the analyzer.
- // assert type.symbol().isSubClass(symbol.owner()):
- // Debug.show(type, type.symbol(), symbol);
- if ((best == null)
- ||
- (best.isDeferred() && !symbol.isDeferred())
- ||
- ((best.isDeferred() == symbol.isDeferred()) &&
- symbol.owner().isSubClass(best.owner())))
- return symbol;
- }
- for (int i = parents.length - 1; 0 <= i; i--)
- best = search(parents[i], search, best, true);
- return best;
- default:
- return null;
- }
- }
- }
-
- public static abstract class Search {
- /**
- * This method is applied to each encountered scope. The flag
- * "inherited" indicates whether the scope is part of the
- * initial type (false) or if it is inherited by it (true).
- */
- public abstract Symbol apply(Scope members, boolean inherited);
- /** This method is applied to each encountered error type. */
- public abstract Symbol error();
- }
-
- /** Seaches a symbol with the given name. */
- public static class NameSearch extends Search {
- public final Name name;
- public final boolean nonPrivate;
- public NameSearch(Name name, boolean nonPrivate) {
- this.name = name;
- this.nonPrivate = nonPrivate;
- }
- public Symbol apply(Scope members, boolean inherited) {
- Symbol symbol = members.lookup(name);
- if (!symbol.isNone())
- if (!inherited || !nonPrivate || (symbol.flags & PRIVATE) == 0)
- return symbol;
- return null;
- }
- public Symbol error() {
- return name.isTermName()
- ? Symbol.NONE.newErrorValue(name)
- : Symbol.NONE.newErrorClass(name);
- }
- }
-
- /**
- * Searches a symbol with the same name as the given source symbol
- * and whose type (as seen from the given prefix) is in the given
- * relation to the type (as seen from the given prefix) of the
- * source symbol. Note that in some cases, the returned symbol may
- * be equal to the source one. This search is useful to find
- * overridden and overriding symbols.
- */
- public static class SymbolSearch extends Search {
-
- /** The type which the symbols are seen from */
- public final Type prefix;
- /** The source symbol */
- public final Symbol srcsym;
- /** The source symbol's type as seen from the prefix */
- public final Type srctype;
- /** The java version of the previous type */
- public Type srcjavatype;
- /** The type relation between returned and source symbols. */
- public final Relation relation;
-
- public SymbolSearch(Symbol srcsym, Type prefix, Relation relation) {
- this.prefix = prefix;
- this.srcsym = srcsym;
- this.srctype = getSeenTypeOf(srcsym);
- this.relation = relation;
- assert !srcsym.isOverloaded(): Debug.show(srcsym);
- }
-
- public Symbol apply(Scope members, boolean inherited) {
- Symbol objsym = members.lookup(srcsym.name);
- if (objsym.isNone()) return null;
- switch (objsym.type()) {
- case NoType:
- case ErrorType:
- return null;
- case OverloadedType(Symbol[] alts, _):
- for (int j = 0; j < alts.length; j++)
- if (areRelated(alts[j], false)) return alts[j];
- return null;
- default:
- return areRelated(objsym, true) ? objsym : null;
- }
- }
-
- public Symbol error() {
- return null;
- }
-
- private Type getSeenTypeOf(Symbol symbol) {
- return prefix.memberType(symbol).derefDef();
- }
-
- private Type getSrcTypeFor(Symbol objsym) {
- if (!objsym.isJava()) return srctype;
- if (srcjavatype == null) srcjavatype = srctype.objParamToAny();
- return srcjavatype;
- }
-
- private boolean areRelated(Symbol objsym, boolean warn) {
- if (objsym == srcsym) return true;
- if (objsym.isPrivate() || objsym.isInitializer()) return false;
- Type srctype = getSrcTypeFor(objsym);
- Type objtype = getSeenTypeOf(objsym);
-// System.out.println(""
-// + "Is 'objsym' " + relation + " 'srcsym' in 'prefix' ?"
-// + "\n srcsym : " + Debug.show(srcsym)
-// + "\n objsym : " + Debug.show(objsym)
-// + "\n srcsym.type: " + srcsym.type()
-// + "\n objsym.type: " + objsym.type()
-// + "\n prefix : " + prefix
-// + "\n srctype : " + srctype
-// + "\n objtype : " + objtype
-// + "\n result : " + objtype.compareTo(srctype, relation)
-// );//DEBUG
- if (objtype.compareTo(srctype, relation)) return true;
- if (warn && Global.instance.debug) System.out.println(""
- + "'objsym' is not " + relation + " 'srcsym' in 'prefix'"
- + "\n srcsym : " + Debug.show(srcsym)
- + "\n objsym : " + Debug.show(objsym)
- + "\n srcsym.type: " + srcsym.type()
- + "\n objsym.type: " + objsym.type()
- + "\n prefix : " + prefix
- + "\nsince 'objtype' " + relation.toString(true) + " 'srctype'"
- + "\n srctype : " + srctype
- + "\n objtype : " + objtype
- );//DEBUG
- return false;
- }
-
- }
- //where
- static private Map objToAnyMap = new Map() {
- public Type apply(Type t) {
- if (t.symbol() == Global.instance.definitions.OBJECT_CLASS)
- return Global.instance.definitions.ANY_TYPE();
- else return t;
- }
- };
-
- private Type objParamToAny() {
- switch (this) {
- case MethodType(Symbol[] params, Type restp):
- Symbol[] params1 = objToAnyMap.map(params);
- if (params1 == params) return this;
- else return MethodType(params1, restp);
- default:
- return this;
- }
- }
-
-// Set Owner ------------------------------------------------------------------
-
- public Type setOwner(Symbol owner) {
- switch (this) {
- case PolyType(Symbol[] tparams, Type restpe):
- Type restpe1 = restpe.setOwner(owner);
- if (restpe1 == restpe) return this;
- else return Type.PolyType(tparams, restpe1);
- case MethodType(Symbol[] params, Type restpe):
- Symbol[] params1 = params;
- if (params.length > 0 &&
- params[0].owner() != owner && params[0].owner() != Symbol.NONE) {
- params1 = new Symbol[params.length];
- for (int i = 0; i < params.length; i++)
- params1[i] = params[i].cloneSymbol();
- }
- for (int i = 0; i < params.length; i++)
- params1[i].setOwner(owner);
- Type restpe1 = restpe.setOwner(owner);
- if (params1 == params && restpe1 == restpe) return this;
- else return Type.MethodType(params1, restpe1);
- default:
- return this;
- }
- }
-
-// Maps --------------------------------------------------------------------------
-
- /** The type of type-to-type functions.
- */
- public abstract static class Map {
-
- public abstract Type apply(Type t);
-
- /**
- * This method assumes that all symbols in MethodTypes and
- * PolyTypes have already been cloned.
- */
- public Type applyParams(Type type) {
- switch (type) {
-
- case MethodType(Symbol[] vparams, Type result):
- map(vparams, true);
- Type result1 = applyParams(result);
- return result == result1 ? type : MethodType(vparams, result1);
-
- case PolyType(Symbol[] tparams, Type result):
- map(tparams, true);
- Type result1 = applyParams(result);
- return result == result1 ? type : PolyType(tparams, result1);
-
- default:
- return apply(type);
- }
- }
-
- /** Apply map to all top-level components of this type.
- */
- public Type map(Type tp) {
- switch (tp) {
- case ErrorType:
- case AnyType:
- case NoType:
- case NoPrefix:
- case UnboxedType(_):
- case TypeVar(_, _):
- case ThisType(_):
- return tp;
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Type pre1 = apply(pre);
- Type[] args1 = map(args);
- if (pre1 == pre && args1 == args) return tp;
- else return typeRef(pre1, sym, args1);
- case SingleType(Type pre, Symbol sym):
- Type pre1 = apply(pre);
- if (pre1 == pre) return tp;
- else return singleType(pre1, sym);
- case ConstantType(Type base, AConstant value):
- Type base1 = apply(base);
- if (base1 == base) return tp;
- else return new ConstantType(base1, value);
- case CompoundType(Type[] parts, Scope members):
- Type[] parts1 = map(parts);
- Scope members1 = map(members);
- if (parts1 == parts && members1 == members) {
- return tp;
- } else if (members1 == members && !tp.symbol().isCompoundSym()) {
- return compoundType(parts1, members, tp.symbol());
- } else {
- Scope members2 = new Scope();
- //Type tp1 = compoundType(parts1, members2);
- Type tp1 = (tp.symbol().isCompoundSym()) ? compoundTypeWithOwner(tp.symbol().owner(), parts1, members2)
- : compoundType(parts1, members2, tp.symbol());
- Symbol[] syms1 = members1.elements();
- Symbol[] syms2 = new Symbol[syms1.length];
- for (int i = 0; i < syms2.length; i++) {
- syms2[i] = syms1[i].cloneSymbol(tp1.symbol());
- }
- for (int i = 0; i < syms2.length; i++) {
- syms2[i].setInfo(syms1[i].info().subst(syms1, syms2));
- if (syms2[i].kind == TYPE) {
- syms2[i].setLoBound(syms1[i].loBound().subst(syms1, syms2));
- syms2[i].setVuBound(syms1[i].vuBound().subst(syms1, syms2));
- }
- }
- for (int i = 0; i < syms2.length; i++) {
- members2.enter(syms2[i]);
- }
- return tp1;
- }
-
- case MethodType(Symbol[] vparams, Type result):
- Symbol[] vparams1 = map(vparams);
- Type result1 = apply(result);
- if (vparams1 == vparams && result1 == result) return tp;
- else return MethodType(vparams1, result1);
- case PolyType(Symbol[] tparams, Type result):
- Symbol[] tparams1 = map(tparams);
- Type result1 = apply(result);
- if (tparams1 != tparams) result1 = result1.subst(tparams, tparams1);
- if (tparams1 == tparams && result1 == result) return tp;
- else return PolyType(tparams1, result1);
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- Type[] alttypes1 = map(alttypes);
- if (alttypes1 == alttypes) return tp;
- else return OverloadedType(alts, alttypes1);
- case UnboxedArrayType(Type elemtp):
- Type elemtp1 = apply(elemtp);
- if (elemtp1 == elemtp) return tp;
- else return UnboxedArrayType(elemtp1);
- default:
- throw new ApplicationError(tp + " " + tp.symbol());
- }
- }
-
- public final Symbol map(Symbol sym) {
- return map(sym, false);
- }
- public Symbol map(Symbol sym, boolean dontClone) {
- Type tp = sym.info();
- Type tp1 = apply(tp);
- if (tp != tp1) {
- if (!dontClone) sym = sym.cloneSymbol();
- sym.setInfo(tp1);
- dontClone = true;
- }
- if (sym.kind == TYPE) {
- Type lb = sym.loBound();
- Type lb1 = apply(lb);
- if (lb != lb1) {
- if (!dontClone) sym = sym.cloneSymbol();
- sym.setLoBound(lb1);
- }
- Type vb = sym.vuBound();
- Type vb1 = apply(vb);
- if (vb != vb1) {
- if (!dontClone) sym = sym.cloneSymbol();
- sym.setVuBound(vb1);
- }
- }
- return sym;
- }
-
- public Type[] map(Type[] tps) {
- Type[] tps1 = tps;
- for (int i = 0; i < tps.length; i++) {
- Type tp = tps[i];
- Type tp1 = apply(tp);
- if (tp1 != tp && tps1 == tps) {
- tps1 = new Type[tps.length];
- System.arraycopy(tps, 0, tps1, 0, i);
- }
- tps1[i] = tp1;
- }
- return tps1;
- }
-
- /** Apply map to all elements of this array of symbols,
- * preserving recursive references to symbols in the array.
- */
- public final Symbol[] map(Symbol[] syms) {
- return map(syms, false);
- }
- public Symbol[] map(Symbol[] syms, boolean dontClone) {
- Symbol[] syms1 = syms;
- for (int i = 0; i < syms.length; i++) {
- Symbol sym = syms[i];
- Symbol sym1 = map(sym, dontClone);
- if (sym != sym1 && syms1 == syms) {
- syms1 = new Symbol[syms.length];
- System.arraycopy(syms, 0, syms1, 0, i);
- }
- syms1[i] = sym1;
- }
- if (syms1 != syms) {
- for (int i = 0; i < syms1.length; i++) {
- if (syms1[i] == syms[i])
- syms1[i] = syms[i].cloneSymbol();
- }
- new SubstSymMap(syms, syms1).map(syms1, true);
- }
- return syms1;
- }
-
- /** Apply map to all elements of this array of this scope.
- */
- public Scope map(Scope s) {
- Symbol[] members = s.elements();
- Symbol[] members1 = map(members);
- if (members == members1) return s;
- else return new Scope(members1);
- }
- }
-
- public abstract static class MapOnlyTypes extends Map {
- public Symbol map(Symbol sym, boolean dontClone) { return sym; }
- public Symbol[] map(Symbol[] syms, boolean dontClone) { return syms; }
- public Scope map(Scope s) { return s; }
- }
-
- public static final Map IdMap = new Map() {
- public Type apply(Type tp) { return tp; }
- public Type applyParams(Type tp) { return tp; }
- public Type map(Type tp) { return tp; }
- public Symbol map(Symbol sym, boolean dontClone) { return sym; }
- public Type[] map(Type[] tps) { return tps; }
- public Symbol[] map(Symbol[] syms, boolean dontClone) { return syms; }
- public Scope map(Scope scope) { return scope; }
- };
-
-// baseType and asSeenFrom --------------------------------------------------------
-
- /** Return the base type of this type whose symbol is `clazz', or NoType, if
- * such a type does not exist.
- */
- public Type baseType(Symbol clazz) {
- //System.out.println(this + ".baseType(" + clazz + ")");//DEBUG
- switch (this) {
- case ErrorType:
- return ErrorType;
-
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().baseType(clazz);
-
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym == clazz)
- return this;
- else if (sym.kind == TYPE)
- return sym.info()
- .asSeenFrom(pre, sym.owner()).baseType(clazz);
- else if (sym.kind == ALIAS)
- return Type.NoType;
- else if (clazz.isCompoundSym())
- return NoType;
- else {
- return sym.baseType(clazz)
- .asSeenFrom(pre, sym.owner())
- .subst(sym.typeParams(), args);
- }
-
- case CompoundType(Type[] parts, _):
- for (int i = parts.length - 1; i >= 0; i--) {
- Type result = parts[i].baseType(clazz);
- if (result != NoType) return result;
- }
- break;
-
- case UnboxedArrayType(_):
- if (clazz == Global.instance.definitions.ANY_CLASS ||
- clazz == Global.instance.definitions.ANYREF_CLASS)
- return clazz.type();
- }
- return NoType;
- }
-
- /** A map to implement `asSeenFrom'.
- */
- static class AsSeenFromMap extends Map {
-
- private final Type pre;
- private final Symbol clazz;
-
- AsSeenFromMap(Type pre, Symbol clazz) {
- this.pre = pre;
- this.clazz = clazz;
- }
-
- public Type apply(Type type) {
- //System.out.println(type + " as seen from " + pre + "," + clazz);//DEBUG
- if (pre == NoType || clazz.kind != CLASS) return type;
- switch (type) {
- case ThisType(Symbol sym):
- return type.toPrefix(sym, pre, clazz);
- case TypeRef(Type prefix, Symbol sym, Type[] args):
- if (sym.owner().isPrimaryConstructor()) {
- assert sym.kind == TYPE;
- return type.toInstance(sym, pre, clazz);
- }
- return map(type);
-
- case SingleType(Type prefix, Symbol sym):
- try {
- return map(type);
- } catch (Type.Malformed ex) {}
- return apply(type.singleDeref());
-
- default:
- return map(type);
- }
- }
- }
- //where
- Type toInstance(Symbol sym, Type pre, Symbol clazz) {
- if (pre == NoType || clazz.kind != CLASS)
- return this;
- Symbol ownclass = sym.owner().constructorClass();
- if (ownclass == clazz &&
- pre.widen().symbol().isSubClass(ownclass)) {
- switch (pre.baseType(ownclass)) {
- case TypeRef(_, Symbol basesym, Type[] baseargs):
- Symbol[] baseparams = basesym.typeParams();
- for (int i = 0; i < baseparams.length; i++) {
- if (sym == baseparams[i]) return baseargs[i];
- }
- //System.out.println(sym + " " + basesym + " " + ArrayApply.toString(baseparams));//DEBUG
- break;
- case ErrorType:
- return ErrorType;
- }
- throw new ApplicationError(
- this + " in " + ownclass + " cannot be instantiated from " + pre.widen()
- );
- } else {
- return toInstance(sym, pre.baseType(clazz).prefix(), clazz.owner());
- }
- }
-
- Type toPrefix(Symbol sym, Type pre, Symbol clazz) {
- //System.out.println(this + ".toPrefix(" + sym + "," + pre + "," + clazz + ")");//DEBUG
- if (pre == NoType || clazz.kind != CLASS)
- return this;
- else if (sym.isSubClass(clazz) &&
- pre.widen().symbol().isSubClass(sym))
- return pre;
- else
- return toPrefix(sym, pre.baseType(clazz).prefix(), clazz.owner());
- }
-
- /** This type as seen from prefix `pre' and class `clazz'. This means:
- * Replace all thistypes of `clazz' or one of its subclasses by `pre'
- * and instantiate all parameters by arguments of `pre'.
- * Proceed analogously for thistypes referring to outer classes.
- */
- public Type asSeenFrom(Type pre, Symbol clazz) {
- //System.out.println("computing asseenfrom of " + this + " with " + pre + "," + clazz);//DEBUG
- return new AsSeenFromMap(pre, clazz).apply(this);
- }
-
- /** Types `these' as seen from prefix `pre' and class `clazz'.
- */
- public static Type[] asSeenFrom(Type[] these, Type pre, Symbol clazz) {
- return new AsSeenFromMap(pre, clazz).map(these);
- }
-
- /** The info of `sym', seen as a member of this type.
- */
- public Type memberInfo(Symbol sym) {
- return sym.info().asSeenFrom(this, sym.owner());
- }
-
- /** The type of `sym', seen as a member of this type.
- */
- public Type memberType(Symbol sym) {
- return sym.type().asSeenFrom(this, sym.owner());
- }
-
- /** The stabilized type of `sym', seen as a member of this type.
- */
- public Type memberStabilizedType(Symbol sym) {
- return sym.isStable() && this.isStable()
- ? Type.singleTypeMethod(this, sym)
- : this.memberType(sym);
- }
-
- /** The low bound of `sym', seen as a member of this type.
- */
- public Type memberLoBound(Symbol sym) {
- return sym.loBound().asSeenFrom(this, sym.owner());
- }
-
- /** The view bound of `sym', seen as a member of this type.
- */
- public Type memberVuBound(Symbol sym) {
- return sym.vuBound().asSeenFrom(this, sym.owner());
- }
-
-// Substitutions ---------------------------------------------------------------
-
- /** A common map superclass for symbol/symbol and type/symbol substitutions.
- */
- public static abstract class SubstMap extends Map {
- private Symbol[] from;
-
- SubstMap(Symbol[] from) {
- this.from = from;
- }
-
- public boolean matches(Symbol sym1, Symbol sym2) {
- return sym1 == sym2;
- }
-
- /** Produce replacement type
- * @param i The index in `from' of the symbol to be replaced.
- * @param fromtp The type referring to this symbol.
- */
- protected abstract Type replacement(int i, Type fromtp);
-
- /** Produce new substitution where some symbols are excluded.
- * @param newfrom The new array of from symbols (without excluded syms)
- * @param excluded The array of excluded sysmbols
- */
- protected abstract SubstMap exclude(Symbol[] newfrom, Symbol[] excluded);
-
- public Type apply(Type t) {
- switch (t) {
- case TypeRef(NoPrefix, Symbol sym, Type[] args):
- for (int i = 0; i < from.length; i++) {
- if (matches(sym, from[i])) return replacement(i, t);
- }
- break;
- case SingleType(NoPrefix, Symbol sym):
- for (int i = 0; i < from.length; i++) {
- if (matches(sym, from[i])) return replacement(i, t);
- }
- break;
- case PolyType(Symbol[] tparams, Type result):
- Symbol[] from1 = excludeSyms(from, tparams, from);
- if (from1 != from) {
- SubstMap f = exclude(from1, tparams);
- Symbol[] tparams1 = f.map(tparams);
- Type result1 = f.apply(result);
- if (tparams1 != tparams)
- result1 = result1.subst(tparams, tparams1);
- if (tparams1 == tparams && result1 == result) return t;
- else return PolyType(tparams1, result1);
- }
- }
- return map(t);
- }
- //where
- private boolean contains1(Symbol[] syms, Symbol sym) {
- int i = 0;
- while (i < syms.length && syms[i] != sym) i++;
- return i < syms.length;
- }
-
- private int nCommon(Symbol[] from, Symbol[] tparams) {
- int cnt = 0;
- for (int i = 0; i < from.length; i++) {
- if (contains1(tparams, from[i])) cnt++;
- }
- return cnt;
- }
-
- private Symbol[] excludeSyms(Symbol[] from, Symbol[] tparams, Symbol[] syms) {
- int n = nCommon(from, tparams);
- if (n == 0) {
- return syms;
- } else {
- Symbol[] syms1 = new Symbol[syms.length - n];
- int j = 0;
- for (int i = 0; i < from.length; i++) {
- if (!contains1(tparams, from[i])) syms1[j++] = syms[i];
- }
- return syms1;
- }
- }
-
- private Type[] excludeTypes(Symbol[] from, Symbol[] tparams, Type[] types) {
- int n = nCommon(from, tparams);
- if (n == 0) {
- return types;
- } else {
- Type[] types1 = new Type[types.length - n];
- int j = 0;
- for (int i = 0; i < from.length; i++) {
- if (!contains1(tparams, from[i])) types1[j++] = types[i];
- }
- return types1;
- }
- }
- }
-
- /** A map for symbol/symbol substitutions
- */
- public static class SubstSymMap extends SubstMap {
- Symbol[] to;
- protected SubstSymMap(Symbol[] from, Symbol[] to) {
- super(from);
- this.to = to;
- }
- protected Type replacement(int i, Type fromtp) {
- switch (fromtp) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- return typeRef(pre, to[i], args);
- case SingleType(Type pre, Symbol sym):
- return singleType(pre, to[i]);
- default:
- throw new ApplicationError();
- }
- }
- protected SubstMap exclude(Symbol[] newfrom, Symbol[] excluded) {
- return new SubstSymMap(newfrom, excludeSyms(from, excluded, to));
- }
- }
-
- /** A map for type/symbol substitutions
- */
- public static class SubstTypeMap extends SubstMap {
- Type[] to;
- public SubstTypeMap(Symbol[] from, Type[] to) {
- super(from);
- this.to = to;
- }
- public Type replacement(int i, Type fromtp) {
- return to[i];
- }
- public SubstMap exclude(Symbol[] newfrom, Symbol[] excluded) {
- return new SubstTypeMap(newfrom, excludeTypes(from, excluded, to));
- }
- }
-
-
- /** A map for symbol/symbol substitutions which, instead of
- * cloning parameters, updates their symbol's types.
- */
- public static class UpdateSubstSymMap extends SubstSymMap {
- protected UpdateSubstSymMap(Symbol[] from, Symbol[] to) {
- super(from, to);
- }
- public Type apply(Type t) {
- switch (t) {
- case PolyType(Symbol[] params, Type result):
- // !!! Also update loBounds? How? loBound can only be set!
- for (int i = 0; i < params.length; i++) {
- Type tp = params[i].nextType();
- Type tp1 = apply(tp);
- if (tp != tp1) params[i].updateInfo(tp1);
- }
- Type result1 = apply(result);
- if (result1 == result) return t;
- else return Type.PolyType(params, result1);
- case MethodType(Symbol[] params, Type result):
- for (int i = 0; i < params.length; i++) {
- Type tp = params[i].nextType();
- Type tp1 = apply(tp);
- if (tp != tp1) params[i].updateInfo(tp1);
- }
- Type result1 = apply(result);
- if (result1 == result) return t;
- else return Type.MethodType(params, result1);
- default:
- return super.apply(t);
- }
- }
- public Symbol map(Symbol sym, boolean dontClone) { return sym; }
- public Symbol[] map(Symbol[] syms, boolean dontClone) { return syms; }
- public Scope map(Scope s) { return s; }
- }
-
- /** Returns the given non-updating symbol/symbol substitution. */
- public static Map getSubst(Symbol[] from, Symbol[] to) {
- return getSubst(from, to, false);
- }
-
- /** Returns the given (updating?) symbol/symbol substitution. */
- public static Map getSubst(Symbol[] from, Symbol[] to, boolean update) {
- if (from.length == 0 && to.length == 0) return IdMap;
- if (update) return new UpdateSubstSymMap(from, to);
- return new SubstSymMap(from, to);
- }
-
- /** Returns the given non-updating symbol/type substitution. */
- public static Map getSubst(Symbol[] from, Type[] to) {
- if (from.length == 0 && to.length == 0) return IdMap;
- return new SubstTypeMap(from, to);
- }
-
- /** Substitute symbols `to' for occurrences of symbols `from' in this type.
- */
- public Type subst(Symbol[] from, Symbol[] to) {
- if (to.length != 0 && from != to) {//!!!
- assert from.length == to.length
- : this + ": " + from.length + " != " + to.length;
- return new SubstSymMap(from, to).apply(this);
- } else return this;
- }
-
- /** Substitute symbols `to' for occurrences of symbols `from' in these types.
- */
- public static Type[] subst(Type[] these, Symbol[] from, Symbol[] to) {
- if (these.length != 0 && to.length != 0 && from != to) {
- assert from.length == to.length;
- return new SubstSymMap(from, to).map(these);
- } else return these;
- }
-
- /** Substitute types `to' for occurrences of symbols `from' in this type.
- */
- public Type subst(Symbol[] from, Type[] to) {
- if (to.length != 0) {
- assert from.length == to.length
- : this + ": " + Debug.show(from) + " <> " + ArrayApply.toString(to);
- return new SubstTypeMap(from, to).apply(this);
- } else return this;
- }
-
- /** Substitute types `to' for occurrences of symbols `from' in these types.
- */
- public static Type[] subst(Type[] these, Symbol[] from, Type[] to) {
- if (these.length != 0 && to.length != 0) {
- assert from.length == to.length;
- return new SubstTypeMap(from, to).map(these);
- } else return these;
- }
-
- /**
- * A map that substitutes ThisTypes of a given class by a given
- * type. All occurrences of the type parameters of the given class
- * are replaced by the type arguments extracted from the given
- * type. Furthermore, the prefixes of the given type are used to
- * substitute, in the same way, the ThisTypes of the outer classes
- * of the given class.
- *
- * object Foo {
- * class C[D] { class I[J]; }
- * val c: C[Int] = new C[Int];
- * class M[N] extends c.I[N];
- * }
- *
- * In the code above, a ThisTypeMap of class "I" and type
- * "ThisType(M)", would do the following substitutions:
- *
- * - ThisType(I) -> ThisType(M)
- * - TypeRef(_, J, _) -> TypeRef(_, N, -)
- * - ThisType(C) -> SingleType(ThisType(Foo), c)
- * - TypeRef(_, D, _) -> TypeRef(_, Int, _)
- */
- private static class ThisTypeMap extends Map {
-
- private static Map create(Symbol clasz, Type type) {
- HashMap subst = getSubst(clasz, type, 0);
- return subst == null ? IdMap : new ThisTypeMap(subst);
- }
-
- private static HashMap getSubst(Symbol clasz, Type type, int capacity){
- switch (type) {
- case NoPrefix:
- return getSubst(capacity);
- case ThisType(Symbol symbol):
- if (symbol == clasz) return getSubst(capacity);
- }
- Type base = type.baseType(clasz);
- switch (base) {
- case TypeRef(Type prefix, Symbol symbol, Type[] args):
- capacity += 1 + args.length;
- HashMap subst = getSubst(clasz.owner(), prefix, capacity);
- subst.put(clasz, type);
- Symbol[] params = clasz.typeParams();
- assert symbol == clasz && args.length == params.length:
- type + " @ " + Debug.show(clasz) + " -> " + base;
- for (int i = 0; i < params.length; i++) {
- assert params[i].isParameter(): Debug.show(params[i]);
- subst.put(params[i], args[i]);
- }
- return subst;
- default:
- throw Debug.abort("illegal case",
- type + " @ " + Debug.show(clasz) + " -> " + base);
- }
- }
-
- private static HashMap getSubst(int capacity) {
- return capacity == 0 ? null : new HashMap(capacity);
- }
-
- private final HashMap/*<Symbol,Type>*/ subst;
-
- private ThisTypeMap(HashMap subst) {
- this.subst = subst;
- }
-
- public Type apply(Type type) {
- switch (type) {
- case ThisType(Symbol symbol):
- Object lookup = subst.get(symbol);
- if (lookup == null) break;
- return (Type)lookup;
- case TypeRef(NoPrefix, Symbol symbol, Type[] args):
- if (!symbol.isParameter()) break;
- assert args.length == 0: type;
- Object lookup = subst.get(symbol);
- if (lookup == null) break;
- return (Type)lookup;
- }
- return map(type);
- }
-
- public String toString() {
- return subst.toString();
- }
-
- }
-
- /** Returns a ThisTypeMap of given class and type. */
- public static Map getThisTypeMap(Symbol clasz, Type type) {
- return ThisTypeMap.create(clasz, type);
- }
-
- /** A map for substitutions of thistypes.
- */
- public static class SubstThisMap extends Map {
- Symbol from;
- Type to;
- public SubstThisMap(Symbol from, Type to) {
- this.from = from;
- this.to = to;
- }
- public SubstThisMap(Symbol oldSym, Symbol newSym) {
- this(oldSym, newSym.thisType());
- }
- public Type apply(Type type) {
- switch (type) {
- case ThisType(Symbol sym):
- return sym == from ? to : type;
- default:
- return map(type);
- }
- }
- }
-
- public Type substThis(Symbol from, Type to) {
- return new SubstThisMap(from, to).apply(this);
- }
-
- public static Type[] substThis(Type[] these, Symbol from, Type to) {
- return new SubstThisMap(from, to).map(these);
- }
-
- static class ContainsMap extends Map {
- boolean result = false;
- Symbol sym;
- ContainsMap(Symbol sym) {
- this.sym = sym;
- }
- public Type apply(Type t) {
- if (!result) {
- switch (t) {
- case TypeRef(Type pre, Symbol sym1, Type[] args):
- if (sym == sym1) result = true;
- else { map(pre); map(args); }
- break;
- case SingleType(Type pre, Symbol sym1):
- map(pre);
- if (sym == sym1) result = true;
- break;
- default:
- map(t);
- }
- }
- return t;
- }
- }
-
- /** Does this type contain symbol `sym'?
- */
- public boolean contains(Symbol sym) {
- ContainsMap f = new ContainsMap(sym);
- f.apply(this);
- return f.result;
- }
-
- /** Does this type contain any of the symbols `syms'?
- */
- public boolean containsSome(Symbol[] syms) {
- for (int i = 0; i < syms.length; i++)
- if (contains(syms[i])) return true;
- return false;
- }
-
-// Cloning ---------------------------------------------------------------
-
- /** Returns a shallow copy of the given array. */
- public static Type[] cloneArray(Type[] array) {
- return cloneArray(0, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items.
- */
- public static Type[] cloneArray(int prefix, Type[] array) {
- return cloneArray(prefix, array, 0);
- }
-
- /**
- * Returns a shallow copy of the given array suffixed by "suffix"
- * null items.
- */
- public static Type[] cloneArray(Type[] array, int suffix) {
- return cloneArray(0, array, suffix);
- }
-
- /**
- * Returns a shallow copy of the given array prefixed by "prefix"
- * null items and suffixed by "suffix" null items.
- */
- public static Type[] cloneArray(int prefix, Type[] array, int suffix) {
- assert prefix >= 0 && suffix >= 0: prefix + " - " + suffix;
- int size = prefix + array.length + suffix;
- if (size == 0) return EMPTY_ARRAY;
- Type[] clone = new Type[size];
- for (int i = 0; i < array.length; i++) clone[prefix + i] = array[i];
- return clone;
- }
-
- /** Returns the concatenation of the two arrays. */
- public static Type[] concat(Type[] array1, Type[] array2) {
- if (array1.length == 0) return array2;
- if (array2.length == 0) return array1;
- Type[] clone = cloneArray(array1.length, array2);
- for (int i = 0; i < array1.length; i++) clone[i] = array1[i];
- return clone;
- }
-
- /**
- * Clones a type i.e. returns a new type where all symbols in
- * MethodTypes and PolyTypes and CompoundTypes have been cloned.
- */
- public Type cloneType(Symbol oldOwner, Symbol newOwner) {
- SymbolCloner cloner = new SymbolCloner();
- cloner.owners.put(oldOwner, newOwner);
- return cloner.cloneType(this);
- }
-
- /**
- * Clones a type i.e. returns a new type where all symbols in
- * MethodTypes and PolyTypes have been cloned. This method
- * performs no substitution on the type of the cloned symbols.
- * Typically, the type of those symbols will be fixed later by
- * applying some Map.applyParams method to the returned type.
- */
- public Type cloneTypeNoSubst(SymbolCloner cloner) {
- switch (this) {
-
- case MethodType(Symbol[] vparams, Type result):
- Symbol[] clones = cloner.cloneSymbols(vparams);
- return Type.MethodType(clones, result.cloneTypeNoSubst(cloner));
-
- case PolyType(Symbol[] tparams, Type result):
- Symbol[] clones = cloner.cloneSymbols(tparams);
- return Type.PolyType(clones, result.cloneTypeNoSubst(cloner));
-
- default:
- return this;
- }
- }
-
-
-// Comparisons ------------------------------------------------------------------
-
- /** Type relations */
- public static class Relation {
- public case SubType; // this SubType that <=> this.isSubType(that)
- public case SameType; // this SameType that <=> this.isSameAs(that)
- public case SuperType; // this SuperType that <=> that.isSubType(this)
-
- public String toString() {
- return toString(false);
- }
- public String toString(boolean negate) {
- switch (this) {
- case SubType : return negate ? "!<=" : "<=";
- case SameType : return negate ? "!==" : "=";
- case SuperType: return negate ? "!>=" : ">=";
- default : throw Debug.abort("unknown relation", this);
- }
- }
- }
-
- /** Is this type in given relation to that type?
- */
- public boolean compareTo(Type that, Relation relation) {
- switch (relation) {
- case SubType : return this.isSubType(that);
- case SameType : return this.isSameAs(that);
- case SuperType: return that.isSubType(this);
- default : throw Debug.abort("unknown relation", relation);
- }
- }
-
- /** Is this type a subtype of that type?
- */
- public boolean isSubType(Type that) {
- if (explainSwitch) {
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(this + " < " + that + "?");
- indent++;
- }
- boolean result = isSubType0(that);
- if (explainSwitch) {
- indent--;
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(result);
- }
- return result;
- }
-
- public boolean isSubType0(Type that) {
- if (this == that) return true;
-
- switch (this) {
- case ErrorType:
- case AnyType:
- return true;
- }
-
- switch (that) {
- case ErrorType:
- case AnyType:
- return true;
-
- case NoType:
- case NoPrefix:
- return false;
-
- case ThisType(_):
- case SingleType(_, _):
- switch (this) {
- case ThisType(_):
- case SingleType(_, _):
- return this.isSameAs(that);
- default:
- if (this.isSameAs(that)) return true;
- }
- break;
-
- case ConstantType(_, _):
- switch (this) {
- case ConstantType(Type base, _):
- return this.isSameAs(that) || base.isSubType(that);
- }
- break;
-
- case TypeRef(Type pre1, Symbol sym1, Type[] args1):
- switch (this) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym == sym1 && pre.isSubType(pre1) &&
- isSubArgs(args, args1, sym.typeParams())
- ||
- sym.kind == TYPE && pre.memberInfo(sym).isSubType(that))
- return true;
- break;
- }
- if (sym1.kind == CLASS) {
- Type base = this.baseType(sym1);
- if (this != base && base.isSubType(that))
- return true;
- }
- break;
-
- case CompoundType(Type[] parts1, Scope members1):
- int i = 0;
- while (i < parts1.length && isSubType(parts1[i])) i++;
- if (i == parts1.length && specializes(members1))
- return true;
- break;
-
- case MethodType(Symbol[] ps1, Type res1):
- switch (this) {
- case MethodType(Symbol[] ps, Type res):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++) {
- Symbol p1 = ps1[i];
- Symbol p = ps[i];
- if (!p1.type().isSameAs(p.type()) ||
- (p1.flags & (DEF | REPEATED)) != (p.flags & (DEF | REPEATED)))
- return false;
- }
- return res.isSubType(res1);
- }
- break;
-
- case PolyType(Symbol[] ps1, Type res1):
- switch (this) {
- case PolyType(Symbol[] ps, Type res):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++)
- if (!ps1[i].info().subst(ps1, ps).isSubType(ps[i].info()) ||
- !ps[i].loBound().isSubType(ps1[i].loBound().subst(ps1, ps)) ||
- !ps1[i].vuBound().subst(ps1, ps).isSubType(ps[i].vuBound()))
- return false;
- return res.isSubType(res1.subst(ps1, ps));
- }
- break;
-
- case OverloadedType(Symbol[] alts1, Type[] alttypes1):
- for (int i = 0; i < alttypes1.length; i++) {
- if (!isSubType(alttypes1[i]))
- return false;
- }
- return true;
-
- case UnboxedType(int tag1):
- switch (this) {
- case UnboxedType(int tag):
- return tag == tag1;
- }
- break;
-
- case UnboxedArrayType(Type elemtp1):
- switch (this) {
- case UnboxedArrayType(Type elemtp):
- return elemtp.isSubType(elemtp1);
- }
- break;
-
- case TypeVar(Type origin, Constraint constr):
- //todo: should we test for equality with origin?
- if (constr.inst != NoType) {
- return this.isSubType(constr.inst);
- } else {
- constr.lobounds = new List(this, constr.lobounds);
- return true;
- }
-
- default:
- throw new ApplicationError(this + " <: " + that);
- }
-
- switch (this) {
- case NoType:
- case NoPrefix:
- return false;
- case ThisType(_):
- case SingleType(_, _):
- if (this.isSameAs(that)) return true;
- if (this.singleDeref().isSubType(that)) return true;
- break;
- case ConstantType(_, _):
- if (this.singleDeref().isSubType(that)) return true;
- break;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) {
- return constr.inst.isSubType(that);
- } else {
- constr.hibounds = new List(that, constr.hibounds);
- return true;
- }
-
- case TypeRef(_, Symbol sym, _):
- switch (that) {
- case TypeRef(_, Symbol sym1, _):
- if (sym1.kind == TYPE && this.isSubType(that.loBound()))
- return true;
- }
- if (sym == Global.instance.definitions.ALL_CLASS)
- return that.isSubType(Global.instance.definitions.ANY_TYPE());
- else if (sym == Global.instance.definitions.ALLREF_CLASS)
- return
- that.symbol() == Global.instance.definitions.ANY_CLASS ||
- (that.symbol() != Global.instance.definitions.ALL_CLASS &&
- that.isSubType(Global.instance.definitions.ANYREF_TYPE()));
- break;
-
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int i = 0; i < alttypes.length; i++) {
- if (alttypes[i].isSubType(that)) return true;
- }
- break;
-
- case CompoundType(Type[] parts, Scope members):
- int i = 0;
- while (i < parts.length) {
- if (parts[i].isSubType(that)) return true;
- i++;
- }
- break;
-
- case UnboxedArrayType(_):
- if (Global.instance.definitions.OBJECT_TYPE().isSubType(that))
- return true;
- // !!! we should probably also test for Clonable, Serializable, ...
- }
-
- return false;
- }
-
- /** Are types `these' subtypes of corresponding types `those'?
- */
- public static boolean isSubType(Type[] these, Type[] those) {
- if (these.length != those.length) return false;
- for (int i = 0; i < these.length; i++) {
- if (!these[i].isSubType(those[i])) return false;
- }
- return true;
- }
-
- /** Are types `these' arguments types conforming to corresponding types `those'?
- */
- static boolean isSubArgs(Type[] these, Type[] those, Symbol[] tparams) {
- if (these.length != those.length) return false;
- for (int i = 0; i < these.length; i++) {
- if ((tparams[i].flags & COVARIANT) != 0) {
- if (!these[i].isSubType(those[i])) return false;
- } else if ((tparams[i].flags & CONTRAVARIANT) != 0) {
- //System.out.println("contra: " + these[i] + " " + those[i] + " " + those[i].isSubType(these[i]));//DEBUG
- if (!those[i].isSubType(these[i])) return false;
- } else {
- if (!these[i].isSameAs(those[i])) return false;
- }
- }
- return true;
- }
-
- public static boolean isSubSet(Type[] alts, Type[] alts1) {
- for (int i = 0; i < alts.length; i++) {
- int j = 0;
- while (j < alts1.length && !alts1[j].isSameAs(alts[i])) j++;
- if (j == alts1.length) return false;
- }
- return true;
- }
-
- /** Does this type implement all symbols in scope `s' with same or stronger types?
- */
- public boolean specializes(Scope s) {
- for (Scope.SymbolIterator it = s.iterator();
- it.hasNext();) {
- if (!specializes(it.next())) return false;
- }
- return true;
- }
-
- /** Does this type implement symbol `sym1' with same or stronger type?
- */
- public boolean specializes(Symbol sym1) {
- if (explainSwitch) {
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(this + " specializes " + sym1 + "?");
- indent++;
- }
- boolean result = specializes0(sym1);
- if (explainSwitch) {
- indent--;
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(result);
- }
- return result;
- }
-
- private boolean specializes0(Symbol sym1) {
- Type self = narrow();
- Symbol[] tparams = symbol().typeParams();
- Type[] targs = typeArgs();
- Symbol sym = lookup(sym1.name);
- return
- sym.kind != NONE &&
- (sym == sym1
- ||
- (sym.kind == sym1.kind || sym1.kind == TYPE) &&
- self.memberInfo(sym).subst(tparams, targs)
- .isSubType(sym1.info().substThis(sym1.owner(), self)) &&
- sym1.loBound().substThis(sym1.owner(), self)
- .isSubType(self.memberLoBound(sym).subst(tparams, targs)) &&
- self.memberVuBound(sym).subst(tparams, targs)
- .isSubType(sym1.vuBound().substThis(sym1.owner(), self))
- ||
- (sym.kind == TYPE && sym1.kind == ALIAS &&
- sym1.info().unalias().isSameAs(sym.type())));
- }
-
- /** Is this type the same as that type?
- */
- public boolean isSameAs(Type that) {
- if (explainSwitch) {
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(this + " = " + that + "?");
- indent++;
- }
- boolean result = isSameAs0(that);
- if (explainSwitch) {
- indent--;
- for (int i = 0; i < indent; i++) System.out.print(" ");
- System.out.println(result);
- }
- return result;
- }
-
- public boolean isSameAs0(Type that) {
- if (this == that) return true;
-
- switch (this) {
- case ErrorType:
- case AnyType:
- return true;
-
- case ThisType(Symbol sym):
- switch (that) {
- case ThisType(Symbol sym1):
- return sym == sym1;
- case SingleType(Type pre1, Symbol sym1):
- return sym1.isModule()
- && sym == sym1.moduleClass()
- && sym.owner().thisType().isSameAs(pre1)
- ||
- this.singleDeref().isSingletonType() &&
- this.singleDeref().isSameAs(that)
- ||
- that.singleDeref().isSingletonType() &&
- this.isSameAs(that.singleDeref())
- ||
- deAlias(that) != that &&
- this.isSameAs(deAlias(that));
- default:
- if (deAlias(this) != this)
- return deAlias(this).isSameAs(that);
- }
- break;
-
- case SingleType(Type pre, Symbol sym):
- switch (that) {
- case SingleType(Type pre1, Symbol sym1):
- return sym == sym1 && pre.isSameAs(pre1)
- ||
- this.singleDeref().isSingletonType() &&
- this.singleDeref().isSameAs(that)
- ||
- that.singleDeref().isSingletonType() &&
- this.isSameAs(that.singleDeref())
- ||
- (deAlias(this) != this || deAlias(that) != that) &&
- deAlias(this).isSameAs(deAlias(that));
- case ThisType(Symbol sym1):
- return sym.isModule()
- && sym.moduleClass() == sym1
- && pre.isSameAs(sym1.owner().thisType())
- ||
- this.singleDeref().isSingletonType() &&
- this.singleDeref().isSameAs(that)
- ||
- that.singleDeref().isSingletonType() &&
- this.isSameAs(that.singleDeref())
- ||
- deAlias(this) != this &&
- deAlias(this).isSameAs(that);
- default:
- if (deAlias(this) != this)
- return deAlias(this).isSameAs(that);
- }
- break;
-
- case ConstantType(Type base, AConstant value):
- switch (that) {
- case ConstantType(Type base1, AConstant value1):
- return base.isSameAs(base1) && value.equals(value1);
- }
- break;
-
- case TypeRef(Type pre, Symbol sym, Type[] args):
- switch (that) {
- case TypeRef(Type pre1, Symbol sym1, Type[] args1):
- if (sym == sym1 && pre.isSameAs(pre1) && isSameAs(args, args1))
- return true;
- }
- break;
-
- case CompoundType(Type[] parts, Scope members):
- switch (that) {
- case CompoundType(Type[] parts1, Scope members1):
- if (parts.length != parts1.length) return false;
- for (int i = 0; i < parts.length; i++)
- if (!parts[i].isSameAs(parts1[i])) return false;
- return isSameAs(members, members1);
- }
- break;
-
- case MethodType(Symbol[] ps, Type res):
- switch (that) {
- case MethodType(Symbol[] ps1, Type res1):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++) {
- Symbol p1 = ps1[i];
- Symbol p = ps[i];
- if (!p1.type().isSameAs(p.type()) ||
- (p1.flags & (DEF | REPEATED)) != (p.flags & (DEF | REPEATED)))
- return false;
- }
- return res.isSameAs(res1);
- }
- break;
-
- case PolyType(Symbol[] ps, Type res):
- switch (that) {
- case PolyType(Symbol[] ps1, Type res1):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++)
- if (!ps1[i].info().subst(ps1, ps).isSameAs(ps[i].info()) ||
- !ps1[i].loBound().subst(ps1, ps).isSameAs(ps[i].loBound()) ||
- !ps1[i].vuBound().subst(ps1, ps).isSameAs(ps[i].vuBound()))
- return false;
- return res.isSameAs(res1.subst(ps1, ps));
- }
- break;
-
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- switch (that) {
- case OverloadedType(Symbol[] alts1, Type[] alttypes1):
- return isSubSet(alttypes1, alttypes)
- && isSubSet(alttypes, alttypes1);
- }
- break;
-
- case UnboxedType(int kind):
- switch (that) {
- case UnboxedType(int kind1):
- return kind == kind1;
- }
- break;
-
- case UnboxedArrayType(Type elemtp):
- switch (that) {
- case UnboxedArrayType(Type elemtp1):
- return elemtp.isSameAs(elemtp1);
- }
- break;
- }
-
- switch (that) {
- case ErrorType:
- case AnyType:
- return true;
- case NoType:
- case NoPrefix:
- return false;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.isSameAs(this);
- else return constr.instantiate(this.any2typevar());
- case ThisType(_):
- case SingleType(_, _):
- if (deAlias(that) != that)
- return this.isSameAs(deAlias(that));
- }
-
- switch (this) {
- case NoType:
- case NoPrefix:
- return false;
- case TypeVar(Type origin, Constraint constr):
- if (constr.inst != NoType) return constr.inst.isSameAs(that);
- else return constr.instantiate(that.any2typevar());
- }
-
- return false;
- }
- //where
-
- static Type deAlias(Type tp) {
- switch (tp) {
- case ThisType(_):
- case SingleType(_, _):
- Type tp1 = tp.singleDeref();
- if (tp1.isStable()) return deAlias(tp1);
- }
- return tp;
- }
-
- /** Are types `these' the same as corresponding types `those'?
- */
- public static boolean isSameAs(Type[] these, Type[] those) {
- if (these.length != those.length) return false;
- for (int i = 0; i < these.length; i++) {
- if (!these[i].isSameAs(those[i])) return false;
- }
- return true;
- }
-
- /** Do scopes `s1' and `s2' define he same symbols with the same kinds and infos?
- */
- public boolean isSameAs(Scope s1, Scope s2) {
- return isSubScope(s1, s2) && isSubScope(s2, s1);
- }
-
- /** Does scope `s1' define all symbols of scope `s2' with the same kinds and infos?
- */
- private boolean isSubScope(Scope s1, Scope s2) {
- for (Scope.SymbolIterator it = s2.iterator(); it.hasNext(); ) {
- Symbol sym2 = it.next();
- // todo: handle overloaded
- Symbol sym1 = s1.lookup(sym2.name);
- if (sym1.kind != sym2.kind ||
- !sym1.info().isSameAs(
- sym2.info().substThis(
- sym2.owner(), sym1.owner().thisType())) ||
- !sym1.loBound().isSameAs(
- sym2.loBound().substThis(
- sym2.owner(), sym1.owner().thisType())) ||
- !sym1.vuBound().isSameAs(
- sym2.vuBound().substThis(
- sym2.owner(), sym1.owner().thisType())))
- return false;
- }
- return true;
- }
-
- boolean isSameAsAll(Type[] tps) {
- int i = 1;
- while (i < tps.length && isSameAs(tps[i])) i++;
- return i == tps.length;
- }
-
- /** Map every occurrence of AnyType to a fresh type variable.
- */
- public static Map any2typevarMap = new Map() {
- public Type apply(Type t) { return t.any2typevar(); }
- };
-
- public Type any2typevar() {
- switch (this) {
- case AnyType:
- return TypeVar(this, new Constraint());
- default:
- return any2typevarMap.map(this);
- }
- }
-
- /** Does this type match type `tp', so that corresponding symbols with
- * the two types would be taken to override each other?
- */
- public boolean overrides(Type tp) {
- switch (this) {
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int i = 0; i < alttypes.length; i++) {
- if (alttypes[i].overrides(tp)) return true;
- }
- return false;
- default:
- switch (tp) {
- case MethodType(Symbol[] ps1, Type res1):
- switch (this) {
- case MethodType(Symbol[] ps, Type res):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++) {
- Symbol p1 = ps1[i];
- Symbol p = ps[i];
- if (!p1.type().isSameAs(p.type()) ||
- (p1.flags & (DEF | REPEATED)) != (p.flags & (DEF | REPEATED)))
- return false;
- }
- return res.overrides(res1);
- }
- return false;
-
- case PolyType(Symbol[] ps1, Type res1):
- switch (this) {
- case PolyType(Symbol[] ps, Type res):
- if (ps.length != ps1.length) return false;
- for (int i = 0; i < ps.length; i++)
- if (!ps1[i].info().subst(ps1, ps).isSubType(ps[i].info()) ||
- !ps[i].loBound().isSubType(ps1[i].loBound().subst(ps1, ps)) ||
- !ps1[i].vuBound().subst(ps1, ps).isSubType(ps[i].vuBound()))
- return false;
- return res.overrides(res1.subst(ps1, ps));
- }
- return false;
-
- case OverloadedType(_, _):
- throw new ApplicationError("overrides inapplicable for " + tp);
-
- default:
- switch (this) {
- case MethodType(_, _): case PolyType(_, _): return false;
- default: return true;
- }
- }
- }
- }
-
-// Closures and Least Upper Bounds ---------------------------------------------------
-
- /** The closure of this type, i.e. the widened type itself followed by all
- * its direct and indirect (pre-) base types, sorted by Symbol.isLess().
- */
- public Type[] closure() {
- switch (this.widen().unalias()) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- return subst(
- asSeenFrom(sym.closure(), pre, sym.owner()),
- sym.typeParams(), args);
-
- case CompoundType(Type[] parts, Scope members):
-/*
- if (symbol().isCompoundSym()) {
- Type[][] closures = new Type[parts.length][];
- for (int i = 0; i < parts.length; i++)
- closures[i] = parts[i].closure();
- return union(closures);
- } else {
-*/
- return symbol().closure();
-
- default:
- return new Type[]{this};
- }
- }
-
- /** return union of array of closures. It is assumed that
- * for any two base types with the same class symbols the later one
- * is a subtype of the former.
- */
- static private Type[] union(Type[][] closures) {
- if (closures.length == 1) return closures[0]; // fast special case
- int[] index = new int[closures.length];
- int totalsize = 0;
- for (int i = 0; i < index.length; i++) {
- index[i] = 0;
- totalsize = totalsize + closures[i].length;
- }
- Type[] res = new Type[totalsize];
- int j = 0;
-
- while (true) {
- // find minimal element
- Type min = null;
- for (int i = 0; i < index.length; i++) {
- if (index[i] < closures[i].length) {
- Type cltype = closures[i][index[i]];
- if (min == null ||
- cltype.symbol().isLess(min.symbol()) ||
- cltype.symbol() == min.symbol()) {
- min = cltype;
- }
- }
- }
- if (min == null) break;
-
- res[j] = min;
- j = j + 1;
-
- // bump all indices that start with minimal element
- for (int i = 0; i < index.length; i++) {
- if (index[i] < closures[i].length &&
- closures[i][index[i]].symbol() == min.symbol())
- index[i] = index[i] + 1;
- }
- }
- Type[] result = new Type[j];
- System.arraycopy(res, 0, result, 0, j);
- return result;
- }
-
- /** return intersection of non-empty array of closures
- */
- static private Type[] intersection(Type[][] closures) {
- if (closures.length == 1) return closures[0]; // fast special case
- int[] index = new int[closures.length];
- Type[] mintypes = new Type[closures.length];
- int minsize = Integer.MAX_VALUE;
- for (int i = 0; i < index.length; i++) {
- index[i] = 0;
- if (closures[i].length < minsize) minsize = closures[i].length;
- }
- Type[] res = new Type[minsize];
- int j = 0;
-
- L:
- while (true) {
- // find minimal element
- Symbol minsym = null;
- for (int i = 0; i < index.length; i++) {
- if (index[i] == closures[i].length) break L;
- Symbol clsym = closures[i][index[i]].symbol();
- if (minsym == null || clsym.isLess(minsym)) minsym = clsym;
- }
-
- boolean agree = true;
- // bump all indices that start with minimal element
- for (int i = 0; i < index.length; i++) {
- Type cltype = closures[i][index[i]];
- if (cltype.symbol() == minsym) {
- mintypes[i] = cltype;
- index[i] = index[i] + 1;
- } else {
- agree = false;
- }
- }
- if (agree) {
- Type mintype = argLub(mintypes);
- if (mintype.symbol().kind == CLASS) {
- res[j] = mintype;
- j = j + 1;
- }
- }
- }
- Type[] result = new Type[j];
- System.arraycopy(res, 0, result, 0, j);
- return result;
- }
-
- /** same as lub, but all types are instances of the same class,
- * possibly with different prefixes and arguments.
- */
- //todo: catch lubs not within bounds.
- static Type argLub(Type[] tps) {
- tps = elimRedundant(tps, true);
- if (tps.length == 1) return tps[0];
-
- Type pre = tps[0].prefix();
- Symbol sym = tps[0].symbol();
- Symbol[] tparams = sym.typeParams();
- Type[] args = new Type[tparams.length];
- Type[][] argss = new Type[args.length][tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case TypeRef(Type pre1, Symbol sym1, Type[] args1):
- assert sym == sym1;
- assert args1.length == args.length;
- if (!pre.isSameAs(pre1)) return NoType;
- for (int j = 0; j < args1.length; j++)
- argss[j][i] = args1[j];
- break;
- case ErrorType:
- return ErrorType;
- default:
- assert false : tps[i];
- }
- }
- for (int j = 0; j < args.length; j++) {
- if ((tparams[j].flags & COVARIANT) != 0)
- args[j] = lub(argss[j]);
- else if ((tparams[j].flags & CONTRAVARIANT) != 0)
- args[j] = glb(argss[j]);
- else return NoType;
- }
- return typeRef(pre, sym, args);
- }
-
- /** The frontier of a closure C is the minimal set of types such that
- * the union of the closures of these types equals C.
- */
- static private Type[] frontier(Type[] closure) {
- Type[] front = new Type[closure.length];
- int j = 0;
- for (int i = 0; i < closure.length; i++) {
- int k = 0;
- Type tp = closure[i];
- while (k < j && !front[k].symbol().isSubClass(tp.symbol()))
- k++;
- if (k == j) {
- front[j] = tp;
- j++;
- }
- }
- Type[] result = new Type[j];
- System.arraycopy(front, 0, result, 0, j);
- return result;
- }
-
- /** remove types that are subtypes of some other type.
- */
- static private Type[] elimRedundant(Type[] tps, boolean elimLower) {
- Type.List tl = Type.List.EMPTY;
- int nredundant = 0;
- boolean[] redundant = new boolean[tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case ErrorType:
- return new Type[]{ErrorType};
- case MethodType(_, _):
- case PolyType(_, _):
- case OverloadedType(_, _):
- return new Type[]{NoType};
- default:
- assert tps[i].isObjectType(): tps[i];
- for (int j = 0; j < i && !redundant[i]; j++) {
- if (!redundant[j]) {
- if (tps[i].isSubType(tps[j])) {
- redundant[elimLower ? i : j] = true;
- nredundant++;
- } else if (tps[j].isSubType(tps[i])) {
- redundant[elimLower ? j : i] = true;
- nredundant++;
- }
- }
- }
- }
- }
-
- if (nredundant != 0) {
- Type[] tps1 = new Type[tps.length - nredundant];
- int n = 0;
- for (int i = 0; i < tps.length; i++) {
- if (!redundant[i]) tps1[n++] = tps[i];
- }
- return tps1;
- } else {
- return tps;
- }
- }
-
- static int recCount = 0;
- static boolean giveUp = false;
- static int recLimit = 10;
-
- public static Type lub(Type[] tps) {
- if (recCount == recLimit) {
- giveUp = true;
- return Global.instance.definitions.ANY_TYPE();
- } else {
- recCount++;
- Type result = lub0(tps);
- recCount--;
- if (recCount == 0) {
- if (giveUp) {
- giveUp = false;
- throw new Error("failure to compute least upper bound of types " +
- ArrayApply.toString(tps, "", " and ", ";\n") +
- "an approximation is: " + result + ";\n" +
- "additional type annotations are needed");
- } else {
- giveUp = false;
- }
- }
- return result;
- }
- }
-
- /** Return the least upper bound of non-empty array of types `tps'.
- */
- public static Type lub0(Type[] tps) {
- //for (int i = 0; i < recCount; i++) System.out.print(" "); System.out.println("lub" + ArrayApply.toString(tps));//debug
-
- if (tps.length == 0) return Global.instance.definitions.ALL_TYPE();
-
- //If all types are method types with same parameters,
- //compute lub of their result types.
- switch (tps[0]) {
- case PolyType(Symbol[] tparams, _):
- return polyLub(tps, tparams);
- case MethodType(Symbol[] vparams, _):
- return methodLub(tps, vparams);
- }
-
- // remove types that are subtypes of some other type.
- tps = elimRedundant(tps, true);
- if (tps.length == 1) return tps[0];
-
- // singleDeref singletypes and try again
- Type[] tps1 = tps;
- for (int i = 0; i < tps.length; i++) {
- Type tp1 = tps[i].singleDeref();
- if (tp1 != tps[i] && tps1 == tps) {
- tps1 = new Type[tps.length];
- System.arraycopy(tps, 0, tps1, 0, i);
- }
- tps1[i] = tp1;
- }
- if (tps1 != tps) return lub0(tps1);
-
- // intersect closures and build frontier.
- Type[][] closures = new Type[tps.length][];
- for (int i = 0; i < tps.length; i++) {
- closures[i] = tps[i].closure();
- }
- Type[] allBaseTypes = intersection(closures);
- Type[] leastBaseTypes = frontier(allBaseTypes);
- assert leastBaseTypes.length > 0 : ArrayApply.toString(tps);
-
- // add refinements where necessary
- Scope members = new Scope();
- Type lubType = compoundTypeWithOwner(Symbol.NONE, leastBaseTypes, members); // !!! NONE
- /*
- Type lubThisType = lubType.narrow();
- //System.out.println("lubtype = " + lubType);//DEBUG
-
- Symbol[] rsyms = new Symbol[tps.length];
- Type[] rtps = new Type[tps.length];
- Type[] rlbs = new Type[tps.length];
- for (int i = 0; i < allBaseTypes.length; i++) {
- for (Scope.SymbolIterator it = allBaseTypes[i].members().iterator();
- it.hasNext(); ) {
- Symbol sym = it.next();
- Name name = sym.name;
- if ((sym.flags & PRIVATE) == 0 && lubType.lookup(name) == sym) {
- Type symType = memberTp(lubThisType, sym);
- Type symLoBound = lubThisType.memberLoBound(sym);
- int j = 0;
- while (j < tps.length) {
- rsyms[j] = tps[j].lookupNonPrivate(name);
- if (rsyms[j] == sym) break;
- rtps[j] = memberTp(tps[j], rsyms[j])
- .substThis(tps[j].symbol(), lubThisType);
- rlbs[j] = tps[j].memberLoBound(rsyms[j])
- .substThis(tps[j].symbol(), lubThisType);
- if (rtps[j].isSameAs(symType) &&
- rlbs[j].isSameAs(symLoBound)) break;
- j++;
- }
- if (j == tps.length) {
- if (Global.instance.debug)
- System.out.println("refinement lub for " +
- ArrayApply.toString(rsyms) + ":" + ArrayApply.toString(rtps));//debug
- Symbol lubSym = lub(rsyms, rtps, rlbs, lubType.symbol());
- if (lubSym.kind != NONE &&
- !(lubSym.kind == sym.kind &&
- lubSym.info().isSameAs(symType) &&
- lubSym.loBound().isSameAs(symType)))
- members.enter(lubSym);
- }
- }
- }
- }
- //System.out.print("lub "); System.out.print(ArrayApply.toString(tps)); System.out.println(" = " + lubType);//DEBUG
- */
- if (leastBaseTypes.length == 1 && members.isEmpty())
- return leastBaseTypes[0];
- else return lubType;
- }
- //where
- private static Type memberTp(Type base, Symbol sym) {
- return sym.kind == CLASS ? base.memberType(sym) : base.memberInfo(sym);
- }
-
- private static Type polyLub(Type[] tps, Symbol[] tparams0) {
- Type[][] hiboundss = new Type[tparams0.length][tps.length];
- Type[][] loboundss = new Type[tparams0.length][tps.length];
- Type[][] vuboundss = new Type[tparams0.length][tps.length];
- Type[] restps = new Type[tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case PolyType(Symbol[] tparams, Type restp):
- if (tparams.length == tparams0.length) {
- for (int j = 0; j < tparams0.length; j++) {
- hiboundss[j][i] = tparams[j].info()
- .subst(tparams, tparams0);
- loboundss[j][i] = tparams[j].loBound()
- .subst(tparams, tparams0);
- vuboundss[j][i] = tparams[j].vuBound()
- .subst(tparams, tparams0);
- }
- restps[i] = restp.subst(tparams, tparams0);
- } else {
- return Type.NoType;
- }
- break;
- default:
- return Type.NoType;
- }
- }
- Type[] hibounds = new Type[tparams0.length];
- Type[] lobounds = new Type[tparams0.length];
- Type[] vubounds = new Type[tparams0.length];
- for (int j = 0; j < tparams0.length; j++) {
- hibounds[j] = glb(hiboundss[j]);
- lobounds[j] = lub(loboundss[j]);
- vubounds[j] = glb(vuboundss[j]);
- }
- Symbol[] tparams = new Symbol[tparams0.length];
- for (int j = 0; j < tparams.length; j++) {
- tparams[j] = tparams0[j].cloneSymbol(Symbol.NONE)
- .setInfo(hibounds[j].subst(tparams0, tparams))
- .setLoBound(lobounds[j].subst(tparams0, tparams))
- .setVuBound(vubounds[j].subst(tparams0, tparams));
- }
- return Type.PolyType(tparams, lub(restps).subst(tparams0, tparams));
- }
-
- private static Type methodLub(Type[] tps, Symbol[] vparams0) {
- Type[] restps = new Type[tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case MethodType(Symbol[] vparams, Type restp):
- if (vparams.length != vparams0.length)
- return Type.NoType;
- for (int j = 0; j < vparams.length; j++)
- if (!vparams[j].type().isSameAs(vparams0[j].type()) ||
- (vparams[j].flags & (DEF | REPEATED)) !=
- (vparams0[j].flags & (DEF | REPEATED)))
- return Type.NoType;
- restps[i] = restp;
- }
- }
- Symbol[] vparams = new Symbol[vparams0.length];
- for (int j = 0; j < vparams.length; j++) {
- vparams[j] = vparams0[j].cloneSymbol(Symbol.NONE);
- }
- return Type.MethodType(vparams, lub(restps));
- }
-
- private static Symbol lub(Symbol[] syms, Type[] tps, Type[] lbs, Symbol owner) {
- //System.out.println("lub" + ArrayApply.toString(syms));//DEBUG
- int lubKind = syms[0].kind;
- for (int i = 1; i < syms.length; i++) {
- Symbol sym = syms[i];
- if (sym.isError()) return Symbol.NONE;
- if (sym.isType() && sym.kind != lubKind) lubKind = TYPE;
- }
- if (lubKind == syms[0].kind && tps[0].isSameAsAll(tps)) {
- return syms[0].cloneSymbol();
- }
-
- Type lubType = lub(tps);
- if (lubType == Type.NoType) return Symbol.NONE;
- Symbol lubSym;
- switch (lubKind) {
- case VAL:
- lubSym = owner.newTerm(syms[0].pos, 0, syms[0].name);
- break;
- case TYPE: case ALIAS: case CLASS:
- lubSym = owner.newAbstractType(syms[0].pos, 0, syms[0].name);
- lubSym.setLoBound(glb(lbs));
- break;
- default:
- throw new ApplicationError();
- }
- lubSym.setInfo(lubType.setOwner(lubSym));
- return lubSym;
- }
-
- public static Type glb(Type[] tps) {
- if (recCount == recLimit) {
- giveUp = true;
- return Global.instance.definitions.ALL_TYPE();
- } else {
- recCount++;
- Type result = glb0(tps);
- recCount--;
- if (recCount == 0) {
- if (giveUp) {
- giveUp = false;
- throw new Error("failure to compute greatest lower bound of types " +
- ArrayApply.toString(tps, "", " and ", ";\n") +
- "an approximation is: " + result + ";\n" +
- "additional type annotations are needed");
- } else {
- giveUp = false;
- }
- }
- return result;
- }
- }
-
- public static Type glb0(Type[] tps) {
- if (tps.length == 0) return Global.instance.definitions.ANY_TYPE();
-
- // step one: eliminate redunandant types; return if one one is left
- tps = elimRedundant(tps, false);
- if (tps.length == 1) return tps[0];
-
- // step two: build arrays of all typerefs and all refinements
- Type.List treftl = Type.List.EMPTY;
- Type.List comptl = Type.List.EMPTY;
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case TypeRef(_, _, _):
- treftl = new Type.List(tps[i], treftl);
- break;
- case CompoundType(Type[] parents, Scope members):
- if (!members.isEmpty())
- comptl = new Type.List(tps[i], comptl);
- for (int j = 0; j < parents.length; j++)
- treftl = new Type.List(parents[j], treftl);
- break;
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return Global.instance.definitions.ALL_TYPE();
- }
- }
-
- CompoundType glbType = compoundTypeWithOwner(Symbol.NONE, Type.EMPTY_ARRAY, new Scope()); // !!! NONE
- Type glbThisType = glbType.narrow();
-
- // step 3: compute glb of all refinements.
- Scope members = Scope.EMPTY;
- if (comptl != List.EMPTY) {
- Type[] comptypes = comptl.toArrayReverse();
- Scope[] refinements = new Scope[comptypes.length];
- for (int i = 0; i < comptypes.length; i++)
- refinements[i] = comptypes[i].members();
- if (!setGlb(glbType.members, refinements, glbThisType)) {
- // refinements don't have lower bound, so approximate
- // by AllRef
- glbType.members = Scope.EMPTY;
- treftl = new Type.List(
- Global.instance.definitions.ALLREF_TYPE(), treftl);
- }
- }
-
- // eliminate redudant typerefs
- Type[] treftypes = elimRedundant(treftl.toArrayReverse(), false);
- if (treftypes.length != 1 || !glbType.members.isEmpty()) {
- // step 4: replace all abstract types by their lower bounds.
- boolean hasAbstract = false;
- for (int i = 0; i < treftypes.length; i++) {
- if (treftypes[i].unalias().symbol().kind == TYPE)
- hasAbstract = true;
- }
- if (hasAbstract) {
- treftl = Type.List.EMPTY;
- for (int i = 0; i < treftypes.length; i++) {
- if (treftypes[i].unalias().symbol().kind == TYPE)
- treftl = new Type.List(treftypes[i].loBound(), treftl);
- else
- treftl = new Type.List(treftypes[i], treftl);
- }
- treftypes = elimRedundant(treftl.toArrayReverse(), false);
- }
- }
-
- if (treftypes.length != 1) {
- // step 5: if there are conflicting instantiations of same
- // class, replace them by lub/glb of arguments or lower bound.
- Type lb = NoType;
- for (int i = 0;
- i < treftypes.length &&
- lb.symbol() != Global.instance.definitions.ALL_CLASS;
- i++) {
- for (int j = 0; j < i; j++) {
- if (treftypes[j].symbol() == treftypes[i].symbol())
- lb = argGlb(treftypes[j], treftypes[i]);
- }
- }
- if (lb != NoType) return lb;
- }
-
- if (treftypes.length == 1 && glbType.members.isEmpty()) {
- return treftypes[0];
- } else {
- glbType.parts = treftypes;
- return glbType;
- }
- }
-
- private static Type argGlb(Type tp1, Type tp2) {
- switch (tp1) {
- case TypeRef(Type pre1, Symbol sym1, Type[] args1):
- switch (tp2) {
- case TypeRef(Type pre2, Symbol sym2, Type[] args2):
- assert sym1 == sym2;
- if (pre1.isSameAs(pre2)) {
- Symbol[] tparams = sym1.typeParams();
- Type[] args = new Type[tparams.length];
- for (int i = 0; i < tparams.length; i++) {
- if (args1[i].isSameAs(args2[i]))
- args[i] = args1[i];
- else if ((tparams[i].flags & COVARIANT) != 0)
- args[i]= lub(new Type[]{args1[i], args2[i]});
- else if ((tparams[i].flags & CONTRAVARIANT) != 0)
- args[i]= glb(new Type[]{args1[i], args2[i]});
- else
- return glb(new Type[]{tp1.loBound(), tp2.loBound()});
- }
- return typeRef(pre1, sym1, args);
- }
- }
- }
- return glb(new Type[]{tp1.loBound(), tp2.loBound()});
- }
-
- /** Set scope `result' to glb of scopes `ss'. Return true iff succeeded.
- */
- private static boolean setGlb(Scope result, Scope[] ss, Type glbThisType) {
- for (int i = 0; i < ss.length; i++)
- for (Scope.SymbolIterator it = ss[i].iterator(); it.hasNext(); )
- if (!addMember(result, it.next(), glbThisType)) return false;
- return true;
- }
-
- /** Add member `sym' to scope `s'. If`s' has already a member with same name,
- * overwrite its info/low bound to form glb of both symbols.
- */
- private static boolean addMember(Scope s, Symbol sym, Type glbThisType) {
- Type syminfo = sym.info().substThis(sym.owner(), glbThisType);
- Type symlb = sym.loBound().substThis(sym.owner(), glbThisType);
- Type symvb = sym.vuBound().substThis(sym.owner(), glbThisType);
- Scope.Entry e = s.lookupEntry(sym.name);
- if (e == Scope.Entry.NONE) {
- Symbol sym1 = sym.cloneSymbol(glbThisType.symbol());
- sym1.setInfo(syminfo);
- if (sym1.kind == TYPE) {
- sym1.setLoBound(symlb);
- sym1.setVuBound(symvb);
- }
- s.enter(sym1);
- } else {
- Type einfo = e.sym.info();
- if (einfo.isSameAs(syminfo)) {
- } else if (einfo.isSubType(syminfo) && sym.kind != ALIAS) {
- } else if (syminfo.isSubType(einfo) && e.sym.kind != ALIAS) {
- e.sym.setInfo(syminfo);
- } else if (sym.kind == VAL && e.sym.kind == VAL ||
- sym.kind == TYPE && e.sym.kind == TYPE) {
- e.sym.setInfo(glb(new Type[]{einfo, syminfo}).setOwner(e.sym));
- } else {
- return false;
- }
- if (e.sym.kind == TYPE && sym.kind == TYPE) {
- Type elb = e.sym.loBound();
- if (elb.isSameAs(symlb)) {
- } else if (symlb.isSubType(elb)) {
- } else if (elb.isSubType(symlb)) {
- e.sym.setLoBound(symlb);
- } else {
- e.sym.setLoBound(lub(new Type[]{elb, symlb}));
- }
- Type evb = e.sym.vuBound();
- if (evb.isSameAs(symvb)) {
- } else if (evb.isSubType(symvb)) {
- } else if (symvb.isSubType(evb)) {
- e.sym.setVuBound(symvb);
- } else {
- e.sym.setVuBound(glb(new Type[]{evb, symvb}));
- }
- }
- }
- return true;
- }
-
- private static Type polyGlb(Type[] tps, Symbol[] tparams0) {
- Type[][] hiboundss = new Type[tparams0.length][tps.length];
- Type[][] loboundss = new Type[tparams0.length][tps.length];
- Type[][] vuboundss = new Type[tparams0.length][tps.length];
- Type[] restps = new Type[tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case PolyType(Symbol[] tparams, Type restp):
- if (tparams.length == tparams0.length) {
- for (int j = 0; j < tparams0.length; j++) {
- hiboundss[j][i] = tparams[j].info()
- .subst(tparams, tparams0);
- loboundss[j][i] = tparams[j].loBound()
- .subst(tparams, tparams0);
- vuboundss[j][i] = tparams[j].vuBound()
- .subst(tparams, tparams0);
- }
- restps[i] = restp.subst(tparams, tparams0);
- } else {
- return Type.NoType;
- }
- break;
- default:
- return Type.NoType;
- }
- }
- Type[] hibounds = new Type[tparams0.length];
- Type[] lobounds = new Type[tparams0.length];
- Type[] vubounds = new Type[tparams0.length];
- for (int j = 0; j < tparams0.length; j++) {
- hibounds[j] = lub(hiboundss[j]);
- lobounds[j] = glb(loboundss[j]);
- vubounds[j] = lub(vuboundss[j]);
- }
- Symbol[] tparams = new Symbol[tparams0.length];
- for (int j = 0; j < tparams.length; j++) {
- tparams[j] = tparams0[j].cloneSymbol(Symbol.NONE)
- .setInfo(hibounds[j].subst(tparams0, tparams))
- .setLoBound(lobounds[j].subst(tparams0, tparams))
- .setVuBound(vubounds[j].subst(tparams0, tparams));
- }
- return Type.PolyType(tparams, glb(restps).subst(tparams0, tparams));
- }
-
- private static Type methodGlb(Type[] tps, Symbol[] vparams0) {
- Type[] restps = new Type[tps.length];
- for (int i = 0; i < tps.length; i++) {
- switch (tps[i]) {
- case MethodType(Symbol[] vparams, Type restp):
- if (vparams.length != vparams0.length)
- return Type.NoType;
- for (int j = 0; j < vparams.length; j++)
- if (!vparams[i].type().isSameAs(vparams0[i].type()) ||
- (vparams[i].flags & (DEF | REPEATED)) !=
- (vparams0[i].flags & (DEF | REPEATED)))
- return Type.NoType;
- restps[i] = restp;
- }
- }
- Symbol[] vparams = new Symbol[vparams0.length];
- for (int j = 0; j < vparams.length; j++) {
- vparams[j] = vparams0[j].cloneSymbol(Symbol.NONE);
- }
- return Type.MethodType(vparams, glb(restps));
- }
-
-// Erasure --------------------------------------------------------------------------
-
- public static Map erasureMap = new MapOnlyTypes() {
- public Type apply(Type t) { return t.erasure(); }
- };
-
- private static final Type[] unboxedType =
- new Type[LastUnboxedTag + 1 - FirstUnboxedTag];
- private static final Name[] unboxedName =
- new Name[LastUnboxedTag + 1 - FirstUnboxedTag];
- private static final Symbol[] boxedSymbol =
- new Symbol[LastUnboxedTag + 1 - FirstUnboxedTag];
-
- private static void mkStdClassType(int kind, String unboxedstr, Symbol boxedsym) {
- unboxedType[kind - FirstUnboxedTag] = UnboxedType(kind);
- unboxedName[kind - FirstUnboxedTag] = Name.fromString(unboxedstr);
- boxedSymbol[kind - FirstUnboxedTag] = boxedsym;
- }
-
- static void initializeUnboxedTypes(Definitions definitions) {
- mkStdClassType(BYTE, "byte", definitions.BYTE_CLASS);
- mkStdClassType(SHORT, "short", definitions.SHORT_CLASS);
- mkStdClassType(CHAR, "char", definitions.CHAR_CLASS);
- mkStdClassType(INT, "int", definitions.INT_CLASS);
- mkStdClassType(LONG, "long", definitions.LONG_CLASS);
- mkStdClassType(FLOAT, "float", definitions.FLOAT_CLASS);
- mkStdClassType(DOUBLE, "double", definitions.DOUBLE_CLASS);
- mkStdClassType(BOOLEAN, "boolean", definitions.BOOLEAN_CLASS);
- mkStdClassType(UNIT, "void", definitions.UNIT_CLASS);
- }
-
- /** Return unboxed type of given kind.
- */
- public static Type unboxedType(int kind) {
- return unboxedType[kind - FirstUnboxedTag];
- }
-
- /** Return the name of unboxed type of given kind.
- */
- public static Name unboxedName(int kind) {
- return unboxedName[kind - FirstUnboxedTag];
- }
-
- /** If type is boxed, return its unboxed equivalent; otherwise return the type
- * itself.
- */
- public Type unbox() {
- switch (this) {
- case TypeRef(_, Symbol clasz, Type[] args):
- if (args.length == 0) {
- for (int i = 0; i < boxedSymbol.length; i++)
- if (boxedSymbol[i] == clasz) return unboxedType[i];
- } else if (args.length == 1) {
- Definitions definitions = Global.instance.definitions;
- if (clasz == definitions.ARRAY_CLASS) {
- Type item = args[0];
- Type bound = item.upperBound();
- // todo: check with Philippe if this is what we want.
- if (item.symbol().isClass() ||
- (bound.symbol() != definitions.ANY_CLASS &&
- bound.symbol() != definitions.ANYVAL_CLASS))
- {
- return UnboxedArrayType(args[0].erasure());
- }
- }
- }
- }
- return this;
- }
- //where
- private Type upperBound() {
- switch (this) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (sym.kind == TYPE)
- return pre.memberInfo(sym).upperBound();
- }
- return this;
- }
-
- /** Return the erasure of this type.
- */
- public Type erasure() {
- switch (this) {
- case ThisType(_):
- case SingleType(_, _):
- case ConstantType(_, _):
- return singleDeref().erasure();
- case TypeRef(Type pre, Symbol sym, Type[] args):
- switch (sym.kind) {
- case ALIAS: case TYPE:
- return sym.info().asSeenFrom(pre, sym.owner()).erasure();
-
- case CLASS:
- Definitions definitions = Global.instance.definitions;
- if (sym == definitions.UNIT_CLASS) return this;
- if (sym == definitions.OBJECT_CLASS ||
- sym == definitions.ALL_CLASS ||
- sym == definitions.ALLREF_CLASS)
- return Type.typeRef(NoPrefix, definitions.ANY_CLASS, EMPTY_ARRAY);
- else {
- Type this1 = unbox();
- if (this1 != this) return this1;
- else return Type.typeRef(NoPrefix, sym, EMPTY_ARRAY);
- }
-
- default: throw new ApplicationError(sym + " has wrong kind: " + sym.kind);
- }
- case CompoundType(Type[] parents, _):
- if (parents.length > 0) return parents[0].erasure();
- else return this;
- case MethodType(Symbol[] params, Type tp):
- Symbol[] params1 = erasureMap.map(params);
- Type tp1 = tp.fullErasure();
- switch (tp1) {
- case MethodType(Symbol[] params2, Type tp2):
- Symbol[] newparams = new Symbol[params1.length + params2.length];
- System.arraycopy(params1, 0, newparams, 0, params1.length);
- System.arraycopy(params2, 0, newparams, params1.length, params2.length);
- return MethodType(newparams, tp2);
- default:
- if (params1 == params && tp1 == tp) return this;
- else return MethodType(params1, tp1);
- }
- case PolyType(_, Type result):
- return result.erasure();
- default:
- return erasureMap.map(this);
- }
- }
-
- /** Return the full erasure of the type. Full erasure is the same
- * as "normal" erasure, except that the "Unit" type is erased to
- * the "void" type.
- */
- public Type fullErasure() {
- Type erasure = erasure();
- if (Global.instance.definitions.UNIT_CLASS == erasure.symbol())
- erasure = erasure.unbox();
- return erasure;
- }
-
-// Object Interface -----------------------------------------------------------------
-
- public String toString() {
- return new SymbolTablePrinter().printType(this).toString();
- }
-
- public String toLongString() {
- String str = toString();
- if (str.endsWith(".type")) return str + " (with underlying type " + widen() + ")";
- else return str;
- }
-
- public int hashCode() {
- switch (this) {
- case ErrorType:
- return ERRORtpe;
- case NoType:
- return NOtpe;
- case NoPrefix:
- return NOpre;
- case ThisType(Symbol sym):
- return THIStpe
- ^ (sym.hashCode() * 41);
- case TypeRef(Type pre, Symbol sym, Type[] args):
- return TYPEREFtpe
- ^ (pre.hashCode() * 41)
- ^ (sym.hashCode() * (41*41))
- ^ (hashCode(args) * (41*41*41));
- case SingleType(Type pre, Symbol sym):
- return SINGLEtpe
- ^ (pre.hashCode() * 41)
- ^ (sym.hashCode() * (41*41));
- case ConstantType(Type base, AConstant value):
- return CONSTANTtpe
- ^ (base.hashCode() * 41)
- ^ (value.hashCode() * (41*41));
- case CompoundType(Type[] parts, Scope members):
- return symbol().hashCode();
- //return COMPOUNDtpe
- // ^ (hashCode(parts) * 41)
- // ^ (members.hashCode() * (41 * 41));
- case MethodType(Symbol[] vparams, Type result):
- int h = METHODtpe;
- for (int i = 0; i < vparams.length; i++)
- h = (h << 4) ^ (vparams[i].flags & SOURCEFLAGS);
- return h
- ^ (hashCode(Symbol.type(vparams)) * 41)
- ^ (result.hashCode() * (41 * 41));
- case PolyType(Symbol[] tparams, Type result):
- return POLYtpe
- ^ (hashCode(tparams) * 41)
- ^ (result.hashCode() * (41 * 41));
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- return OVERLOADEDtpe
- ^ (hashCode(alts) * 41)
- ^ (hashCode(alttypes) * (41 * 41));
- case UnboxedType(int kind):
- return UNBOXEDtpe
- ^ (kind * 41);
- case UnboxedArrayType(Type elemtp):
- return UNBOXEDARRAYtpe
- ^ (elemtp.hashCode() * 41);
- default:
- throw new ApplicationError("bad type for hashCode: " + this);
- }
- }
-
- public static int hashCode(Object[] elems) {
- int h = 0;
- for (int i = 0; i < elems.length; i++)
- h = h * 41 + elems[i].hashCode();
- return h;
- }
-
- // todo: change in relation to needs.
-
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- } else if (other instanceof Type) {
- Type that = (Type) other;
- switch (this) {
- case ErrorType:
- return that == ErrorType;
- case NoType:
- return that == NoType;
- case NoPrefix:
- return that == NoPrefix;
- case ThisType(Symbol sym):
- switch (that) {
- case ThisType(Symbol sym1):
- return sym == sym1;
- default: return false;
- }
- case TypeRef(Type pre, Symbol sym, Type[] args):
- switch (that) {
- case TypeRef(Type pre1, Symbol sym1, Type[] args1):
- return pre.equals(pre1) && sym == sym1 && equals(args, args1);
- default: return false;
- }
- case SingleType(Type pre, Symbol sym):
- switch (that) {
- case SingleType(Type pre1, Symbol sym1):
- return pre.equals(pre1) && sym == sym1;
- default: return false;
- }
- case ConstantType(Type base, AConstant value):
- switch (that) {
- case ConstantType(Type base1, AConstant value1):
- return base.equals(base1) && value.equals(value1);
- default: return false;
- }
- case CompoundType(Type[] parts, Scope members):
- switch (that) {
- case CompoundType(Type[] parts1, Scope members1):
- return this.symbol() == that.symbol();
- //return parts.equals(parts1) && members.equals(members1);
- default: return false;
- }
- case MethodType(Symbol[] vparams, Type result):
- switch (that) {
- case MethodType(Symbol[] vparams1, Type result1):
- if (vparams.length != vparams1.length)
- return false;
- for (int i = 0; i < vparams.length; i++)
- if ((vparams[i].flags & SOURCEFLAGS) !=
- (vparams1[i].flags & SOURCEFLAGS))
- return false;
- return
- equals(Symbol.type(vparams), Symbol.type(vparams1)) &&
- result.equals(result1);
- default: return false;
- }
- case PolyType(Symbol[] tparams, Type result):
- switch (that) {
- case PolyType(Symbol[] tparams1, Type result1):
- return equals(tparams, tparams1) && result.equals(result1);
- default: return false;
- }
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- switch (that) {
- case OverloadedType(Symbol[] alts1, Type[] alttypes1):
- return equals(alts, alts1) && equals(alttypes, alttypes1);
- default: return false;
- }
- case UnboxedType(int kind):
- switch (that) {
- case UnboxedType(int kind1):
- return kind == kind1;
- default: return false;
- }
- case UnboxedArrayType(Type elemtp):
- switch (that) {
- case UnboxedArrayType(Type elemtp1):
- return elemtp.equals(elemtp1);
- default: return false;
- }
- default:
- }
- }
- return false;
- }
-
- public static boolean equals(Object[] elems1, Object[] elems2) {
- if (elems1.length != elems2.length) return false;
- for (int i = 0; i < elems1.length; i++) {
- if (!elems1[i].equals(elems2[i])) return false;
- }
- return true;
- }
-
-// Type.List class -----------------------------------------------------------------
-
- /** A class for lists of types.
- */
- public static class List {
- public Type head;
- public List tail;
- public List(Type head, List tail) {
- this.head = head; this.tail = tail;
- }
- public int length() {
- return (this == EMPTY) ? 0 : 1 + tail.length();
- }
- public Type[] toArray() {
- Type[] ts = new Type[length()];
- copyToArray(ts, 0, 1);
- return ts;
- }
- public void copyToArray(Type[] ts, int start, int delta) {
- if (this != EMPTY) {
- ts[start] = head;
- tail.copyToArray(ts, start+delta, delta);
- }
- }
- public Type[] toArrayReverse() {
- Type[] ts = new Type[length()];
- copyToArray(ts, ts.length - 1, -1);
- return ts;
- }
-
- public String toString() {
- if (this == EMPTY) return "List()";
- else return head + "::" + tail;
- }
-
- public static List EMPTY = new List(null, null);
-
- public static List append(List l, Type tp) {
- return (l == EMPTY) ? new List(tp, EMPTY)
- : new List(l.head, append(l.tail, tp));
- }
- }
-
-// Type.Constraint class -------------------------------------------------------
-
- /** A class for keeping sub/supertype constraints and instantiations
- * of type variables.
- */
- public static class Constraint {
- public List lobounds = List.EMPTY;
- public List hibounds = List.EMPTY;
- public Type inst = NoType;
-
- public boolean instantiate(Type tp) {
- for (List l = lobounds; l != List.EMPTY; l = l.tail) {
- if (!l.head.isSubType(tp)) return false;
- }
- for (List l = hibounds; l != List.EMPTY; l = l.tail) {
- if (!tp.isSubType(l.head)) return false;
- }
- inst = tp;
- return true;
- }
- }
-
-// Type.Error class --------------------------------------------------------------
-
- /** A class for throwing type errors
- */
- public static class Error extends java.lang.Error {
- public String msg;
- public Error(String msg) {
- super(msg);
- this.msg = msg;
- }
- }
-
- public static class Malformed extends Error {
- public Malformed(Type pre, String tp) {
- super("malformed type: " + pre + "#" + tp);
- }
- }
-
- /** A class for throwing type errors
- */
- public static class VarianceError extends Error {
- public VarianceError(String msg) {
- super(msg);
- }
- }
-
- public static void explainTypes(Type found, Type required) {
- if (Global.instance.explaintypes) {
- boolean s = explainSwitch;
- explainSwitch = true;
- found.isSubType(required);
- explainSwitch = s;
- }
- }
-}
-
-/* A standard pattern match:
-
- case ErrorType:
- case AnyType:
- case NoType:
- case ThisType(Symbol sym):
- case TypeRef(Type pre, Symbol sym, Type[] args):
- case SingleType(Type pre, Symbol sym):
- case ConstantType(Type base, Object value):
- case CompoundType(Type[] parts, Scope members):
- case MethodType(Symbol[] vparams, Type result):
- case PolyType(Symbol[] tparams, Type result):
- case OverloadedType(Symbol[] alts, Type[] alttypes):
-*/
-
diff --git a/sources/scalac/symtab/TypeTags.java b/sources/scalac/symtab/TypeTags.java
deleted file mode 100644
index 0a0d25cfb6..0000000000
--- a/sources/scalac/symtab/TypeTags.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab;
-
-public interface TypeTags {
-
- /** unboxed type tags
- */
- int BYTE = 10;
- int CHAR = 11;
- int SHORT = 12;
- int INT = 13;
- int LONG = 14;
- int FLOAT = 15;
- int DOUBLE = 16;
- int BOOLEAN = 17;
- int UNIT = 18;
- int STRING = 19;
-
- int FirstUnboxedTag = BYTE;
- int LastUnboxedTag = UNIT;
-}
diff --git a/sources/scalac/symtab/classfile/AttributeParser.java b/sources/scalac/symtab/classfile/AttributeParser.java
deleted file mode 100644
index 7f04a3d147..0000000000
--- a/sources/scalac/symtab/classfile/AttributeParser.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.Position;
-import scala.tools.util.AbstractFileReader;
-import scalac.*;
-import scalac.atree.AConstant;
-import scalac.symtab.*;
-import scalac.util.*;
-import java.util.*;
-
-public class AttributeParser implements ClassfileConstants {
-
- /** the classfile input buffer
- */
- protected AbstractFileReader in;
-
- /** the constant pool
- */
- protected ConstantPool pool;
-
- protected ClassfileParser parser;
-
- /** constructor
- */
- public AttributeParser(AbstractFileReader in,
- ConstantPool pool,
- ClassfileParser parser)
- {
- this.in = in;
- this.pool = pool;
- this.parser = parser;
- }
-
- /** convert an attribute name into an attribute id
- */
- public int nameToId(Name name) {
- if (name == SOURCEFILE_N)
- return SOURCEFILE_ATTR;
- if (name == SYNTHETIC_N)
- return SYNTHETIC_ATTR;
- if (name == DEPRECATED_N)
- return DEPRECATED_ATTR;
- if (name == CODE_N)
- return CODE_ATTR;
- if (name == EXCEPTIONS_N)
- return EXCEPTIONS_ATTR;
- if (name == CONSTANT_VALUE_N)
- return CONSTANT_VALUE_ATTR;
- if (name == LINE_NUM_TABLE_N)
- return LINE_NUM_TABLE_ATTR;
- if (name == LOCAL_VAR_TABLE_N)
- return LOCAL_VAR_TABLE_ATTR;
- if (name == INNERCLASSES_N)
- return INNERCLASSES_ATTR;
- if (name == META_N)
- return META_ATTR;
- if (name == SCALA_N)
- return SCALA_ATTR;
- if (name == JACO_N)
- return JACO_ATTR;
- if (name == BRIDGE_N)
- return BRIDGE_ATTR;
- if (name == SIG_N)
- return SIG_ATTR;
- return BAD_ATTR;
- }
-
- /** skip all attributes.
- */
- public void skipAttributes() {
- char nattr = in.nextChar();
- for (int i = 0; i < nattr; i++) {
- in.skip(2);
- in.skip(in.nextInt());
- }
- }
-
- /** read all attributes associated with symbol 'sym' which are
- * contained in 'attrs'.
- */
- public Symbol readAttributes(Symbol def, Type type, int attrs) {
- char nattr = in.nextChar();
- for (int i = 0; i < nattr; i++) {
- Name attrName = pool.getName(in.nextChar());
- int attr = nameToId(attrName);
- int attrLen = in.nextInt();
- if ((attrs & attr) == 0) {
- //System.out.println("# skipping " + attrName + " of " + def);
- in.skip(attrLen);
- } else {
- //System.out.println("# reading " + attrName + " of " + def);
- readAttribute(def, type, attr, attrLen);
- }
- }
- return def;
- }
-
- /** read a single attribute 'attr' for symbol 'sym' with type 'type'.
- */
- public void readAttribute(Symbol sym, Type type, int attr, int attrLen) {
- switch (attr) {
- // class attributes
- case SCALA_ATTR:
- try {
- UnPickle.parse(parser.global, in.nextBytes(attrLen), sym);
- return;
- } catch (UnPickle.BadSignature exception) {
- throw new RuntimeException(exception);
- }
- case INNERCLASSES_ATTR:
- int n = in.nextChar();
- //System.out.println(sym + " has " + n + " innerclass entries");
- for (int i = 0; i < n; i++) {
- int inner = in.nextChar();
- if (inner == 0) { in.skip(6); continue; }
- int outer = in.nextChar();
- if (outer == 0) { in.skip(4); continue; }
- int name = in.nextChar();
- if (name == 0) { in.skip(2); continue; }
- int flags = in.nextChar();
- if ((flags & JAVA_ACC_STATIC) == 0) continue;
- if ((flags & (JAVA_ACC_PUBLIC | JAVA_ACC_PROTECTED)) == 0)
- continue;
- if (pool.getClass(outer) != sym) continue;
- Symbol alias = sym.linkedModule().moduleClass()
- .newTypeAlias(Position.NOPOS, 0,
- pool.getName(name).toTypeName(),
- parser.make.classType(pool.getClass(inner)));
- parser.statics.enterNoHide(alias);
- }
- //in.skip(attrLen);
- return;
- // method attributes
- case CODE_ATTR:
- in.skip(attrLen);
- return;
- case EXCEPTIONS_ATTR:
- //int nexceptions = in.nextChar();
- //Type[] thrown = new Type[nexceptions];
- //for (int j = 0; j < nexceptions; j++)
- // thrown[j] = make.classType(reader.readClassName(in.nextChar()));
- //((MethodType)def.type).thrown = thrown;
- in.skip(attrLen);
- return;
- case LINE_NUM_TABLE_ATTR:
- in.skip(attrLen);
- return;
- case LOCAL_VAR_TABLE_ATTR:
- in.skip(attrLen);
- return;
- // general attributes
- case SYNTHETIC_ATTR:
- sym.flags |= Modifiers.SYNTHETIC;
- return;
- case BRIDGE_ATTR:
- sym.flags |= Modifiers.BRIDGE;
- return;
- case DEPRECATED_ATTR:
- sym.flags |= Modifiers.DEPRECATED;
- return;
- case CONSTANT_VALUE_ATTR:
- AConstant constant = pool.getConstantValue(in.nextChar());
- switch (constant) {
- case INT(int value):
- Definitions definitions = parser.global.definitions;
- Symbol base = sym.getType().symbol();
- if (base == definitions.INT_CLASS) break;
- if (base == definitions.CHAR_CLASS)
- constant = AConstant.CHAR((char)value);
- else if (base == definitions.SHORT_CLASS)
- constant = AConstant.SHORT((short)value);
- else if (base == definitions.BYTE_CLASS)
- constant = AConstant.BYTE((byte)value);
- else
- constant = AConstant.BOOLEAN(value != 0);
- }
- sym.setInfo(parser.make.constantType(constant));
- return;
- case META_ATTR:
- //System.out.println("parsing meta data for " + sym);
- String meta = pool.getString(in.nextChar()).trim();
- MetaParser mp = new MetaParser
- (meta, tvars, sym, type, parser.c, parser.ctype, parser.make);
- sym.setInfo(mp.parse());
- return;
- case JACO_ATTR:
- // this attribute is present in all PiCo generated classfiles
- int mods = in.nextChar();
- mods |= (in.nextChar() << 16);
- boolean algebraicClass = (mods & 0x00100000) != 0;
- boolean caseClass = (mods & 0x00200000) != 0;
- if (caseClass)
- sym.flags |= Modifiers.CASE | Modifiers.JAVA;
- in.skip(attrLen - 4);
- return;
- case SOURCEFILE_ATTR:
- String name = pool.getString(in.nextChar());
- parser.c.getOrigin().setSourceFileAttribute(name);
- parser.m.moduleClass().getOrigin().setSourceFileAttribute(name);
- return;
- default:
- in.skip(attrLen);
- return;
- }
- }
-
- Scope tvars = new Scope();
-}
diff --git a/sources/scalac/symtab/classfile/CLRClassParser.java b/sources/scalac/symtab/classfile/CLRClassParser.java
deleted file mode 100644
index 498237edbe..0000000000
--- a/sources/scalac/symtab/classfile/CLRClassParser.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2003, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import scalac.Global;
-import scalac.atree.AConstant;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-import scalac.symtab.SymbolOrigin;
-import scalac.symtab.Scope;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Type.*;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Debug;
-
-import scala.tools.util.Position;
-import ch.epfl.lamp.compiler.msil.*;
-
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Arrays;
-import java.util.Iterator;
-
-public class CLRClassParser extends SymbolLoader {
-
- //##########################################################################
-
- private static Name[] ENUM_CMP_NAMES = new Name[]
- { Names.EQ, Names.NE, Names.LT, Names.LE, Names.GT, Names.GE };
-
- private static Name[] ENUM_BIT_LOG_NAMES = new Name[]
- { Names.OR, Names.AND, Names.XOR };
-
- private static JavaTypeFactory make;
-
- private static final CLRTypes clrTypes = CLRTypes.instance();
-
- private final Type type;
-
- public CLRClassParser(Global global, Type type) {
- super(global);
- this.type = type;
- }
-
- private Symbol clazz;
- private Scope members;
- private Symbol staticsClass;
- private Scope statics;
- scalac.symtab.Type clazzType;
-
- private final Scope tvars = new Scope();
-
- protected String doComplete(Symbol root) {
- clazz = root;
- clazz.owner().initialize(); //???
-
- if (make == null)
- make = new JavaTypeCreator(global.definitions);
-
- clazz.flags = translateAttributes(type);
- Type[] ifaces = type.getInterfaces();
- scalac.symtab.Type[] baseTypes = new scalac.symtab.Type[ifaces.length+1];
- baseTypes[0] = type.BaseType() != null ? getCLRType(type.BaseType())
- : (type.IsInterface() ? make.objectType() : make.anyType());
- for (int i = 0; i < ifaces.length; i++)
- baseTypes[i + 1] = getCLRType(ifaces[i]);
- members = new Scope();
- statics = new Scope();
- scalac.symtab.Type clazzInfo =
- scalac.symtab.Type.compoundType(baseTypes, members, clazz);
- clazz.setInfo(clazzInfo);
- Symbol staticsModule = clazz.linkedModule();
- staticsClass = staticsModule.moduleClass();
- assert staticsClass.isModuleClass(): Debug.show(staticsClass);
- scalac.symtab.Type staticsInfo = scalac.symtab.Type.compoundType
- (scalac.symtab.Type.EMPTY_ARRAY, statics, staticsClass);
- staticsClass.setInfo(staticsInfo);
- staticsModule.setInfo(make.classType(staticsClass));
- clazzType = make.classType(clazz);
-
- // import nested types
- Type[] nestedTypes = type.getNestedTypes();
- for (int i = 0; i < nestedTypes.length; i++) {
- Type ntype = nestedTypes[i];
- if (ntype.IsNestedPrivate() || ntype.IsNestedAssembly()
- || ntype.IsNestedFamANDAssem())
- continue;
- Name classname = Name.fromString(ntype.Name).toTypeName();
- CLRClassParser loader = new CLRClassParser(global, ntype);
- SymbolOrigin origin = SymbolOrigin.CLRAssembly(ntype.Assembly());
- Symbol nclazz = staticsClass.newLoadedClass
- (JAVA, classname, loader, statics, origin);
- clrTypes.map(nclazz, ntype);
- }
-
- FieldInfo[] fields = type.getFields();
- for (int i = 0; i < fields.length; i++) {
- if (fields[i].IsPrivate() || fields[i].IsAssembly()
- || fields[i].IsFamilyAndAssembly())
- continue;
- int mods = translateAttributes(fields[i]);
- Name name = Name.fromString(fields[i].Name);
- scalac.symtab.Type fieldType = getCLRType(fields[i].FieldType);
- if (fields[i].IsLiteral() && !fields[i].FieldType.IsEnum())
- fieldType = make.constantType(
- getConstant(fieldType.symbol(), fields[i].getValue()));
- Symbol owner = fields[i].IsStatic() ? staticsClass : clazz;
- Symbol field = owner.newField(Position.NOPOS, mods, name);
- parseMeta(field, fields[i], fieldType);
- (fields[i].IsStatic() ? statics : members).enterOrOverload(field);
- clrTypes.map(field, fields[i]);
- }
-
- Set methodsSet = new HashSet(Arrays.asList(type.getMethods()));
-
- PropertyInfo[] props = type.getProperties();
- for (int i = 0; i < props.length; i++) {
- scalac.symtab.Type proptype = getCLSType(props[i].PropertyType);
- if (proptype == null)
- continue;
-
- MethodInfo getter = props[i].GetGetMethod(true);
- MethodInfo setter = props[i].GetSetMethod(true);
- if (getter == null || getter.IsPrivate() ||
- getter.IsAssembly() || getter.IsFamilyAndAssembly())
- continue;
- assert props[i].PropertyType == getter.ReturnType;
- Name n;
- scalac.symtab.Type mtype;
-
- ParameterInfo[] gparams = getter.GetParameters();
- if (gparams.length == 0) {
- n = Name.fromString(props[i].Name);
- mtype =
- scalac.symtab.Type.PolyType(Symbol.EMPTY_ARRAY, proptype);
- } else {
- n = Names.apply;
- mtype = methodType(getter, getter.ReturnType);
- }
- int mods = translateAttributes(getter);
- createMethod(n, mods, mtype, getter, getter.IsStatic());
- assert methodsSet.contains(getter) : "" + getter;
- methodsSet.remove(getter);
-
- if (setter == null || setter.IsPrivate() ||
- setter.IsAssembly() || setter.IsFamilyAndAssembly())
- continue;
- ParameterInfo[] sparams = setter.GetParameters();
- assert getter.IsStatic() == setter.IsStatic();
- assert setter.ReturnType == clrTypes.VOID;
- assert sparams.length == gparams.length + 1 : "" + getter + "; " + setter;
-
- if (gparams.length == 0)
- n = Name.fromString(n.toString() + Names._EQ);
- else n = Names.update;
-
- mods = translateAttributes(setter);
- mtype = methodType(setter, global.definitions.UNIT_TYPE());
- createMethod(n, mods, mtype, setter, setter.IsStatic());
- assert methodsSet.contains(setter) : "" + setter;
- methodsSet.remove(setter);
- }
-
- for (Iterator i = methodsSet.iterator(); i.hasNext(); ) {
- MethodInfo method = (MethodInfo)i.next();
- if ((clrTypes.getSymbol(method) != null) || method.IsPrivate()
- || method.IsAssembly() || method.IsFamilyAndAssembly())
- continue;
- createMethod(method);
- }
-
- // Create symbols related to delegate types
- if(clrTypes.isDelegateType(type)) {
- createDelegateView();
- createDelegateChainers();
- }
-
- // for enumerations introduce comparison and bitwise logical operations;
- // the backend should recognize and replace them with comparison or
- // bitwise logical operations on the primitive underlying type
- if (type.IsEnum()) {
- scalac.symtab.Type[] argTypes = new scalac.symtab.Type[] {clazzType};
- int mods = Modifiers.JAVA | Modifiers.FINAL;
- for (int i = 0; i < ENUM_CMP_NAMES.length; i++) {
- scalac.symtab.Type enumCmpType =
- make.methodType(argTypes,
- global.definitions.boolean_TYPE(),
- scalac.symtab.Type.EMPTY_ARRAY);
- createMethod(ENUM_CMP_NAMES[i], mods, enumCmpType, null, false);
- }
- for (int i = 0; i < ENUM_BIT_LOG_NAMES.length; i++) {
- scalac.symtab.Type enumBitLogType = make.methodType
- (argTypes, clazzType, scalac.symtab.Type.EMPTY_ARRAY);
- createMethod
- (ENUM_BIT_LOG_NAMES[i], mods, enumBitLogType, null, false);
- }
- }
-
- ConstructorInfo[] constrs = type.getConstructors();
- for (int i = 0; i < constrs.length; i++) {
- if (constrs[i].IsStatic() || constrs[i].IsPrivate()
- || constrs[i].IsAssembly() || constrs[i].IsFamilyAndAssembly())
- continue;
- createConstructor(constrs[i]);
- }
-
- Symbol constr = clazz.primaryConstructor();
- if (!constr.isInitialized()) {
- constr.setInfo(scalac.symtab.Type.MethodType
- (Symbol.EMPTY_ARRAY, clazzType));
- if ((clazz.flags & Modifiers.INTERFACE) == 0)
- constr.flags |= Modifiers.PRIVATE;
- }
-
- parseMeta(clazz, type, clazzInfo);
-
- return type + " from assembly " + type.Assembly();
- }
-
- private scalac.symtab.Type parseMeta(Symbol sym,
- ICustomAttributeProvider member,
- scalac.symtab.Type defaultType)
- {
- if (member !=null && member.IsDefined(clrTypes.PICO_META_ATTR, false)) {
- Object[] attrs =
- member.GetCustomAttributes(clrTypes.PICO_META_ATTR, false);
- assert attrs.length == 1 : "attrs.length = " + attrs.length;
- String meta =
- (String)((Attribute)attrs[0]).getConstructorArguments()[0];
- defaultType = new MetaParser
- (meta, tvars, sym, defaultType, clazz, clazzType, make).parse();
- }
- sym.setInfo(defaultType);
- return defaultType;
- }
-
- private void createConstructor(ConstructorInfo constr) {
- scalac.symtab.Type mtype = methodType(constr, clazzType);
- if (mtype == null)
- return;
- Symbol constrSym = clazz.primaryConstructor();
- int mods = translateAttributes(constr);
- if (constrSym.isInitialized()) {
- constrSym = clazz.newConstructor(Position.NOPOS, mods);
- clazz.addConstructor(constrSym);
- } else {
- constrSym.flags = mods;
- }
- setParamOwners(mtype, constrSym);
- parseMeta(constrSym, constr, mtype);
- clrTypes.map(constrSym, constr);
- }
-
- private void createMethod(MethodInfo method) {
- scalac.symtab.Type mtype =
- methodType(method, method.ReturnType);
- if (mtype == null)
- return;
- int mods = translateAttributes(method);
- createMethod(getName(method), mods, mtype, method, method.IsStatic());
- }
-
- // Create static view methods within the delegate and the function type
- // with the following signatures:
- // def MyDelegate.view(MyDelegate): FunctionX[InvokeArgs..., InvokeRet];
- // def FunctionX.view(FunctionX[InvokeArgs..., InvokeRet]): MyDelegate;
- private void createDelegateView() {
- // Extract the parameter and return types of the Invoke method
- MethodInfo invoke = (MethodInfo)type.GetMember("Invoke")[0];
- scalac.symtab.Type invokeRetType = getCLRType(invoke.ReturnType);
- scalac.symtab.Type invokeParamTypes[] =
- new scalac.symtab.Type[invoke.GetParameters().length];
- for(int j = 0; j < invoke.GetParameters().length; j++)
- invokeParamTypes[j] =
- getCLRType(invoke.GetParameters()[j].ParameterType);
- scalac.symtab.Type funType =
- global.definitions.FUNCTION_TYPE(invokeParamTypes, invokeRetType);
-
- // FORWARD MAPPING (Delegate => Function)
- scalac.symtab.Type viewParamTypes[] = { getCLRType(type) };
- scalac.symtab.Type viewRetType = funType;
- scalac.symtab.Type viewMethodType = make.methodType(
- viewParamTypes,
- viewRetType,
- scalac.symtab.Type.EMPTY_ARRAY);
-
- createMethod(Names.view, Modifiers.JAVA, viewMethodType, null, true);
-
- // REVERSE MAPPING (Function => Delegate)
- viewParamTypes = new scalac.symtab.Type[]{ funType };
- viewRetType = getCLRType(type);
- viewMethodType = make.methodType(
- viewParamTypes,
- viewRetType,
- scalac.symtab.Type.EMPTY_ARRAY);
-
- createMethod(Names.view, Modifiers.JAVA, viewMethodType, null, true);
- }
-
- private void createDelegateChainers() {
- int mods = Modifiers.JAVA | Modifiers.FINAL;
- Type[] args = new Type[]{type};
-
- createMethod(Names.PLUSEQ, mods, args, clrTypes.VOID,
- clrTypes.DELEGATE_COMBINE, false);
- createMethod(Names.MINUSEQ, mods, args, clrTypes.VOID,
- clrTypes.DELEGATE_REMOVE, false);
- createMethod
- (Names.PLUS, mods, args, type, clrTypes.DELEGATE_COMBINE, false);
- createMethod
- (Names.MINUS, mods, args, type, clrTypes.DELEGATE_REMOVE, false);
- }
-
- private Symbol createMethod(Name name, int mods, Type[] args,
- Type retType, MethodInfo method, boolean statik)
- {
- return createMethod(name, mods, args, getCLSType(retType), method, statik);
- }
- private Symbol createMethod(Name name, int mods, Type[] args,
- scalac.symtab.Type retType,
- MethodInfo method,
- boolean statik)
- {
- scalac.symtab.Type mtype = methodType(args, retType);
- assert mtype != null : name;
- return createMethod(name, mods, mtype, method, statik);
- }
- private Symbol createMethod(Name name, int mods, scalac.symtab.Type mtype,
- MethodInfo method, boolean statik)
- {
- Symbol methodSym = (statik ? staticsClass: clazz)
- .newMethod(Position.NOPOS, mods, name);
- setParamOwners(mtype, methodSym);
- parseMeta(methodSym, method, mtype); // sets the type to mtype if no meta
- (statik ? statics : members).enterOrOverload(methodSym);
- if (method != null)
- clrTypes.map(methodSym, method);
- return methodSym;
- }
-
- private Name getName(MethodInfo method) {
- final String name = method.Name;
- if (method.IsStatic()) return Name.fromString(name);
- final ParameterInfo[] params = method.GetParameters();
- if (name.equals("GetHashCode") && params.length == 0)
- return Names.hashCode;
- if (name.equals("ToString") && params.length == 0)
- return Names.toString;
- if (name.equals("Finalize") && params.length == 0)
- return Names.finalize;
- if (name.equals("Equals") && params.length == 1
- && params[0].ParameterType == clrTypes.OBJECT)
- return Names.equals;
- // TODO: check if the type implements ICloneable?
- if (name.equals("Clone") && params.length == 0)
- return Names.clone;
- // Pretend that delegates have a 'apply' method instead of the 'Invoke'
- // method. This is harmless because the latter one can't be called
- // directly anyway.
- if (name.equals("Invoke")
- && clrTypes.isDelegateType(method.DeclaringType))
- return Names.apply;
- return Name.fromString(name);
- }
-
- //##########################################################################
-
- private Type[] getParamTypes(MethodBase method) {
- ParameterInfo[] params = method.GetParameters();
- Type[] paramTypes = new Type[params.length];
- for (int i = 0; i < params.length; i++)
- paramTypes[i] = params[i].ParameterType;
- return paramTypes;
- }
-
- private scalac.symtab.Type methodType(MethodBase method, Type rettype) {
- scalac.symtab.Type rtype = getCLSType(rettype);
- return rtype == null ? null : methodType(method, rtype);
- }
-
- /** Return a method type for the given method. */
- private scalac.symtab.Type methodType(MethodBase method,
- scalac.symtab.Type rettype)
- {
- return methodType(getParamTypes(method), rettype);
- }
-
- /** Return a method type for the provided argument types and return type. */
- private scalac.symtab.Type methodType(Type[] argtypes,
- scalac.symtab.Type rettype)
- {
- scalac.symtab.Type[] ptypes = new scalac.symtab.Type[argtypes.length];
- for (int i = 0; i < argtypes.length; i++) {
- ptypes[i] = getCLSType(argtypes[i]);
- if (ptypes[i] == null)
- return null;
- }
- return make.methodType(ptypes, rettype, scalac.symtab.Type.EMPTY_ARRAY);
- }
-
- private void setParamOwners(scalac.symtab.Type type, Symbol owner) {
- switch (type) {
- case PolyType(Symbol[] params, scalac.symtab.Type restype):
- for (int i = 0; i < params.length; i++) params[i].setOwner(owner);
- setParamOwners(restype, owner);
- return;
- case MethodType(Symbol[] params, scalac.symtab.Type restype):
- for (int i = 0; i < params.length; i++) params[i].setOwner(owner);
- setParamOwners(restype, owner);
- return;
- }
- }
-
- //##########################################################################
-
- private scalac.symtab.Type getClassType(Type type) {
- assert type != null;
- scalac.symtab.Type res =
- make.classType(type.FullName.replace('+', '.'));
- if (res.isError())
- global.error("unknown class reference " + type.FullName);
- return res;
- }
-
- private scalac.symtab.Type getCLSType(Type type) {
- if (/*type == clrTypes.BYTE ||*/ type == clrTypes.USHORT
- || type == clrTypes.UINT || type == clrTypes.ULONG
- || type.IsNotPublic() || type.IsNestedPrivate()
- || type.IsNestedAssembly() || type.IsNestedFamANDAssem()
- || type.IsPointer()
- || (type.IsArray() && getCLSType(type.GetElementType()) == null))
- return null;
- //Symbol s = clrTypes.getSymbol(type);
- //scalac.symtab.Type t = s != null ? make.classType(s) : getCLRType(type);
- return getCLRType(type);
- }
-
- private scalac.symtab.Type getCLRType(Type type) {
- if (type == clrTypes.OBJECT)
- return make.objectType();
- if (type == clrTypes.STRING)
- return make.stringType();
- if (type == clrTypes.VOID)
- return make.voidType();
- if (type == clrTypes.BOOLEAN)
- return make.booleanType();
- if (type == clrTypes.CHAR)
- return make.charType();
- if (type == clrTypes.BYTE || type == clrTypes.UBYTE)
- return make.byteType();
- if (type == clrTypes.SHORT || type == clrTypes.USHORT)
- return make.shortType();
- if (type == clrTypes.INT || type == clrTypes.UINT)
- return make.intType();
- if (type == clrTypes.LONG || type == clrTypes.ULONG)
- return make.longType();
- if (type == clrTypes.FLOAT)
- return make.floatType();
- if (type == clrTypes.DOUBLE)
- return make.doubleType();
- if (type.IsArray())
- return make.arrayType(getCLRType(type.GetElementType()));
- Symbol s = clrTypes.getSymbol(type);
- return s != null ? make.classType(s) : getClassType(type);
- }
-
- public AConstant getConstant(Symbol base, Object value) {
- if (base == global.definitions.BOOLEAN_CLASS)
- return AConstant.BOOLEAN(((Number)value).intValue() != 0);
- if (base == global.definitions.BYTE_CLASS)
- return AConstant.BYTE(((Number)value).byteValue());
- if (base == global.definitions.SHORT_CLASS)
- return AConstant.SHORT(((Number)value).shortValue());
- if (base == global.definitions.CHAR_CLASS)
- return AConstant.CHAR(((Character)value).charValue());
- if (base == global.definitions.INT_CLASS)
- return AConstant.INT(((Number)value).intValue());
- if (base == global.definitions.LONG_CLASS)
- return AConstant.LONG(((Number)value).longValue());
- if (base == global.definitions.FLOAT_CLASS)
- return AConstant.FLOAT(((Number)value).floatValue());
- if (base == global.definitions.DOUBLE_CLASS)
- return AConstant.DOUBLE(((Number)value).doubleValue());
- if (base == global.definitions.STRING_CLASS)
- return AConstant.STRING((String)value);
- throw Debug.abort("illegal value", Debug.show(value, base));
- }
-
- private static int translateAttributes(Type type) {
- int mods = Modifiers.JAVA;
- if (type.IsNotPublic() || type.IsNestedPrivate()
- || type.IsNestedAssembly() || type.IsNestedFamANDAssem())
- mods |= Modifiers.PRIVATE;
- else if (type.IsNestedFamily() || type.IsNestedFamORAssem())
- mods |= Modifiers.PROTECTED;
- if (type.IsAbstract())
- mods |= Modifiers.ABSTRACT;
- if (type.IsSealed())
- mods |= Modifiers.FINAL;
- if (type.IsInterface())
- mods |= Modifiers.INTERFACE | Modifiers.TRAIT | Modifiers.ABSTRACT;
-
- return mods;
- }
-
- private static int translateAttributes(FieldInfo field) {
- int mods = Modifiers.JAVA;
- if (field.IsPrivate() || field.IsAssembly() || field.IsFamilyAndAssembly())
- mods |= Modifiers.PRIVATE;
- else if (field.IsFamily() || field.IsFamilyOrAssembly())
- mods |= Modifiers.PROTECTED;
- if (field.IsInitOnly())
- mods |= Modifiers.FINAL;
- else
- mods |= Modifiers.MUTABLE;
-
- return mods;
- }
-
- private static int translateAttributes(MethodBase method) {
- int mods = Modifiers.JAVA;
- if (method.IsPrivate() || method.IsAssembly() || method.IsFamilyAndAssembly())
- mods |= Modifiers.PRIVATE;
- else if (method.IsFamily() || method.IsFamilyOrAssembly())
- mods |= Modifiers.PROTECTED;
- if (method.IsAbstract())
- mods |= Modifiers.DEFERRED;
-
- return mods;
- }
-}
diff --git a/sources/scalac/symtab/classfile/CLRPackageParser.java b/sources/scalac/symtab/classfile/CLRPackageParser.java
deleted file mode 100644
index c7e5296e17..0000000000
--- a/sources/scalac/symtab/classfile/CLRPackageParser.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.HashSet;
-
-import scala.tools.util.AbstractFile;
-import scala.tools.util.ByteArrayFile;
-import scala.tools.util.VirtualDirectory;
-
-import scalac.Global;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-import scalac.symtab.SymbolOrigin;
-
-import ch.epfl.lamp.compiler.msil.Type;
-import ch.epfl.lamp.compiler.msil.Attribute;
-
-/**
- * Package/namespace member loader for the CLR.
- */
-public final class CLRPackageParser extends PackageParser {
-
- //########################################################################
- // Private Constants
-
- /** An empty directory */
- private static final AbstractFile EMPTY = new VirtualDirectory("<empty>");
-
- //########################################################################
- // Protected Fields
-
- /** A table to collect types */
- protected final HashMap types = new HashMap();
-
- //########################################################################
- // Public Constructors
-
- public CLRPackageParser(Global global, AbstractFile directory) {
- super(global, directory);
- }
-
- //########################################################################
- // Protected Methods
-
- protected PackageParser newPackageParser(AbstractFile directory) {
- return new CLRPackageParser(global, directory);
- }
-
- protected void collectAllMembers(Symbol clasz) {
- super.collectAllMembers(clasz);
- HashSet namespaces = new HashSet();
- CLRTypes.instance().collectMembers(clasz, types, namespaces);
- for (Iterator i = namespaces.iterator(); i.hasNext(); ) {
- String namespace = (String)i.next();
- if (!packages.containsKey(namespace))
- packages.put(namespace, EMPTY);
- }
- }
-
- protected void removeHiddenMembers(Symbol clasz) {
- // Ignore all ".symbl" and ".class" files.
- symbols.clear();
- classes.clear();
- super.removeHiddenMembers(clasz);
- // Classes/Objects in the root package are hidden.
- if (clasz.isRoot()) { types.clear(); }
- // Source versions hide compiled versions except if separate
- // compilation is enabled and the compiled version is more
- // recent. In that case the compiled version hides the source
- // version.
- boolean separate = global.separate;
- for (Iterator i = sources.entrySet().iterator(); i.hasNext(); ) {
- if (types.isEmpty()) break;
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile sfile = (AbstractFile)entry.getValue();
- Type type = (Type)types.get(name);
- boolean hidden = false;
- if (type != null)
- if (separate /* !!! && type.Assembly().getFile().lastModified() > sfile.lastModified() */)
- hidden = true;
- else
- types.remove(name);
- if (hidden) i.remove();
- }
- // Packages are hidden by classes/objects with the same name.
- packages.keySet().removeAll(types.keySet());
- }
-
- protected Scope createMemberSymbols(Symbol clasz) {
- CLRTypes clrTypes = CLRTypes.instance();
- String namespace = clrTypes.getNameSpaceOf(clasz);
- Scope members = super.createMemberSymbols(clasz);
-
- // import the CLR types contained in the package (namespace)
- for (Iterator i = types.values().iterator(); i.hasNext(); ) {
- Type type = (Type)i.next();
-
- assert namespace.equals(type.Namespace)
- : Debug.show(clasz, namespace) + " << " + type.FullName;
- AbstractFile symfile = null;
- if (type.IsDefined(clrTypes.SCALA_SYMTAB_ATTR, false)) {
- Object[] attrs = type.GetCustomAttributes
- (clrTypes.SCALA_SYMTAB_ATTR, false);
- assert attrs.length == 1 : attrs.length;
- Attribute a = (Attribute)attrs[0];
- assert a.GetType() == clrTypes.SCALA_SYMTAB_ATTR : a.toString();
- if (a.getConstructor() == clrTypes.SYMTAB_DEFAULT_CONSTR)
- continue;
- byte[] symtab = (byte[])a.getConstructorArguments()[0];
- symfile = new ByteArrayFile
- (type.FullName, "[" + type.Assembly().GetName() + "]",
- symtab);
- }
- SymbolLoader loader = symfile != null
- ? new SymblParser(Global.instance, symfile)
- : new CLRClassParser(Global.instance, type);
-
- Name classname = Name.fromString(type.Name).toTypeName();
- SymbolOrigin origin = SymbolOrigin.CLRAssembly(type.Assembly());
- Symbol clazz = clasz.newLoadedClass
- (JAVA, classname, loader, members, origin);
- clrTypes.map(clazz, type);
- //Type moduleType = getType(type.FullName + "$");
- //map(clazz, moduleType != null ? moduleType : type);
- }
-
- return members;
- }
-
- protected String doComplete(Symbol root) {
- String base = super.doComplete(root);
- base = directory == EMPTY ? "" : base + " and ";
- String namespace = CLRTypes.instance().getNameSpaceOf(root);
- return base + "namespace '" + namespace + "'";
- }
-
- //########################################################################
-} // CLRPackageParser
diff --git a/sources/scalac/symtab/classfile/CLRTypes.java b/sources/scalac/symtab/classfile/CLRTypes.java
deleted file mode 100644
index f7a5af508c..0000000000
--- a/sources/scalac/symtab/classfile/CLRTypes.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.util.List;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.LinkedHashSet;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Comparator;
-
-import java.io.File;
-
-import scalac.Global;
-import scalac.CompilerCommand;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolNameWriter;
-
-import ch.epfl.lamp.compiler.msil.*;
-
-/**
- * Collects all types from all reference assemblies.
- */
-public final class CLRTypes {
-
- //##########################################################################
-
- private static CLRTypes instance;
-
- /** Return the unique instance of the CLRTypes class */
- public static CLRTypes instance() {
- assert instance != null;
- return instance;
- }
-
- /** Initialize the CLRTypes */
- public static void init(CompilerCommand args) {
- instance = new CLRTypes(args);
- }
-
- //##########################################################################
-
- public final Type BYTE;
- public final Type UBYTE;
- public final Type CHAR;
- public final Type SHORT;
- public final Type USHORT;
- public final Type INT;
- public final Type UINT;
- public final Type LONG;
- public final Type ULONG;
- public final Type FLOAT;
- public final Type DOUBLE;
- public final Type BOOLEAN;
- public final Type VOID;
- public final Type ENUM;
- public final Type DELEGATE;
-
- public final Type OBJECT;
- public final Type STRING;
- public final Type STRING_ARRAY;
-
- public final MethodInfo MEMBERWISE_CLONE;
-
- public final Type PICO_META_ATTR;
-
- public final Type SCALA_SYMTAB_ATTR;
- public final ConstructorInfo SYMTAB_CONSTR;
- public final ConstructorInfo SYMTAB_DEFAULT_CONSTR;
-
- public final MethodInfo DELEGATE_COMBINE;
- public final MethodInfo DELEGATE_REMOVE;
-
- private final SymbolNameWriter snw = new SymbolNameWriter();
-
- private Type[] types;
-
- private final CompilerCommand args;
-
- private CLRTypes(CompilerCommand args) {
- this.args = args;
- scala.tools.util.ClassPath.addFilesInPath(
- assemrefs, args.assemrefs.value);
- Assembly mscorlib = findAssembly("mscorlib.dll", true);
- Type.initMSCORLIB(mscorlib);
- findAllAssemblies();
-
- if (getType("scala.Int") == null) {
- findAssembly("scala.dll", true);
- }
-
- BYTE = getType("System.SByte");
- UBYTE = getType("System.Byte");
- CHAR = getType("System.Char");
- SHORT = getType("System.Int16");
- USHORT = getType("System.UInt16");
- INT = getType("System.Int32");
- UINT = getType("System.UInt32");
- LONG = getType("System.Int64");
- ULONG = getType("System.UInt64");
- FLOAT = getType("System.Single");
- DOUBLE = getType("System.Double");
- BOOLEAN = getType("System.Boolean");
- VOID = getType("System.Void");
- ENUM = getType("System.Enum");
- DELEGATE = getType("System.MulticastDelegate");
-
- OBJECT = getType("System.Object");
- STRING = getType("System.String");
- STRING_ARRAY = getType("System.String[]");
-
- MEMBERWISE_CLONE = OBJECT.GetMethod("MemberwiseClone", Type.EmptyTypes);
-
- PICO_META_ATTR = Type.GetType("scala.runtime.MetaAttribute");
- SCALA_SYMTAB_ATTR = Type.GetType("scala.runtime.SymtabAttribute");
- final Type[] bytearray = new Type[]{ Type.GetType("System.Byte[]") };
- SYMTAB_CONSTR = SCALA_SYMTAB_ATTR.GetConstructor(bytearray);
- SYMTAB_DEFAULT_CONSTR =
- SCALA_SYMTAB_ATTR.GetConstructor(Type.EmptyTypes);
-
- Type delegate = Type.GetType("System.Delegate");
- Type[] dargs = new Type[]{delegate, delegate};
- DELEGATE_COMBINE = delegate.GetMethod("Combine", dargs);
- DELEGATE_REMOVE = delegate.GetMethod("Remove", dargs);
-
- assert PICO_META_ATTR != null;
- assert SCALA_SYMTAB_ATTR != null;
- assert DELEGATE_COMBINE != null;
- assert DELEGATE_REMOVE != null;
-
- Type[] types = Type.EmptyTypes;
- Iterator as = assemblies.iterator();
- while (as.hasNext()) {
- Type[] atypes = ((Assembly)as.next()).GetTypes();
- int j = 0;
- for (int i = 0; i < atypes.length; i++)
- // skip nested types
- if (atypes[i].DeclaringType == null)
- atypes[j++] = atypes[i];
- Type[] btypes = new Type[types.length + j];
- System.arraycopy(types, 0, btypes, 0, types.length);
- System.arraycopy(atypes, 0, btypes, types.length, j);
- types = btypes;
- }
-
- Comparator typeNameComparator =
- new Comparator() {
- public int compare(Object o1, Object o2) {
- Type t1 = (Type)o1;
- Type t2 = (Type)o2;
- return t1.FullName.compareTo(t2.FullName);
- }
- };
-
- Arrays.sort(types, typeNameComparator);
- this.types = types;
- }
-
- //##########################################################################
- // type mapping and lookup
-
- private final Map syms2members = new HashMap();
- private final Map members2syms = new HashMap();
-
- public void map(Symbol sym, MemberInfo m) {
- syms2members.put(sym, m);
- members2syms.put(m, sym);
- }
-
- public MemberInfo getMember(Symbol sym) {
- return (MemberInfo)syms2members.get(sym);
- }
-
- public Symbol getSymbol(MemberInfo m) {
- return (Symbol)members2syms.get(m);
- }
-
- public Type getType(String name) {
- Type t = Type.GetType(name);
- //assert t != null : name;
- return t;
- }
-
- public Type mkArrayType(Type elemType) {
- return getType(elemType.FullName + "[]");
- }
-
- // Returns true if the given type is a delegate type.
- public boolean isDelegateType(Type t) {
- return t.BaseType() == DELEGATE;
- }
-
- //##########################################################################
- // assembly loading methods
-
- // a list of all loaded assemblies
- private final List assemblies = new LinkedList();
-
- // a set of all directories and assembly files
- private final Set/*<File>*/ assemrefs = new LinkedHashSet();
-
- /** Load the assembly with the given name
- */
- private Assembly findAssembly(String name, boolean required) {
- // see if the assembly is referenced directly
- for (Iterator assems = assemrefs.iterator(); assems.hasNext();) {
- File file = (File)assems.next();
- if (!file.getName().equals(name))
- continue;
- Assembly assem = Assembly.LoadFrom(file.getPath());
- if (assem != null) {
- assems.remove();
- assemblies.add(assem);
- return assem;
- }
- }
- // look in directories specified with the '-r' option
- for (Iterator assems = assemrefs.iterator(); assems.hasNext();) {
- File d = (File)assems.next();
- if (!d.isDirectory())
- continue;
- File file = new File(d, name);
- if (file.exists()) {
- Assembly assem = Assembly.LoadFrom(file.getPath());
- if (assem != null) {
- assemblies.add(assem);
- return assem;
- }
- }
- }
- // try in the current directory
- File file = new File(".", name);
- if (file.exists()) {
- Assembly assem = Assembly.LoadFrom(file.getPath());
- if (assem != null) {
- assemblies.add(assem);
- return assem;
- }
- }
-
- if (required)
- abort(name);
-
- return null;
- }
-
- /** Load the rest of the assemblies specified with the '-r' option
- */
- private void findAllAssemblies() {
- for (Iterator assems = assemrefs.iterator(); assems.hasNext();) {
- File f = (File)assems.next();
- if (f.isFile()) {
- Assembly assem = Assembly.LoadFrom(f.getPath());
- if (assem != null) {
- assemblies.add(assem);
- assems.remove();
- }
- }
- }
- }
-
- private void abort(String name) {
- //the Global instance is not yet constructed; use the Reporter from args
- args.reporter().error(null, "cannot find assembly " + name +
- "; use the -r option to specify its location");
- throw Debug.abort();
- }
-
- //##########################################################################
- // collect the members contained in a given namespace
-
- /** Find the position of the first type whose name starts with
- * the given prefix; return the length of the types array if no match
- * is found so the result can be used to terminate loop conditions
- */
- private int findFirst(String prefix) {
- int m = 0, n = types.length - 1;
- while (m < n) {
- int l = (m + n) / 2;
- int res = types[l].FullName.compareTo(prefix);
- if (res < 0) m = l + 1;
- else n = l;
- }
- return types[m].FullName.startsWith(prefix) ? m : types.length;
- }
-
- /** Collects the members contained in the given Scala package (namespace)
- */
- void collectMembers(Symbol pakage, Map/*<String,Type>*/ typesMap,
- Set/*<String>*/ namespacesSet)
- {
- String namespace = pakage.isRoot() ? "" : snw.toString(pakage) + ".";
- int nl = namespace.length();
- for (int i = findFirst(namespace);
- i < types.length && types[i].FullName.startsWith(namespace);
- i++)
- {
- Type type = types[i];
- if (type.FullName.equals("java.lang.Object")
- || type.FullName.equals("java.lang.String")) {
- continue;
- }
- int k = type.FullName.indexOf(".", nl);
- if (k < 0) {
- typesMap.put(type.Name, type);
- } else {
- namespacesSet.add(type.Namespace.substring(nl, k));
- }
- }
- }
-
- /** Returns the namespace of the given package */
- String getNameSpaceOf(Symbol pakage) {
- assert pakage.hasPackageFlag() || pakage.isRoot(): Debug.show(pakage);
- return pakage.isRoot() ? "" : snw.toString(pakage);
- }
-
- //##########################################################################
-} // CLRTypes
diff --git a/sources/scalac/symtab/classfile/ClassParser.java b/sources/scalac/symtab/classfile/ClassParser.java
deleted file mode 100644
index 5284d9cfed..0000000000
--- a/sources/scalac/symtab/classfile/ClassParser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.io.IOException;
-
-import scala.tools.util.AbstractFile;
-
-import scalac.Global;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-import scalac.util.Debug;
-
-/** This class implements a SymbolLoader that reads a class file. */
-public class ClassParser extends SymbolLoader {
-
- //########################################################################
- // Private Fields
-
- /** The class file to read */
- private final AbstractFile file;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance with the specified class file. */
- public ClassParser(Global global, AbstractFile file) {
- super(global);
- this.file = file;
- }
-
- //########################################################################
- // Protected Methods
-
- /** Completes the specified symbol by reading the class file. */
- protected String doComplete(Symbol root) throws IOException {
- assert root.isClassType(): Debug.show(root);
- ClassfileParser.parse(global, file, root);
- return "class file '" + file + "'";
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/classfile/ClassfileConstants.java b/sources/scalac/symtab/classfile/ClassfileConstants.java
deleted file mode 100644
index 02c07eea4b..0000000000
--- a/sources/scalac/symtab/classfile/ClassfileConstants.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scalac.util.Name;
-
-public interface ClassfileConstants {
-
- int JAVA_MAGIC = 0xCAFEBABE;
- int JAVA_MAJOR_VERSION = 45;
- int JAVA_MINOR_VERSION = 3;
-
- int JAVA_ACC_PUBLIC = 0x0001;
- int JAVA_ACC_PRIVATE = 0x0002;
- int JAVA_ACC_PROTECTED = 0x0004;
- int JAVA_ACC_STATIC = 0x0008;
- int JAVA_ACC_FINAL = 0x0010;
- int JAVA_ACC_SUPER = 0x0020;
- int JAVA_ACC_SYNCHRONIZED = 0x0020;
- int JAVA_ACC_VOLATILE = 0x0040;
- int JAVA_ACC_BRIDGE = 0x0040;
- int JAVA_ACC_TRANSIENT = 0x0080;
- int JAVA_ACC_NATIVE = 0x0100;
- int JAVA_ACC_INTERFACE = 0x0200;
- int JAVA_ACC_ABSTRACT = 0x0400;
- int JAVA_ACC_STRICT = 0x0800;
- int JAVA_ACC_SYNTHETIC = 0x1000;
-
- int CONSTANT_UTF8 = 1;
- int CONSTANT_UNICODE = 2;
- int CONSTANT_INTEGER = 3;
- int CONSTANT_FLOAT = 4;
- int CONSTANT_LONG = 5;
- int CONSTANT_DOUBLE = 6;
- int CONSTANT_CLASS = 7;
- int CONSTANT_STRING = 8;
- int CONSTANT_FIELDREF = 9;
- int CONSTANT_METHODREF = 10;
- int CONSTANT_INTFMETHODREF = 11;
- int CONSTANT_NAMEANDTYPE = 12;
-
- int BAD_ATTR = 0x00000;
- int SOURCEFILE_ATTR = 0x00001;
- int SYNTHETIC_ATTR = 0x00002;
- int DEPRECATED_ATTR = 0x00004;
- int CODE_ATTR = 0x00008;
- int EXCEPTIONS_ATTR = 0x00010;
- int CONSTANT_VALUE_ATTR = 0x00020;
- int LINE_NUM_TABLE_ATTR = 0x00040;
- int LOCAL_VAR_TABLE_ATTR = 0x00080;
- int INNERCLASSES_ATTR = 0x08000;
- int META_ATTR = 0x10000;
- int SCALA_ATTR = 0x20000;
- int JACO_ATTR = 0x40000;
- int BRIDGE_ATTR = 0x80000;
- int SIG_ATTR = 0x100000;
-
- Name SOURCEFILE_N = Name.fromString("SourceFile");
- Name SYNTHETIC_N = Name.fromString("Synthetic");
- Name BRIDGE_N = Name.fromString("Bridge");
- Name DEPRECATED_N = Name.fromString("Deprecated");
- Name CODE_N = Name.fromString("Code");
- Name EXCEPTIONS_N = Name.fromString("Exceptions");
- Name CONSTANT_VALUE_N = Name.fromString("ConstantValue");
- Name LINE_NUM_TABLE_N = Name.fromString("LineNumberTable");
- Name LOCAL_VAR_TABLE_N = Name.fromString("LocalVariableTable");
- Name INNERCLASSES_N = Name.fromString("InnerClasses");
- Name META_N = Name.fromString("JacoMeta");
- Name SCALA_N = Name.fromString("ScalaSignature");
- Name JACO_N = Name.fromString("JacoInterface");
- Name SIG_N = Name.fromString("Signature");
- Name CONSTR_N = Name.fromString("<init>");
-}
diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java
deleted file mode 100644
index 235e350903..0000000000
--- a/sources/scalac/symtab/classfile/ClassfileParser.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.AbstractFile;
-import scala.tools.util.AbstractFileReader;
-import scala.tools.util.Position;
-import scalac.*;
-import scalac.util.*;
-import scalac.symtab.*;
-import scalac.symtab.Scope.SymbolIterator;
-import java.io.*;
-import java.util.*;
-
-//todo: don't keep statics module in scope.
-
-public class ClassfileParser implements ClassfileConstants {
-
- static final int CLASS_ATTR = SOURCEFILE_ATTR
- | INNERCLASSES_ATTR
- | SYNTHETIC_ATTR
- | DEPRECATED_ATTR
- | META_ATTR
- | SCALA_ATTR
- | JACO_ATTR
- | SIG_ATTR;
- static final int METH_ATTR = CODE_ATTR
- | EXCEPTIONS_ATTR
- | SYNTHETIC_ATTR
- | DEPRECATED_ATTR
- | META_ATTR
- | SIG_ATTR
- | BRIDGE_ATTR;
- static final int FIELD_ATTR = CONSTANT_VALUE_ATTR
- | SYNTHETIC_ATTR
- | DEPRECATED_ATTR
- | META_ATTR
- | SIG_ATTR;
-
- protected final Global global;
- protected final AbstractFileReader in;
- protected final Symbol c;
- protected final Symbol m;
- protected final Type ctype;
- protected final JavaTypeFactory make;
- protected final ConstantPool pool;
- protected final AttributeParser attrib;
- protected final Scope locals;
- protected final Scope statics;
-
-
- private ClassfileParser(Global global, AbstractFileReader in, Symbol c, JavaTypeFactory make, ConstantPool pool) {
- this.global = global;
- this.in = in;
- this.c = c;
- this.m = c.linkedModule();
- this.ctype = make.classType(c);
- this.make = make;
- this.pool = pool;
- this.attrib = new AttributeParser(in, pool, this);
- this.locals = new Scope();
- this.statics = new Scope();
- }
-
-
- /** parse the classfile and throw IO exception if there is an
- * error in the classfile structure
- */
- public static void parse(Global global, AbstractFile file, Symbol c) throws IOException {
- AbstractFileReader in = new AbstractFileReader(file);
- try {
- int magic = in.nextInt();
- if (magic != JAVA_MAGIC)
- throw new IOException("class file '" + in.file + "' "
- + "has wrong magic number 0x" + Integer.toHexString(magic)
- + ", should be 0x" + Integer.toHexString(JAVA_MAGIC));
- int minorVersion = in.nextChar();
- int majorVersion = in.nextChar();
- if ((majorVersion < JAVA_MAJOR_VERSION) ||
- ((majorVersion == JAVA_MAJOR_VERSION) &&
- (minorVersion < JAVA_MINOR_VERSION)))
- throw new IOException("class file '" + in.file + "' "
- + "has unknown version "
- + majorVersion + "." + minorVersion
- + ", should be less than "
- + JAVA_MAJOR_VERSION + "." + JAVA_MINOR_VERSION);
- JavaTypeFactory make = new JavaTypeCreator(global.definitions);
- Signatures sigs = new Signatures(global, make, in);
- ConstantPool pool = new ConstantPool(in, sigs);
- int flags = in.nextChar();
- Symbol clasz = pool.getClass(in.nextChar());
- if (c != clasz)
- throw new IOException("class file '" + in.file + "' "
- + "contains wrong class " + clasz.staticType());
- new ClassfileParser(global, in, c, make, pool).parse(flags);
- } catch (RuntimeException e) {
- if (global.debug) e.printStackTrace();
- throw new IOException("class file '" + in.file + "' is broken");
- }
- }
-
- protected void parse(int flags) {
- {
- // todo: correct flag transition
- c.flags = transFlags(flags);
- if ((c.flags & Modifiers.DEFERRED) != 0)
- c.flags = c.flags & ~Modifiers.DEFERRED | Modifiers.ABSTRACT;
- Type supertpe = readClassType(in.nextChar());
- Type[] basetpes = new Type[in.nextChar() + 1];
- // set info of class
- Type classInfo = Type.compoundType(basetpes, locals, c);
- c.setInfo(classInfo);
- // set info of statics class
- Symbol staticsClass = m.moduleClass();
- assert staticsClass.isModuleClass(): Debug.show(staticsClass);
- Type staticsInfo = Type.compoundType(Type.EMPTY_ARRAY, statics, staticsClass);
- staticsClass.setInfo(staticsInfo);
- m.setInfo(make.classType(staticsClass));
- basetpes[0] = supertpe;
- for (int i = 1; i < basetpes.length; i++)
- basetpes[i] = readClassType(in.nextChar());
- int fieldCount = in.nextChar();
- for (int i = 0; i < fieldCount; i++)
- parseField();
- int methodCount = in.nextChar();
- for (int i = 0; i < methodCount; i++)
- parseMethod();
-
- Symbol constr = c.primaryConstructor();
- if (!constr.isInitialized()) {
- constr.setInfo(
- Type.MethodType(Symbol.EMPTY_ARRAY, ctype));
- if ((c.flags & Modifiers.INTERFACE) == 0)
- constr.flags |= Modifiers.PRIVATE;
- }
- attrib.readAttributes(c, classInfo, CLASS_ATTR);
- //System.out.println("dynamic class: " + c);
- //System.out.println("statics class: " + staticsClass);
- //System.out.println("module: " + m);
- //System.out.println("modules class: " + m.type().symbol());
-
- int savedFlags = c.flags;
- c.flags |= Modifiers.INITIALIZED;
- // hack to make memberType in addInheritedOverloaded work
- if (global.currentPhase.id <= global.PHASE.REFCHECK.id() &&
- !c.name.toString().endsWith("$class"))
- addInheritedOverloaded();
-
- //if (global.debug) {
- // Symbol[] elems = c.members().elements();
- // global.log(c + " defines: ");
- // for (int i = 0; i < elems.length; i++) {
- // global.log(elems[i] + ":" + elems[i].type());
- // }
- //}
-
- c.flags = savedFlags;
-
- // Add static members of superclass
- // todo: remove
- Symbol superclass = supertpe.symbol();
- if (m.isJava() && superclass.isJava()) {
- Symbol mclass = m.moduleClass();
- SymbolIterator i = superclass.linkedModule().moduleClass()
- .members().iterator();
- outer:
- while (i.hasNext()) {
- Symbol member = i.next();
- Symbol current = statics.lookup(member.name);
- if (!current.isNone()) {
- if (!member.isTerm()) continue outer;
- Type info = member.info();
- Symbol[] currents = current.alternativeSymbols();
- inner:
- for (int j = 0; j < currents.length; j++) {
- if (currents[j].owner() != mclass)
- continue inner;
- if (currents[j].info().isSubType(info))
- continue outer;
- }
- }
- statics.enterOrOverload(member);
- }
- }
- }
- }
-
- private void addInheritedOverloaded() {
- Symbol[] elems = c.members().elements();
- for (int i = 0; i < elems.length; i++) {
- addInheritedOverloaded(elems[i]);
- }
- }
-
- private void addInheritedOverloaded(Symbol sym) {
- if (sym.isMethod() && !sym.isConstructor()) {
- sym.addInheritedOverloaded(sym.type());
- }
- }
-
- /** convert Java modifiers into Scala flags
- */
- public int transFlags(int flags) {
- int res = 0;
- if ((flags & JAVA_ACC_PRIVATE) != 0)
- res |= Modifiers.PRIVATE;
- else if ((flags & JAVA_ACC_PROTECTED) != 0)
- res |= Modifiers.PROTECTED;
- else if ((flags & JAVA_ACC_PUBLIC) == 0)
- res |= Modifiers.PRIVATE;
- if ((flags & JAVA_ACC_ABSTRACT) != 0)
- res |= Modifiers.DEFERRED;
- if ((flags & JAVA_ACC_FINAL) != 0)
- res |= Modifiers.FINAL;
- if ((flags & JAVA_ACC_INTERFACE) != 0)
- res |= Modifiers.INTERFACE | Modifiers.TRAIT | Modifiers.ABSTRACT;
- if ((flags & JAVA_ACC_SYNTHETIC) != 0)
- res |= Modifiers.SYNTHETIC;
- return res | Modifiers.JAVA;
- }
-
- /** read a class name and return the corresponding class type
- */
- protected Type readClassType(int i) {
- return i == 0 ? make.anyType() : make.classType(pool.getClass(i));
- }
-
- /** read a field
- */
- protected void parseField() {
- int jflags = in.nextChar();
- int sflags = transFlags(jflags);
- if ((jflags & JAVA_ACC_FINAL) == 0) sflags |= Modifiers.MUTABLE;
- if ((sflags & Modifiers.PRIVATE) != 0) {
- in.skip(4);
- attrib.skipAttributes();
- } else {
- Name name = pool.getName(in.nextChar());
- Symbol owner = getOwner(jflags);
- Symbol symbol = owner.newTerm(Position.NOPOS, sflags, name);
- Type type = pool.getFieldType(in.nextChar());
- symbol.setInfo(type);
- attrib.readAttributes(symbol, type, FIELD_ATTR);
- getScope(jflags).enterOrOverload(symbol);
- }
- }
-
- /** read a method
- */
- protected void parseMethod() {
- int jflags = in.nextChar();
- int sflags = transFlags(jflags);
- if ((jflags & JAVA_ACC_BRIDGE) != 0) sflags |= Modifiers.PRIVATE;
- if ((sflags & Modifiers.PRIVATE) != 0) {
- in.skip(4);
- attrib.skipAttributes();
- } else {
- Name name = pool.getName(in.nextChar());
- Type type = pool.getMethodType(in.nextChar());
- Symbol owner = getOwner(jflags);
- Symbol symbol;
- boolean newConstructor = false;
- if (name == CONSTR_N) {
- switch (type) {
- case MethodType(Symbol[] vparams, _):
- type = Type.MethodType(vparams, ctype);
- break;
- default:
- throw Debug.abort("illegal case", type);
- }
- symbol = owner.primaryConstructor();
- if (symbol.isInitialized()) {
- symbol = owner.newConstructor(Position.NOPOS, sflags);
- newConstructor = true;
- } else {
- symbol.flags = sflags;
- }
- } else {
- symbol = owner.newTerm(Position.NOPOS, sflags, name);
- }
- setParamOwners(type, symbol);
- symbol.setInfo(type);
- attrib.readAttributes(symbol, type, METH_ATTR);
- if (name != CONSTR_N) {
- if ((symbol.flags & Modifiers.BRIDGE) == 0)
- getScope(jflags).enterOrOverload(symbol);
- } else if (newConstructor)
- owner.addConstructor(symbol);
- }
- }
-
- /** return the owner of a member with given java flags
- */
- private Symbol getOwner(int jflags) {
- return (jflags & JAVA_ACC_STATIC) != 0 ? m.moduleClass() : c;
- }
-
- /** return the scope of a member with given java flags
- */
- private Scope getScope(int jflags) {
- return (jflags & JAVA_ACC_STATIC) != 0 ? statics : locals;
- }
-
- private void setParamOwners(Type type, Symbol owner) {
- switch (type) {
- case PolyType(Symbol[] params, Type result):
- for (int i = 0; i < params.length; i++)
- params[i].setOwner(owner);
- setParamOwners(result, owner);
- break;
- case MethodType(Symbol[] params, Type result):
- for (int i = 0; i < params.length; i++) params[i].setOwner(owner);
- setParamOwners(result, owner);
- break;
- }
- }
-}
diff --git a/sources/scalac/symtab/classfile/ConstantPool.java b/sources/scalac/symtab/classfile/ConstantPool.java
deleted file mode 100644
index 0a042ae3f0..0000000000
--- a/sources/scalac/symtab/classfile/ConstantPool.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import scalac.atree.AConstant;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scala.tools.util.AbstractFileReader;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.SourceRepresentation;
-
-/** This class implements the parsing of class file constant pools. */
-public class ConstantPool implements ClassfileConstants {
-
- //########################################################################
- // Private Fields
-
- /** The input file */
- private final AbstractFileReader in;
-
- /** The signature parser */
- private final Signatures parser;
-
- /** The start addresses of all constants */
- private final int[] starts;
-
- /** The values of the constants (or null if not yet read) */
- private final Object[] values;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance by reading constant pool in file. */
- public ConstantPool(AbstractFileReader in, Signatures parser) {
- this.in = in;
- this.parser = parser;
- this.starts = new int[in.nextChar()];
- this.values = new Object[starts.length];
- for (int index = 1; index < starts.length; ) {
- starts[index++] = in.bp;
- switch (in.nextByte()) {
- case CONSTANT_UTF8:
- case CONSTANT_UNICODE:
- in.skip(in.nextChar());
- continue;
- case CONSTANT_CLASS:
- case CONSTANT_STRING:
- in.skip(2);
- continue;
- case CONSTANT_FIELDREF:
- case CONSTANT_METHODREF:
- case CONSTANT_INTFMETHODREF:
- case CONSTANT_NAMEANDTYPE:
- case CONSTANT_INTEGER:
- case CONSTANT_FLOAT:
- in.skip(4);
- continue;
- case CONSTANT_LONG:
- case CONSTANT_DOUBLE:
- in.skip(8);
- index++;
- continue;
- default:
- throw errorBadTag(in.bp - 1);
- }
- }
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the string at given index. */
- public String getString(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] instanceof String) return (String)values[index];
- if (values[index] instanceof Name) return values[index].toString();
- String value = readString(starts[index]);
- values[index] = value;
- return value;
- }
-
- /** Returns the name at given index. */
- public Name getName(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] instanceof Name) return (Name)values[index];
- Name value = readName(starts[index]);
- values[index] = value;
- return value;
- }
-
- /** Returns the class at given index. */
- public Symbol getClass(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] instanceof Symbol) return (Symbol)values[index];
- Symbol value = readClass(starts[index]);
- values[index] = value;
- return value;
- }
-
- /** Returns the field type at given index. */
- public Type getFieldType(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] instanceof Type) return (Type)values[index];
- Type value = readFieldType(starts[index]);
- values[index] = value;
- return value;
- }
-
- /** Returns the method type at given index. */
- public Type getMethodType(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] instanceof Type) return clone((Type)values[index]);
- Type value = readMethodType(starts[index]);
- values[index] = value;
- return value;
- }
-
- /** Returns the constant value at given index. */
- public AConstant getConstantValue(int index) {
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- if (values[index] != null) return (AConstant)values[index];
- AConstant value = readConstantValue(starts[index]);
- values[index] = value;
- return value;
- }
-
- //########################################################################
- // Private Fields
-
- /** Reads the string at given address. */
- private String readString(int address) {
- if (in.byteAt(address) != CONSTANT_UTF8) throw errorBadTag(address);
- return parser.at(address).getSignature();
- }
-
- /** Reads the name at given address. */
- private Name readName(int address) {
- return Name.fromString(readString(address));
- }
-
- /** Reads the class at given address. */
- private Symbol readClass(int address) {
- if (in.byteAt(address) != CONSTANT_CLASS) throw errorBadTag(address);
- int index = in.getChar(address + 1);
- if (index <= 0 || starts.length <= index) throw errorBadIndex(index);
- address = starts[index];
- if (in.byteAt(address) != CONSTANT_UTF8) throw errorBadTag(address);
- return parser.at(address).readClassName();
- }
-
- /** Reads the field type at given address. */
- private Type readFieldType(int address) {
- if (in.byteAt(address) != CONSTANT_UTF8) throw errorBadTag(address);
- return parser.at(address).readValueType();
- }
-
- /** Reads the method type at given address. */
- private Type readMethodType(int address) {
- if (in.byteAt(address) != CONSTANT_UTF8) throw errorBadTag(address);
- return parser.at(address).readMethodType();
- }
-
- /** Reads the constant value at given address. */
- private AConstant readConstantValue(int address) {
- switch (in.byteAt(address)) {
- case CONSTANT_STRING:
- return AConstant.STRING(getString(in.getChar(address + 1)));
- case CONSTANT_INTEGER:
- return AConstant.INT(in.getInt(address + 1));
- case CONSTANT_FLOAT:
- return AConstant.FLOAT(in.getFloat(address + 1));
- case CONSTANT_LONG:
- return AConstant.LONG(in.getLong(address + 1));
- case CONSTANT_DOUBLE:
- return AConstant.DOUBLE(in.getDouble(address + 1));
- default:
- throw errorBadTag(address);
- }
- }
-
- /** Returns the type with all its parameters symbols cloned. */
- private Type clone(Type type) {
- switch (type) {
- case MethodType(Symbol[] params, Type result):
- Symbol[] clones = new Symbol[params.length];
- for (int i = 0; i < clones.length; i++)
- clones[i] = params[i].cloneSymbol(Symbol.NONE);
- return Type.MethodType(clones, result);
- case ErrorType:
- return type;
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Throws an exception signaling a bad constant index. */
- private RuntimeException errorBadIndex(int index) {
- String error = "bad constant pool index: " + index;
- throw new RuntimeException(error);
- }
-
- /** Throws an exception signaling a bad tag at given address. */
- private RuntimeException errorBadTag(int address) {
- int tag = in.byteAt(address);
- String error = "bad constant pool tag " + tag + " at byte " + address;
- throw new RuntimeException(error);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/classfile/JavaTypeCreator.java b/sources/scalac/symtab/classfile/JavaTypeCreator.java
deleted file mode 100644
index d01f1923e2..0000000000
--- a/sources/scalac/symtab/classfile/JavaTypeCreator.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.Position;
-import scalac.atree.AConstant;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.symtab.*;
-import Type.*;
-
-
-public class JavaTypeCreator implements JavaTypeFactory {
-
- protected final Definitions definitions;
-
- protected final Type ANY_TYPE;
- protected final Type DOUBLE_TYPE;
- protected final Type FLOAT_TYPE;
- protected final Type LONG_TYPE;
- protected final Type INT_TYPE;
- protected final Type CHAR_TYPE;
- protected final Type SHORT_TYPE;
- protected final Type BYTE_TYPE;
- protected final Type BOOLEAN_TYPE;
- protected final Type UNIT_TYPE;
- protected final Type OBJECT_TYPE;
- protected final Type STRING_TYPE;
- protected final Type ARRAY_TYPE;
-
- public JavaTypeCreator(Definitions definitions) {
- this.definitions = definitions;
- this.ANY_TYPE = classType(definitions.ANY_CLASS);
- this.DOUBLE_TYPE = classType(definitions.DOUBLE_CLASS);
- this.FLOAT_TYPE = classType(definitions.FLOAT_CLASS);
- this.LONG_TYPE = classType(definitions.LONG_CLASS);
- this.INT_TYPE = classType(definitions.INT_CLASS);
- this.CHAR_TYPE = classType(definitions.CHAR_CLASS);
- this.SHORT_TYPE = classType(definitions.SHORT_CLASS);
- this.BYTE_TYPE = classType(definitions.BYTE_CLASS);
- this.BOOLEAN_TYPE = classType(definitions.BOOLEAN_CLASS);
- this.UNIT_TYPE = classType(definitions.UNIT_CLASS);
- this.OBJECT_TYPE = classType(definitions.OBJECT_CLASS);
- this.STRING_TYPE = classType(definitions.STRING_CLASS);
- this.ARRAY_TYPE = classType(definitions.ARRAY_CLASS);
- }
-
- public Type anyType() {
- return ANY_TYPE;
- }
-
- public Type byteType() {
- return BYTE_TYPE;
- }
-
- public Type shortType() {
- return SHORT_TYPE;
- }
-
- public Type charType() {
- return CHAR_TYPE;
- }
-
- public Type intType() {
- return INT_TYPE;
- }
-
- public Type longType() {
- return LONG_TYPE;
- }
-
- public Type floatType() {
- return FLOAT_TYPE;
- }
-
- public Type doubleType() {
- return DOUBLE_TYPE;
- }
-
- public Type booleanType() {
- return BOOLEAN_TYPE;
- }
-
- public Type voidType() {
- return UNIT_TYPE;
- }
-
- public Type objectType() {
- return OBJECT_TYPE;
- }
-
- public Type stringType() {
- return STRING_TYPE;
- }
-
- public Type classType(String classname) {
- if (classname.equals("java.lang.Object"))
- return objectType();
- if (classname.equals("java.lang.String"))
- return stringType();
- return classType(definitions.getClass(classname));
- }
-
- public Type classType(Symbol clasz) {
- return clasz.staticType();
- }
-
- public Type arrayType(Type elemtpe) {
- return Type.appliedType(ARRAY_TYPE, new Type[]{elemtpe});
- }
-
- public Type methodType(Type[] argtpes, Type restpe, Type[] thrown) {
- Symbol[] args = new Symbol[argtpes.length];
- for (int i = 0; i < args.length; i++) {
- args[i] = Symbol.NONE.newTerm( // !!! should be newVParam
- Position.NOPOS, Modifiers.PARAM, Name.fromString("x" + i));
- args[i].setInfo(objToAny(argtpes[i]));
- }
- return new MethodType(args, restpe);
- }
- private Type objToAny(Type tp) {
- return tp.isSameAs(OBJECT_TYPE) ? ANY_TYPE : tp;
- }
-
- public Type packageType(Name packagename) {
- return null;
- }
-
- /** return the constant type for the given constant.
- */
- public Type constantType(AConstant value) {
- return Type.constantType(value);
- }
-
- /** return the type of a given constant.
- */
- public Type typeOfValue(Object value) {
- if (value instanceof Character)
- return charType();
- else if (value instanceof Integer)
- return intType();
- else if (value instanceof Long)
- return longType();
- else if (value instanceof Float)
- return floatType();
- else if (value instanceof Double)
- return doubleType();
- else if (value instanceof String)
- return stringType();
- else if (value instanceof Boolean)
- return booleanType();
- else
- throw Debug.abort("unknown constant type", value.getClass());
- }
-
-}
diff --git a/sources/scalac/symtab/classfile/JavaTypeFactory.java b/sources/scalac/symtab/classfile/JavaTypeFactory.java
deleted file mode 100644
index af89fce22b..0000000000
--- a/sources/scalac/symtab/classfile/JavaTypeFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scalac.atree.AConstant;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Name;
-
-public interface JavaTypeFactory {
- Type anyType();
- Type byteType();
- Type shortType();
- Type charType();
- Type intType();
- Type longType();
- Type floatType();
- Type doubleType();
- Type booleanType();
- Type voidType();
- Type objectType();
- Type stringType();
- Type classType(String classname);
- Type classType(Symbol clasz);
- Type arrayType(Type elemtpe);
- Type methodType(Type[] argtpes, Type restpe, Type[] thrown);
- Type packageType(Name packagename);
- Type constantType(AConstant value);
-}
diff --git a/sources/scalac/symtab/classfile/MetaParser.java b/sources/scalac/symtab/classfile/MetaParser.java
deleted file mode 100644
index afc5f525e1..0000000000
--- a/sources/scalac/symtab/classfile/MetaParser.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, 2003, 2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.Position;
-import scalac.util.Name;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Symbol;
-import scalac.symtab.Scope;
-import scalac.symtab.Type;
-import scalac.ApplicationError;
-import scalac.util.Debug;
-
-import java.util.Vector;
-import java.util.StringTokenizer;
-import java.util.NoSuchElementException;
-
-/** a parser class for parsing meta type information in classfiles
- * generated by pico.
- */
-class MetaParser {
- private final Symbol owner;
- private final StringTokenizer scanner;
- private final Type defaultType;
- private String token;
- private final Scope tvars;
- private Scope locals;
- private final Symbol clazz;
- private final Type ctype;
- private final JavaTypeFactory make;
-
- MetaParser(String meta, Scope tvars, Symbol owner, Type defaultType,
- Symbol clazz, Type ctype, JavaTypeFactory make) {
- this.scanner = new StringTokenizer(meta, "()[], \t<;", true);
- this.defaultType = defaultType;
- this.owner = owner;
- this.tvars = tvars;
- this.clazz = clazz;
- this.ctype = ctype;
- this.make = make;
- }
-
- private static Name getTypeName(String name) {
- return Name.fromString(name).toTypeName();
- }
-
- private Symbol getTVar(String name) {
- return getTVar(name, clazz.primaryConstructor());
- }
-
- private Symbol getTVar(String name, Symbol owner) {
- if (name.startsWith("?")) {
- Symbol s = (locals != null ? locals : tvars)
- .lookup(getTypeName(name));
- if (s != Symbol.NONE)
- return s;
- else if (locals != null) {
- s = tvars.lookup(getTypeName(name));
- if (s != Symbol.NONE)
- return s;
- }
- s = owner.newTParam
- (Position.NOPOS, 0, getTypeName(token), make.anyType());
- tvars.enter(s);
- return s;
- } else
- return Symbol.NONE;
- }
-
- private String nextToken() {
- do {
- token = scanner.nextToken().trim();
- } while (token.length() == 0);
- return token;
- }
-
- protected Type parse() {
- if (scanner.hasMoreTokens()) {
- nextToken();
- if (!scanner.hasMoreTokens())
- return defaultType;
- if ("class".equals(token))
- return parseMetaClass();
- if ("method".equals(token))
- return parseMetaMethod();
- if ("field".equals(token))
- return parseMetaField();
- if ("constr".equals(token))
- return parseConstrField();
- }
- return defaultType;
- }
-
- protected Type parseMetaClass() {
- nextToken();
- //System.out.println("parse meta class " + token);//DEBUG
- if ("[".equals(token)) {
- try {
- Vector syms = new Vector();
- do {
- nextToken();
- int vflag = 0;
- if (token.equals("+")) {
- nextToken();
- vflag = Modifiers.COVARIANT;
- } else if (token.equals("-")) {
- nextToken();
- vflag = Modifiers.CONTRAVARIANT;
- }
- assert token.startsWith("?");
- Symbol s = getTVar(token);
- if (s == Symbol.NONE)
- return defaultType;
- s.flags |= vflag;
- nextToken();
- //System.out.println("new var " + s + ", " + token);//DEBUG
- if (token.equals("<")) {
- nextToken();
- s.setInfo(parseType());
- }
- syms.add(s);
- } while (token.equals(","));
- assert "]".equals(token);
- nextToken();
- Symbol[] smbls = (Symbol[])syms.toArray(new Symbol[syms.size()]);
- //System.out.println("*** " + syms);//DEBUG
- Type clazztype = Type.appliedType(ctype, Symbol.type(smbls));
- Symbol constr = clazz.primaryConstructor();
- switch (constr.rawInfo()) {
- case MethodType(Symbol[] vparams, _):
- constr.setInfo(Type.PolyType
- (smbls, Type.MethodType(vparams, clazztype)));
- break;
- default:
- throw new ApplicationError(constr.rawInfo());
- }
- } catch (NoSuchElementException e) {
- }
- }
- Type res = defaultType;
- if ("extends".equals(token)) {
- Vector basetpes = new Vector();
- do {
- nextToken();
- basetpes.add(parseType());
- } while (token.equals("with"));
- switch (defaultType) {
- case CompoundType(_, Scope scope):
- Type[] ts = (Type[])basetpes.toArray(new Type[basetpes.size()]);
- res = Type.compoundType(ts, scope, defaultType.symbol());
- }
- }
- assert ";".equals(token);
- return res;
- }
-
- protected Type parseType() {
- String name = token;
- Symbol s = getTVar(name);
- nextToken();
- if (s != Symbol.NONE)
- return s.type();
- Type clazztype = make.classType(name).unalias();
- if (token.equals("[")) {
- Vector types = new Vector();
- do {
- nextToken();
- types.add(parseType());
- } while (token.equals(","));
- assert "]".equals(token);
- nextToken();
- Type[] args = new Type[types.size()];
- types.toArray(args);
- return Type.appliedType(clazztype, args);
- } else {
- return clazztype;
- }
- }
-
- protected Type parseMetaMethod() {
- locals = new Scope();
- try {
- nextToken();
- Symbol[] smbls = null;
- //System.out.println("parse meta method " + token);
- if ("[".equals(token)) {
- Vector syms = new Vector();
- do {
- nextToken();
- if ("]".equals(token))
- break;
- assert token.startsWith("?");
- Symbol s = owner.newTParam
- (Position.NOPOS, 0, getTypeName(token), make.anyType());
- locals.enter(s);
- nextToken();
- if (token.equals("<")) {
- nextToken();
- s.setInfo(parseType());
- }
- syms.add(s);
- } while (token.equals(","));
- assert "]".equals(token);
- nextToken();
- smbls = (Symbol[])syms.toArray(new Symbol[syms.size()]);
- }
- if ("(".equals(token)) {
- int i = 0;
- Vector params = new Vector();
- do {
- nextToken();
- if (")".equals(token))
- break;
- int flags = 0;
- if ("def".equals(token)) {
- nextToken();
- flags |= Modifiers.DEF;
- }
- Symbol vp = owner.newVParam
- (Position.NOPOS, flags, Name.fromString("x" + (i++)));
- params.add(vp.setInfo(parseType()));
- //System.out.println(" + " + token);
- } while (token.equals(","));
- assert ")".equals(token);
- nextToken();
- //System.out.println("+++ method " + token);
- Type restpe = parseType();
- assert ";".equals(token);
- Type mtype = Type.MethodType
- ((Symbol[])params.toArray(new Symbol[params.size()]),
- restpe);
- return smbls == null ? mtype : Type.PolyType(smbls, mtype);
- } else {
- Type res = parseType();
- assert ";".equals(token);
- return Type.PolyType
- (smbls == null ? Symbol.EMPTY_ARRAY : smbls, res);
- }
- } catch (NoSuchElementException e) {
- e.printStackTrace();
- return defaultType;
- } finally {
- locals = null;
- }
- }
-
- protected Type parseMetaField() {
- nextToken();
- return parseType();
- }
-
- protected Type parseConstrField() {
- try {
- nextToken();
- //System.out.println("+++ constr " + token);
- if ("(".equals(token)) {
- int i = 0;
- Vector params = new Vector();
- do {
- nextToken();
- if (")".equals(token))
- break;
- Symbol vp = owner.newVParam
- (Position.NOPOS, 0, Name.fromString("x" + (i++)));
- params.add(vp.setInfo(parseType()));
- //System.out.println(" + " + token);
- } while (token.equals(","));
- assert ")".equals(token);
- nextToken();
- assert ";".equals(token);
- return Type.MethodType((Symbol[])params.toArray(new Symbol[params.size()]),
- ctype);
- } else {
- assert ";".equals(token);
- return Type.PolyType(Symbol.EMPTY_ARRAY, ctype);
- }
- } catch (NoSuchElementException e) {
- return defaultType;
- }
- }
-}
diff --git a/sources/scalac/symtab/classfile/PackageParser.java b/sources/scalac/symtab/classfile/PackageParser.java
deleted file mode 100644
index fdbc796916..0000000000
--- a/sources/scalac/symtab/classfile/PackageParser.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.util.Iterator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map.Entry;
-
-import scala.tools.util.AbstractFile;
-
-import scalac.Global;
-import scalac.symtab.Scope;
-import scalac.symtab.SourceCompleter;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-import scalac.symtab.SymbolOrigin;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Debug;
-
-/**
- * This class implements a package member loader. It can be used to
- * complete package class symbols.
- */
-public class PackageParser extends SymbolLoader {
-
- //########################################################################
- // Protected Fields
-
- /** The directory to read */
- protected final AbstractFile directory;
-
- /** A table to collect .scala files */
- protected final HashMap/*<String,AbstractFile>*/ sources = new HashMap();
- /** A table to collect .symbl files */
- protected final HashMap/*<String,AbstractFile>*/ symbols = new HashMap();
- /** A table to collect .class files */
- protected final HashMap/*<String,AbstractFile>*/ classes = new HashMap();
- /** A table to collect subdirectories */
- protected final HashMap/*<String,AbstractFile>*/ packages = new HashMap();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public PackageParser(Global global, AbstractFile directory) {
- super(global);
- this.directory = directory;
- assert directory != null;
- }
-
- //########################################################################
- // Protected Methods
-
- /** Is the given name a valid input file base name? */
- protected boolean isValidName(String name) {
- return name.length() > 0
- &&!name.endsWith("$class")
- && name.indexOf("$$anon") == -1;
- }
-
- /** Returns a new package parser for the given directory. */
- protected PackageParser newPackageParser(AbstractFile directory) {
- return new PackageParser(global, directory);
- }
-
- /**
- * Collects all members of the package. This method is invoked by
- * method "doComplete". It should not be invoked otherwise.
- */
- protected void collectAllMembers(Symbol clasz) {
- for (Iterator i = directory.list(); i.hasNext(); ) {
- AbstractFile file = (AbstractFile)i.next();
- String filename = file.getName();
- if (file.isDirectory()) {
- if (filename.equals("META-INF")) continue;
- packages.put(filename, file);
- continue;
- }
- if (filename.endsWith(".class")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!classes.containsKey(name)) classes.put(name, file);
- continue;
- }
- if (filename.endsWith(".symbl")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!symbols.containsKey(name)) symbols.put(name, file);
- continue;
- }
- if (filename.endsWith(".scala")) {
- String name = filename.substring(0, filename.length() - 6);
- if (!isValidName(name)) continue;
- if (!sources.containsKey(name)) sources.put(name, file);
- continue;
- }
- }
- }
-
- /**
- * Removes from the members collected by "collectAllMembers" all
- * those that are hidden. This method is invoked by method
- * "doComplete". It should not be invoked otherwise.
- */
- protected void removeHiddenMembers(Symbol clasz) {
- // Classes/Objects in the root package are hidden.
- if (clasz.isRoot()) sources.clear();
- if (clasz.isRoot()) symbols.clear();
- if (clasz.isRoot()) classes.clear();
- // For all files "<N>.class" find the longest M such that
- // there is a file "<M>.symbl" and M equals N or "<M>$" is a
- // prefix of N. If the file "<N>.class" is less recent than
- // the file "<M>.symbl" ignore the ".class" file. Otherwise,
- // if M equals N, ignore the ".symbl" file.
- for (Iterator i = classes.entrySet().iterator(); i.hasNext(); ) {
- if (symbols.isEmpty()) break;
- Entry entry = (Entry)i.next();
- String cname = (String)entry.getKey();
- AbstractFile cfile = (AbstractFile)entry.getValue();
- for (String zname = cname; true; ) {
- AbstractFile zfile = (AbstractFile)symbols.get(zname);
- if (zfile != null) {
- if (cfile.lastModified() <= zfile.lastModified()) {
- i.remove();
- } else if (zname == cname) {
- symbols.remove(zname);
- }
- break;
- }
- int index = zname.lastIndexOf('$');
- if (index < 0) break;
- zname = zname.substring(0, index);
- }
- }
- // Source versions hide compiled versions except if separate
- // compilation is enabled and the compiled version is more
- // recent. In that case the compiled version hides the source
- // version.
- boolean separate = global.separate;
- for (Iterator i = sources.entrySet().iterator(); i.hasNext(); ) {
- if (symbols.isEmpty() && classes.isEmpty()) break;
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile sfile = (AbstractFile)entry.getValue();
- AbstractFile zfile = (AbstractFile)symbols.get(name);
- AbstractFile cfile = (AbstractFile)classes.get(name);
- boolean hidden = false;
- if (zfile != null)
- if (separate && zfile.lastModified() > sfile.lastModified())
- hidden = true;
- else
- symbols.remove(name);
- if (cfile != null)
- if (separate && cfile.lastModified() > sfile.lastModified())
- hidden = true;
- else
- classes.remove(name);
- if (hidden) i.remove();
- }
- // Packages are hidden by classes/objects with the same name.
- packages.keySet().removeAll(sources.keySet());
- packages.keySet().removeAll(symbols.keySet());
- packages.keySet().removeAll(classes.keySet());
- }
-
- /**
- * Creates symbols for all members left by method
- * "removeHiddenMembers". This method is invoked by method
- * "doComplete". It should not be invoked otherwise.
- */
- protected Scope createMemberSymbols(Symbol clasz) {
- Scope members = new Scope();
- for (Iterator i = sources.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile sfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new SourceCompleter(global, sfile);
- SymbolOrigin origin = SymbolOrigin.ScalaFile(sfile);
- clasz.newLoadedClass(0, classname, loader, members, origin);
- }
- for (Iterator i = symbols.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile zfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new SymblParser(global, zfile);
- SymbolOrigin origin = SymbolOrigin.SymblFile(zfile);
- clasz.newLoadedClass(0, classname, loader, members, origin);
- }
- for (Iterator i = classes.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile cfile = (AbstractFile)entry.getValue();
- Name classname = Name.fromString(name).toTypeName();
- SymbolLoader loader = new ClassParser(global, cfile);
- SymbolOrigin origin = SymbolOrigin.ClassFile(cfile, null);
- clasz.newLoadedClass(JAVA, classname, loader, members, origin);
- }
- for (Iterator i = packages.entrySet().iterator(); i.hasNext(); ) {
- HashMap.Entry entry = (HashMap.Entry)i.next();
- String name = (String)entry.getKey();
- AbstractFile dfile = (AbstractFile)entry.getValue();
- Name packagename = Name.fromString(name);
- SymbolLoader loader = newPackageParser(dfile);
- SymbolOrigin origin = SymbolOrigin.Directory(dfile);
- clasz.newLoadedPackage(packagename, loader, members, origin);
- }
- return members;
- }
-
- /** Completes the package symbol by loading all its members. */
- protected String doComplete(Symbol root) {
- assert root.isRoot() || root.isPackage(): Debug.show(root);
- Symbol clasz = root.isRoot() ? root : root.moduleClass();
- collectAllMembers(clasz);
- removeHiddenMembers(clasz);
- Scope members = createMemberSymbols(clasz);
- clasz.setInfo(Type.compoundType(Type.EMPTY_ARRAY, members, clasz));
- return "directory path '" + directory + "'";
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/classfile/Pickle.java b/sources/scalac/symtab/classfile/Pickle.java
deleted file mode 100644
index 22699b33a3..0000000000
--- a/sources/scalac/symtab/classfile/Pickle.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.Position;
-import java.util.HashMap;
-import java.io.*;
-import scalac.Global;
-import scalac.ApplicationError;
-import scalac.atree.AConstant;
-import scalac.util.*;
-import scalac.symtab.*;
-import Symbol.*;
-import Type.*;
-
-public class Pickle implements Kinds, Modifiers, EntryTags {
-
- final static boolean debug = false;
-
-/***************************************************
- * Symbol table attribute format: see EntryTags.java
- */
- public byte[] bytes;
- private int bp;
-
- private Name rootname;
- private Symbol rootowner;
- private HashMap index;
- private Object[] entries;
- private int ep;
-
- /** Write symbol table info for root.
- * root must be either a module or a class.
- */
- public Pickle() {
- index = new HashMap();
- entries = new Object[256];
- ep = 0;
- }
-
- /** Pickle all symbols descending from `root'.
- */
- public void add(Symbol root) {
- if (!root.isExternal()) {
- if (Global.instance.debug) System.out.println("pickling " + root);
- if (index.get(root) == null) {
- this.rootname = root.name.toTermName();
- this.rootowner = root.owner();
- putSymbol(root);
- }
- }
- }
-
- /** Finalize pickler with given fullname.
- */
- public void pickle() {
- bytes = new byte[4096];
- bp = 0;
- writeAttr();
- this.index = null;
- this.entries = null;
- }
-
- /** The number of elements defined in `bytes'.
- */
- public int size() {
- return bp;
- }
-
- public void writeTo(File file) throws IOException {
- OutputStream stream = new FileOutputStream(file);
- stream.write(bytes, 0, size());
- stream.close();
- }
-
-/* **************************************************
- * Phase 1: Build entry table
- ************************************************* */
-
- /** Is root in symbol.owner*?
- */
- private boolean isLocal(Symbol sym) {
- return
- sym.name.toTermName() == rootname && sym.owner() == rootowner
- ||
- sym.isConstructor() && isLocal(sym.constructorClass())
- ||
- (sym.kind != NONE && isLocal(sym.owner()));
- }
-
- /** Store entry `e' in index at next available position unless it it
- * already there. Return true iff entry is new.
- */
- private boolean putEntry(Object e) {
- Integer n = (Integer) index.get(e);
- if (n == null) {
- //System.out.println("entry " + e);//DEBUG
- if (ep == entries.length) {
- Object[] entries1 = new Object[ep * 2];
- System.arraycopy(entries, 0, entries1, 0, ep);
- entries = entries1;
- }
- entries[ep] = e;
- index.put(e, new Integer(ep));
- ep++;
- return true;
- } else {
- return false;
- }
- }
-
- /** Store symbol in index. If symbol is local, also store
- * everything it refers to.
- */
- private void putSymbol(Symbol sym) {
- if (putEntry(sym)) {
- if (debug) System.out.println("put " + sym);
- if (isLocal(sym)) {
- putEntry(sym.name);
- putSymbol(sym.isConstructor() ? sym.constructorClass() : sym.owner());
- switch (sym.kind) {
- case TYPE:
- if (sym.isViewBounded()) putType(sym.vuBound());
- else putType(sym.info());
- putType(sym.loBound());
- break;
- case ALIAS:
- putType(sym.info());
- putSymbol(sym.allConstructors());
- break;
- case CLASS:
- putType(sym.info());
- if (sym.isModuleClass()) putSymbol(sym.sourceModule());
- putType(sym.typeOfThis());
- putSymbol(sym.allConstructors());
- Symbol[] elems = sym.members().elements();
- for (int i = 0; i < elems.length; i++)
- putSymbol(elems[i]);
-
- break;
- case VAL:
- putType(sym.removeInheritedOverloaded(sym.info()));
- if (sym.isConstructor() &&
- sym == sym.constructorClass().allConstructors())
- putSymbol(sym.constructorClass());
- else if (sym.isModule())
- putSymbol(sym.moduleClass());
- break;
- default:
- throw new ApplicationError();
- }
- } else if (sym.kind != NONE) {
- putEntry(sym.isModuleClass() || sym.isRoot() ? sym.name.toTermName() : sym.name);
- if (!sym.owner().isRoot())
- putSymbol(sym.owner());
- }
- }
- }
-
- private void putSymbols(Symbol[] syms) {
- for (int i = 0; i < syms.length; i++)
- putSymbol(syms[i]);
- }
-
- /** Store type and everythig it refers to in index.
- */
- private void putType(Type tp) {
- if (putEntry(tp)) {
- switch (tp) {
- case NoType:
- break;
- case NoPrefix:
- putSymbol(Symbol.NONE);
- // !!! code above is usefull for compatibility
- // !!! nothing would be better line
- break;
- case ThisType(Symbol sym):
- putSymbol(sym);
- break;
- case SingleType(Type pre, Symbol sym):
- putType(pre);
- putSymbol(sym);
- break;
- case ConstantType(Type base, AConstant value):
- putType(base);
- putConstant(value);
- break;
- case TypeRef(Type pre, Symbol sym, Type[] args):
- putType(pre);
- putSymbol(sym);
- putTypes(args);
- break;
- case CompoundType(Type[] parents, Scope members):
- Symbol clazz = tp.symbol();
- if (clazz.isCompoundSym()) putSymbol(clazz.owner());
- putSymbol(clazz);
- putTypes(parents);
- break;
- case MethodType(Symbol[] vparams, Type result):
- putType(result);
- for (int i = 0; i < vparams.length; i++) {
- Type ptype = vparams[i].type();
- putType(ptype);
- int pflags = vparams[i].flags;
- if ((pflags & (REPEATED | DEF)) != 0)
- putEntry(new FlagsAndType(encodeFlags(pflags), ptype));
- }
- break;
- case PolyType(Symbol[] tparams, Type result):
- putType(result);
- putSymbols(tparams);
- break;
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int i = 0; i < alts.length; i++) alts[i].flags |= ALTERNATIVE;
- putSymbols(alts);
- putTypes(alttypes);
- break;
- default:
- throw new ApplicationError();
- }
- }
- }
-
- private void putTypes(Type[] tps) {
- for (int i = 0; i < tps.length; i++)
- putType(tps[i]);
- }
-
- private void putConstant(AConstant constant) {
- if (putEntry(constant)) {
- switch (constant) {
- case STRING(String value):
- putEntry(Name.fromString(value));
- return;
- }
- }
- }
-
-/* **************************************************
- * Phase 2: Write byte array
- ************************************************* */
-
- private void resizeTo(int size) {
- byte[] bytes1 = new byte[size];
- System.arraycopy(bytes, 0, bytes1, 0, bp);
- bytes = bytes1;
- }
-
- /** Write a byte of data
- */
- private void writeByte(int b) {
- if (bp == bytes.length) resizeTo(bytes.length * 2);
- bytes[bp++] = (byte)b;
- if (debug) System.out.print(b + " ");
- }
-
- /** Write a natural number in big endian format, base 128.
- * All but the last digits have bit 0x80 set.
- */
- private void writeNat(int x) {
- int y = x >>> 7;
- if (y != 0) writeNatPrefix(y);
- writeByte(x & 0x7f);
- }
-
- private void writeNatPrefix(int x) {
- int y = x >>> 7;
- if (y != 0) writeNatPrefix(y);
- writeByte((x & 0x7f) | 0x80);
- }
-
- /** Write a natural number at `pos'
- * If number is more than one byte, shift rest of array to make space.
- */
- private void patchNat(int pos, int x) {
- bytes[pos] = (byte) (x & 0x7f);
- int y = x >>> 7;
- if (y != 0) patchNatPrefix(pos, y);
- }
-
- private void patchNatPrefix(int pos, int x) {
- writeByte(0);
- System.arraycopy(bytes, pos, bytes, pos+1, bp - (pos+1));
- bytes[pos] = (byte) ((x & 0x7f) | 0x80);
- int y = x >>> 7;
- if (y != 0) patchNatPrefix(pos, y);
- }
-
- /** Write a long number in signed big endian format, base 256.
- */
- private void writeLong(long x) {
- long y = x >> 8;
- long z = x & 0xff;
- if (-y != z >> 7) writeLong(y);
- writeByte((int) z);
- }
-
- /** Write a reference to object, i.e., the object's number in the index.
- */
- private void writeRef(Object ref) {
- Integer i = (Integer) index.get(ref);
- assert i != null : ref + " " + ref.getClass();
- writeNat(i.intValue());
- }
-
- private void writeRefs(Object[] es) {
- for (int i = 0; i < es.length; i++) writeRef(es[i]);
- }
-
- /** Write a name entry. Names are stored in Utf8 format.
- */
- private void writeName(Name name) {
- writeByte(name.isTermName() ? TERMname : TYPEname);
- writeByte(0); // space for length
- byte[] ascii = name.toAsciiUnsafe();
- while (bp + ascii.length > bytes.length) resizeTo(bytes.length * 2);
- System.arraycopy(ascii, 0, bytes, bp, ascii.length);
- if (debug) System.out.print(name);
- bp = bp + ascii.length;
- }
-
- /** Write a symbol entry.
- */
- private void writeSymbol(Symbol sym) {
- if (debug) System.out.println("write " + sym);
- if (isLocal(sym)) {
- switch (sym.kind) {
- case TYPE:
- writeByte(TYPEsym);
- break;
- case ALIAS:
- writeByte(ALIASsym);
- break;
- case CLASS:
- writeByte(CLASSsym);
- break;
- case VAL:
- writeByte(VALsym);
- break;
- default:
- throw new ApplicationError();
- }
- writeByte(0); // space for length
- writeRef(sym.name);
- writeRef(sym.isConstructor() ? sym.constructorClass() : sym.owner());
- writeNat(sym.flags);
- switch (sym.kind) {
- case TYPE:
- if (sym.isViewBounded()) writeRef(sym.vuBound());
- else writeRef(sym.info());
- writeRef(sym.loBound());
- break;
- case ALIAS:
- writeRef(sym.info());
- writeRef(sym.allConstructors());
- break;
- case CLASS:
- writeRef(sym.info());
- if (sym.isModuleClass()) writeRef(sym.sourceModule());
- writeRef(sym.typeOfThis());
- writeRef(sym.allConstructors());
- break;
- case VAL:
- writeRef(sym.removeInheritedOverloaded(sym.info()));
- if (sym.isConstructor() &&
- sym == sym.constructorClass().allConstructors())
- writeRef(sym.constructorClass());
- else if (sym.isModule())
- writeRef(sym.moduleClass());
- break;
- default:
- throw new ApplicationError();
- }
- } else if (sym.kind == NONE) {
- writeByte(NONEsym);
- writeByte(0); // space for length
- } else {
- if (sym.isModuleClass() || sym.isRoot()) {
- writeByte(EXTMODCLASSref);
- writeByte(0); // space for length
- writeRef(sym.name.toTermName());
- } else {
- writeByte(EXTref);
- writeByte(0); // space for length
- assert !sym.isConstructor() : sym;
- writeRef(sym.name);
- }
- if (!sym.owner().isRoot())
- writeRef(sym.owner());
- }
- sym.flags &= ~ALTERNATIVE;
- }
-
- /** Write a type entry.
- */
- private void writeType(Type tp) {
- switch (tp) {
- case NoType:
- writeByte(NOtpe);
- writeByte(0); // space for length
- break;
- case NoPrefix:
- writeByte(THIStpe);
- writeByte(0); // space for length
- writeRef(Symbol.NONE);
- // !!! code above is usefull for compatibility
- // !!! following code would be better line:
- // !!! writeByte(NOpre);
- // !!! writeByte(0); // space for length
- break;
- case ThisType(Symbol sym):
- writeByte(THIStpe);
- writeByte(0); // space for length
- writeRef(sym);
- break;
-
- case SingleType(Type pre, Symbol sym):
- writeByte(SINGLEtpe);
- writeByte(0); // space for length
- writeRef(pre);
- writeRef(sym);
- break;
-
- case ConstantType(Type base, AConstant value):
- writeByte(CONSTANTtpe);
- writeByte(0); // space for length
- writeRef(base);
- writeRef(value);
- break;
-
- case TypeRef(Type pre, Symbol sym, Type[] args):
- writeByte(TYPEREFtpe);
- writeByte(0); // space for length
- writeRef(pre);
- writeRef(sym);
- writeRefs(args);
- break;
-
- case CompoundType(Type[] parents, Scope members):
- writeByte(COMPOUNDtpe);
- writeByte(0); // space for length
- Symbol clazz = tp.symbol();
- writeByte(clazz.isCompoundSym() ? 1 : 0);
- if (clazz.isCompoundSym()) writeRef(clazz.owner());
- writeRef(clazz);
- writeRefs(parents);
- break;
-
- case MethodType(Symbol[] vparams, Type result):
- writeByte(METHODtpe);
- writeByte(0); // space for length
- writeRef(result);
- for (int i = 0; i < vparams.length; i++) {
- Type ptype = vparams[i].type();
- int pflags = vparams[i].flags;
- if ((pflags & (REPEATED | DEF)) != 0)
- writeRef(new FlagsAndType(encodeFlags(pflags), ptype));
- else
- writeRef(ptype);
- }
- break;
-
- case PolyType(Symbol[] tparams, Type result):
- writeByte(POLYtpe);
- writeByte(0); // space for length
- writeRef(result);
- writeRefs(tparams);
- break;
-
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- writeByte(OVERLOADEDtpe);
- writeByte(0); // space for length
- writeRefs(alts);
- writeRefs(alttypes);
- break;
-
- default:
- throw new ApplicationError();
- }
- }
-
- private void writeFlagsAndType(FlagsAndType ft) {
- writeByte(FLAGGEDtpe);
- writeByte(0); // space for length
- writeNat(ft.flags);
- writeRef(ft.type);
- }
-
- /** Write a constant entry.
- */
- private void writeConstant(AConstant constant) {
- switch (constant) {
- case UNIT:
- writeByte(LITERALunit);
- writeByte(0); // space for length
- return;
- case BOOLEAN(boolean value):
- writeByte(LITERALboolean);
- writeByte(0); // space for length
- writeByte(value ? 1 : 0);
- return;
- case BYTE(byte value):
- writeByte(LITERALbyte);
- writeByte(0); // space for length
- writeLong(value);
- return;
- case SHORT(short value):
- writeByte(LITERALshort);
- writeByte(0); // space for length
- writeLong(value);
- return;
- case CHAR(char value):
- writeByte(LITERALchar);
- writeByte(0); // space for length
- writeLong(value);
- return;
- case INT(int value):
- writeByte(LITERALint);
- writeByte(0); // space for length
- writeLong(value);
- return;
- case LONG(long value):
- writeByte(LITERALlong);
- writeByte(0); // space for length
- writeLong(value);
- return;
- case FLOAT(float value):
- writeByte(LITERALfloat);
- writeByte(0); // space for length
- writeLong(Float.floatToIntBits(value));
- return;
- case DOUBLE(double value):
- writeByte(LITERALdouble);
- writeByte(0); // space for length
- writeLong(Double.doubleToLongBits(value));
- return;
- case STRING(String value):
- writeByte(LITERALstring);
- writeByte(0); // space for length
- writeRef(Name.fromString(value));
- return;
- case NULL:
- writeByte(LITERALnull);
- writeByte(0); // space for length
- return;
- case ZERO:
- writeByte(LITERALzero);
- writeByte(0); // space for length
- return;
- default:
- throw Debug.abort("unknown case", constant);
- }
- }
-
- private void writeEntry(Object e) {
- int startpos = bp;
- if (e instanceof Symbol)
- writeSymbol((Symbol) e);
- else if (e instanceof Type)
- writeType((Type) e);
- else if (e instanceof Name)
- writeName((Name) e);
- else if (e instanceof FlagsAndType)
- writeFlagsAndType((FlagsAndType) e);
- else if (e instanceof AConstant)
- writeConstant((AConstant)e);
- else
- throw new ApplicationError(e);
- patchNat(startpos + 1, bp - (startpos + 2));
- }
-
- private void writeAttr() {
- writeNat(ep);
- for (int i = 0; i < ep; i++) {
- if (debug) System.out.print(i + "," + bp + ": ");
- writeEntry(entries[i]);
- if (debug) System.out.print("(" + entries[i] + ")");
- if (debug) System.out.println();
- }
- }
-
- private static int encodeFlags(int flags) {
- int n = 0;
- if ((flags & REPEATED) != 0) n |= REPEATEDflag;
- if ((flags & DEF) != 0) n |= DEFflag;
- return n;
- }
-
- static class FlagsAndType {
- int flags;
- Type type;
- FlagsAndType(int flags, Type type) {
- this.flags = flags;
- this.type = type;
- }
- public boolean equals(Object other) {
- if (other instanceof FlagsAndType) {
- FlagsAndType that = (FlagsAndType) other;
- return this.type.equals(that.type) &&
- this.flags == that.flags;
- } else {
- return false;
- }
- }
- public int hashCode() {
- return 37 + ((flags * 41) ^ type.hashCode());
- }
- }
-}
-
diff --git a/sources/scalac/symtab/classfile/Signatures.java b/sources/scalac/symtab/classfile/Signatures.java
deleted file mode 100644
index 102bce1a64..0000000000
--- a/sources/scalac/symtab/classfile/Signatures.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import scala.tools.util.Position;
-import scala.tools.util.AbstractFileReader;
-import scalac.Global;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.SourceRepresentation;
-import scalac.util.Debug;
-
-/** This class implements the parsing of class file signatures. */
-public class Signatures {
-
- //########################################################################
- // Private Fields
-
- /** The global environment */
- private final Global global;
-
- /** The Java type factory */
- private final JavaTypeFactory make;
-
- /** The input file */
- private final AbstractFileReader in;
-
- /** The address of the first byte of the current signature */
- private int first;
-
- /** The address of the last byte of the current signature */
- private int last;
-
- /** The current address (first <= current <= last) */
- private int current;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public Signatures(Global global, JavaTypeFactory make,
- AbstractFileReader in)
- {
- this.global = global;
- this.make = make;
- this.in = in;
- }
-
- //########################################################################
- // Public Methods
-
- /**
- * Sets the address of the next signature to read. The address
- * must point to the first byte of a CONSTANT_Utf8_info.
- */
- public Signatures at(int address) {
- first = address + 3;
- last = first + in.getChar(address + 1) - 1;
- current = first;
- return this;
- }
-
- /** Returns the current signature. */
- public String getSignature() {
- return SourceRepresentation.ascii2string(in.buf, first, last-first+1);
- }
-
- /** Reads the class signature at current address. */
- public Symbol readClassName() {
- Symbol owner = global.definitions.ROOT_CLASS;
- int start = current;
- for (; current <= last; current++) {
- int b = in.byteAt(current);
- if (b == ';') break;
- if (b != '/') continue;
- Name name = Name.fromAscii(in.buf, start, current - start);
- Symbol module = owner.members().lookup(name);
- if (!module.isModule()) {
- Symbol symbol = owner.newModule(Position.NOPOS, 0, name);
- symbol.moduleClass().setInfo(Type.ErrorType);
- error("could not find module " + symbol.staticType());
- if (module.isNone()) owner.members().enterNoHide(symbol);
- module = symbol;
- }
- owner = module.moduleClass();
- start = current + 1;
- }
-
- Symbol clasz = null;
- Name name = Name.fromAscii(in.buf, start, current-start);
- if (owner == global.definitions.JAVALANG.moduleClass()) {
- if (name == Names.String)
- clasz = global.definitions.STRING_CLASS;
- else if (name == Names.Object)
- clasz = global.definitions.OBJECT_CLASS;
- }
- if (clasz == null) {
- name = name.toTypeName();
- clasz = owner.members().lookup(name);
- }
-
- if (!clasz.isClass()) {
- Symbol symbol = owner.newErrorClass(name);
- error("could not find class " + symbol.staticType());
- if (clasz.isNone()) owner.members().enterNoHide(symbol);
- clasz = symbol;
- }
- current++;
- return clasz;
- }
-
- /** Reads the value type signature at current address. */
- public Type readValueType() {
- switch (in.byteAt(current++)) {
- case 'V': return make.voidType();
- case 'Z': return make.booleanType();
- case 'B': return make.byteType();
- case 'S': return make.shortType();
- case 'C': return make.charType();
- case 'I': return make.intType();
- case 'J': return make.longType();
- case 'F': return make.floatType();
- case 'D': return make.doubleType();
- case 'L': return make.classType(readClassName());
- case '[': return make.arrayType(readValueType());
- default : return errorBadTypeTag(current - 1);
- }
- }
-
- /** Reads the method type signature at current address. */
- public Type readMethodType() {
- if (in.byteAt(current++) != '(') return errorBadTypeTag(current - 1);
- Type[] parameters = readParamterTypes(0);
- Type result = readValueType();
- return make.methodType(parameters, result, Type.EMPTY_ARRAY);
- }
-
- //########################################################################
- // Private Methods
-
- /** Reads the parameter types at current address. */
- private Type[] readParamterTypes(int i) {
- if (in.byteAt(current) == ')') {
- current++;
- return new Type[i];
- } else {
- Type type = readValueType();
- Type[] types = readParamterTypes(i + 1);
- types[i] = type;
- return types;
- }
- }
-
- /** Signals a bad tag at given address. Return ErrorType. */
- private Type errorBadTypeTag(int address) {
- char tag = (char)in.byteAt(address);
- error("bad tag '" + tag + "' in signature '" + getSignature() + "'");
- return Type.ErrorType;
- }
-
- /** Signals the given error. */
- private void error(String error) {
- global.error("class file '" + in.file + "': " + error);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/classfile/SymblParser.java b/sources/scalac/symtab/classfile/SymblParser.java
deleted file mode 100644
index 5c948d9176..0000000000
--- a/sources/scalac/symtab/classfile/SymblParser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.io.IOException;
-
-import scala.tools.util.AbstractFile;
-
-import scalac.Global;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolLoader;
-
-/** This class implements a SymbolLoader that reads a symbol file. */
-public class SymblParser extends SymbolLoader {
-
- //########################################################################
- // Private Fields
-
- /** The symbol file to read */
- private final AbstractFile file;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance with the specified symbol file. */
- public SymblParser(Global global, AbstractFile file) {
- super(global);
- this.file = file;
- }
-
- //########################################################################
- // Protected Methods
-
- /** Completes the specified symbol by reading the symbol file. */
- public String doComplete(Symbol root) throws IOException {
- UnPickle.parse(global, file, root);
- return "symbol file '" + file + "'";
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/symtab/classfile/UnPickle.java b/sources/scalac/symtab/classfile/UnPickle.java
deleted file mode 100644
index f3a715b480..0000000000
--- a/sources/scalac/symtab/classfile/UnPickle.java
+++ /dev/null
@@ -1,643 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.symtab.classfile;
-
-import java.util.HashMap;
-import java.io.IOException;
-import java.io.PrintStream;
-import scala.tools.util.AbstractFile;
-import scala.tools.util.Position;
-import scalac.*;
-import scalac.atree.AConstant;
-import scalac.util.*;
-import scalac.symtab.*;
-import Symbol.*;
-import Type.*;
-
-public class UnPickle implements Kinds, Modifiers, EntryTags, TypeTags {
-
-/***************************************************
- * Symbol table attribute format: see EntryTags.java
- */
- static final boolean debug = true;
-
- public static void parse(Global global, AbstractFile file, Symbol root)
- throws IOException
- {
- try {
- parse(global, file.read(), root);
- } catch (BadSignature exception) {
- throw new IOException("symbol file '" + file.getPath() + "' "
- + "could not be loaded; " + exception.getMessage());
- }
- }
-
- /**
- * The root symbol must be either a module or a non-module
- * class. The unpickler initializes it. If it has a linked module
- * or class, it will also be initialized.
- */
- public static void parse(Global global, byte[] data, Symbol root)
- throws BadSignature
- {
- new UnPickle(global, data, root);
- }
-
- Symbol classroot;
- Symbol moduleroot;
- byte[] bytes;
- int bp;
- int[] index;
- Object[] entries;
- int paramFlags;
- final Global global;
-
- private UnPickle(Global global, byte[] data, Symbol root) {
- this.global = global;
- this.classroot = root.isModule() ? root.linkedClass() : root;
- this.moduleroot = root.isClassType() ? root.linkedModule() : root;
- assert classroot == null || classroot.isClassType(): Debug.show(root);
- assert moduleroot == null || moduleroot.isModule(): Debug.show(root);
- if (root != moduleroot && moduleroot != null) {
- moduleroot.moduleClass().setInfo(Type.NoType);
- }
- if (global.debug) global.log(
- "unpickle " + root + " " + classroot + " " + moduleroot
- + (moduleroot != null ? " " + moduleroot.moduleClass() : ""));
- this.bytes = data;
- this.bp = 0;
- index = new int[readNat()];
- for (int i = 0; i < index.length; i++) {
- index[i] = bp;
- bp++;
- bp = readNat() + bp;
- }
- entries = new Object[index.length];
-
- if (global.debug) print(System.out);
-
- for (int i = 0; i < index.length; i++) {
- if (isSymbolEntry(i)) getSymbol(i);
- }
- if (global.debug) global.log("unpickled " + root + ":" + root.rawInfo());//debug
- if (!classroot.isInitialized() && !moduleroot.isInitialized())
- throw new BadSignature(this, "it does not define " + root);
- // the isModule test is needed because moduleroot may become
- // the case class factory method of classroot
- if (moduleroot != null && moduleroot.isModule() && moduleroot.moduleClass().type() == Type.NoType) {
- moduleroot.setInfo(Type.NoType);
- }
- }
-
- int readByte() {
- return bytes[bp++];
- }
-
- int readNat() {
- int b;
- int x = 0;
- do {
- b = readByte();
- x = (x << 7) + (b & 0x7f);
- } while ((b & 0x80) != 0);
- return x;
- }
-
- long readLong(int n) {
- long x = 0;
- for (int i = 0; i < n; i++) {
- x = (x << 8) + (readByte() & 0xff);
- }
- int leading = 64 - (n * 8);
- return x << leading >> leading;
- }
-
- boolean isTypeEntry(int i) {
- int tag = bytes[index[i]];
- return (firstTypeTag <= tag && tag <= lastTypeTag) || tag == NOpre;
- }
-
- boolean isSymbolEntry(int i) {
- int tag = bytes[index[i]];
- return (firstSymTag <= tag && tag <= lastSymTag);
- }
-
- Name getName(int n) {
- if (entries[n] == null) {
- int savedBp = bp;
- bp = index[n];
- int tag = bytes[bp++];
- int len = readNat();
- Name name = Name.fromAscii(bytes, bp, len);
- switch (tag) {
- case TERMname : entries[n] = name; break;
- case TYPEname : entries[n] = name.toTypeName(); break;
- default: throw new BadSignature(this);
- }
- bp = savedBp;
- }
- return (Name) entries[n];
- }
-
- Name readNameRef() {
- return getName(readNat());
- }
-
- String decode(Name name) {
- if (name.isTypeName()) return "type " + NameTransformer.decode(name);
- else return "value " + NameTransformer.decode(name);
- }
-
- /*
- void enterSymbol(Symbol sym) {
- Symbol owner = sym.owner();
- if (owner.kind == CLASS &&
- !sym.isConstructor() && !sym.isModuleClass()) {
- Scope scope = owner.info().members();
- scope.enterOrOverload(sym);
- }
- }
- */
-
- void enterSymbol(Symbol sym) {
- /*
- if (global.debug) {
- global.log("entering " + sym + ":" + sym.type() + " in " + sym.owner());//debug
- if (sym.kind == CLASS)
- global.log("primconstr = " + sym.primaryConstructor());
- }
- */
- if ((sym.flags & ALTERNATIVE) != 0) {
- sym.flags &= ~ALTERNATIVE;
- } else {
- Symbol owner = sym.owner();
- if (owner.kind == CLASS &&
- !sym.isConstructor() && !sym.isModuleClass()) {
- Scope scope = owner.info().members();
- Symbol other = scope.lookup(sym.name);
- if (other == Symbol.NONE) {
- scope.enter(sym);
- } else {
- assert sym == other
- : "double enter: " + other + ":" + other.rawFirstInfo() + "," + sym + ":" + sym.rawFirstInfo();
- }
- }
- }
- }
-
- Symbol getSymbol(int n) {
- if (entries[n] == null) {
- int savedBp = bp;
- bp = index[n];
- int tag = bytes[bp++];
- int end = readNat() + bp;
- Symbol sym;
- Symbol owner;
- switch (tag) {
- case NONEsym:
- entries[n] = sym = Symbol.NONE;
- break;
- case EXTref:
- case EXTMODCLASSref:
- Name name = readNameRef();
- if (bp == end) {
- owner = global.definitions.ROOT_CLASS;
- } else {
- assert bp < end;
- owner = readSymbolRef();
- }
- if (name == Names.ROOT && owner == Symbol.NONE) {
- sym = global.definitions.ROOT_CLASS;
- if (tag == EXTref) sym = sym;
- // !!! line above is usefull for the transition
- // !!! after some time, replace it by the following line:
- // !!! assert tag != EXTref;
- } else {
- sym = owner.info().lookup(name);
- if (tag == EXTMODCLASSref) {
- /*
- if (sym.kind == VAL)
- switch (sym.type()) {
- case OverloadedType(Symbol[] alts, _):
- for (int i = 0; i < alts.length; i++)
- if (alts[i].isModule()) sym = alts[i];
- }
- */
- assert sym.isModule();
- sym = sym.moduleClass();
- }
- }
- entries[n] = sym;
- if (sym.kind == NONE) {
- if (global.debug)
- global.log(owner.info().members().toString());
- throw new BadSignature(this,
- "reference " + decode(name) + " of " + owner +
- " refers to nonexisting symbol.");
- }
- break;
- default:
- assert isSymbolEntry(n) : n;
- Name name = readNameRef();
- if (global.debug)
- global.log("reading " + name + " at " + n);
- owner = readSymbolRef();
- if (entries[n] == null) {
- int flags = readNat();
- int inforef = readNat();
- switch (tag) {
- case TYPEsym:
- entries[n] = sym = owner.newAbstractType(
- Position.NOPOS, flags, name);
- if ((flags & VIEWBOUND) != 0) {
- sym.setInfo(global.definitions.ANY_TYPE());
- sym.setVuBound(getType(inforef, sym));
- } else {
- sym.setInfo(getType(inforef, sym));
- }
- sym.setLoBound(readTypeRef(sym));
- break;
-
- case ALIASsym:
- entries[n] = sym = owner.newTypeAlias(
- Position.NOPOS, flags, name);
- sym.setInfo(getType(inforef, sym));
- Symbol constr = readSymbolRef();
- break;
-
- case CLASSsym:
- if ((flags & MODUL) != 0) {
- Symbol modulesym = readSymbolRef();
- entries[n] = sym = modulesym.moduleClass();
- sym.flags = flags;
- } else if (classroot != null && name == classroot.name && owner == classroot.owner()) {
- if (global.debug)
- global.log("overwriting " + classroot);
- entries[n] = sym = classroot;
- sym.flags = flags;
- } else {
- entries[n] = sym = owner.newClass(
- Position.NOPOS, flags, name);
- }
- sym.setInfo(getType(inforef, sym));
- sym.setTypeOfThis(readTypeRef(sym));
- Symbol constr = readSymbolRef();
- assert constr == sym.allConstructors();
- break;
-
- case VALsym:
- if (moduleroot != null && name == moduleroot.name && owner == moduleroot.owner()) {
- if (global.debug)
- global.log("overwriting " + moduleroot);
- entries[n] = sym = moduleroot;
- sym.flags = flags;
- } else if ((flags & MODUL) != 0) {
- entries[n] = sym = owner.newModule(
- Position.NOPOS, flags, name);
- } else if (name == Names.CONSTRUCTOR) {
- Symbol tsym = bp < end ? readSymbolRef() : null;
- if (tsym == null) {
- entries[n] = sym = owner.newConstructor(
- Position.NOPOS, flags);
- } else {
- entries[n] = sym = tsym.allConstructors();
- sym.flags = flags;
- }
- } else {
- entries[n] = sym = owner.newTerm(
- Position.NOPOS, flags, name);
- }
- if (sym.isModule()) {
- Symbol clasz = readSymbolRef();
- assert clasz == sym.moduleClass(): Debug.show(sym);
- }
- Type owntype = getType(inforef, sym);
- sym.setInfo(owntype);
- break;
-
- default:
- throw new BadSignature(this);
- }
-
- enterSymbol(sym);
- }
- }
- bp = savedBp;
- }
- return (Symbol) entries[n];
- }
-
- Symbol readSymbolRef() {
- return getSymbol(readNat());
- }
-
- Symbol[] readSymbolRefs(int end) {
- return readSymbolRefs(0, end);
- }
-
- Symbol[] readSymbolRefs(int nread, int end) {
- if (bp == end) {
- return new Symbol[nread];
- } else {
- assert bp < end;
- int bp0 = bp;
- int ref = readNat();
- if (isSymbolEntry(ref)) {
- Symbol s = getSymbol(ref);
- Symbol[] ss = readSymbolRefs(nread+1, end);
- ss[nread] = s;
- return ss;
- } else {
- bp = bp0;
- return new Symbol[nread];
- }
- }
- }
-
- Type getType(int n, Symbol owner) {
- Type tpe = (Type)entries[n];
- if (tpe == null) {
- int savedBp = bp;
- bp = index[n];
- int tag = bytes[bp++];
- int end = readNat() + bp;
- switch (tag) {
- case NOtpe:
- tpe = Type.NoType;
- break;
- case NOpre:
- tpe = Type.NoPrefix;
- break;
- case THIStpe:
- Symbol sym = readSymbolRef();
- tpe = (sym.kind == NONE) ? Type.NoPrefix : Type.ThisType(sym);
- // !!! code above is usefull for the transition
- // !!! after some time, replace it by the following line:
- // !!! tpe = Type.ThisType(readSymbolRef());
- break;
- case SINGLEtpe:
- Type prefix = readTypeRef(owner);
- Symbol symbol = readSymbolRef();
- tpe = symbol.isRoot() ? symbol.thisType() : Type.singleType(prefix, symbol);
- // !!! code above is usefull for the transition
- // !!! after some time, replace it by the following line:
- // !!! tpe = Type.singleType(readTypeRef(), readSymbolRef());
- break;
- case CONSTANTtpe:
- Type base = readTypeRef(owner);
- AConstant value = readConstantRef();
- tpe = new Type.ConstantType(base, value);
- break;
- case TYPEREFtpe:
- tpe = Type.newTypeRefUnsafe( // !!!
- readTypeRef(owner), readSymbolRef(), readTypeRefs(end, owner));
- break;
- case COMPOUNDtpe:
- boolean isCompoundSym = readByte() != 0;
- Symbol ctOwner = isCompoundSym
- ? readSymbolRef()
- : null;
- int ctClassRef = readNat();
- Symbol ctClass = isCompoundSym
- ? (Symbol)entries[ctClassRef]
- : getSymbol(ctClassRef);
- Type[] parents = readTypeRefs(end, owner);
- if (ctClass == null) {
- tpe = Type.compoundTypeWithOwner(ctOwner, parents, new Scope());
- entries[ctClassRef] = tpe.symbol();
- } else {
- tpe = Type.compoundType(parents, new Scope(), ctClass);
- }
- break;
- case METHODtpe:
- Type restype = readTypeRef(owner);
- int bp1 = bp;
- Type[] argtypes = readTypeRefs(end, owner);
- int[] flags = new int[argtypes.length];
- bp = bp1;
- readFlags(flags);
- Symbol[] params = new Symbol[argtypes.length];
- for (int i = 0; i < argtypes.length; i++) {
- Name name = Name.fromString("$" + i);
- params[i] = owner.newVParam(
- Position.NOPOS, flags[i], name, argtypes[i]);
- }
- tpe = Type.MethodType(params, restype);
- break;
- case POLYtpe:
- Type restype = readTypeRef(owner);
- tpe = Type.PolyType(readSymbolRefs(end), restype);
- break;
- case OVERLOADEDtpe:
- int bp0 = bp;
- Symbol[] alts = readSymbolRefs(end);
- int bp1 = bp;
- Type[] alttypes = readTypeRefs(end, alts);
- assert alts.length == alttypes.length
- : alts.length + "!=" + alttypes.length +
- " at " + bp0 + "/" + bp1 + "/" + bp;
- tpe = Type.OverloadedType(alts, alttypes);
- break;
- case FLAGGEDtpe:
- readNat(); // skip flags
- tpe = readTypeRef(owner);
- break;
- default:
- throw new BadSignature(this);
- }
- if (tag != METHODtpe) entries[n] = tpe;
- bp = savedBp;
- }
- return tpe;
- }
-
- Type readTypeRef(Symbol owner) {
- return getType(readNat(), owner);
- }
-
- Type[] readTypeRefs(int end, Symbol owner) {
- return readTypeRefs(0, end, owner, null);
- }
-
- Type[] readTypeRefs(int end, Symbol[] owners) {
- return readTypeRefs(0, end, null, owners);
- }
-
- Type[] readTypeRefs(int nread, int end, Symbol owner, Symbol[] owners) {
- assert (owner != null) ^ (owners != null);
- if (bp == end) {
- return new Type[nread];
- } else {
- assert bp < end : bp + ">" + end;
- int bp0 = bp;
- int ref = readNat();
- if (isTypeEntry(ref)) {
- Type t = getType(ref, owner != null ? owner : owners[nread]);
- Type[] ts = readTypeRefs(nread + 1, end, owner, owners);
- ts[nread] = t;
- return ts;
- } else {
- bp = bp0;
- return new Type[nread];
- }
- }
- }
-
- void readFlags(int[] flags) {
- for (int i = 0; i < flags.length; i++)
- flags[i] = getFlags(readNat());
- }
-
- int getFlags(int n) {
- int savedBp = bp;
- bp = index[n];
- int tag = bytes[bp++];
- int end = readNat() + bp;
- int flags = (tag == FLAGGEDtpe) ? decodeFlags(readNat()) : 0;
- bp = savedBp;
- return flags;
- }
-
- private static int decodeFlags(int n) {
- int flags = 0;
- if ((n & REPEATEDflag) != 0) flags |= REPEATED;
- if ((n & DEFflag) != 0) flags |= DEF;
- return flags;
- }
-
- AConstant readConstant() {
- int tag = bytes[bp++];
- int len = readNat();
- switch (tag) {
- case LITERALunit:
- return AConstant.UNIT;
- case LITERALboolean:
- return AConstant.BOOLEAN(readByte() == 0 ? false : true);
- case LITERALbyte:
- return AConstant.BYTE((byte)readLong(len));
- case LITERALshort:
- return AConstant.SHORT((short)readLong(len));
- case LITERALchar:
- return AConstant.CHAR((char)readLong(len));
- case LITERALint:
- return AConstant.INT((int)readLong(len));
- case LITERALlong:
- return AConstant.LONG(readLong(len));
- case LITERALfloat:
- return AConstant.FLOAT(Float.intBitsToFloat((int)readLong(len)));
- case LITERALdouble:
- return AConstant.DOUBLE(Double.longBitsToDouble(readLong(len)));
- case LITERALstring:
- return AConstant.STRING(readNameRef().toString());
- case LITERALnull:
- return AConstant.NULL;
- case LITERALzero:
- return AConstant.ZERO;
- default:
- throw Debug.abort("illegal tag: " + tag);
- }
- }
-
- AConstant readConstantRef() {
- int n = readNat();
- int savedBp = bp;
- bp = index[n];
- AConstant constant = readConstant();
- bp = savedBp;
- return constant;
- }
-
- public static class BadSignature extends java.lang.Error {
- public BadSignature(UnPickle outer, String msg) {
- super(msg);
- }
- public BadSignature(UnPickle outer) {
- this(outer, "malformed signature at " + outer.bp);
- }
- }
-
-// --- print symbl files -------------------------------------------------
-
- private static String tag2string(int tag) {
- switch (tag) {
- case TERMname: return "TERMname";
- case TYPEname: return "TYPEname";
- case NONEsym: return "NONEsym";
- case TYPEsym: return "TYPEsym";
- case ALIASsym: return "ALIASsym";
- case CLASSsym: return "CLASSsym";
- case VALsym: return "VALsym";
- case EXTref: return "EXTref";
- case EXTMODCLASSref: return "EXTMODCLASSref";
- case NOtpe: return "NOtpe";
- case THIStpe: return "THIStpe";
- case SINGLEtpe: return "SINGLEtpe";
- case TYPEREFtpe: return "TYPEREFtpe";
- case CONSTANTtpe: return "CONSTANTtpe";
- case COMPOUNDtpe: return "COMPOUNDtpe";
- case METHODtpe: return "METHODtpe";
- case POLYtpe: return "POLYtpe";
- case OVERLOADEDtpe: return "OVERLOADEDtpe";
- case UNBOXEDtpe: return "UNBOXEDtpe";
- case UNBOXEDARRAYtpe: return "UNBOXEDARRAYtpe";
- case FLAGGEDtpe: return "FLAGGEDtpe";
- case ERRORtpe: return "ERRORtpe";
- case LITERALunit: return "LITERALunit";
- case LITERALboolean: return "LITERALboolean";
- case LITERALbyte: return "LITERALbyte";
- case LITERALshort: return "LITERALshort";
- case LITERALchar: return "LITERALchar";
- case LITERALint: return "LITERALint";
- case LITERALlong: return "LITERALlong";
- case LITERALfloat: return "LITERALfloat";
- case LITERALdouble: return "LITERALdouble";
- case LITERALstring: return "LITERALstring";
- case LITERALnull: return "LITERALnull";
- case LITERALzero: return "LITERALzero";
- default: return "***BAD TAG***(" + tag + ")";
- }
- }
-
- private void print(PrintStream out) {
- out.println("symbl attribute for " + classroot + ":");
- for (int i = 0; i < index.length; i++) {
- out.print(i + "," + index[i] + ": ");
- bp = index[i];
- int tag = readByte();
- out.print(tag2string(tag));
- int len = readNat();
- int end = len + bp;
- out.print(" " + len);
- switch (tag) {
- case TERMname:
- case TYPEname:
- String name = SourceRepresentation.ascii2string(bytes, bp, len);
- out.print(" " + SourceRepresentation.escape(name));
- bp = end;
- break;
- case NONEsym:
- break;
- case TYPEsym:
- case ALIASsym:
- case CLASSsym:
- case VALsym:
- out.print(" " + readNat()); //name
- out.print(" " + readNat()); //owner
- out.print(" " + Integer.toHexString(readNat())); //flags
- out.print(" " + readNat()); //type
- break;
- case FLAGGEDtpe:
- out.print(" " + Integer.toHexString(readNat())); //flags
- }
- while (bp < end) out.print(" " + readNat());
- out.println();
- }
- }
-}
-
diff --git a/sources/scalac/transformer/AddAccessorsPhase.java b/sources/scalac/transformer/AddAccessorsPhase.java
deleted file mode 100644
index 2f684e1acb..0000000000
--- a/sources/scalac/transformer/AddAccessorsPhase.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: AddAccessorsPhase.java,v 1.1 2002/10/17 12:27:11 schinz Exp $
-// $Id$
-
-package scalac.transformer;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.ast.GenTransformer;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Template;
-import scalac.ast.TreeList;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Debug;
-
-
-/**
- * This phase adds private accessor fields and methods for all class
- * constructor arguments which are accessed from within the class'
- * methods, or nested classes.
- */
-public class AddAccessorsPhase extends Phase {
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AddAccessorsPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- treeTransformer.apply(unit);
- }
-
- //########################################################################
- // Private Class - Tree transformer
-
- /** The tree transformer */
- private final GenTransformer treeTransformer = new GenTransformer(global) {
-
- /** The parameter to accessor method map */
- private final Map/*<Symbol,Symbol>*/ methods = new HashMap();
-
- /** The current method */
- private Symbol method;
-
- /** Creates an accessor field symbol for given parameter. */
- private Symbol createAccessorField(Symbol param) {
- int flags = Modifiers.PRIVATE | Modifiers.STABLE;
- Name name = Name.fromString(param.name + "$");
- Symbol owner = param.owner().constructorClass();
- Symbol field = owner.newField(param.pos, flags, name);
- field.setType(param.type());
- owner.members().enterOrOverload(field);
- return field;
- }
-
- /** Creates an accessor method symbol for given parameter. */
- private Symbol createAccessorMethod(Symbol param) {
- int flags = Modifiers.PRIVATE | Modifiers.STABLE | Modifiers.ACCESSOR;
- Name name = param.name;
- Symbol owner = param.owner().constructorClass();
- Symbol method = owner.newMethod(param.pos, flags, name);
- method.setType(Type.MethodType(Symbol.EMPTY_ARRAY, param.type()));
- owner.members().enterOrOverload(method);
- methods.put(param, method);
- return method;
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, Template impl): {
- Symbol clasz = tree.symbol();
- // transform parents and body
- Symbol backup = this.method;
- this.method = clasz.primaryConstructor();
- Tree[] parents = transform(impl.parents);
- Tree[] body = transform(impl.body);
- this.method = backup;
- // create accessor field & method trees
- TreeList accessors = new TreeList();
- Symbol[] params = clasz.valueParams();
- for (int i = 0; i < params.length; ++i) {
- Symbol param = params[i];
- Symbol method = (Symbol)methods.remove(param);
- if (method == null) continue;
- Symbol field = createAccessorField(param);
- accessors.append(
- gen.ValDef(
- field,
- gen.Ident(param.pos, param)));
- accessors.append(
- gen.DefDef(
- method,
- gen.Select(gen.This(param.pos, clasz), field)));
- }
- body = Tree.concat(accessors.toArray(), body);
- impl = gen.Template(clasz.pos, impl.symbol(), parents, body);
- return gen.ClassDef(clasz, impl);
- }
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- return Tree.Empty; // eliminate
- case Typed(Tree expr, _):
- return transform(expr); // eliminate
- case DefDef(_, _, _, _, _, _):
- Symbol backup = this.method;
- this.method = tree.symbol();
- tree = super.transform(tree);
- this.method = backup;
- return tree;
- case Ident(_):
- Symbol symbol = tree.symbol();
- if (!symbol.owner().isPrimaryConstructor()) break;
- if (symbol.owner() == this.method) break;
- Symbol method = (Symbol)methods.get(symbol);
- if (method == null) method = createAccessorMethod(symbol);
- Tree qualifier = gen.This(tree.pos, method.owner());
- return gen.Apply(gen.Select(tree.pos, qualifier, method));
- }
- return super.transform(tree);
- }
-
- };
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java
deleted file mode 100644
index 5440c68ebf..0000000000
--- a/sources/scalac/transformer/AddConstructors.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import scalac.Global;
-import scalac.ast.GenTransformer;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Template;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolSubstTypeMap;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/**
- * This phase adds to all classes one initializer method per
- * constructor. Initializers have the same value parameters as their
- * corresponding constructor but no type parameters.
- *
- * An initializer may be used in the body of another initializer
- * either to invoke another initializer of the same class or to invoke
- * an initailizer of the superclass. In that case, the initializer
- * must appear in a Select node whose qualifier is either a This node
- * or a Super node. The type of such a Select node is the type of the
- * initializer.
- *
- * An initializer may also be used in a new operation. In that case,
- * the initializer must appear in an Ident node. The type of such an
- * Ident node is a PolyType whose arguments are the type arguments of
- * the initializer's class and whose result type is the initializer's
- * type.
- *
- * This phase does the following in the tree:
- *
- * - replaces all non-primary constructors definitions by initializer
- * definitions with the same body,
- *
- * - for each non-interface class creates an primary initializer
- * method corresponding to the primary constructor,
- *
- * - moves the call to the super constructor into the primary
- * initializer,
- *
- * - moves all class fields initialization code (rhs of ValDefs) into
- * the primary initializer,
- *
- * - moves all class-level expressions into the primary initializer,
- *
- * - replaces all constructor invocations by initializer invocations,
- * except in the parents field of class templates.
- *
- * @author Nikolay Mihaylov
- * @version 1.2
- */
-public class AddConstructors extends GenTransformer {
-
- /** A constructor to initializer map */
- private final HashMap/*<Symbol,Symbol>*/ initializers;
-
- /** A constructor to initializer parameter substitution */
- private final SymbolSubstTypeMap subst;
-
- /** The current primary initializer or null */
- private Symbol primaryInitializer;
-
- /**
- * ...
- *
- * @param global
- * @param initializers
- */
- public AddConstructors(Global global, HashMap initializers) {
- super(global);
- this.initializers = initializers;
- this.subst = new SymbolSubstTypeMap();
- }
-
- /**
- * Returns the initializer corresponding to the given constructor.
- *
- * @param constructor
- * @return
- */
- private Symbol getInitializer(Symbol constructor) {
- assert constructor.isConstructor(): Debug.show(constructor);
- Symbol initializer = (Symbol)initializers.get(constructor);
- if (initializer == null) {
- assert !constructor.constructorClass().isInterface():
- "found interface constructor " + Debug.show(constructor);
- int flags = constructor.isPrivate()
- ? (constructor.flags & ~Modifiers.PRIVATE) | Modifiers.PROTECTED
- : constructor.flags;
- initializer = constructor.constructorClass().newMethod(
- constructor.pos,
- flags & Modifiers.ACCESSFLAGS,
- constructor.name);
- initializer.setInfo(
- Type.MethodType(
- constructor.valueParams(),
- global.definitions.void_TYPE())
- .cloneType(constructor, initializer));
- initializer.owner().members().enterOrOverload(initializer);
- initializers.put(constructor, initializer);
- }
- return initializer;
- }
-
- /**
- * Process the tree.
- */
- public Tree transform(Tree tree) {
- return transform(tree, false);
- }
-
- /**
- * ...
- *
- * @param tree
- * @param inNew
- * @return
- */
- private Tree transform(Tree tree, boolean inNew) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, Template impl):
- Symbol clasz = tree.symbol();
-
- if (clasz.isInterface())
- return gen.ClassDef(clasz, transform(impl.body));
-
- // expressions that go before the call to the super constructor
- final ArrayList constrBody = new ArrayList();
-
- // expressions that go after the call to the super constructor
- final ArrayList constrBody2 = new ArrayList();
-
- // the body of the class after the transformation
- final ArrayList classBody = new ArrayList();
-
- Symbol local = impl.symbol();
- for (int i = 0; i < impl.body.length; i++) {
- Tree member = impl.body[i];
- if (member.definesSymbol() && member.symbol().owner()!=local) {
- switch (member) {
- case ValDef(_, _, _, Tree rhs):
- // move initialization code into initializer
- Symbol field = member.symbol();
- if (rhs == Tree.Empty) break;
- member = gen.ValDef(field, Tree.Empty);
- Tree assign = gen.Assign(
- gen.Select(gen.This(member.pos, clasz),field),rhs);
- if (rhs.hasSymbol() && rhs.symbol().isParameter()) {
- constrBody.add(assign);
- } else {
- constrBody2.add(assign);
- }
- }
- classBody.add(member);
- } else {
- // move class-level code into initializer
- constrBody2.add(member);
- }
- }
-
- // inline the call to the super constructor
- for (int i = 0; i < impl.parents.length; i++) {
- switch (impl.parents[i]) {
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] args):
- assert fun.symbol().isConstructor(): impl.parents[i];
- if (fun.symbol().constructorClass().isInterface()) continue;
- int pos = impl.parents[i].pos;
- Tree superConstr = gen.Select
- (gen.Super(pos, clasz), getInitializer(fun.symbol()));
- constrBody.add(gen.mkApply_V(superConstr, args));
- break;
- case Apply(Tree fun, Tree[] args):
- assert fun.symbol().isConstructor(): impl.parents[i];
- if (fun.symbol().constructorClass().isInterface()) continue;
- int pos = impl.parents[i].pos;
- Tree superConstr = gen.Select
- (gen.Super(pos, clasz), getInitializer(fun.symbol()));
- constrBody.add(gen.mkApply_V(superConstr, args));
- break;
- default:
- throw Debug.abort("illegal case", impl.parents[i]);
- }
- }
-
- // add valdefs and class-level expression to the constructor body
- constrBody.addAll(constrBody2);
-
- Tree constrTree = gen.mkUnitBlock(
- clasz.primaryConstructor().pos,
- (Tree[])constrBody.toArray(new Tree[constrBody.size()]));
-
- classBody.add(gen.DefDef(clasz.primaryConstructor(), constrTree));
-
- Tree[] newBody = (Tree[]) classBody.toArray(Tree.EMPTY_ARRAY);
-
- // transform the bodies of all members in order to substitute
- // the constructor references with the new ones
- return gen.ClassDef(clasz, transform(newBody));
-
- case DefDef(_, _, _, _, _, Tree rhs):
- if (!tree.symbol().isConstructor()) return super.transform(tree);
- // replace constructor by initializer
- Symbol constructor = tree.symbol();
- Symbol initializer = getInitializer(constructor);
- subst.insertSymbol(
- constructor.typeParams(),
- constructor.constructorClass().typeParams());
- subst.insertSymbol(
- constructor.valueParams(),
- initializer.valueParams());
- if (constructor.isPrimaryConstructor())
- primaryInitializer = initializer;
- rhs = transform(rhs);
- primaryInitializer = null;
- subst.removeSymbol(constructor.valueParams());
- subst.removeSymbol(constructor.typeParams());
- // add consistent result expression
- rhs = gen.mkUnitBlock(rhs);
- return gen.DefDef(initializer, rhs);
-
- case ValDef(_, _, _, _):
- case LabelDef(_, _, _):
- Symbol symbol = tree.symbol();
- if (symbol.owner().isConstructor()) {
- // update symbols like x in these examples
- // ex 1: class C { { val x = ...; ... } }
- // ex 2: class C { def this(i: Int) { val x = i; ... } }
- symbol.setOwner(getInitializer(symbol.owner()));
- symbol.updateInfo(subst.apply(symbol.info()));
- }
- return super.transform(tree);
-
- case New(Tree init):
- return gen.New(transform(init, true));
-
- case TypeApply(Tree fun, Tree[] args):
- if (!fun.symbol().isConstructor()) return super.transform(tree);
- if (!inNew) return transform(fun);
- assert fun instanceof Tree.Ident: tree;
- return transform(tree, fun.symbol(), transform(args));
-
- case Apply(Tree fun, Tree[] args):
- return gen.Apply(transform(fun, inNew), transform(args));
-
- case Ident(_):
- Symbol symbol = tree.symbol();
- if (inNew) return transform(tree, symbol, Tree.EMPTY_ARRAY);
- if (symbol.isConstructor()) {
- symbol = getInitializer(symbol);
- Symbol clasz = symbol.owner();
- return gen.Select(gen.This(tree.pos, clasz), symbol);
- }
- else if (symbol.owner().isConstructor()) {
- symbol = subst.lookupSymbol(symbol);
- }
- return gen.Ident(tree.pos, symbol);
-
- case TypeTerm():
- return gen.TypeTerm(tree.pos, subst.apply(tree.getType()));
-
- default:
- return super.transform(tree);
- } // switch(tree)
-
- } // transform()
-
- /**
- * Transforms the new instance creation.
- *
- * @param tree
- * @param constructor
- * @param targs
- * @return
- */
- private Tree transform(Tree tree, Symbol constructor, Tree[] targs) {
- assert constructor.isConstructor(): tree;
- Symbol initializer = getInitializer(constructor);
- Symbol clasz = initializer.owner();
- Tree instance = gen.Create(tree.pos, Tree.Empty, clasz, targs);
- return gen.Select(tree.pos, instance, initializer);
- }
-
-} // class AddConstructors
diff --git a/sources/scalac/transformer/AddConstructorsPhase.java b/sources/scalac/transformer/AddConstructorsPhase.java
deleted file mode 100644
index 1dfb10e344..0000000000
--- a/sources/scalac/transformer/AddConstructorsPhase.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-//package scala.compiler.backend;
-package scalac.transformer;
-
-import java.util.HashMap;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-public class AddConstructorsPhase extends Phase {
-
- //########################################################################
- // Private Fields
-
- /** A map from old constructor symbols to new ones */
- private final HashMap/*<Symbol,Symbol>*/ constructors = new HashMap();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AddConstructorsPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given type for the given symbol. */
- public Type transformInfo(Symbol symbol, Type type) {
- if (symbol.isConstructor()) {
- switch (type) {
- case PolyType(Symbol[] tparams, MethodType(_, Type result)):
- result = Type.MethodType(Symbol.EMPTY_ARRAY, result);
- return Type.PolyType(tparams, result);
- case MethodType(_, Type result):
- return Type.MethodType(Symbol.EMPTY_ARRAY, result);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
- return type;
- }
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- new AddConstructors(global, constructors).apply(unit);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java
deleted file mode 100644
index 1e922a8165..0000000000
--- a/sources/scalac/transformer/AddInterfaces.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-// TODO find a good way to change symbol flags (PRIVATE, DEFERRED,
-// INTERFACE). In particular find how to make sure that the
-// modifications are not made too early, for example before the symbol
-// is cloned.
-
-package scalac.transformer;
-
-import java.util.Map;
-import java.util.HashMap;
-
-import scalac.Global;
-import scalac.ast.GenTransformer;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Template;
-import scalac.ast.TreeGen;
-import scalac.ast.TreeList;
-import scalac.symtab.Type;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolSubstTypeMap;
-import scalac.util.Debug;
-
-/**
- * Add, for each class, an interface with the same name, to be used
- * later by mixin expansion. More specifically:
- *
- * - at the end of the name of every class, the string "$class" is
- * added,
- *
- * - an interface with the original name of the class is created, and
- * contains all directly bound members of the class (as abstract
- * members),
- *
- * - the interface is added to the mixin base classes of the class.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-public class AddInterfaces extends GenTransformer {
-
- //#########################################################################
- // Private Fields
-
- /** The AddInterface phase */
- private final AddInterfacesPhase phase;
-
- /** The current class (null is none) */
- private Symbol clasz;
-
- /** The current member (null is none) */
- private Symbol member;
-
- /** The current class substitution (null is none) */
- private Type.Map classSubst;
-
- /** The current parameter substitution (null is none) */
- private SymbolSubstTypeMap paramSubst;
-
- //#########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public AddInterfaces(Global global, AddInterfacesPhase phase) {
- super(global);
- this.phase = phase;
- }
-
- //#########################################################################
- // Public Methods
-
- /** Transforms the given symbol.
- *
- * @param tree
- * @return
- */
- public Symbol getSymbolFor(Tree tree) {
- switch (tree) {
- case Create(_, _):
- return phase.getClassSymbol(tree.symbol());
- case Return(_):
- return member;
- case This(_):
- case Super(_, _):
- return clasz;
- case Select(Super(_, _), _):
- Symbol symbol = tree.symbol();
- if (symbol.isInitializer()) return getClassMember(symbol);
- return getClassMember(symbol, true);
- case Select(_, _):
- Symbol symbol = tree.symbol();
- if (symbol.isInitializer()) return getClassMember(symbol);
- return symbol;
- case Ident(_):
- Symbol symbol = tree.symbol();
- if (symbol.isInitializer()) return getClassMember(symbol);
- if (symbol.isParameter() && !symbol.owner().isStatic())
- return getClassVParam(symbol);
- return symbol;
- default:
- return tree.symbol();
- }
- }
-
- /** Transforms the given type. */
- public Type transform(Type type) {
- if (classSubst != null) type = classSubst.apply(type);
- if (paramSubst != null) type = paramSubst.apply(type);
- return type;
- }
-
- /** Transforms the given trees. */
- public Tree[] transform(Tree[] trees) {
- if (member != null) return super.transform(trees);
- TreeList list = new TreeList();
- for (int i = 0; i < trees.length; i++) template(list, trees[i]);
- return list.toArray();
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- switch (tree) {
- case ValDef(_, _, _, _):
- case LabelDef(_, _, _):
- Symbol symbol = tree.symbol();
- if (symbol.owner() != member) {
- symbol.updateInfo(transform(symbol.info()));
- symbol.setOwner(member);
- }
- return super.transform(tree);
- case Select(Tree qualifier, _):
- Type prefix = qualifier.type();
- qualifier = transform(qualifier);
- Symbol symbol = getSymbolFor(tree);
- if (symbol.isJava() && !symbol.owner().isInterface()) {
- if (qualifier.type().widen().symbol().isInterface()) {
- Type baseType = prefix.baseType(symbol.owner());
- assert baseType != Type.NoType: tree;
- qualifier = gen.mkAsInstanceOf(qualifier, baseType);
- }
- }
- return gen.Select(tree.pos, qualifier, symbol);
- default:
- return super.transform(tree);
- }
- }
-
- //#########################################################################
- // Private Methods
-
- /** Transforms the given template and adds it to given list.
- *
- * @param trees
- * @param tree
- */
- private void template(TreeList trees, Tree tree) {
- switch (tree) {
- case Empty:
- return;
- case PackageDef(_, _):
- trees.append(super.transform(tree));
- return;
- case ClassDef(_, _, _, _, _, Template(_, Tree[] body)):
- TreeList list = new TreeList(transform(body));
- this.clasz = tree.symbol();
- Map methods = new HashMap();
- if (phase.needInterface(clasz)) {
- Symbol clone = phase.getClassSymbol(clasz);
- trees.append(getClassTree(clasz, list, methods));
- list = new TreeList();
- this.classSubst = new Type.SubstThisMap(clasz, clone);
- this.paramSubst = phase.getClassSubst(clone);
- this.clasz = clone;
- }
- for (int i = 0; i < body.length; i++) member(methods, body[i]);
- trees.append(getClassTree(clasz, list, methods));
- assert methods.isEmpty(): Debug.show(methods.keySet().toArray());
- this.paramSubst = null;
- this.classSubst = null;
- this.clasz = null;
- return;
- case DefDef(_, _, _, _, _, _):
- case ValDef(_, _, _, _):
- return;
- default:
- throw Debug.abort("illegal tree", tree);
- }
- }
-
- /**
- * Transforms the given class member. Methods with a non-empty
- * body are added to the given method map. All other members are
- * dropped.
- *
- * @param methods
- * @param tree
- */
- private void member(Map methods, Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, _):
- return;
- case DefDef(_, _, _, _, _, Tree rhs):
- if (rhs == Tree.Empty) return;
- Symbol symbol = tree.symbol();
- this.member = getClassMember(symbol);
- if (member != symbol) {
- paramSubst.insertSymbol(
- symbol.typeParams(), member.nextTypeParams());
- paramSubst.insertSymbol(
- symbol.valueParams(), member.nextValueParams());
- }
- methods.put(member, gen.DefDef(member, transform(rhs)));
- if (member != symbol) {
- paramSubst.removeSymbol(symbol.valueParams());
- paramSubst.removeSymbol(symbol.typeParams());
- }
- this.member = null;
- return;
- case ValDef(_, _, _, Tree rhs):
- assert rhs == Tree.Empty: tree;
- return;
- default:
- throw Debug.abort("illegal tree", tree);
- }
- }
-
- /**
- * Returns the tree of the given class. Its body is built by
- * adding its members to the provided body. Non-abstract methods
- * are removed from the provided method map. All other members are
- * generated from their symbol.
- *
- * @param clasz
- * @param body
- * @param methods
- * @return
- */
- private Tree getClassTree(Symbol clasz, TreeList body, Map methods) {
- Scope members = clasz.nextInfo().members();
- for (Scope.SymbolIterator i = members.iterator(); i.hasNext(); ) {
- Symbol member = i.next();
- if (!member.isTerm()) continue;
- body.append(getMemberTree(clasz, member, methods));
- }
- Tree[] array = body.toArray();
- if (!clasz.isInterface()) phase.classToBody.put(clasz, array);
- return gen.ClassDef(clasz, array);
- }
-
- /**
- * Returns the tree of the given member. Non-abstract methods are
- * removed from the given method map. All other members are
- * generated from their symbol.
- *
- * @param clasz
- * @param member
- * @param methods
- * @return
- */
- private Tree getMemberTree(Symbol clasz, Symbol member, Map methods) {
- if (!member.isMethod()) return gen.ValDef(member, Tree.Empty);
- if (member.isDeferred()) return gen.DefDef(member, Tree.Empty);
- Tree method = (Tree)methods.remove(member);
- assert method != null: Debug.show(clasz + "." + member + ":" + member.info() + member.locationString());
- return method;
- }
-
- /** Returns the symbol of given parameter in current class.
- *
- * @param vparam
- * @return
- */
- private Symbol getClassVParam(Symbol vparam) {
- if (paramSubst == null) return vparam;
- Symbol clone = (Symbol)paramSubst.lookupSymbol(vparam);
- assert clone != null: Debug.show(vparam, clasz, member);
- return clone;
- }
-
- /** Returns the symbol of given member in current class. */
- private Symbol getClassMember(Symbol member) {
- return getClassMember(member, false);
- }
- // !!! Try to remove version with lazy argument. It is currently
- // needed for super calls to abstract method (possible in mixins).
- private Symbol getClassMember(Symbol member, boolean lazy) {
- Symbol owner = member.owner();
- assert owner.isClass(): Debug.show(member);
- if (!phase.needInterface(owner)) return member;
- Symbol clasz = phase.getClassSymbol(owner);
- Symbol clone = (Symbol)phase.getClassMemberMap(clasz).get(member);
- assert clone != null || lazy: Debug.show(member, " not in ", clasz);
- return clone != null ? clone : member;
- }
-
- //#########################################################################
-}
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java
deleted file mode 100644
index 026ac5feda..0000000000
--- a/sources/scalac/transformer/AddInterfacesPhase.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-// TODO try to use setInfo instead of updateInfo for cloned symbols,
-// to avoid the need to use nextPhase/nextInfo.
-
-package scalac.transformer;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import scalac.*;
-import scalac.symtab.*;
-import scalac.util.Debug;
-import scalac.util.Name;
-
-public class AddInterfacesPhase extends Phase {
-
- /** Initializes this instance. */
- public AddInterfacesPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- new AddInterfaces(global, this).apply(unit);
- }
-
- public Type transformInfo(Symbol sym, Type tp) {
- if (sym.isConstructor() || sym.owner().isConstructor()) {
- return tp;
- } else if (sym.isClass() && !sym.isJava()) {
- Definitions definitions = global.definitions;
- if (sym == definitions.ANY_CLASS) return tp;
- Type[] oldParents = tp.parents();
- assert oldParents.length > 0 : Debug.show(sym);
- for (int i = 1; i < oldParents.length; ++i) {
- Symbol oldSym = oldParents[i].symbol();
- assert !oldSym.isJava() || oldSym.isInterface() :
- Debug.show(sym) + " <: " + Debug.show(oldSym);
- }
-
- boolean ifaceReqrd = needInterface(sym);
- Type[] newParents;
- Scope newMembers = new Scope();
-
- Scope.SymbolIterator oldMembersIt =
- tp.members().iterator();
- while (oldMembersIt.hasNext()) {
- Symbol member = oldMembersIt.next();
-
- if (ifaceReqrd
- && (member.isInitializer() || !memberGoesInInterface(member)))
- continue;
-
- if (member.isPrivate() && !member.isClass()) {
- member.name = uniqueName(member);
- member.flags ^= Modifiers.PRIVATE;
- } else if (member.isProtected())
- member.flags ^= Modifiers.PROTECTED;
-
- newMembers.enterOrOverload(member);
- }
-
- if (ifaceReqrd) {
- // Before this phase, the symbol is a class, but after
- // it will be an interface. Its type has to be changed
- // so that:
- //
- // 1. Java classes are removed from its parents,
- //
- // 2. only members which will end up in the
- // interface are kept, and private ones are made
- // public and renamed.
- sym.flags |= Modifiers.INTERFACE;
- newParents = oldParents;
- } else {
- // The symbol is the one of a class which doesn't need
- // an interface. We need to fix its parents to use
- // class symbols instead of interface symbols.
- newParents = new Type[oldParents.length];
- for (int i = 0; i < oldParents.length; ++i) {
- switch (oldParents[i]) {
- case TypeRef(Type pre, Symbol oldSym, Type[] args):
- newParents[i] = !needInterface(oldSym)
- ? oldParents[i]
- : Type.typeRef(pre, getClassSymbol(oldSym), args);
- break;
- default:
- throw Debug.abort("illegal case", oldParents[i]);
- }
- }
- }
-
- return Type.compoundType(newParents, newMembers, sym);
- } else if (sym.owner().isClass() || sym.isParameter()) {
- getClassSymbol(sym.enclClass());
- return sym.info();
- } else
- return tp;
- }
-
- protected boolean memberGoesInInterface(Symbol member) {
- return !member.isStatic() && (member.isType() || member.isMethod());
- }
-
- protected final SymbolNameWriter uniqueNameWriter = new SymbolNameWriter()
- .setAllSeparators('$')
- .setRootSeparator('\0');
- protected Name uniqueName(Symbol sym) {
- Name name = Name.fromString(uniqueNameWriter.toString(sym));
- return sym.name.isTypeName() ? name.toTypeName() : name;
- }
-
- // Terminology: in the following code, the symbol which was used
- // until this phase for the class, and will now be used for the
- // interface is called the "interface symbol". The symbol created
- // by this phase for the class is called the "class symbol".
-
- /** True iff the given class symbol needs an interface. */
- protected boolean needInterface(Symbol classSym) {
- assert classSym.isClass()
- : Debug.show(classSym) + " is not a class (kind " + classSym.kind + ")";
- return !(classSym.isJava()
- || classSym.isModuleClass()
- || classSym.isAnonymousClass()
- || hasInterfaceSymbol(classSym)
- || classSym == global.definitions.ANY_CLASS
- || classSym == global.definitions.ANYREF_CLASS
- || classSym == global.definitions.ALL_CLASS
- || classSym == global.definitions.ALLREF_CLASS);
- }
-
- protected final static String CLASS_SUFFIX = "$class";
- protected Name className(Name ifaceName) {
- Name className = Name.fromString(ifaceName.toString() + CLASS_SUFFIX);
- if (ifaceName.isTypeName()) return className.toTypeName();
- else return className;
- }
-
- protected final HashMap/*<Symbol,Symbol>*/ ifaceToClass = new HashMap();
- protected final HashMap/*<Symbol,Symbol>*/ classToIFace = new HashMap();
- protected final HashMap/*<Symbol,Tree[]>*/ classToBody = new HashMap();
-
- /** Return the class symbol corresponding to the given interface
- * symbol. If the class does not need an interface, return the
- * given symbol.
- *
- * @param ifaceSym
- * @return
- */
- protected Symbol getClassSymbol(Symbol ifaceSym) {
- assert ifaceSym.isClass(): Debug.show(ifaceSym);
- if (!needInterface(ifaceSym))
- return ifaceSym;
-
- Symbol classSym = (Symbol)ifaceToClass.get(ifaceSym);
- if (classSym == null) {
- classSym = ifaceSym.cloneSymbol(ifaceSym.owner());
- classSym.name = className(ifaceSym.name);
- ifaceSym.flags &= ~Modifiers.FINAL;
- classSym.flags &= ~Modifiers.INTERFACE;
-
- Scope ifaceOwnerMembers = ifaceSym.owner().members();
- ifaceOwnerMembers.enter(classSym);
-
- Type.SubstThisMap thisTypeMap =
- new Type.SubstThisMap(ifaceSym, classSym);
-
- // Create class substitution map.
- SymbolSubstTypeMap classSubst = newClassSubst(classSym);
- Map classMemberMap = newClassMemberMap(classSym);
-
- Symbol[] ifaceTParams = ifaceSym.typeParams();
- Symbol[] classTParams = classSym.typeParams();
- classSubst.insertSymbol(ifaceTParams, classTParams);
-
- // Clone all members, entering them in the class scope.
- Scope classMembers = new Scope();
- Scope.SymbolIterator ifaceMembersIt =
- ifaceSym.members().iterator();
- while (ifaceMembersIt.hasNext()) {
- Symbol ifaceMemberSym = ifaceMembersIt.next();
-
- if (ifaceMemberSym.isType()
- || ifaceMemberSym.isDeferred())
- continue;
-
- Symbol classMemberSym;
- if (memberGoesInInterface(ifaceMemberSym)) {
- if (ifaceMemberSym.isPrivate()) {
- ifaceMemberSym.name = uniqueName(ifaceMemberSym);
- ifaceMemberSym.flags |= Modifiers.FINAL;
- ifaceMemberSym.flags ^= Modifiers.PRIVATE;
- } else if (ifaceMemberSym.isProtected())
- ifaceMemberSym.flags ^= Modifiers.PROTECTED;
-
- classMemberSym = ifaceMemberSym.cloneSymbol(classSym);
- ifaceMemberSym.flags &= ~Modifiers.FINAL;
- classMemberSym.setInfo(
- thisTypeMap.applyParams(
- classSubst.applyParams(
- classMemberSym.info().cloneType(
- ifaceMemberSym, classMemberSym))));
-
- ifaceMemberSym.flags |= Modifiers.DEFERRED;
- } else {
- // Member doesn't go in interface, we just make it
- // owned by the class.
- classMemberSym = ifaceMemberSym;
-
- // [HACK] the following forces the evaluation of
- // the type of all value parameters, which might
- // otherwise become invalid once the owner is
- // changed.
- classMemberSym.info();
- if (classMemberSym.isMethod()) {
- Symbol[] vp = classMemberSym.valueParams();
- for (int i = 0; i < vp.length; ++i)
- vp[i].info();
- }
-
- classMemberSym.setOwner(classSym);
- classMemberSym.updateInfo(
- thisTypeMap.apply(
- classSubst.apply(
- classMemberSym.info())));
- }
-
- classMemberMap.put(ifaceMemberSym, classMemberSym);
- classMembers.enterOrOverload(classMemberSym);
- }
-
- // Give correct type to the class symbol by using class
- // symbols for its parents, and by adding the interface
- // among them.
- Type[] oldClassParents = classSym.parents();
- int oldParentsCount = oldClassParents.length;
- Type[] newClassParents = new Type[oldParentsCount + 1];
- for (int i = 0; i < oldParentsCount; ++i) {
- switch (oldClassParents[i]) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Type newTp = Type.typeRef(pre, getClassSymbol(sym), args);
- newClassParents[i] = classSubst.apply(newTp);
- break;
- default:
- throw Debug.abort("unexpected type for parent", oldClassParents[i]);
- }
- }
- newClassParents[oldParentsCount] = classSubst.apply(ifaceSym.type());
- // TODO setInfo cannot be used here because the type then
- // goes through transformInfo. Maybe setInfo should behave
- // like updateInfo.
- classSym.updateInfo(Type.compoundType(newClassParents,
- classMembers,
- classSym));
- ifaceToClass.put(ifaceSym, classSym);
- classToIFace.put(classSym, ifaceSym);
-
- // move attributes to the implementing class
- AttributeInfo attr = global.removeAttributes(ifaceSym);
- if (attr != null) {
- global.setAttribute(classSym, attr);
- }
- }
- return classSym;
- }
-
- public boolean hasInterfaceSymbol(Symbol classSym) {
- return classToIFace.containsKey(classSym);
- }
-
- public Symbol getInterfaceSymbol(Symbol classSym) {
- return (Symbol)classToIFace.get(classSym);
- }
-
- HashMap/*<Symbol,SymbolSubstTypeMap>*/ classSubstitutions = new HashMap();
- protected SymbolSubstTypeMap newClassSubst(Symbol classSym) {
- SymbolSubstTypeMap subst = new SymbolSubstTypeMap();
- classSubstitutions.put(classSym, subst);
- return subst;
- }
-
- /** Return symbol substitution for the class (a mapping from the
- * interface's type and value parameters to the class' equivalent)
- */
- public SymbolSubstTypeMap getClassSubst(Symbol classSym) {
- SymbolSubstTypeMap classSubst =
- (SymbolSubstTypeMap)classSubstitutions.get(classSym);
- assert classSubst != null;
- return classSubst;
- }
-
- HashMap/*<Symbol, HashMap>*/ classMemberMaps = new HashMap();
- protected HashMap newClassMemberMap(Symbol classSym) {
- HashMap map = new HashMap();
- classMemberMaps.put(classSym, map);
- return map;
- }
-
- /** Return symbol substitution for the class (a mapping from the
- * interface's type and value parameters to the class' equivalent)
- */
- public Map getClassMemberMap(Symbol classSym) {
- return (Map)classMemberMaps.get(classSym);
- }
-
-}
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
deleted file mode 100644
index 67a462b1f4..0000000000
--- a/sources/scalac/transformer/Erasure.java
+++ /dev/null
@@ -1,759 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: Erasure.java,v 1.48 2003/01/16 14:21:19 schinz Exp $
-// $Id$
-
-package scalac.transformer;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Ident;
-import scalac.ast.Tree.Template;
-import scalac.ast.Tree.AbsTypeDef;
-import scalac.ast.Tree.AliasTypeDef;
-import scalac.ast.Tree.ValDef;
-import scalac.ast.TreeList;
-import scalac.ast.GenTransformer;
-import scalac.atree.AConstant;
-import scalac.symtab.Definitions;
-import scalac.symtab.Kinds;
-import scalac.symtab.Type;
-import scalac.symtab.TypeTags;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.SymSet;
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolTablePrinter;
-import scalac.backend.Primitive;
-import scalac.backend.Primitives;
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Debug;
-
-/** A transformer for type erasure and bridge building
- *
- * @author Martin Odersky
- * @version 1.0
- *
- * What it does:
- * (1) Map every type to its erasure.
- * (2) If method A overrides a method B, and the erased type ETA of A is
- * different from the erased type ETB of B seen as a member of A's class,
- * add a bridge method with the same name as A,B, with signature ETB
- * which calls A after casting parameters.
- */
-public class Erasure extends GenTransformer implements Modifiers {
-
- //########################################################################
- // Private Constants
-
- /** The unboxed types */
- private static final Type
- UNBOXED_UNIT = Type.unboxedType(TypeTags.UNIT),
- UNBOXED_BOOLEAN = Type.unboxedType(TypeTags.BOOLEAN),
- UNBOXED_BYTE = Type.unboxedType(TypeTags.BYTE),
- UNBOXED_SHORT = Type.unboxedType(TypeTags.SHORT),
- UNBOXED_CHAR = Type.unboxedType(TypeTags.CHAR),
- UNBOXED_INT = Type.unboxedType(TypeTags.INT),
- UNBOXED_LONG = Type.unboxedType(TypeTags.LONG),
- UNBOXED_FLOAT = Type.unboxedType(TypeTags.FLOAT),
- UNBOXED_DOUBLE = Type.unboxedType(TypeTags.DOUBLE);
-
- //########################################################################
- // Private Fields
-
- /** The global definitions */
- private final Definitions definitions;
-
- /** The global primitives */
- private final Primitives primitives;
-
- /** The current unit */
- private CompilationUnit unit;
-
- private final boolean forMSIL;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public Erasure(Global global) {
- super(global);
- this.definitions = global.definitions;
- this.primitives = global.primitives;
- this.forMSIL = global.target == global.TARGET_MSIL;
- }
-
- //########################################################################
- // Public Methods
-
- /** Transforms the given unit. */
- public void apply(CompilationUnit unit) {
- this.unit = unit;
- super.apply(unit);
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- switch (tree) {
-
- case ClassDef(_, _, _, _, _, Template(_, Tree[] body)):
- Symbol clasz = tree.symbol();
- TreeList members = new TreeList(transform(body));
- addBridges(clasz, members);
- return gen.ClassDef(clasz, members.toArray());
-
- case ValDef(_, _, _, Tree rhs):
- Symbol field = tree.symbol();
- if (rhs != Tree.Empty) rhs = transform(rhs, field.nextType());
- return gen.ValDef(field, rhs);
-
- case DefDef(_, _, _, _, _, Tree rhs):
- Symbol method = tree.symbol();
- if (rhs != Tree.Empty)
- rhs = transform(rhs, method.nextType().resultType());
- return gen.DefDef(method, rhs);
-
- case LabelDef(_, Ident[] params, Tree body):
- Symbol label = tree.symbol();
- body = transform(body, label.nextType().resultType());
- return gen.LabelDef(label, Tree.symbolOf(params), body);
-
- case Assign(Tree lhs, Tree rhs):
- lhs = transform(lhs);
- rhs = transform(rhs, lhs.type);
- return gen.Assign(tree.pos, lhs, rhs);
-
- case Return(Tree expr):
- Symbol method = tree.symbol();
- Type type = method.nextType().resultType();
- return gen.Return(tree.pos, method, transform(expr, type));
-
- case New(Tree init):
- if (tree.getType().symbol() == definitions.ARRAY_CLASS) {
- switch (init) {
- case Apply(_, Tree[] args):
- assert args.length == 1: tree;
- Type element = getArrayElementType(tree.getType()).erasure();
- Tree size = transform(args[0]);
- return genNewUnboxedArray(tree.pos, element, size);
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
- return gen.New(tree.pos, transform(init));
-
- case Create(_, _):
- return gen.Create(tree.pos, Tree.Empty, tree.symbol());
-
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs):
- fun = transform(fun);
- vargs = transform(vargs);
- Symbol symbol = fun.symbol();
- if (symbol == definitions.ANY_AS_ERASED) {
- assert targs.length == 1 && vargs.length == 0: tree;
- return coerce(getQualifier(fun), targs[0].getType().erasure());
- }
- if (symbol == definitions.ANY_IS_ERASED) {
- assert targs.length == 1 && vargs.length == 0: tree;
- Type type = targs[0].type.erasure();
- if (isUnboxedSimpleType(type)) type = targs[0].type;
- return gen.mkIsInstanceOf(tree.pos, getQualifier(fun), type);
- }
- return genApply(tree.pos, fun, vargs);
-
- case Apply(Tree fun, Tree[] vargs):
- fun = transform(fun);
- vargs = transform(vargs);
- switch (fun) {
- case Select(Apply(Tree bfun, Tree[] bargs), _):
- Symbol bsym = bfun.symbol();
- if (primitives.getPrimitive(bsym) != Primitive.BOX) break;
- assert bargs.length == 1: fun;
- switch (primitives.getPrimitive(fun.symbol())) {
- case COERCE:
- assert vargs.length == 0: tree;
- Tree value = bargs[0];
- return coerce(value, fun.type().resultType());
- case LENGTH:
- assert vargs.length == 0: tree;
- Tree array = bargs[0];
- return genUnboxedArrayLength(tree.pos, array);
- case APPLY:
- assert vargs.length == 1: tree;
- Tree array = bargs[0];
- Tree index = vargs[0];
- return genUnboxedArrayGet(tree.pos, array, index);
- case UPDATE:
- assert vargs.length == 2: tree;
- Tree array = bargs[0];
- Tree index = vargs[0];
- Tree value = vargs[1];
- return genUnboxedArraySet(tree.pos, array, index, value);
- }
- }
- return genApply(tree.pos, fun, vargs);
-
- case Select(Tree qualifier, _):
- Symbol symbol = tree.symbol();
- Type prefix = qualifier.type().baseType(symbol.owner()).erasure();
- assert prefix != Type.NoType: tree + " -- " + Debug.show(symbol);
- qualifier = transform(qualifier);
- qualifier = coerce(qualifier, prefix);
-
- // Might end up with "box(unbox(...))". That's needed by backend.
- if (isUnboxedType(prefix)) qualifier = box(qualifier, true);
- return gen.Select(tree.pos, qualifier, symbol);
-
- case Literal(AConstant.ZERO):
- return gen.mkNullLit(tree.pos);
-
- case Block(_, _):
- case If(_, _, _):
- case Switch(_, _, _, _):
- return transform(tree, tree.getType().fullErasure());
-
- default:
- return super.transform(tree);
- }
- }
-
- //########################################################################
- // Private Methods - Tree transformation
-
- /** Transforms the given trees with given prototype. */
- private Tree[] transform(Tree[] trees, Type pt) {
- for (int i = 0; i < trees.length; i++) {
- Tree tree = transform(trees[i], pt);
- if (tree == trees[i]) continue;
- Tree[] array = new Tree[trees.length];
- for (int j = 0; j < i ; j++) array[j] = trees[j];
- array[i] = tree;
- while (++i < trees.length) array[i] = transform(trees[i], pt);
- return array;
- }
- return trees;
- }
-
- /** Transforms the given tree with given prototype. */
- private Tree transform(Tree tree, Type pt) {
- switch (tree) {
-
- case Block(Tree[] stats, Tree value):
- return gen.Block(tree.pos, transform(stats), transform(value, pt));
-
- case If(Tree cond, Tree thenp, Tree elsep):
- cond = transform(cond, UNBOXED_BOOLEAN);
- thenp = transform(thenp, pt);
- elsep = transform(elsep, pt);
- return gen.If(tree.pos, cond, thenp, elsep, pt);
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- test = transform(test, UNBOXED_INT);
- bodies = transform(bodies, pt);
- otherwise = transform(otherwise, pt);
- return gen.Switch(tree.pos, test, tags, bodies, otherwise, pt);
-
- case Return(_):
- // !!! why do we build a block here?
- Tree value = transform(gen.mkDefaultValue(tree.pos, pt), pt);
- return gen.mkBlock(transform(tree), value);
-
- case LabelDef(_, _, _):
- case Assign(_, _):
- case New(_):
- case Apply(_, _):
- case Super(_, _):
- case This(_):
- case Select(_, _):
- case Ident(_):
- case Literal(_):
- return coerce(transform(tree), pt);
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- /** Transforms Unit literal with given prototype. */
- private Tree transformUnit(int pos, Type pt) {
- Tree unit = pt.isSameAs(UNBOXED_UNIT)
- ? gen.mkUnitLit(pos)
- : gen.mkApply__(gen.mkGlobalRef(pos, primitives.BOX_UVALUE));
- return coerce(unit, pt);
- }
-
- /** Coerces the given tree to the given type. */
- private Tree coerce(Tree tree, Type pt) {
- if (isSubType(tree.type(), pt)) {
- if (tree.type().symbol() == definitions.ARRAY_CLASS) {
- if (pt.symbol() != definitions.ARRAY_CLASS) {
- Symbol symbol = primitives.UNBOX__ARRAY;
- Tree unboxtree = gen.mkGlobalRef(tree.pos, symbol);
- tree = gen.mkApply_V(unboxtree, new Tree[] {tree});
- return coerce(tree, pt);
- }
- }
- return tree;
- }
- if (isUnboxedSimpleType(tree.type())) {
- if (isUnboxedSimpleType(pt)) return convert(tree, pt);
- Type to = pt.erasure();
- if (!isUnboxedSimpleType(to) || isSameAs(to, tree.type()))
- return box(tree);
- else
- return coerce(convert(tree, to), pt);
- } else if (isUnboxedArrayType(tree.type())) {
- if (!isUnboxedArrayType(pt)) return check(box(tree), pt);
- } else if (isUnboxedSimpleType(pt)) {
- Type from = tree.type().erasure();
- if (isUnboxedSimpleType(from))
- return convert(unbox(tree, from), pt);
- else
- return unbox(coerce(tree, boxUnboxedType(pt)), pt);
- } else if (isUnboxedArrayType(pt)) {
- if (tree.type.symbol() == definitions.ARRAY_CLASS)
- return coerce(unbox(tree, pt), pt);
- } else if (pt.symbol() == definitions.ARRAY_CLASS) {
- Tree boxtree = gen.mkGlobalRef(tree.pos, primitives.BOX__ARRAY);
- return gen.mkApply_V(boxtree, new Tree[]{tree});
- }
- return gen.mkAsInstanceOf(tree, pt);
- }
-
- /** Checks that the given tree is of the given type. */
- private Tree check(Tree tree, Type pt) {
- assert isSubType(tree.type(), pt): tree +" - "+ tree.type() +" - "+pt;
- return tree;
- }
-
-
- /** Boxes the given tree. */
- private Tree box(Tree tree) {
- return box(tree, false);
- }
-
- /** Boxes the given tree. */
- private Tree box(Tree tree, boolean force) {
- switch (tree) {
- case Apply(Tree fun, Tree[] args):
- if (primitives.getPrimitive(fun.symbol()) == Primitive.UNBOX) {
- assert args.length == 1: tree;
- if (!force) return args[0];
- }
- }
- Symbol symbol = primitives.getBoxValueSymbol(tree.getType());
- Tree boxtree = gen.mkGlobalRef(tree.pos, symbol);
- return tree.getType().equals(UNBOXED_UNIT)
- ? gen.mkBlock(tree, gen.mkApply__(boxtree))
- : gen.mkApply_V(boxtree, new Tree[]{tree});
- }
-
- /** Unboxes the given tree to the given type. */
- private Tree unbox(Tree tree, Type pt) {
- switch (tree) {
- case Apply(Tree fun, Tree[] args):
- if (primitives.getPrimitive(fun.symbol()) == Primitive.BOX) {
- assert args.length == 1: tree;
- return args[0];
- }
- }
- Symbol symbol = primitives.getUnboxValueSymbol(pt);
- return gen.mkApply_V(
- gen.mkGlobalRef(tree.pos, symbol), new Tree[]{tree});
- }
-
- /** Converts the given tree to the given type. */
- private Tree convert(Tree tree, Type to) {
- Symbol symbol = primitives.getConvertSymbol(tree.type(), to);
- return gen.mkApply_V(
- gen.mkGlobalRef(tree.pos, symbol), new Tree[]{tree});
- }
-
- //########################################################################
- // Private Methods - Tree generation
-
- /** Generates given bridge method forwarding to given method. */
- private Tree genBridgeMethod(Symbol bridge, Symbol method) {
- Type type = bridge.nextType();
- Tree body = genApply(bridge.pos,
- gen.Select(gen.This(bridge.pos, bridge.owner()), method),
- gen.mkLocalRefs(bridge.pos, type.valueParams()));
- return gen.DefDef(bridge, coerce(body, type.resultType()));
- }
-
- /** Generates an application with given function and arguments. */
- private Tree genApply(int pos, Tree fun, Tree[] args) {
- switch (fun.getType()) {
- case MethodType(Symbol[] params, Type result):
- Tree[] args1 = args;
- for (int i = 0; i < args.length; i++) {
- Tree arg = args[i];
- Tree arg1 = coerce(arg, params[i].nextType());
- if (arg1 != arg && args1 == args) {
- args1 = new Tree[args.length];
- for (int j = 0; j < i; j++) args1[j] = args[j];
- }
- args1[i] = arg1;
- }
- return gen.mkApply_V(pos, fun, args1);
- default:
- throw Debug.abort("illegal type " + fun.getType() + " for " + fun);
- }
- }
-
- /**
- * Generates a new unboxed array of given size and with elements
- * of given type.
- */
- private Tree genNewUnboxedArray(int pos, Type element, Tree size) {
- if (global.target == global.TARGET_INT) {
- Tree[] targs = {gen.mkType(pos, element)};
- Tree[] vargs = {coerce(size, UNBOXED_INT)};
- Tree fun = gen.mkGlobalRef(pos, primitives.NEW_OARRAY);
- return gen.mkApplyTV(fun, targs, vargs);
- }
- switch (element) {
- case UnboxedType(int kind): return genNewUnboxedArray(pos, kind, size);
- }
- String name = primitives.getNameForClassForName(element);
- Tree[] args = { coerce(size, UNBOXED_INT), gen.mkStringLit(pos,name) };
- Tree array =
- gen.mkApply_V(gen.mkGlobalRef(pos,primitives.NEW_OARRAY), args);
- return gen.mkAsInstanceOf(array, Type.UnboxedArrayType(element));
- }
-
- /**
- * Generates a new unboxed array of given size and with elements
- * of given unboxed type kind.
- */
- private Tree genNewUnboxedArray(int pos, int kind, Tree size) {
- Symbol symbol = primitives.getNewArraySymbol(kind);
- Tree[] args = { coerce(size, UNBOXED_INT) };
- return gen.mkApply_V(gen.mkGlobalRef(pos, symbol), args);
- }
-
- /** Generates an unboxed array length operation. */
- private Tree genUnboxedArrayLength(int pos, Tree array) {
- assert isUnboxedArrayType(array.getType()): array;
- Symbol symbol = primitives.getArrayLengthSymbol(array.getType());
- Tree[] args = { array };
- return gen.mkApply_V(gen.mkGlobalRef(pos, symbol), args);
- }
-
- /** Generates an unboxed array get operation. */
- private Tree genUnboxedArrayGet(int pos, Tree array, Tree index) {
- assert isUnboxedArrayType(array.getType()): array;
- Symbol symbol = primitives.getArrayGetSymbol(array.getType());
- index = coerce(index, UNBOXED_INT);
- Tree[] args = { array, index };
- return gen.mkApply_V(gen.mkGlobalRef(pos, symbol), args);
- }
-
- /** Generates an unboxed array set operation. */
- private Tree genUnboxedArraySet(int pos, Tree array,Tree index,Tree value){
- assert isUnboxedArrayType(array.getType()): array;
- Symbol symbol = primitives.getArraySetSymbol(array.getType());
- index = coerce(index, UNBOXED_INT);
- value = coerce(value, getArrayElementType(array.getType()));
- Tree[] args = { array, index, value };
- return gen.mkApply_V(gen.mkGlobalRef(pos, symbol), args);
- }
-
- //########################################################################
- // Private Methods - Queries
-
- /** Returns the qualifier of the given tree. */
- private Tree getQualifier(Tree tree) {
- switch (tree) {
- case Select(Tree qualifier, _):
- return qualifier;
- default:
- throw Debug.abort("no qualifier for tree", tree);
- }
- }
-
- /** Are the given erased types in a subtyping relation? */
- private boolean isSubType(Type tp1, Type tp2) {
- global.nextPhase();
- boolean result = tp1.isSubType(tp2);
- global.prevPhase();
- return result;
- }
-
- /** Are the given erased types in an equality relation? */
- private boolean isSameAs(Type tp1, Type tp2) {
- global.nextPhase();
- boolean result = tp1.isSameAs(tp2);
- global.prevPhase();
- return result;
- }
-
- /** Is the given type an unboxed type? */
- private boolean isUnboxedType(Type type) {
- switch (type) {
- case UnboxedType(_) : return true;
- case UnboxedArrayType(_): return true;
- default : return false;
- }
- }
-
- /** Is the given type an unboxed simple type? */
- private boolean isUnboxedSimpleType(Type type) {
- switch (type) {
- case UnboxedType(_) : return true;
- default : return false;
- }
- }
-
- /** Is the given type an unboxed array type? */
- private boolean isUnboxedArrayType(Type type) {
- switch (type) {
- case UnboxedArrayType(_): return true;
- default : return false;
- }
- }
-
- /** Returns the boxed version of the given unboxed type. */
- private Type boxUnboxedType(Type type) {
- switch (type) {
- case UnboxedType(TypeTags.UNIT):
- return definitions.UNIT_CLASS.type();
- case UnboxedType(TypeTags.BOOLEAN):
- return definitions.BOOLEAN_CLASS.type();
- case UnboxedType(TypeTags.BYTE):
- return definitions.BYTE_CLASS.type();
- case UnboxedType(TypeTags.SHORT):
- return definitions.SHORT_CLASS.type();
- case UnboxedType(TypeTags.CHAR):
- return definitions.CHAR_CLASS.type();
- case UnboxedType(TypeTags.INT):
- return definitions.INT_CLASS.type();
- case UnboxedType(TypeTags.LONG):
- return definitions.LONG_CLASS.type();
- case UnboxedType(TypeTags.FLOAT):
- return definitions.FLOAT_CLASS.type();
- case UnboxedType(TypeTags.DOUBLE):
- return definitions.DOUBLE_CLASS.type();
- case UnboxedArrayType(Type element):
- return Type.appliedType(
- definitions.ARRAY_CLASS.type(), new Type[] {element});
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- /** Returns the element type of the given array type. */
- private Type getArrayElementType(Type type) {
- switch (type) {
- case TypeRef(_, Symbol symbol, Type[] args):
- if (symbol != definitions.ARRAY_CLASS) break;
- assert args.length == 1: type;
- return args[0];
- case UnboxedArrayType(Type element):
- return element;
- }
- throw Debug.abort("non-array type", type);
- }
-
-//////////////////////////////////////////////////////////////////////////////////
-// Bridge Building
-/////////////////////////////////////////////////////////////////////////////////
-
- private TreeList bridges;
- private HashMap bridgeSyms;
-
- /** Add bridge which Java-overrides `sym1' and which forwards to `sym'
- */
- public void addBridge(Symbol owner, Symbol sym, Symbol sym1) {
- Type bridgeType = sym1.nextType();
-
- // create bridge symbol and add to bridgeSyms(sym)
- // or return if bridge with required type already exists for sym.
- SymSet bridgesOfSym = (SymSet) bridgeSyms.get(sym);
- if (bridgesOfSym == null) bridgesOfSym = SymSet.EMPTY;
- Symbol[] brs = bridgesOfSym.toArray();
- for (int i = 0; i < brs.length; i++) {
- if (isSameAs(brs[i].type(), bridgeType)) return;
- }
- Symbol bridgeSym = sym.cloneSymbol();
- bridgeSym.flags |= (SYNTHETIC | BRIDGE);
- bridgeSym.flags &= ~(JAVA | DEFERRED);
- bridgesOfSym = bridgesOfSym.incl(bridgeSym);
- bridgeSyms.put(sym, bridgesOfSym);
- bridgeSym.setOwner(owner);
-
- // check that there is no overloaded symbol with same erasure as bridge
- // todo: why only check for overloaded?
- Symbol overSym = owner.members().lookup(sym.name);
- switch (overSym.nextType()) {
- case OverloadedType(Symbol[] alts, Type[] alttypes):
- for (int i = 0; i < alts.length; i++) {
- if (sym != alts[i] && isSameAs(bridgeType, alttypes[i])) {
- unit.error(sym.pos, "overlapping overloaded alternatives; " +
- "overridden " + sym1 + sym1.locationString() +
- " has same erasure as " + alts[i] +
- alttypes[i] + alts[i].locationString());
- }
- }
- }
-
- switch (bridgeType) {
- case MethodType(Symbol[] params, Type restp):
- // assign to bridge symbol its bridge type
- // where owner of all parameters is bridge symbol itself.
- Symbol[] params1 = new Symbol[params.length];
- for (int i = 0; i < params.length; i++) {
- params1[i] = params[i].cloneSymbol(bridgeSym);
- }
- bridgeSym.setType(Type.MethodType(params1, restp));
-
- bridges.append(genBridgeMethod(bridgeSym, sym));
- }
-
- }
-
- /** Add an "empty bridge" (abstract method declaration) to satisfy
- * CLR's requirement that classes should provide declaration
- * for all methods of the interfaces they implement
- */
- /*
- public void addEmptyBridge(Symbol owner, Symbol method) {
- Type bridgeType = method.nextType();
- Symbol bridgeSym = method.cloneSymbol(owner);
- bridgeSym.flags = bridgeSym.flags & ~JAVA | SYNTHETIC | DEFERRED;
- //bridgeSym.setOwner(owner);
- switch (bridgeType) {
- case MethodType(Symbol[] params, Type restp):
- // assign to bridge symbol its bridge type
- // where owner of all parameters is bridge symbol itself.
- Symbol[] params1 = new Symbol[params.length];
- for (int i = 0; i < params.length; i++) {
- params1[i] = params[i].cloneSymbol(bridgeSym);
- }
- bridgeSym.setType(Type.MethodType(params1, restp));
- Tree bridge = gen.DefDef(bridgeSym, Tree.Empty);
- bridges.append(bridge);
- }
- }
- */
-
- private final Map interfaces/*<Symbol,Set<Symbol>>*/ = new HashMap();
-
- private Set getInterfacesOf(Symbol clasz) {
- assert clasz.isClass(): Debug.show(clasz);
- Set set = (Set)interfaces.get(clasz);
- if (set == null) {
- set = new HashSet();
- interfaces.put(clasz, set);
- Type parents[] = clasz.parents();
- for (int i = 0; i < parents.length; i++)
- set.addAll(getInterfacesOf(parents[i].symbol()));
- if (clasz.isInterface()) set.add(clasz);
- }
- return set;
- }
-
- private void addInterfaceBridges_(Symbol clasz) {
- assert clasz.isClass() && !clasz.isInterface(): Debug.show(clasz);
- assert clasz.parents().length > 0: Debug.show(clasz)+": "+clasz.info();
- Symbol svper = clasz.parents()[0].symbol();
- assert svper.isClass() && !svper.isInterface(): Debug.show(clasz);
- Set interfaces = new HashSet(getInterfacesOf(clasz));
- interfaces.removeAll(getInterfacesOf(svper));
- for (Iterator i = interfaces.iterator(); i.hasNext(); ) {
- Symbol inter = (Symbol)i.next();
- addInterfaceBridgesAux(clasz, inter.members());
- }
- }
-
- private void addInterfaceBridgesAux(Symbol owner, Scope symbols) {
- for (Scope.SymbolIterator i = symbols.iterator();
- i.hasNext();) {
- Symbol member = i.next();
- if (!member.isTerm() || !member.isDeferred()) continue;
- addInterfaceBridges(owner, member);
- }
- }
-
-
- private Symbol getOverriddenMethod(Symbol method) {
- Type[] parents = method.owner().parents();
- if (parents.length == 0) return Symbol.NONE;
- return method.overriddenSymbol(parents[0]);
- }
-
- public void addBridgeMethodsTo(Symbol method) {
- assert method.owner().isClass() && !method.owner().isInterface();
- Symbol overridden = getOverriddenMethod(method);
- if (!overridden.isNone() && !isSameAs(overridden.nextType(), method.nextType()))
- addBridge(method.owner(), method, overridden);
- }
-
- public void addInterfaceBridges(Symbol owner, Symbol method) {
- assert owner.isClass() && !owner.isInterface(): Debug.show(owner);
- Symbol overriding = method.overridingSymbol(owner.thisType());
- if (overriding == method) {
- Symbol overridden = method.overriddenSymbol(owner.thisType().parents()[0], owner);
- if (!overridden.isNone() && !isSameAs(overridden.nextType(), method.nextType()))
- addBridge(owner, method, overridden);
- // moved this into the TypeCreator class of the MSIL backend
- //if (forMSIL && (overridden.isNone() || overridden.owner() != owner))
- // addEmptyBridge(owner, method);
- } else if (!overriding.isNone() && !isSameAs(overriding.nextType(), method.nextType()))
- addBridge(owner, overriding, method);
- }
-
- private void addBridges(Symbol clasz, TreeList members) {
- TreeList savedBridges = bridges;
- HashMap savedBridgeSyms = bridgeSyms;
- bridges = new TreeList();
- bridgeSyms = new HashMap();
-
- int length = members.length();
- if (!clasz.isInterface()) {
- for (int i = 0; i < length; i++) {
- switch (members.get(i)) {
- case DefDef(_, _, _, _, _, Tree rhs):
- addBridgeMethodsTo(members.get(i).symbol());
- }
- }
- addInterfaceBridges_(clasz);
- }
-
- members.append(bridges);
- if (bridges.length() > 0) {
- Type info = clasz.nextInfo();
- switch (info) {
- case CompoundType(Type[] parts, Scope members_):
- members_ = members_.cloneScope();
- for (int i = 0; i < bridges.length(); i++) {
- Tree bridge = (Tree)bridges.get(i);
- members_.enterOrOverload(bridge.symbol());
- }
- clasz.updateInfo(Type.compoundType(parts, members_, info.symbol()));
- break;
- default:
- throw Debug.abort("class = " + Debug.show(clasz) + ", " +
- "info = " + Debug.show(info));
- }
- }
- bridgeSyms = savedBridgeSyms;
- bridges = savedBridges;
- }
-
-
-}
diff --git a/sources/scalac/transformer/ErasurePhase.java b/sources/scalac/transformer/ErasurePhase.java
deleted file mode 100644
index c0669e22f2..0000000000
--- a/sources/scalac/transformer/ErasurePhase.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ErasurePhase.java,v 1.13 2002/11/14 15:58:22 schinz Exp $
-// $Id$
-
-package scalac.transformer;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.backend.Primitive;
-import scalac.backend.Primitives;
-import scalac.symtab.Definitions;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Name;
-import scalac.util.Debug;
-
-public class ErasurePhase extends Phase {
-
- //########################################################################
- // Private Fields
-
- private final Definitions definitions;
- private final Primitives primitives;
- private final Erasure erasure;
-
- //########################################################################
- // Public Constructors
-
- public ErasurePhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- this.definitions = global.definitions;
- this.primitives = global.primitives;
- this.erasure = new Erasure(global);
- }
-
- //########################################################################
- // Public Methods
-
- public void apply(CompilationUnit unit) {
- erasure.apply(unit);
- }
-
- public Type transformInfo(Symbol sym, Type tp) {
- if (sym.isConstructor() && sym.constructorClass().isSubClass(definitions.ANYVAL_CLASS)) return tp;
- if (sym.isClass()) {
- if (sym == definitions.ANY_CLASS) return tp;
- if (sym.isJava() && sym.isModuleClass()) return tp;
- if (sym.isSubClass(definitions.ANYVAL_CLASS))
- if (sym != definitions.ANYVAL_CLASS) return tp;
- switch (tp) {
- case CompoundType(Type[] parents, Scope members):
- assert parents.length != 0: Debug.show(sym) + " -- " + tp;
- if (sym.isInterface()) {
- Symbol superclass = parents[0].symbol();
- if (superclass.isJava() && !superclass.isInterface()) {
- parents = Type.cloneArray(parents);
- parents[0] = definitions.ANYREF_TYPE();
- tp = Type.compoundType(parents, members, sym);
- }
- }
- return Type.erasureMap.map(tp);
- default:
- throw Debug.abort("illegal case", tp);
- }
- }
- if (sym.isTerm() && sym.isParameter()) {
- if (primitives.getPrimitive(sym.owner()) == Primitive.BOX)
- return eraseUnboxMethodType(tp);
- if (primitives.getPrimitive(sym.owner()) == Primitive.UNBOX)
- return eraseBoxMethodType(tp);
- }
- if (sym.isType()) return tp;
- if (sym.isThisSym()) return sym.owner().nextType();
- // if (sym == definitions.NULL) return tp.resultType().erasure();
- if (global.target == global.TARGET_INT && sym ==primitives.NEW_OARRAY){
- // !!! hack for interpreter
- Name name = Name.fromString("element").toTypeName();
- Symbol tparam = sym.newTParam(sym.pos, 0, name, definitions.ANY_TYPE());
- return Type.PolyType(new Symbol[]{tparam}, tp);
- }
- switch (primitives.getPrimitive(sym)) {
- case Primitive.IS : return Type.PolyType(tp.typeParams(), Type.MethodType(tp.valueParams(), tp.resultType().erasure()));
- case Primitive.AS : return tp;
- case Primitive.BOX: return eraseBoxMethodType(tp);
- case Primitive.UNBOX: return eraseUnboxMethodType(tp);
- default : return tp.erasure();
- }
- }
-
- //########################################################################
- // Private Methods
-
- private Type eraseBoxMethodType(Type type) {
- switch (type) {
- case PolyType(_, Type result):
- return eraseBoxMethodType(result);
- case MethodType(Symbol[] params, Type result):
- return Type.MethodType(params, eraseBoxMethodType(result));
- case TypeRef(Type prefix, Symbol clasz, Type[] args):
- return Type.typeRef(prefix, clasz, Type.EMPTY_ARRAY);
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- private Type eraseUnboxMethodType(Type type) {
- switch (type) {
- case PolyType(_, Type result):
- return eraseUnboxMethodType(result);
- case MethodType(Symbol[] params, Type result):
- return Type.MethodType(params, eraseUnboxMethodType(result));
- case TypeRef(_, Symbol clasz, Type[] args):
- if (clasz == definitions.ARRAY_CLASS) {
- Symbol element = args[0].symbol();
- if (element.isAbstractType())
- if (element.info().symbol() == definitions.ANY_CLASS)
- return definitions.ANYREF_CLASS.nextType();
- }
- return type.fullErasure();
- default:
- throw Debug.abort("illegal case", type);
- }
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/ExpandMixinsPhase.java b/sources/scalac/transformer/ExpandMixinsPhase.java
deleted file mode 100644
index 969080039a..0000000000
--- a/sources/scalac/transformer/ExpandMixinsPhase.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $OldId: ExpandMixinsPhase.java,v 1.8 2002/05/02 10:59:35 schinz Exp $
-// $Id$
-
-package scalac.transformer;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.LinkedList;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Template;
-import scalac.ast.TreeGen;
-import scalac.ast.TreeInfo;
-import scalac.ast.TreeList;
-import scalac.ast.Traverser;
-import scalac.ast.Transformer;
-import scalac.ast.GenTransformer;
-import scalac.ast.GenTreeCloner;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope.SymbolIterator;
-import scalac.symtab.SymbolCloner;
-import scalac.symtab.SymbolSubstTypeMap;
-
-// TODO do not copy hidden members which are not accessible via
-// "super".
-
-/**
- * A phase to expand mixins using code copying. We assume that links
- * to outer classes have been made explicit by a previous phase.
- */
-// !!! needs to be cleaned
-public class ExpandMixinsPhase extends Phase {
-
- //########################################################################
- // Private Fields
-
- /** A map from classes to their interface */
- private final Map/*<Symbol,Symbol>*/ interfaces;
-
- /** A map from classes to their type transformer */
- private final Map/*<Symbol,TypeTransformer>*/ transformers;
-
- /** A map from classes to their expanded body */
- private final Map/*<Symbol,Tree[]>*/ expansions;
-
- /** A map from classes to their original (unexpanded) body */
- private final Map/*<Symbol,Tree[]>*/ bodies;
-
- /** A map from members to their original member */
- private final Map/*<Symbol,Symbol>*/ origins;
-
-
- /** A transformer that expands classes that have mixins */
- private final GenTransformer expander;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ExpandMixinsPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- Phase addinterfaces = global.PHASE.ADDINTERFACES.phase();
- this.interfaces = ((AddInterfacesPhase)addinterfaces).classToIFace;
- this.transformers = new HashMap();
- this.expansions = new HashMap();
- this.bodies = ((AddInterfacesPhase)addinterfaces).classToBody;
- this.origins = new HashMap();
- this.expander = new TreeExpander(global);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- expander.apply(unit);
- }
-
- /** Applies this phase to the given type for the given symbol. */
- public Type transformInfo(Symbol symbol, Type type) {
- while (true) {
- if (symbol.isJava()) return type;
- if (symbol.isInterface()) return type;
- if (symbol.isCompoundSym()) return type; // !!! check
- if (symbol.isClass()) {
- return getTypeExpander(symbol).apply(type);
- }
- symbol = symbol.isConstructor()
- ? symbol.constructorClass()
- : symbol.owner();
- }
- }
-
- //########################################################################
- // Private Methods
-
- //########################################################################
- // Private Class - Tree expander
-
- /**
- * A tree transformer that expands class definitions and removes
- * compiled units.
- */
- private class TreeExpander extends GenTransformer {
- public TreeExpander(Global global) {
- super(global);
- }
- public void apply(CompilationUnit unit) {
- if (unit.mixinOnly) {
- assert Debug.log("removing unit " + unit);
- unit.body = Tree.EMPTY_ARRAY;
- } else {
- super.apply(unit);
- }
- }
- public Tree transform(Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, _):
- Symbol clasz = tree.symbol();
- if (clasz.isInterface()) return super.transform(tree);
- return gen.ClassDef(clasz, getExpandedBody(clasz));
- default:
- return super.transform(tree);
- }
- }
- }
-
- //########################################################################
- // Private Class - Tree inliner
-
- /**
- * A Tree cloner that clones mixin bodies. It assumes that these
- * bodies have already been expanded. References to mixin value
- * parameters are replaced by references to newly-created inlined
- * fields. The symbol of Super and This nodes is replaced by the
- * symbol of the generated class. The symbol of super members is
- * rebound if required. Note that as the input tree has already
- * been expanded, it contains only super member to the first
- * supertype of the mixin, all other super members have been
- * removed during the expansion of the input tree.
- */
- private static class TreeInliner extends GenTreeCloner {
- private final Symbol clasz;
- private final Type supertype;
- private boolean initializer;
- public TreeInliner(Global global, TypeTransformer transformer) {
- super(global, transformer, transformer.cloner);
- // !!! global.nextPhase();
- this.clasz = transformer.clasz;
- // !!! global.prevPhase();
- this.supertype = clasz.nextInfo().parents()[0];
- }
- public Symbol getSymbolFor(Tree tree) {
- switch (tree) {
- case Select(Super(_, _), _):
- if (tree.symbol().isInitializer()) return tree.symbol(); // !!!
- assert supertype.symbol().isSubClass(tree.symbol().owner()):
- tree + " -- " + Debug.show(clasz);
- global.nextPhase();
- Symbol symbol = tree.symbol().overriddenSymbol(supertype);
- assert !symbol.isNone(): Debug.show(tree, clasz, supertype);
- global.prevPhase();
- return symbol;
- case Super(_, _):
- case This(_):
- return clasz;
- default:
- return super.getSymbolFor(tree);
- }
- }
- public Tree transform(Tree tree) {
- switch (tree) {
- case ValDef(_, _, _, _):
- if (tree.symbol().hasStaticAttribute())
- return Tree.Empty;
- break;
- case DefDef(_, _, _, _, _, _):
- Symbol symbol = getSymbolFor(tree);
- if (symbol.owner() != clasz || symbol.hasStaticAttribute())
- return Tree.Empty;
- if (symbol.isInitializer()) initializer = true;
- tree = super.transform(tree);
- initializer = false;
- return tree;
- case Apply(Select(Super(_, _), _), _):
- if (TreeInfo.methSymbol(tree).isInitializer() && !initializer)
- return Tree.Empty;
- break;
- }
- if (tree.hasSymbol() && tree.symbol().isParameter()) {
- Symbol symbol = getSymbolFor(tree);
- if (!symbol.isParameter()) {
- assert tree instanceof Tree.Ident: tree;
- return gen.Select(gen.This(tree.pos, clasz), symbol);
- }
- }
- return super.transform(tree);
- }
- }
-
- //########################################################################
- // Private Class - Class tree expander
-
- /**
- * A tree transformer that expands a class definitions. Super
- * members are rebound and/or rewritten into normal members.
- */
- private class ClassTreeExpander extends TreeExpander {
- private final Symbol clasz;
- private final Type[] parents;
- private final Map clones;
- public ClassTreeExpander(Global global, TypeTransformer transformer) {
- super(global);
- this.clasz = transformer.clasz;
- this.parents = clasz.parents();
- this.clones = transformer.cloner.clones;
- }
- private Symbol getSuperMember(Symbol member) {
- for (int i = 0; i < parents.length; i++) {
- global.nextPhase();
- if (!parents[i].symbol().isSubClass(member.owner())) {
- global.prevPhase(); // !!!
- continue;
- }
- Symbol override = member.overridingSymbol(parents[i]);
- global.prevPhase();
- assert !override.isNone():
- Debug.show(member, clasz, parents[i]);
- if (i == 0) return override;
- Symbol clone = (Symbol)clones.get(override);
- assert clone != null: Debug.show(member, override, clasz);
- return clone;
- }
- // !!! double loop
- for (int i = 0; i < parents.length; i++) {
- if (!parents[i].symbol().isSubClass(member.owner())) continue;
- //global.nextPhase();
- Symbol override = member.overridingSymbol(parents[i]);
- //global.prevPhase();
- assert !override.isNone():
- Debug.show(member, clasz, parents[i]);
- if (i == 0) return override;
- Symbol clone = (Symbol)clones.get(override);
- assert clone != null: Debug.show(member, override, clasz);
- return clone;
- }
- throw Debug.abort(Debug.show(member, clasz));
- }
- public Tree transform(Tree tree) {
- switch (tree) {
- case Select(Super(_, _), _):
- Symbol symbol = getSuperMember(tree.symbol());
- Tree qualifier = symbol.owner() == clasz
- ? gen.This(tree.pos, clasz)
- : gen.Super(tree.pos, clasz);
- return gen.Select(tree.pos, qualifier, symbol);
- default:
- return super.transform(tree);
- }
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /** Returns the type transformer to use for the given class. */
- private TypeTransformer getTypeExpander(Symbol clasz) { // !!!
- assert clasz.isClass() && !clasz.isInterface(): Debug.show(clasz);
- TypeTransformer transformer =(TypeTransformer)transformers.get(clasz);
- if (transformer == null) {
- transformer = new TypeTransformer(clasz);
- transformers.put(clasz, transformer);
- }
- return transformer;
- }
-
- /** Returns the expanded body of the given clasz. */
- private Tree[] getExpandedBody(Symbol clasz) {
- Tree[] body = (Tree[])expansions.get(clasz);
- if (body == null) {
- body = (Tree[])bodies.remove(clasz);
- assert body != null: Debug.show(clasz);
- TypeTransformer transformer = getTypeExpander(clasz);
- TreeList list = new TreeList();
- assert Debug.log("expanding tree ", clasz);
- Type[] parents = clasz.parents();
- TreeInliner inliner = new TreeInliner(global, transformer);
- for (int i = 1; i < parents.length; i++) {
- Symbol mixin = parents[i].symbol();
- if (mixin.isInterface()) continue;
- assert Debug.log("expanding tree ", clasz, ": inlining ", mixin);
- list.append(inliner.transform(getExpandedBody(mixin)));
- }
- ClassTreeExpander expander = new ClassTreeExpander(global, transformer);
- list.append(expander.transform(body));
- body = list.toArray();
- expansions.put(clasz, body);
- }
- return body;
- }
-
- //########################################################################
- // Private Class - Collector
-
- private class TypeTransformer extends Type.MapOnlyTypes {
-
- public final Symbol clasz;
- public final Type[] parents;
- public final SymbolCloner cloner;
- public final Map/*<Symbol,Type>*/ inlines;
-
- public TypeTransformer(Symbol clasz) {
- this.clasz = clasz;
- this.parents = clasz.parents();
- this.cloner = new SymbolCloner();
- this.inlines = new HashMap();
- initialize();
- }
-
- private void initialize() {
- Type[] parents = clasz.parents();
- // !!! parents.length > 0
- if (parents.length > 0) parents[0].symbol().nextInfo(); // force
- assert Debug.log("expanding type ", clasz);
- for (int i = parents.length - 1; 0 < i; i--) {
- switch (parents[i]) {
- case TypeRef(Type prefix, Symbol mixin, Type[] args):
- if (mixin.isInterface()) continue;
- mixin.nextInfo(); // force
- assert Debug.log("expanding type ", clasz, ": inlining ", mixin);
- cloner.owners.put(mixin, clasz);
- cloner.owners.put(mixin.primaryConstructor(), clasz);
- // map mixin type parameters to mixin type arguments
- Symbol[] tparams = mixin.typeParams();
- for (int j = 0; j < tparams.length; j++)
- inlines.put(tparams[j], args[j]);
-
- createMixedInMemberSymbols(mixin.nextInfo().members());
- }
- }
- Set clones = new HashSet(cloner.clones.keySet());
-// cloner.clones.putAll(getTypeTransformerFor(parents[0].symbol()).cloner.clones); // !!! build closure
-
- // !!! remove ?
- for (Iterator i = cloner.clones.values().iterator(); i.hasNext();){
- // !!! for (Iterator i = clones.iterator(); i.hasNext();){
- Symbol clone = (Symbol)i.next();
- clone.setInfo(apply(clone.info()));
- }
- }
-
- private Symbol getMemberOrigin(Symbol member) {
- Object origin = origins.get(member);
- return origin == null ? member : (Symbol)origin;
- }
-
- private void createMixedInMemberSymbols(Scope symbols) {
- Scope scope = clasz.members();
- for (SymbolIterator i = symbols.iterator(); i.hasNext();) {
- Symbol member = i.next();
- boolean shadowed = member.isPrivate() || member.isInitializer()
- || member.overridingSymbol(clasz.thisType()) != member;
- Symbol origin = getMemberOrigin(member);
- if (!shadowed && origin != null) {
- Symbol overridden = member.overriddenSymbol(parents[0]);
- if (origin == getMemberOrigin(overridden)) {
- cloner.clones.put(member, overridden);
- continue;
- }
- }
- // !!! when the symbol is shadowed, inlining could be
- // avoided if the original definition is accessible
- // through super
- assert Debug.log("expanding type ", clasz, ": cloning ", member);
- Symbol clone = cloner.cloneSymbol(member);
- if (shadowed) clone.name = Names.MIXIN(member);
- if (shadowed) clone.flags &= ~Modifiers.OVERRIDE;
- if (shadowed) clone.flags &= ~Modifiers.ACCESSFLAGS;
- if (shadowed) clone.flags |= Modifiers.PRIVATE;
- scope.enterOrOverload(clone);
- origins.put(clone, origin != null ? origin : member);
- }
- }
-
-
- public Type apply(Type type) {
- switch (type) {
- case TypeRef(Type prefix, Symbol symbol, Type[] args):
- Type inline = (Type)inlines.get(symbol);
- if (inline != null) return inline;
- if (symbol.isParameter()) {
- Symbol clone = (Symbol)cloner.clones.get(symbol);
- if (clone != null) {
- assert prefix == Type.NoPrefix && args.length == 0:
- type;
- return Type.typeRef(prefix, clone, args);
- }
- }
- return map(type);
- case SingleType(Type prefix, Symbol symbol):
- Symbol clone = (Symbol)cloner.clones.get(symbol);
- prefix = apply(prefix);
- return Type.singleType(prefix, clone != null ? clone : symbol);
- case ThisType(_):
- return clasz.thisType();
- case CompoundType(Type[] parents, Scope members):
- if (type.symbol() != clasz) return map(type);
- if (parents.length <= 1) return type;
- Symbol iface = (Symbol)interfaces.get(clasz);
- if (iface == null) {
- int i = 1;
- while (i < parents.length && parents[i].symbol().isInterface()) i++;
- if (i == parents.length) return type;
- parents = Type.cloneArray(parents);
- while (i < parents.length) {
- if (!parents[i].symbol().isInterface())
- parents[i] = Type.typeRef(parents[i].prefix(), (Symbol)interfaces.get(parents[i].symbol()), parents[i].typeArgs());
- i++;
- }
- return Type.compoundType(parents, members, clasz);
- }
- assert parents[parents.length - 1].symbol() == iface: type;
- if (parents.length == 2) return type;
- for (int i = 1; i < parents.length - 1; i++) {
- Symbol mixin = parents[i].symbol();
- Symbol imix = mixin.isInterface()
- ? mixin
- : (Symbol)interfaces.get(mixin);
- assert iface.isSubClass(imix): type+" - "+i;
- }
- parents = new Type[] {parents[0], parents[parents.length - 1]};
- return Type.compoundType(parents, members, clasz);
- default:
- return map(type);
- }
- }
-
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/ExplicitOuterClassesPhase.java b/sources/scalac/transformer/ExplicitOuterClassesPhase.java
deleted file mode 100644
index b1b05832a1..0000000000
--- a/sources/scalac/transformer/ExplicitOuterClassesPhase.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.ast.GenTransformer;
-import scalac.ast.Tree;
-import scalac.ast.Tree.Template;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-import scalac.util.Name;
-import scalac.util.Names;
-
-/**
- * This phase does the following:
- *
- * - In every nested class, adds to each of its constructor a new
- * value parameter that contains a link to the outer class.
- *
- * - In every nested type, adds to each of its constructor a new type
- * parameter for every type parameter appearing in outer types.
- *
- * - In every class, adds a forwarding "super" method for every method
- * that is accessed via "super" in a nested class.
- *
- * - Replaces all prefixes of TypeRefs by localThisTypes.
- *
- * - Adds all missing qualifiers.
- */
-// !!! needs to be cleaned
-public class ExplicitOuterClassesPhase extends Phase {
-
- //########################################################################
- // Private Fields
-
- /** A map from constructor symbols to type transformers */
- private final Map/*<Symbol,TypeTransformer>*/ transformers = new HashMap();
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ExplicitOuterClassesPhase(Global global,PhaseDescriptor descriptor){
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- treeTransformer.apply(unit);
- }
-
- /** Applies this phase to the given type for the given symbol. */
- public Type transformInfo(Symbol symbol, Type type) {
- if (symbol.isConstructor()) {
- Symbol clasz = symbol.constructorClass();
- if (clasz.isClass() && !clasz.isCompoundSym())
- return transformInfo(clasz, symbol, type);
- }
- return getTypeTransformerFor(symbol).apply(type);
- }
-
- //########################################################################
- // Private Methods
-
- /**
- * Computes and returns the new type of the constructor. As a side
- * effect, creates and stores the type transformer corresponding
- * to this constructor.
- */
- private Type transformInfo(Symbol clasz, Symbol constructor, Type type) {
- Symbol[] tparams = type.typeParams();
- Symbol[] vparams = type.valueParams();
- int depth = getClassDepth(clasz);
-
- Map/*<Symbol,Type>*/ table = new HashMap();
- table.put(clasz, clasz.thisType());
- for (int i = 0; i < tparams.length; i++)
- table.put(tparams[i], tparams[i].type());
-
- Symbol[] owners = new Symbol[depth];
- Symbol[][] tparamss = new Symbol[depth][];
-
- Symbol vlink = null;
- if (depth > 0) {
- int count = depth;
- Symbol owner = clasz.owner();
- for (int i = depth - 1; i >= 0; i--) {
- owners[i] = owner;
- tparamss[i] = owner.typeParams();
- count += tparamss[i].length;
- owner = owner.owner();
- }
-
- // create outer value link
- vparams = Symbol.cloneArray(1, vparams);
- int vflags = Modifiers.SYNTHETIC;
- Name vname = Names.OUTER(constructor);
- vlink = constructor.newVParam(constructor.pos, vflags, vname);
- vlink.setInfo(clasz.owner().thisType());
- vparams[0] = vlink;
-
- int o = 0;
- tparams = Symbol.cloneArray(count, tparams);
- for (int i = 0; i < depth; i++) {
- // create new type parameters
- for (int j = 0; j < tparamss[i].length; j++) {
- Symbol oldtparam = tparamss[i][j];
- Symbol newtparam = oldtparam.cloneSymbol(constructor);
- newtparam.name = Names.OUTER(constructor, oldtparam);
- table.put(oldtparam, newtparam.type());
- tparams[o++] = newtparam;
- }
- // create outer type links
- int tflags = Modifiers.PARAM | Modifiers.COVARIANT | Modifiers.SYNTHETIC | Modifiers.STABLE;
- Name tname = Names.OUTER(constructor, owners[i]);
- Symbol tlink = constructor.newTParam(
- constructor.pos, tflags, tname, owners[i].typeOfThis());
- table.put(owners[i], tlink.type());
- tparams[o++] = tlink;
- }
-
- }
-
- transformers.put(constructor, new TypeTransformer(table));
- type = Type.typeRef(Type.NoPrefix, clasz, Symbol.type(tparams));
- type = Type.MethodType(vparams, type);
- if (tparams.length > 0) type = Type.PolyType(tparams, type);
- return type;
- }
-
- /** Returns the type transformer for the given symbol. */
- private TypeTransformer getTypeTransformerFor(Symbol symbol) {
- while (true) {
- Symbol test = symbol;
- if (test.isConstructor()) test = test.constructorClass();
- // !!! isClassType -> isClass ?
- if (test.isClassType() && !test.isCompoundSym()) break;
- symbol = symbol.owner();
- }
-// !!!
-// while (!symbol.isClassType() && !(symbol.isConstructor() && symbol.constructorClass().isClassType())) // !!! isClassType -> isClass ?
-// symbol = symbol.owner();
- if (symbol.isClassType())
- symbol = symbol.primaryConstructor();
- if (symbol.constructorClass().isPackageClass())
- return topLevelTypeTransformer;
- TypeTransformer context = (TypeTransformer)transformers.get(symbol);
- if (context == null) {
- symbol.nextInfo();
- context = (TypeTransformer)transformers.get(symbol);
- assert context != null: Debug.show(symbol);
- }
- return context;
- }
-
- //########################################################################
- // Private Functions
-
- /**
- * Returns the depth of the specified class. The depth of a class
- * is:
- * - -1 for a package class
- * - 0 for a top-level class
- * - the depth of the enclosing class plus 1 for an inner class
- */
- private static int getClassDepth(Symbol clasz) {
- assert clasz.isClass() || clasz.isPackageClass(): Debug.show(clasz);
- int depth = -1;
- while (!clasz.isPackageClass()) { clasz = clasz.owner(); depth++; }
- return depth;
- }
-
- /**
- * Returns the type arguments of the flattened version of the
- * specified type reference. This functions takes and returns
- * non-transformed types.
- */
- private static Type[] getFlatArgs(Type prefix, Symbol clasz, Type[] args) {
- int depth = getClassDepth(clasz);
- if (depth <= 0) return args;
- Type[] prefixes = new Type[depth];
- Type[][] argss = new Type[depth][];
- int count = collect(prefix, clasz, prefixes, argss);
- args = Type.cloneArray(count, args);
- for (int i = 0, o = 0; i < depth; i++) {
- for (int j = 0; j < argss[i].length; j++)
- args[o++] = argss[i][j];
- args[o++] = prefixes[i];
- }
- return args;
- }
- // where
- private static int collect(Type prefix, Symbol clasz, Type[] prefixes,
- Type[][] argss)
- {
- int count = prefixes.length;
- for (int i = prefixes.length - 1; i >= 0; i--) {
- prefixes[i] = prefix;
- Symbol owner = clasz.owner();
- Type base = prefix.baseType(owner);
- switch (base) {
- case TypeRef(Type type, Symbol symbol, Type[] args):
- assert symbol == owner: Debug.show(base);
- count += args.length;
- argss[i] = args;
- prefix = type;
- clasz = owner;
- continue;
- default:
- throw Debug.abortIllegalCase(base);
- }
- }
- return count;
- }
-
- //########################################################################
- // Private Class - Type transformer
-
- /** The type transformer for top-level types */
- private static final TypeTransformer topLevelTypeTransformer =
- new TypeTransformer(Collections.EMPTY_MAP);
-
- /** The type transformer */
- private static final class TypeTransformer extends Type.MapOnlyTypes {
-
- private final Map/*<Symbol,Type>*/ tparams;
-
- public TypeTransformer(Map tparams) {
- this.tparams = tparams;
- }
-
- public Type apply(Type type) {
- switch (type) {
- case TypeRef(Type prefix, Symbol symbol, Type[] args):
- if (symbol.isParameter() && symbol.owner().isConstructor()) {
- assert prefix == Type.NoPrefix: type;
- assert args.length == 0: type;
- Object value = tparams.get(symbol);
- return value != null ? (Type)value : type;
- }
- if (symbol.isClass() && !symbol.isCompoundSym()) {
- args = map(getFlatArgs(prefix, symbol, args));
- prefix = Type.NoPrefix;
- return Type.typeRef(prefix, symbol, args);
- }
- if (symbol.isPackageClass()) {
- args = Type.EMPTY_ARRAY;
- prefix = Type.NoPrefix;
- return Type.typeRef(prefix, symbol, args);
- }
- return Type.typeRef(apply(prefix), symbol, map(args));
- case SingleType(Type prefix, Symbol symbol):
- if (symbol.owner().isPackageClass())
- return Type.singleType(Type.NoPrefix, symbol);
- return Type.singleType(apply(prefix), symbol);
- case ThisType(Symbol clasz):
- Object value = tparams.get(clasz);
- if (value != null) return (Type)value;
- assert clasz.isCompoundSym() || clasz.isPackageClass():
- Debug.show(clasz);
- return type;
- case CompoundType(Type[] parents, Scope members):
- // !!! this case should not be needed
- return Type.compoundType(map(parents), members, type.symbol());
- default:
- return map(type);
- }
- }
-
- }
-
- //########################################################################
- // Private Class - Tree transformer
-
- /** The tree transformer */
- private final GenTransformer treeTransformer = new GenTransformer(global) {
-
- /** The current context */
- private Context context;
-
- /** The current method */
- private Symbol method;
-
- /** Transforms the given type. */
- public Type transform(Type type) {
- return context.transformer.apply(type);
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- if (global.debug) global.log("transforming " + tree);//debug
- switch (tree) {
-
- case ClassDef(_, _, _, _, _, Template impl):
- Symbol clasz = tree.symbol();
- context = new Context(context, clasz, new HashMap(), new HashMap());
- Tree[] parents = transform(impl.parents);
- Tree[] body = transform(impl.body);
- body = Tree.concat(body, genAccessMethods(false));
- body = Tree.concat(body, genAccessMethods(true));
- if (context.vfield != null) {
- body = Tree.cloneArray(1, body);
- body[0] = gen.ValDef(
- context.vfield,
- gen.Ident(context.vfield.pos, context.vparam));
- }
- context = context.outer;
- return gen.ClassDef(clasz, parents, impl.symbol(), body);
-
- case DefDef(_, _, _, _, _, Tree rhs):
- Symbol method = tree.symbol();
- Context backup = context;
- if (method.isConstructor())
- context = context.getConstructorContext(method);
- this.method = method;
- rhs = transform(rhs);
- this.method = null;
- context = backup;
- return gen.DefDef(method, rhs);
-
- case Apply(Tree vfun, Tree[] vargs):
- switch (vfun) {
- case TypeApply(Tree tfun, Tree[] targs):
- if (!tfun.symbol().isConstructor()) break;
- return transform(tree, vargs, vfun, targs, tfun);
- default:
- if (!vfun.symbol().isConstructor()) break;
- return transform(tree, vargs, vfun, Tree.EMPTY_ARRAY,vfun);
- }
- return super.transform(tree);
-
- case This(_):
- return genOuterRef(tree.pos, tree.symbol());
-
- case Select(Tree qualifier, _):
- Symbol symbol = tree.symbol();
- if (symbol.owner().isStaticOwner()) // !!! qualifier ignored
- return gen.mkGlobalRef(tree.pos, symbol);
- Symbol access;
- switch (qualifier) {
- case Super(_, _):
- Symbol clasz = qualifier.symbol();
- if (clasz == context.clasz) {
- access = symbol;
- qualifier = gen.Super(tree.pos, qualifier.symbol());
- } else {
- access = getAccessSymbol(symbol, clasz);
- qualifier = genOuterRef(qualifier.pos, clasz);
- }
- break;
- default:
- access = getAccessSymbol(symbol, null);
- qualifier = transform(qualifier);
- break;
- }
- tree = gen.Select(tree.pos, qualifier, access);
- if (access != symbol && !symbol.isMethod())
- tree = gen.mkApply__(tree);
- return tree;
-
- default:
- return super.transform(tree);
- }
- }
-
- /* Add outer type and value arguments to constructor calls. */
- private Tree transform(Tree vapply, Tree[] vargs, Tree tapply,
- Tree[] targs, Tree tree)
- {
- switch (tree) {
- case Select(Tree qualifier, _):
- Symbol symbol = tree.symbol();
- Symbol clasz = symbol.constructorClass();
- if (getClassDepth(clasz) > 0) {
- Type[] types = Tree.typeOf(targs);
- types = getFlatArgs(qualifier.type(), clasz, types);
- targs = gen.mkTypes(tapply.pos, types);
- vargs = Tree.cloneArray(1, vargs);
- vargs[0] = qualifier;
- } else {
- assert !containsValue(qualifier): tree;
- }
- tree = gen.Ident(tree.pos, symbol);
- if (targs.length != 0)
- tree = gen.TypeApply(tapply.pos, tree, transform(targs));
- return gen.Apply(vapply.pos, tree, transform(vargs));
- default:
- throw Debug.abortIllegalCase(tree);
- }
- }
-
- /**
- * Returns the symbol to access the specified member from the
- * current context. If "svper" is non null, the member is
- * selected from the superclass of the specified class. The
- * returned symbol may be the same as the given one.
- */
- private Symbol getAccessSymbol(Symbol member, Symbol svper) {
- if (member.isPublic() && svper == null) return member;
- Context context = this.context;
- for (; context != null; context = context.outer)
- if (svper != null
- ? context.clasz == svper
- : member.isPrivate()
- ? context.clasz == member.owner()
- // !!! This is incorrect without static access methods
- : context.clasz.isSubClass(member.owner())) break;
- assert context != null: Debug.show(this.context, member);
- if (context == this.context) return member;
- Map table = svper != null ? context.supers : context.selfs;
- Symbol access = (Symbol)table.get(member);
- if (access == null) {
- // !!! generate static access methods ?
- Name name = Names.ACCESS(member, svper != null);
- access = context.clasz.newAccessMethod(context.clasz.pos,name);
- global.nextPhase();
- Type info = member.isMethod()
- ? member.info().cloneType(member, access)
- : Type.MethodType(Symbol.EMPTY_ARRAY, member.info());
- access.setInfo(info);
- global.prevPhase();
- table.put(member, access);
- context.clasz.nextInfo().members().enter(access);
- assert Debug.log("created access method: ", access);
- }
- return access;
- }
-
- /** Generates the trees of the access methods. */
- private Tree[] genAccessMethods(boolean withSuper) {
- Map table = withSuper ? context.supers : context.selfs;
- if (table.size() == 0) return Tree.EMPTY_ARRAY;
- Tree[] trees = new Tree[table.size()];
- Iterator entries = table.entrySet().iterator();
- for (int i = 0; i < trees.length; i++) {
- Map.Entry entry = (Map.Entry)entries.next();
- Symbol member = (Symbol)entry.getKey();
- Symbol access = (Symbol)entry.getValue();
- int pos = access.pos;
- Tree qualifier = withSuper
- ? gen.Super(pos, context.clasz)
- : gen.This(pos, context.clasz);
- Tree select = gen.Select(qualifier, member);
- Tree[] targs = gen.mkTypeRefs(pos, access.nextTypeParams());
- Tree[] vargs = gen.mkLocalRefs(pos, access.nextValueParams());
- Tree body = member.isMethod()
- ? gen.mkApplyTV(select, targs, vargs)
- : select;
- trees[i] = gen.DefDef(access, body);
- }
- return trees;
- }
-
- /** Returns a tree referencing the given outer class. */
- private Tree genOuterRef(int pos, Symbol clasz) {
- if (context.clasz == clasz) return gen.This(pos, clasz);
- Tree tree = method == null || method.isConstructor()
- ? gen.Ident(pos, context.vparam)
- : gen.Select(gen.This(pos, context.clasz),context.getVField());
- for (Context c = context.outer;; c = c.outer) {
- assert c != null: Debug.show(clasz, context.clasz);
- if (c.clasz == clasz) return tree;
- Symbol access = getAccessSymbol(c.getVField(), null);
- tree = gen.Apply(gen.Select(tree, access));
- }
- }
-
- /** Tests whether the tree contains some value computation. */
- private boolean containsValue(Tree tree) {
- switch (tree) {
- case This(_):
- return !tree.symbol().isPackageClass();
- case Select(Tree qualifier, _):
- return containsValue(qualifier) || tree.symbol().isValue();
- default:
- return false;
- }
- }
-
- };
-
- //########################################################################
- // Private Class - Tree transformer context
-
- /** This class represents the tree transformation context. */
- private class Context {
-
- /** The outer context */
- public final Context outer;
- /** The context class */
- public final Symbol clasz;
- /** The context type transformer */
- public final TypeTransformer transformer;
- /** The self access methods (maps members to accessors) */
- public final Map/*<Symbol,Symbol>*/ selfs;
- /** The super access methods (maps members to accessors) */
- public final Map/*<Symbol,Symbol>*/ supers;
- /** The context outer paramater (null if none) */
- public final Symbol vparam;
- /** The context outer field (null if none or not yet used) */
- private Symbol vfield;
-
- /** Initializes this instance. */
- public Context(Context outer, Symbol symbol, Map selfs, Map supers) {
- this.outer = outer;
- this.clasz = symbol.constructorClass();
- this.transformer = getTypeTransformerFor(symbol);
- this.selfs = selfs;
- this.supers = supers;
- this.vparam = outer != null ? symbol.nextValueParams()[0] : null;
- }
-
- /** Returns a context for the given constructor. */
- public Context getConstructorContext(Symbol constructor) {
- assert constructor.constructorClass() == clasz;
- return new Context(outer, constructor, selfs, supers);
- }
-
- /**
- * Returns the outer value field. The field is created on the
- * fly if it does not yet exist.
- */
- private Symbol getVField() {
- assert outer != null: Debug.show(clasz);
- if (vfield == null) {
- int flags =
- Modifiers.SYNTHETIC | Modifiers.PRIVATE | Modifiers.STABLE;
- vfield = clasz.newField(clasz.pos, flags, Names.OUTER(clasz));
- vfield.setInfo(outer.clasz.thisType());
- clasz.members().enterNoHide(vfield);
- }
- return vfield;
- }
-
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/ICodePhase.java b/sources/scalac/transformer/ICodePhase.java
deleted file mode 100644
index 3274897641..0000000000
--- a/sources/scalac/transformer/ICodePhase.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import ch.epfl.lamp.util.CodePrinter;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-
-/**
- * This class represents the ICode phase for the java version
- * of the compiler. It doesn't do anything but permit to make
- * a bridge between the java implementation of Socos et the
- * scala one. See scala.tools.scalac.icode.ICodePhase for
- * implementation
- */
-public abstract class ICodePhase extends Phase {
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public ICodePhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Prints the given compilation units. */
- public abstract void print(CompilationUnit[] units, CodePrinter printer);
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java
deleted file mode 100644
index fdf14e8d9b..0000000000
--- a/sources/scalac/transformer/LambdaLift.java
+++ /dev/null
@@ -1,763 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import java.io.*;
-import java.util.HashMap;
-
-import scalac.*;
-import scalac.ast.*;
-import scalac.symtab.*;
-import scalac.util.*;
-import Tree.*;
-
-
-/** A lambda lifting transformer
- *
- * @author Martin Odersky
- * @version 1.0
- *
- * What it does:
- * Lift every class and function that's contained in another function
- * out to be a member to the next enclosing class.
- * Pass free variables and type variables as parameters to class constructors.
- * Variables and values that are free in some function or class
- * are given new unique names.
- * Free mutable variables are converted to reference cells.
- * All types are updated so that proxies are passed for additional free
- * type variables.
- */
-public class LambdaLift extends OwnerTransformer
- implements Modifiers, Kinds {
-
- final Global global;
- final Definitions definitions;
- final FreeVars free;
- final LambdaLiftPhase descr;
- private CompilationUnit unit;
-
- public LambdaLift(Global global, LambdaLiftPhase descr) {
- super(global);
- this.global = global;
- this.definitions = global.definitions;
- this.free = new FreeVars(global);
- this.descr = descr;
- }
-
- public void apply(CompilationUnit unit) {
- this.unit = unit;
- global.log(unit.source.toString());
- free.initialize(unit);
- currentOwner = global.definitions.ROOT_CLASS;
- unit.body = transformTemplateStats(unit.body, currentOwner);
- }
-
- /** If `sym' is a class, return its primary constructor;
- * otherwise current symbol itself
- *
- * @param sym
- * @return
- */
- static Symbol asFunction(Symbol sym) {
- return sym.kind == CLASS ? sym.primaryConstructor() : sym;
- }
-
- /** Is symbol local relative to owner?
- * Primary constructor parameters are local iff owner (contained in)
- * the primary constructor.
- *
- * @param sym
- * @param owner
- * @return <code>true</code> if the symbol <code>sym</code>
- * is local relative to <code>owner</code>
- */
- static boolean isLocal(Symbol sym, Symbol owner) {
- if (sym.isParameter() &&
- sym.owner().isPrimaryConstructor() &&
- sym.owner().constructorClass().kind == CLASS &&
- !(owner.isParameter() && owner.owner() == sym)) {
- Symbol encl = sym.owner().owner();
- Symbol clazz = sym.owner().constructorClass();
- //System.out.println("isLocal " + sym + " " + encl + " " + clazz + " " + owner);//DEBUG
- while (owner != encl &&
- owner.kind != NONE &&
- owner != clazz) {
- owner = owner.owner();
- //System.out.println(":" + owner);//DEBUG
- }
- return owner != clazz;
- }
- return sym.isLocal();
- }
-
- /** Propagate free variables from all called functions.
- * `asFunction' applied to the next enclosing function or class owner.
- *
- * @param owner
- * @return
- */
- static Symbol enclFun(Symbol owner) {
- Symbol sym = owner;
- while (!asFunction(sym).isMethod()) sym = sym.owner();
- return asFunction(sym);
- }
-
- /** Return SymSet from a hashmap.
- *
- * @param f
- * @param sym
- * @return
- */
- private static SymSet get(HashMap f, Symbol sym) {
- SymSet ss = (SymSet) f.get(sym);
- return ss == null ? SymSet.EMPTY : ss;
- }
-
- /** Compute free variables map `fvs'.
- * Also assign unique names to all
- * value/variable/let symbols that are free in some function or class, and to
- * all class/function symbols that are owned by some function.
- */
- static class FreeVars extends OwnerTransformer {
-
- private CompilationUnit unit;
-
- public FreeVars(Global global) {
- super(global);
- }
-
- /** A hashtable storing free variables of functions and class constructors.
- */
- private HashMap/*<Symbol,SymSet>*/ fvs;
-
- /** A hashtable storing free type variables of functions and class constructors.
- */
- private HashMap/*<Symbol,SymSet>*/ ftvs;
-
- /** A hashtable storing calls between functions and class constructors
- */
- private HashMap/*<Symbol,SymSet>*/ called;
-
- /** The set of symbols that need to be renamed.
- */
- private SymSet renamable;
-
- /** The set of symbols that bound by polytypes
- * and therefore are not free type variables.
- */
- private SymSet excluded;
-
- /** A flag to indicate whether new free variables have been found
- */
- private boolean changedFreeVars;
-
- /** A flag to indicate whether we are in propagation phase
- * (used in assertion).
- */
- private boolean propagatePhase;
-
- /** Insert `sym' into the set of free variables of `owner'
- *
- * @param owner
- * @param sym
- */
- private void putFree(Symbol owner, Symbol sym) {
- assert owner.isLocal();
- HashMap f = sym.isType() ? ftvs : fvs;
- SymSet ss = get(f, owner);
- if (!ss.contains(sym)) {
- f.put(owner, ss.incl(sym));
- changedFreeVars = true;
- if (global.debug) global.log(sym + " is free in " + owner);
- }
- }
-
- /** Insert `to' into the set of functions called by `from'
- *
- * @param from
- * @param to
- */
- private void putCall(Symbol from, Symbol to) {
- SymSet ss = get(called, from);
- if (!ss.contains(to)) {
- called.put(from, ss.incl(to));
- }
- }
-
- /** Mark symbol `sym' as being free in `owner', unless `sym'
- * is defined in `owner' or there is a class between `owner's owner
- * and the owner of `sym'.
- * Return `true' if there is no class between `owner' and
- * the owner of sym.
- *
- * @param sym
- * @param owner
- * @return
- */
- private boolean markFree(Symbol sym, Symbol owner) {
- if (global.debug)
- global.log("mark " + sym + " of " + sym.owner() +
- " free in " + owner);//debug
- if (owner.kind == NONE) {
- assert propagatePhase : sym + " in " + sym.owner();
- return false;
- } else if (sym.owner() == owner) {
- return true;
- } else if (markFree(sym, owner.owner())) {
- Symbol fowner = asFunction(owner);
- if (fowner.isMethod()) {
- putFree(fowner, sym);
- renamable = renamable.incl(sym);
- if (sym.isVariable()) sym.flags |= CAPTURED;
- }
- return owner.kind != CLASS;
- } else {
- return false;
- }
- }
-
- /** Assign unique name to symbol.
- * If symbol is a class assign same name to its primary constructor.
- */
- private void makeUnique(Symbol sym) {
- sym.name = unit.fresh.newName(sym.name);
- }
-
- private Type.Map traverseTypeMap = new Type.Map() {
- public Type apply(Type tp) {
- if (global.debug) global.log("traverse " + tp);//debug
- switch (tp) {
- case TypeRef(NoPrefix, Symbol sym, Type[] targs):
- if (isLocal(sym, currentOwner) &&
- sym.kind == TYPE &&
- !excluded.contains(sym))
- markFree(sym, currentOwner);
- break;
- case SingleType(NoPrefix, Symbol sym):
- if (isLocal(sym, currentOwner))
- markFree(sym, currentOwner);
- break;
- case PolyType(Symbol[] tparams, Type restp):
- for (int i = 0; i < tparams.length; i++)
- excluded = excluded.incl(tparams[i]);
- Type tp1 = super.map(tp);
- for (int i = 0; i < tparams.length; i++)
- excluded = excluded.excl(tparams[i]);
- return tp1;
- }
- return map(tp);
- }
- };
-
- public Tree transform(Tree tree) {
- if (global.debug) global.log("free " + tree);//debug
- assert tree.type != null : tree;
- traverseTypeMap.apply(tree.type.widen());
- Symbol sym = tree.symbol();
- switch(tree) {
- case ClassDef(_, _, _, _, _, _):
- case DefDef(_, _, _, _, _, _):
- if (sym.isLocal()) {
- renamable = renamable.incl(sym);
- }
- return super.transform(tree);
-
- case AbsTypeDef(int mods, Name name, Tree rhs, Tree lobound):
- // ignore type definition as owner.
- // reason: it might be in a refinement
- // todo: handle type parameters?
- return copy.AbsTypeDef(
- tree, sym,
- transform(rhs, currentOwner),
- transform(lobound, currentOwner));
-
- case AliasTypeDef(int mods, Name name, AbsTypeDef[] tparams, Tree rhs):
- // ignore type definition as owner.
- // reason: it might be in a refinement
- // todo: handle type parameters?
- return copy.AliasTypeDef(
- tree, sym,
- transform(tparams, currentOwner),
- transform(rhs, currentOwner));
-
- case Ident(_):
- if (isLocal(sym, currentOwner)) {
- if (sym.isMethod()) {
- Symbol f = enclFun(currentOwner);
- if (f.name.length() > 0) // it is not a template function {
- putCall(f, sym);
- } else if (sym.kind == VAL || sym.kind == TYPE) {
- markFree(sym, currentOwner);
- }
- }
- return tree;
-
- default:
- return super.transform(tree);
- }
- }
-
- /** Propagate free fariables from all called functions.
- *
- * @param fvs
- */
- void propagateFvs(HashMap fvs) {
- Object[] fs = called.keySet().toArray();
- for (int i = 0; i < fs.length; i++) {
- Symbol f = (Symbol) fs[i];
- Symbol[] calledFromF = get(called, f).toArray();
- for (int j = 0; j < calledFromF.length; j++) {
- //System.out.println(f + " calls " + calledFromF[j]);//DEBUG
- Symbol[] newFvs = get(fvs, calledFromF[j]).toArray();
- for (int k = 0; k < newFvs.length; k++) {
- markFree(newFvs[k], f);
- }
- }
- }
- }
-
- /** This method re-enters all free variables into their free variable
- * sets. This is necessary because the names of these variables (and
- * therefore their `isLess' order have changed.
- *
- * @param fvs
- */
- private void restoreFvs(HashMap fvs) {
- Object[] fs = fvs.keySet().toArray();
- for (int i = 0; i < fs.length; i++) {
- Symbol f = (Symbol) fs[i];
- Symbol[] elems = get(fvs, f).toArray();
- SymSet elems1 = SymSet.EMPTY;
- for (int j = 0; j < elems.length; j++)
- elems1 = elems1.incl(elems[j]);
- fvs.put(f, elems1);
- }
- }
-
- /** Compute a mapping from symbols to their free variables
- * in hashtable `fvs'. Also rename all variables that need it.
- *
- * @param unit
- */
- public void initialize(CompilationUnit unit) {
- this.unit = unit;
- fvs = new HashMap();
- ftvs = new HashMap();
- called = new HashMap();
- renamable = SymSet.EMPTY;
- excluded = SymSet.EMPTY;
- apply(unit);
-
- propagatePhase = true;
- do {
- changedFreeVars = false;
- propagateFvs(fvs);
- propagateFvs(ftvs);
- } while (changedFreeVars);
-
- Symbol[] ss = renamable.toArray();
- for (int i = 0; i < ss.length; i++) {
- makeUnique(ss[i]);
- }
-
- restoreFvs(fvs);
- restoreFvs(ftvs);
- }
- }
-
- private TreeList liftedDefs;
-
- /** Transform template and add lifted definitions to it.
- *
- * @param stats
- * @param tsym
- * @return
- */
- public Tree[] transformTemplateStats(Tree[] stats, Symbol tsym) {
- TreeList prevLiftedDefs = liftedDefs;
- liftedDefs = new TreeList();
- TreeList stats1 = new TreeList(super.transformTemplateStats(stats, tsym));
- stats1.append(liftedDefs);
- liftedDefs = prevLiftedDefs;
- return stats1.toArray();
- }
-
- /** ...
- *
- * @param tree
- */
- public Tree transform(Tree tree) {
- //global.debugPrinter.print("lifting ").print(tree).println().end();//DEBUG
- //System.out.print(tree.type + " --> ");//DEBUG
- tree.type = descr.transform(tree.type, currentOwner);
- //System.out.println(tree.type);//DEBUG
- switch (tree) {
- case Block(Tree[] stats, Tree value):
- for (int i = 0; i < stats.length; i++)
- liftSymbol(stats[i]);
- return copy.Block(tree, transform(stats), transform(value));
-
- case ClassDef(int mods, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Template impl):
- Symbol sym = tree.symbol();
- if ((mods & LIFTED) != 0) {
- ((ClassDef) tree).mods &= ~LIFTED;
- Tree tree1 = copy.ClassDef(
- tree, sym,
- addTypeParams(transform(tparams, sym), newtparams(sym.primaryConstructor())),
- new ValDef[][]{
- addParams(transform(vparams, sym)[0], newparams(sym.primaryConstructor()))},
- transform(tpe, sym),
- transform(impl, sym));
- liftedDefs.append(tree1);
- return Tree.Empty;
- } else {
- assert !sym.isLocal() : sym;
- return copy.ClassDef(
- tree, sym,
- transform(tparams, sym),
- transform(vparams, sym),
- transform(tpe, sym),
- transform(impl, sym));
- }
-
- case DefDef(int mods, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Tree rhs):
- Symbol sym = tree.symbol();
- if ((mods & LIFTED) != 0) {
- ((DefDef) tree).mods &= ~LIFTED;
- Tree tree1 = copy.DefDef(
- tree, sym,
- addTypeParams(transform(tparams, sym), newtparams(sym)),
- new ValDef[][]{
- addParams(transform(vparams, sym)[0], newparams(sym))},
- transform(tpe, sym),
- transform(rhs, sym));
- liftedDefs.append(tree1);
- return Tree.Empty;
- } else {
- assert !sym.isLocal() : sym;
- return copy.DefDef(
- tree, sym,
- transform(tparams, sym), transform(vparams, sym), transform(tpe, sym),
- transform(rhs, sym));
- }
-
- case AbsTypeDef(int mods, Name name, Tree rhs, Tree lobound):
- // ignore type definition as owner.
- // reason: it might be in a refinement
- // todo: handle type parameters?
- return copy.AbsTypeDef(
- tree, tree.symbol(),
- transform(rhs, currentOwner),
- transform(lobound, currentOwner));
-
- case AliasTypeDef(int mods, Name name, AbsTypeDef[] tparams, Tree rhs):
- // ignore type definition as owner.
- // reason: it might be in a refinement
- // todo: handle type parameters?
- return copy.AliasTypeDef(
- tree, tree.symbol(),
- transform(tparams, currentOwner),
- transform(rhs, currentOwner));
-
- case ValDef(_, _, _, Tree rhs):
- Symbol sym = tree.symbol();
- rhs = transform(rhs, sym);
- if (sym.isCaptured()) {
- assert sym.isLocal();
- switch (sym.nextType()) {
- case TypeRef(_, Symbol clasz, Type[] args):
- Tree constr = gen.mkPrimaryConstructorGlobalRef(rhs.pos, clasz);
- rhs = gen.New(gen.mkApplyTV(constr, args, new Tree[]{rhs}));
- break;
- default:
- throw Debug.abort("illegal case", sym.nextType());
- }
- }
- return gen.ValDef(sym, rhs);
-
- case Sequence(Tree[] args):
- throw new ApplicationError("this should not happen");
- /* // moved this to Uncurry
- Tree tree1 = gen.mkNewList(tree.pos, tree.type.typeArgs()[0], transform(args));
- //System.out.println("TUPLE: " + tree + "\n ==> \n" + tree1);//DEBUG
- return tree1;
- */
-
- case Return(Block(Tree[] stats, Tree value)):
- return transform(
- gen.Block(stats, gen.Return(tree.pos, tree.symbol(), value)));
-
- case Return(Tree expr):
- if (tree.symbol() != currentOwner.enclMethod()) {
- unit.error(tree.pos, "non-local return not yet implemented");
- }
- return super.transform(tree);
-
- case Apply(Tree fn, Tree[] args):
- Symbol fsym = TreeInfo.methSymbol(fn);
- Tree fn1 = transform(fn);
- switch (fn1) {
- case TypeApply(Tree fn2, Tree[] targs):
- //if (args.length == 1 && fn2.symbol() == definitions.PREDEF_ARRAY()) {
- // throw new ApplicationError("this should not happen");
- /* // this moved to UnCurry
- switch (args[0]) {
- case Sequence(Tree[] items):
- assert targs.length == 1: tree;
- Tree array = gen.mkNewArray(
- args[0].pos,
- targs[0].type(),
- transform(items),
- currentOwner);
- // fn2 may be like "{ println("hello"); Predef}.Array"
- switch (fn2) {
- case Select(Tree qualifier, _):
- return gen.mkBlock(args[0].pos, qualifier, array);
- default:
- throw Debug.abort("illegal case", fn2);
- }
- }
- */
- //}
- fn1 = copy.TypeApply(
- fn1, fn2, addFreeArgs(tree.pos, get(free.ftvs, fsym), targs, true));
- break;
- default:
- Tree[] targs = addFreeArgs(
- tree.pos, get(free.ftvs, fsym), Tree.EMPTY_ARRAY, true);
- if (targs.length > 0)
- fn1 = gen.TypeApply(fn1, targs);
- }
- Tree[] args1 = transform(args);
- return copy.Apply(
- tree, fn1, addFreeArgs(tree.pos, get(free.fvs, fsym), args1, false));
-
- case Ident(_):
- Symbol sym = tree.symbol();
- if (isLocal(sym, currentOwner) &&
- (sym.kind == TYPE || (sym.kind == VAL && !sym.isMethod()))) {
- sym = descr.proxy(sym, currentOwner);
- }
- Tree tree1 = gen.mkLocalRef(tree.pos, sym);
- if (sym.isCaptured())
- return gen.Select(tree1, definitions.REF_ELEM());
- else
- return tree1;
-
- default:
- return super.transform(tree);
- }
- }
-
- private Symbol[] ftvsParams(Symbol owner) {
- Symbol[] freevars = get(free.ftvs, owner).toArray();
- Symbol[] params = new Symbol[freevars.length];
- for (int i = 0; i < params.length; i++) {
- params[i] = freevars[i].cloneSymbol(owner);
- params[i].pos = owner.pos;
- params[i].flags = PARAM | SYNTHETIC;
- }
- for (int i = 0; i < params.length; i++)
- params[i].setInfo(freevars[i].info().subst(freevars, params));
- return params;
- }
-
- private Symbol[] fvsParams(Symbol owner) {
- Symbol[] freevars = get(free.fvs, owner).toArray();
- Symbol[] params = new Symbol[freevars.length];
- for (int i = 0; i < params.length; i++) {
- params[i] = freevars[i].cloneSymbol(owner);
- params[i].pos = owner.pos;
- params[i].flags &= CAPTURED;
- params[i].flags |= PARAM | SYNTHETIC;
- params[i].setInfo(freevars[i].type());
- }
- return params;
- }
-
- private Symbol[] newtparams(Symbol owner) {
- Symbol[] tparams = owner.nextType().typeParams();
- int nfree = get(free.ftvs, owner).size();
- assert nfree == tparams.length - owner.type().typeParams().length
- : owner + " " + nfree + " " + tparams.length + " " + owner.type().firstParams().length;
- Symbol[] newtparams = new Symbol[nfree];
- System.arraycopy(tparams, tparams.length - nfree, newtparams, 0, nfree);
- return newtparams;
- }
-
- private Symbol[] newparams(Symbol owner) {
- Symbol[] params = owner.nextType().firstParams();
- int nfree = get(free.fvs, owner).size();
- assert nfree == params.length - owner.type().firstParams().length;
- Symbol[] newparams = new Symbol[nfree];
- System.arraycopy(params, params.length - nfree, newparams, 0, nfree);
- return newparams;
- }
-
- /** For members:
- * change symbol of tree so that
- * owner = currentClass
- * newparams are added
- * enter symbol in scope of currentClass
- * For non-members:
- * change symbol of tree so that
- * owner = currentMember
- */
- private void liftSymbol(Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, _):
- ((ClassDef) tree).mods |= LIFTED;
- Symbol sym = tree.symbol();
- sym.flags |= LIFTED;
- assert sym.isLocal() : sym;
- Symbol constr = sym.primaryConstructor();
- liftSymbol(
- sym, get(free.ftvs, constr).toArray(),
- ftvsParams(constr), fvsParams(constr));
- break;
-
- case DefDef(_, _, _, _, _, _):
- ((DefDef) tree).mods |= LIFTED;
- Symbol sym = tree.symbol();
- sym.flags |= LIFTED | PRIVATE;
- assert sym.isLocal() : sym;
- liftSymbol(
- sym, get(free.ftvs, sym).toArray(),
- ftvsParams(sym), fvsParams(sym));
- break;
-
- case ValDef(_, _, _, _):
- case LabelDef(_, _, _):
- Symbol sym = tree.symbol();
- assert sym.isLocal() : sym;
- // This is to fix the owner of y from x to f in this example:
- // class C { def f = { val x = { val y = ...; y } } }
- if (!isClassMember(sym.owner())) {
- assert isClassMember(sym.owner().owner()): Debug.show(tree, sym);
- sym.setOwner(sym.owner().owner());
- }
- break;
-
- }
- }
- // where
- private boolean isClassMember(Symbol sym) {
- return sym.isConstructor() || sym.owner().isClass();
- }
-
- private void liftSymbol(Symbol sym, Symbol[] oldtparams,
- Symbol[] newtparams, Symbol[] newparams) {
- Symbol enclClass = sym.owner();
- while (!enclClass.isClassType()) {
- enclClass = enclClass.isConstructor() && !enclClass.isPrimaryConstructor()
- ? enclClass.constructorClass()
- : enclClass.owner();
- }
- if (!sym.isConstructor()) sym.setOwner(enclClass);
- if (!sym.isConstructor()) enclClass.members().enter(sym);
- if (sym.isMethod()) {
- if (newtparams.length != 0 || newparams.length != 0) {
- sym.updateInfo(
- addParams(
- addTypeParams(
- sym.nextInfo(), oldtparams, newtparams),
- newparams));
- if (global.debug)
- global.log(sym + " has now type " + sym.nextType());
- }
- } else if (sym.kind == CLASS) {
- Symbol constr = sym.primaryConstructor();
- liftSymbol(constr, oldtparams, newtparams, newparams);
- // fix result type of constructor
- constr.updateInfo(descr.transform(constr.nextInfo(), constr));
- } else {
- throw new ApplicationError();
- }
- }
-
- private Type addTypeParams(Type tp, Symbol[] oldtparams, Symbol[] newtparams) {
- if (newtparams.length == 0) return tp;
- switch (tp) {
- case MethodType(_, _):
- return Type.PolyType(
- newtparams,
- Type.getSubst(oldtparams, newtparams, true).apply(tp));
- case PolyType(Symbol[] tparams, Type restpe):
- Symbol[] tparams1 = new Symbol[tparams.length + newtparams.length];
- System.arraycopy(tparams, 0, tparams1, 0, tparams.length);
- System.arraycopy(newtparams, 0, tparams1, tparams.length, newtparams.length);
- return Type.PolyType(
- tparams1,
- Type.getSubst(oldtparams, newtparams, true).apply(restpe));
- default:
- throw new ApplicationError("illegal type: " + tp);
- }
- }
-
- private Type addParams(Type tp, Symbol[] newparams) {
- if (newparams.length == 0) return tp;
- switch (tp) {
- case MethodType(Symbol[] params, Type restpe):
- Symbol[] params1 = new Symbol[params.length + newparams.length];
- System.arraycopy(params, 0, params1, 0, params.length);
- System.arraycopy(newparams, 0, params1, params.length, newparams.length);
- return Type.MethodType(params1, restpe);
- case PolyType(Symbol[] tparams, Type restpe):
- return Type.PolyType(tparams, addParams(restpe, newparams));
- default:
- throw new ApplicationError("illegal type: " + tp);
- }
- }
-
- private AbsTypeDef[] addTypeParams(AbsTypeDef[] tparams, Symbol[] newtparams) {
- if (newtparams.length == 0) return tparams;
- AbsTypeDef[] tparams1 = new AbsTypeDef[tparams.length + newtparams.length];
- System.arraycopy(tparams, 0, tparams1, 0, tparams.length);
- for (int i = 0; i < newtparams.length; i++) {
- tparams1[tparams.length + i] = gen.mkTypeParam(newtparams[i]);
- }
- return tparams1;
- }
-
- private ValDef[] addParams(ValDef[] params, Symbol[] newparams) {
- if (newparams.length == 0) return params;
- ValDef[] params1 = new ValDef[params.length + newparams.length];
- System.arraycopy(params, 0, params1, 0, params.length);
- for (int i = 0; i < newparams.length; i++) {
- params1[params.length + i] = gen.mkParam(newparams[i]);
- }
- return params1;
- }
-
- /** For all variables or type variables in `fvs',
- * append proxies to argument array `args'.
- *
- * @param pos
- * @param fvs
- * @param args
- * @param types
- * @return
- */
- private Tree[] addFreeArgs(int pos, SymSet fvs, Tree[] args, boolean types) {
- if (fvs != SymSet.EMPTY) {
- Symbol[] fparams = fvs.toArray();
- Tree[] args1 = new Tree[args.length + fparams.length];
- System.arraycopy(args, 0, args1, 0, args.length);
- for (int i = 0; i < fparams.length; i++) {
- Symbol farg = descr.proxy(fparams[i], currentOwner);
- args1[args.length + i] =
- types ? gen.mkTypeRef(pos, farg) : gen.Ident(pos, farg);
- }
- return args1;
- } else {
- return args;
- }
- }
-
-}
diff --git a/sources/scalac/transformer/LambdaLiftPhase.java b/sources/scalac/transformer/LambdaLiftPhase.java
deleted file mode 100644
index 06c1984249..0000000000
--- a/sources/scalac/transformer/LambdaLiftPhase.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-//import java.util.ArrayList;
-
-import scalac.*;
-import scalac.parser.*;
-import scalac.symtab.*;
-import scalac.util.ArrayApply;
-
-
-public class LambdaLiftPhase extends Phase implements Kinds, Modifiers {
-
- /** Initializes this instance. */
- public LambdaLiftPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- /** Applies this phase to the given compilation unit.
- *
- * @param unit
- */
- public void apply(CompilationUnit unit) {
- new LambdaLift(global, this).apply(unit);
- }
-
- /** ...
- *
- * @param sym
- * @param tp
- * @return
- */
- public Type transformInfo(Symbol sym, Type tp) {
- /*
- if (global.debug)
- global.log("transform info for " + sym + ":" + tp + sym.locationString());
- */
- Type tp1 = tp;
- if (sym != Symbol.NONE) {
- switch (tp) {
- case MethodType(_, _):
- case PolyType(_, _):
- tp1 = transform(tp, sym);
- break;
- default:
- if (sym.kind == CLASS)
- tp1 = transform(tp, sym);
- else
- tp1 = transform(tp, sym.owner());
- }
- }
- if (sym.isCaptured())
- return global.definitions.REF_TYPE(tp1);
- else return tp1;
- }
-
- /** Add proxies as type arguments for propagated type parameters.
- *
- * @param tp
- * @param owner
- * @return
- */
- Type transform(Type tp, Symbol owner) {
- return transformTypeMap.setOwner(owner).apply(tp);
- }
-
- /** MapOnlyTypes => All symbols are mapped to themselves.
- */
- private class TransformTypeMap extends Type.MapOnlyTypes {
- Symbol owner;
-// ArrayList/*<Symbol>*/ excluded = new ArrayList();
- Type.Map setOwner(Symbol owner) { this.owner = owner; return this; }
-
- public Type apply(Type tp) {
- switch (tp) {
- case TypeRef(Type pre, Symbol sym, Type[] targs):
- if (sym.kind == CLASS) {
- switch (pre) {
- case NoPrefix:
- pre = sym.owner().enclClass().thisType();
- tp = Type.typeRef(pre, sym, targs);
- }
- }
- switch (pre) {
- case NoPrefix:
- if (LambdaLift.isLocal(sym, owner)) {
- assert targs.length == 0;
- return proxy(sym, owner).type();
- }
- break;
- case ThisType(_):
- if (sym.kind == CLASS &&
- sym.primaryConstructor().isUpdatedAt(LambdaLiftPhase.this)) {
- Symbol[] tparams = sym.primaryConstructor().nextInfo().typeParams();
- int i = tparams.length;
- while (i > 0 && tparams[i-1].isSynthetic())
- i--;
- if (i < tparams.length) {
- if (global.debug)
- global.log("adding proxies for " + sym +
- ": " + ArrayApply.toString(tparams));
-
- Type[] targs1 = new Type[tparams.length];
- System.arraycopy(map(targs), 0, targs1, 0, targs.length);
- while (i < tparams.length) {
- targs1[i] = proxy(tparams[i], owner).type();
- i++;
- }
- return Type.typeRef(pre, sym, targs1);
- }
- }
- }
- break;
-/*
- case PolyType(Symbol[] tparams, _):
- if (tparams.length != 0) {
- int len = excluded.size();
- for (int i = 0; i < tparams.length; i++)
- excluded.add(tparams[i]);
- Type tp1 = map(tp);
- for (int i = 0; i < tparams.length; i++)
- excluded.remove(excluded.size() - 1);
- return tp1;
- }
-*/
- }
- return map(tp);
- }
- }
-
- private TransformTypeMap transformTypeMap = new TransformTypeMap();
-
- /** Return closest enclosing (type)parameter that has same name as `fv',
- * or `fv' itself if this is the closest definition.
- *
- * @param fv
- * @param owner
- * @return
- */
- Symbol proxy(Symbol fv, Symbol owner) {
- if (global.debug)
- global.log("proxy " + fv + " of " + fv.owner() +
- " in " + LambdaLift.enclFun(owner));
- Symbol o = owner;
- while (o.kind != NONE) {
- if (global.debug)
- global.log("looking in " + LambdaLift.enclFun(o) + " " +
- ArrayApply.toString(o.typeParams()));
- Symbol fowner = LambdaLift.enclFun(o);
- if (fowner.isMethod()) {
- if (LambdaLift.enclFun(fv.owner()) == fowner) return fv;
- Type ft = (fowner.isUpdatedAt(this)) ? fowner.nextType()
- : fowner.type();
- Symbol[] ownerparams = fv.isType() ? ft.typeParams()
- : ft.firstParams();
- for (int i = 0; i < ownerparams.length; i++) {
- if (ownerparams[i].name == fv.name)
- return ownerparams[i];
- }
- }
- assert o.owner() != o;
- o = o.owner();
- }
- return fv;
- //throw new ApplicationError("proxy " + fv + " in " + owner);
- }
-
-}
diff --git a/sources/scalac/transformer/MakeBoxingExplicitPhase.java b/sources/scalac/transformer/MakeBoxingExplicitPhase.java
deleted file mode 100644
index 435886b1dc..0000000000
--- a/sources/scalac/transformer/MakeBoxingExplicitPhase.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.checkers.TreeChecker;
-import scalac.symtab.Definitions;
-
-/**
- * This phase makes boxing and unboxing of primitive values and arrays
- * explicit.
- */
-public class MakeBoxingExplicitPhase extends Phase {
-
- //########################################################################
- // Private Fields
-
- private final Definitions definitions;
- private final TreeChecker checker;
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public MakeBoxingExplicitPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- this.definitions = global.definitions;
- this.checker = new TreeChecker(definitions);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- assert checker.check(unit);
- new scalac.atree.ATreeFromSTree(definitions).translate(unit); // !!!
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/OwnerTransformer.java b/sources/scalac/transformer/OwnerTransformer.java
deleted file mode 100644
index 55ee93dadd..0000000000
--- a/sources/scalac/transformer/OwnerTransformer.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import scalac.*;
-import scalac.ast.*;
-import scalac.symtab.Kinds;
-import scalac.symtab.Symbol;
-import scalac.util.Name;
-import Tree.*;
-
-
-/** A default transformer class which also maintains owner information
- *
- * @author Martin Odersky
- * @version 1.0
- */
-public class OwnerTransformer extends Transformer {
-
- protected Symbol currentOwner;
-
- public OwnerTransformer(Global global) {
- super(global);
- }
-
- public void apply(CompilationUnit unit) {
- currentOwner = global.definitions.ROOT_CLASS;
- unit.body = transform(unit.body);
- }
-
- /** ..
- *
- * @param tree
- * @param owner
- * @return
- */
- public Tree transform(Tree tree, Symbol owner) {
- Symbol prevOwner = currentOwner;
- currentOwner = owner;
- Tree tree1 = transform(tree);
- currentOwner = prevOwner;
- return tree1;
- }
-
- /** ..
- *
- * @param params
- * @param owner
- * @return
- */
- public AbsTypeDef[] transform(AbsTypeDef[] params, Symbol owner) {
- Symbol prevOwner = currentOwner;
- currentOwner = owner;
- AbsTypeDef[] res = transform(params);
- currentOwner = prevOwner;
- return res;
- }
-
- /** ..
- *
- * @param params
- * @param owner
- * @return
- */
- public ValDef[][] transform(ValDef[][] params, Symbol owner) {
- Symbol prevOwner = currentOwner;
- currentOwner = owner;
- ValDef[][] res = transform(params);
- currentOwner = prevOwner;
- return res;
- }
-
- /** ..
- *
- * @param templ
- * @param owner
- * @return
- */
- public Template transform(Template templ, Symbol owner) {
- Symbol prevOwner = currentOwner;
- if (owner.kind == Kinds.CLASS)
- currentOwner = owner.primaryConstructor();
- Tree[] parents1 = transform(templ.parents);
- currentOwner = owner;
- Tree[] body1 = transformTemplateStats(templ.body, templ.symbol());
- currentOwner = prevOwner;
- return copy.Template(templ, parents1, body1);
- }
-
- /** ..
- *
- * @param ts
- * @param tsym
- * @return
- */
- public Tree[] transformTemplateStats(Tree[] ts, Symbol tsym) {
- Tree[] ts1 = ts;
- for (int i = 0; i < ts.length; i++) {
- Tree t = transformTemplateStat(ts[i], tsym);
- if (t != ts[i] && ts1 == ts) {
- ts1 = new Tree[ts.length];
- System.arraycopy(ts, 0, ts1, 0, i);
- }
- ts1[i] = t;
- }
- return ts1;
- }
-
- /** ..
- *
- * @param stat
- * @param tsym
- * @return
- */
- public Tree transformTemplateStat(Tree stat, Symbol tsym) {
- return transform(stat, tsym);
- }
-
- /** ..
- *
- * @param tree
- * @return
- */
- public Tree transform(Tree tree) {
- switch(tree) {
- case PackageDef(Tree packaged, Template impl):
- return copy.PackageDef(
- tree,
- transform(packaged),
- transform(impl, packaged.symbol()));
-
- case ClassDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Template impl):
- Symbol symbol = tree.symbol();
- return copy.ClassDef(
- tree, symbol,
- transform(tparams, symbol.primaryConstructor()),
- transform(vparams, symbol.primaryConstructor()),
- transform(tpe, symbol),
- transform(impl, symbol));
-
- case ModuleDef(_, _, Tree tpe, Template impl):
- Symbol symbol = tree.symbol();
- return copy.ModuleDef(
- tree, symbol,
- transform(tpe, symbol),
- transform(impl, symbol.moduleClass()));
-
- case DefDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Tree rhs):
- Symbol symbol = tree.symbol();
- return copy.DefDef(
- tree, symbol,
- transform(tparams, symbol),
- transform(vparams, symbol),
- transform(tpe, symbol),
- transform(rhs, symbol));
-
- case ValDef(_, _, Tree tpe, Tree rhs):
- Symbol symbol = tree.symbol();
- return copy.ValDef(
- tree, symbol,
- transform(tpe),
- transform(rhs, symbol));
-
- case AbsTypeDef(int mods, Name name, Tree rhs, Tree lobound):
- Symbol symbol = tree.symbol();
- return copy.AbsTypeDef(
- tree, symbol,
- transform(rhs, symbol),
- transform(lobound, symbol));
-
- case AliasTypeDef(int mods, Name name, AbsTypeDef[] tparams, Tree rhs):
- Symbol symbol = tree.symbol();
- return copy.AliasTypeDef(
- tree, symbol,
- transform(tparams, symbol),
- transform(rhs, symbol));
-
- default:
- return super.transform(tree);
- }
- }
-
-}
diff --git a/sources/scalac/transformer/TailCallPhase.java b/sources/scalac/transformer/TailCallPhase.java
deleted file mode 100644
index 4798e22c1a..0000000000
--- a/sources/scalac/transformer/TailCallPhase.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.ast.Tree;
-import scalac.ast.GenTransformer;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.util.Debug;
-
-/**
- * A Tail Call Transformer
- *
- * @author Erik Stenman
- * @version 1.0
- *
- * What it does:
- *
- * Finds method calls in tail-position and replaces them with jumps.
- * A call is in a tail-position if it is the last instruction to be
- * executed in the body of a method. This is done by recursing over
- * the trees that may contain calls in tail-position (trees that can't
- * contain such calls are not transformed). However, they are not that
- * many.
- *
- * Self-recursive calls in tail-position are replaced by jumps to a
- * label at the beginning of the method. As the JVM provides no way to
- * jump from a method to another one, non-recursive calls in
- * tail-position are not optimized.
- *
- * A method call is self-recursive if it calls the current method on
- * the current instance and the method is final (otherwise, it could
- * be a call to an overridden method in a subclass). Furthermore, If
- * the method has type parameters, the call must contain these
- * parameters as type arguments.
- *
- * Nested functions can be tail recursive (if this phase runs before
- * lambda lift) and they are transformed as well.
- *
- * If a method contains self-recursive calls, a label is added to at
- * the beginning of its body and the calls are replaced by jumps to
- * that label.
- */
-public class TailCallPhase extends Phase {
-
- private static class Context {
- /** The current method */
- public Symbol method = Symbol.NONE;
-
- /** The current tail-call label */
- public Symbol label = Symbol.NONE;
-
- /** The expected type arguments of self-recursive calls */
- public Type[] types;
-
- /** Tells whether we are in a tail position. */
- public boolean tailPosition;
-
- public Context() {
- this.tailPosition = false;
- }
-
- /**
- * The Context of this transformation. It contains the current enclosing method,
- * the label and the type parameters of the enclosing method, together with a
- * flag which says whether our position in the tree allows tail calls. This is
- * modified only in <code>Block</code>, where stats cannot possibly contain tail
- * calls, but the value can.
- */
- public Context(Symbol method, Symbol label, Type[] types, boolean tailPosition) {
- this.method = method;
- this.label = label;
- this.types = types;
- this.tailPosition = tailPosition;
- }
- }
-
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public TailCallPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- treeTransformer.apply(unit);
- }
-
- //########################################################################
- // Private Classes
-
- /** The tree transformer */
- private final GenTransformer treeTransformer = new GenTransformer(global) {
-
-
- /** The context of this call */
- private Context ctx = new Context();
-
- /** Transform the given tree, which is (or not) in tail position */
- public Tree transform(Tree tree, boolean tailPos) {
- boolean oldTP = ctx.tailPosition;
- ctx.tailPosition = tailPos;
- tree = transform(tree);
- ctx.tailPosition = oldTP;
- return tree;
- }
-
- public Tree[] transform(Tree[] trees, boolean tailPos) {
- boolean oldTP = ctx.tailPosition;
- ctx.tailPosition = tailPos;
- trees = transform(trees);
- ctx.tailPosition = oldTP;
- return trees;
- }
-
- /** Transforms the given tree. */
- public Tree transform(Tree tree) {
- switch (tree) {
-
- case DefDef(_, _, _, _, _, Tree rhs):
- Context oldCtx = ctx;
-
- ctx = new Context();
-
- //assert method == null: Debug.show(method) + " -- " + tree;
- ctx.method = tree.symbol();
- ctx.tailPosition = true;
-
- if (ctx.method.isMethodFinal() || ctx.method.owner().isMethod()) {
- ctx.label = ctx.method.newLabel(ctx.method.pos, ctx.method.name);
- ctx.types = Type.EMPTY_ARRAY;
- Type type = ctx.method.type();
- switch (type) {
- case PolyType(Symbol[] tparams, Type result):
- ctx.types = Symbol.type(tparams);
- type = result;
- }
- ctx.label.setInfo(type.cloneType(ctx.method, ctx.label));
- rhs = transform(rhs);
- if (ctx.label.isAccessed()) {
- global.log("Rewriting def " + ctx.method.simpleName());
- rhs = gen.LabelDef(ctx.label, ctx.method.valueParams(), rhs);
- }
- tree = gen.DefDef(ctx.method, rhs);
- } else {
- assert !ctx.method.isMethodFinal()
- : "Final method: " + ctx.method.simpleName();
- // non-final method
- ctx.tailPosition = false;
- tree = gen.DefDef(tree.symbol(), transform(rhs));
- }
- ctx = oldCtx;
- return tree;
-
- case Block(Tree[] stats, Tree value):
- boolean oldPosition = ctx.tailPosition;
- ctx.tailPosition = false; stats = transform(stats);
- ctx.tailPosition = oldPosition;
- return gen.Block(tree.pos, stats, transform(value));
-
-
- case If(Tree cond, Tree thenp, Tree elsep):
- Type type = tree.type();
- thenp = transform(thenp);
- elsep = transform(elsep);
- return gen.If(tree.pos, cond, thenp, elsep);
-
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- Type type = tree.type();
- bodies = transform(bodies);
- otherwise = transform(otherwise);
- return gen.Switch(tree.pos, test, tags, bodies,otherwise,type);
-
- // handle pattern matches explicitly
- case Apply(Select(_, scalac.util.Names._match), Tree[] args):
- Tree newTree = global.make.Apply(tree.pos, ((Tree.Apply)tree).fun, transform(args));
- newTree.setType(tree.getType());
- return newTree;
-
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs):
- if (ctx.method != Symbol.NONE && ctx.tailPosition) {
- assert targs != null : "Null type arguments " + tree;
- assert ctx.types != null : "Null types " + tree;
-
- if (!Type.isSameAs(Tree.typeOf(targs), ctx.types) |
- !ctx.tailPosition)
- return tree;
- return transform(tree, fun, transform(vargs, false));
- } else
- return tree;
-
- case Apply(Tree fun, Tree[] vargs):
- if (ctx.tailPosition)
- return transform(tree, fun, transform(vargs, false));
- else
- return gen.mkApply_V(fun, transform(vargs, false));
-
- case Visitor(Tree.CaseDef[] cases):
- Tree newTree = global.make.Visitor(tree.pos, super.transform(cases));
- newTree.setType(tree.getType());
- return newTree;
-
- case CaseDef(Tree pattern, Tree guard, Tree body):
- return gen.CaseDef(pattern, guard, transform(body));
-
- case Typed(Tree expr, Tree type):
- return gen.Typed(transform(expr), type);
-
- case ClassDef(_, _, _, _, _, Tree.Template impl):
- Symbol impl_symbol = getSymbolFor(impl);
- Tree[] body = transform(impl.body);
- return gen.ClassDef(getSymbolFor(tree), impl.parents, impl_symbol, body);
-
- case PackageDef(_, _):
- case LabelDef(_, _, _):
- case Return(_):
- return super.transform(tree);
-
-
- case Empty:
- case ValDef(_, _, _, _):
- case Assign(_, _):
- case New(_):
- case Super(_, _):
- case This(_):
- case Select(_, _):
- case Ident(_):
- case Literal(_):
- case TypeTerm():
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- case Import(_, _):
- case Function(_, _):
- return tree;
-
- default:
- throw Debug.abort("illegal case", tree);
- }
- }
-
- /** Transforms the given function call. */
- private Tree transform(Tree tree, Tree fun, Tree[] vargs) {
- if (fun.symbol() != ctx.method)
- return tree;
- switch (fun) {
- case Select(Tree qual, _):
- if (!isReferenceToThis(qual, ctx.method.owner()))
- return tree;
- global.log("Applying tail call recursion elimination for " +
- ctx.method.enclClass().simpleName() + "." + ctx.method.simpleName());
- return gen.Apply(tree.pos, gen.Ident(qual.pos, ctx.label), vargs);
-
- case Ident(_):
- global.log("Applying tail call recursion elimination for function " +
- ctx.method.enclClass().simpleName() + "." + ctx.method.simpleName());
- return gen.Apply(tree.pos, gen.Ident(fun.pos, ctx.label), vargs);
-
- default:
- throw Debug.abort("illegal case", fun);
- }
- }
-
- /**
- * Returns true if the tree represents the current instance of
- * given class.
- */
- private boolean isReferenceToThis(Tree tree, Symbol clasz) {
- switch (tree) {
- case This(_):
- assert tree.symbol() == clasz: tree +" -- "+ Debug.show(clasz);
- return true;
- default:
- return false;
- }
- }
-
- };
-
- //########################################################################
-}
diff --git a/sources/scalac/transformer/TypesAsValuesPhase.java b/sources/scalac/transformer/TypesAsValuesPhase.java
deleted file mode 100644
index 394373bd94..0000000000
--- a/sources/scalac/transformer/TypesAsValuesPhase.java
+++ /dev/null
@@ -1,1415 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-import scalac.symtab.Definitions;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-import scalac.symtab.Modifiers;
-import scalac.atree.AConstant;
-import scalac.ast.Transformer;
-import scalac.ast.GenTransformer;
-import scalac.ast.Tree;
-import scalac.ast.TreeGen;
-import scalac.ast.TreeList;
-import scalac.backend.Primitives;
-
-import scalac.util.Name;
-import scalac.util.Names;
-import scalac.util.Debug;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Arrays;
-import java.util.Collections;
-
-/**
- * Turn types into values by applying the following transformations:
- *
- * - For all type member T of all classes, add an accessor method
- * T$type returnining the type as a value (the accessor is abstract
- * if the type member is abstract).
- *
- * - For all polymorphic methods/constructors, add a value parameter
- * for each type parameter.
- *
- * - Add a method getScalaType to every class, to obtain its type as a
- * value.
- *
- * - Transform all type expressions into value expressions: type
- * application is turned into value application, type selection into
- * value selection, and so on.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-
-// TODO use a constant instead of generating empty arrays all the
-// time.
-
-public class TypesAsValuesPhase extends Phase {
- private final GenTransformer transformer;
-
- /**
- * The list of members to add to a given class (either type
- * accessors or instantiation methods).
- */
- private final HashMap/*<Symbol,Symbol[]>*/ membersToAdd =
- new HashMap();
-
- /** The list of parameters to add to a given method. */
- private final HashMap/*<Symbol,List<Symbol>>*/ paramsToAdd =
- new HashMap();
-
- /** The accessor method corresponding to a given type (or class) member. */
- private final HashMap/*<Symbol, Symbol>*/ typeAccessor =
- new HashMap();
-
- /** The instanciation method corresponding to a given class. */
- private final HashMap/*<Symbol,Symbol>*/ instantiator =
- new HashMap();
-
- /** The lazy parent class corresponding to a given class. */
- private final HashMap/*<Symbol,Symbol>*/ lazyParentsClass =
- new HashMap();
-
- /** The class constructor corresponding to a given class. */
- private final HashMap/*<Symbol,Symbol>*/ classInitialiser =
- new HashMap();
-
- private final HashMap/*<Symbol,Symbol>*/ tConstructor =
- new HashMap();
-
- private final HashMap/*<Symbol, HashSet<Symbol>>*/ constructorNeed =
- new HashMap();
-
- private final Definitions defs = global.definitions;
- private final Primitives prims = global.primitives;
-
- private final Type.MethodType typeAccessorType, lazyForceType;
-
- private final Symbol ARRAY_CONSTRUCTOR =
- defs.ARRAY_CLASS.primaryConstructor();
-
- private final TEnv EENV = new TEnv();
-
- private final Map/*<Symbol, Symbol>*/ predefTypes;
- private final Map/*<Type, String>*/ basicTypes;
-
- private HashMap/*<Symbol, Ancestor[][]>*/ ancestorCache = new HashMap();
-
- public TypesAsValuesPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- // If RTT are disabled, use a minimal transformer which simply
- // replaces [ia]sInstanceOf with their erased counterpart.
- if (global.runTimeTypes && global.target != Global.TARGET_MSIL) {
- transformer = new TV_Transformer(global);
- typeAccessorType =
- new Type.MethodType(new Symbol[]{}, defs.TYPE_TYPE());
- lazyForceType =
- new Type.MethodType(Symbol.EMPTY_ARRAY,
- defs.ARRAY_TYPE(defs.SCALACLASSTYPE_TYPE()));
- predefTypes = new HashMap();
- predefTypes.put(defs.DOUBLE_CLASS, defs.RTT_DOUBLE());
- predefTypes.put(defs.FLOAT_CLASS, defs.RTT_FLOAT());
- predefTypes.put(defs.LONG_CLASS, defs.RTT_LONG());
- predefTypes.put(defs.INT_CLASS, defs.RTT_INT());
- predefTypes.put(defs.SHORT_CLASS, defs.RTT_SHORT());
- predefTypes.put(defs.CHAR_CLASS, defs.RTT_CHAR());
- predefTypes.put(defs.BYTE_CLASS, defs.RTT_BYTE());
- predefTypes.put(defs.BOOLEAN_CLASS, defs.RTT_BOOLEAN());
- predefTypes.put(defs.UNIT_CLASS, defs.RTT_UNIT());
-
- predefTypes.put(defs.ANY_CLASS, defs.RTT_ANY());
- predefTypes.put(defs.ANYVAL_CLASS, defs.RTT_ANYVAL());
- predefTypes.put(defs.ALLREF_CLASS, defs.RTT_ALLREF());
- predefTypes.put(defs.ALL_CLASS, defs.RTT_ALL());
-
- basicTypes = new HashMap();
- basicTypes.put(defs.BOOLEAN_TYPE(), "Z");
- basicTypes.put(defs.BYTE_TYPE(), "B");
- basicTypes.put(defs.CHAR_TYPE(), "C");
- basicTypes.put(defs.DOUBLE_TYPE(), "D");
- basicTypes.put(defs.FLOAT_TYPE(), "F");
- basicTypes.put(defs.INT_TYPE(), "I");
- basicTypes.put(defs.LONG_TYPE(), "J");
- basicTypes.put(defs.SHORT_TYPE(), "S");
-
- membersToAdd.put(defs.ARRAY_CLASS, new Symbol[0]);
- paramsToAdd.put(ARRAY_CONSTRUCTOR, new Symbol[0]);
-
- ancestorCache.put(defs.OBJECT_CLASS, new Ancestor[0][]);
- } else {
- transformer = new TV_MiniTransformer(global);
- typeAccessorType = lazyForceType = null;
- predefTypes = basicTypes = null;
- }
- }
-
- /**
- * Return the symbol of the accessor for the given type symbol.
- */
- private Symbol getAccessorSym(Symbol typeSym) {
- assert typeSym.isType();
- Symbol accessorSym = (Symbol)typeAccessor.get(typeSym);
- if (accessorSym == null) {
- accessorSym = typeSym.owner().newVariable(typeSym.pos,
- typeSym.flags,
- Names.TYPE(typeSym));
- accessorSym.setInfo(defs.TYPE_TYPE());
- typeAccessor.put(typeSym, accessorSym);
- }
- return accessorSym;
- }
-
- private Symbol getInstMethSym(Symbol classSym) {
- Symbol imSym = (Symbol)instantiator.get(classSym);
- if (imSym == null) {
- int pos = classSym.pos;
- boolean isStatic = !isNestedClass(classSym);
- Name imName = Names.INSTANTIATE(classSym, isStatic);
-
- int flags = classSym.isAbstractType() ? Modifiers.DEFERRED : 0;
-
- imSym = isStatic
- ? classSym.newStaticMethod(pos, 0, imName)
- : classSym.owner().newMethodOrFunction(pos, flags, imName);
-
- Symbol[] argTypes;
- Symbol typesP = imSym.newVParam(pos, 0, Name.fromString("types"));
- typesP.setInfo(defs.ARRAY_TYPE(defs.TYPE_TYPE()));
- argTypes = new Symbol[]{ typesP };
-
- imSym.setInfo(new Type.MethodType(argTypes,
- isStatic
- ? defs.SCALACLASSTYPE_TYPE()
- : defs.TYPE_TYPE()));
-
- instantiator.put(classSym, imSym);
- }
- return imSym;
- }
-
- private Symbol getLazyParentClassSym(Symbol classSym) {
- Symbol lpcSym = (Symbol)lazyParentsClass.get(classSym);
- if (lpcSym == null) {
- int pos = classSym.pos;
- Name lpcName = Names.LAZYPARENTS(classSym);
- lpcSym = classSym.owner().newClass(pos, 0, lpcName);
-
- Type lpcInfo =
- Type.compoundType(new Type[] { defs.LAZYPARENTS_TYPE() },
- new Scope(),
- lpcSym);
- lpcSym.setInfo(lpcInfo);
-
- Symbol lpcConstrSym = lpcSym.primaryConstructor();
- Symbol typesP =
- lpcConstrSym.newVParam(pos, 0, Name.fromString("types"));
- typesP.setInfo(defs.ARRAY_TYPE(defs.TYPE_TYPE()));
-
- lpcConstrSym.setInfo(new Type.MethodType(new Symbol[]{ typesP },
- defs.UNIT_TYPE()));
-
- lazyParentsClass.put(classSym, lpcSym);
- }
- return lpcSym;
- }
-
- private Symbol getTConstructorSym(Symbol classSym) {
- Symbol tcSym = (Symbol)tConstructor.get(classSym);
- if (tcSym == null) {
- int pos = classSym.pos;
- boolean isStatic = !isNestedClass(classSym);
- Name tcName = Names.TYPECONSTRUCTOR(classSym, isStatic);
-
- tcSym = isStatic
- ? classSym.newStaticField(pos, 0, tcName)
- : classSym.owner().newFieldOrVariable(pos, 0, tcName);
- tcSym.setInfo(defs.TYPECONSTRUCTOR_TYPE());
-
- tConstructor.put(classSym, tcSym);
- }
- return tcSym;
- }
-
- private Symbol getClassInitSym(Symbol classSym) {
- Symbol ciSym = (Symbol)classInitialiser.get(classSym);
- if (ciSym == null) {
- int pos = classSym.pos;
-
- ciSym = classSym.newStaticMethod(pos, 0, Names.CLASS_CONSTRUCTOR);
- ciSym.setInfo(new Type.MethodType(Symbol.EMPTY_ARRAY,
- defs.UNIT_TYPE()));
-
- classInitialiser.put(classSym, ciSym);
- }
- return ciSym;
- }
-
- private Symbol[] membersToAdd(Symbol classSym) {
- Symbol[] toAdd = (Symbol[])membersToAdd.get(classSym);
- if (toAdd == null) {
- HashSet seenMembers = new HashSet(); // [HACK]
- ArrayList toAddL = new ArrayList();
- Scope.SymbolIterator membersIt = classSym.members().iterator();
- while (membersIt.hasNext()) {
- Symbol member = membersIt.next();
- // [HACK] work around a bug in the analyzer, which
- // doesn't add the module class to its owner's members
- if (member.isModule())
- member = member.moduleClass();
- if (!seenMembers.add(member))
- continue;
- if (member.isClass()) {
- toAddL.add(getTConstructorSym(member));
- toAddL.add(getInstMethSym(member));
- } else if (member.isType())
- toAddL.add(getInstMethSym(member));
- }
-
- if (needsInstantiationMethod(classSym)) {
- toAddL.add(getTConstructorSym(classSym));
- toAddL.add(getClassInitSym(classSym));
- toAddL.add(getInstMethSym(classSym));
- }
-
- toAdd = (Symbol[])toAddL.toArray(new Symbol[toAddL.size()]);
- membersToAdd.put(classSym, toAdd);
- }
- return toAdd;
- }
-
- private Symbol[] paramsToAdd(Symbol methSym) {
- Symbol[] toAdd = (Symbol[])paramsToAdd.get(methSym);
- if (toAdd == null) {
- Symbol[] tparams = methSym.typeParams();
-
- ArrayList toAddL = new ArrayList();
- for (int i = 0; i < tparams.length; ++i)
- toAddL.add(getAccessorSym(tparams[i]));
-
- toAdd = (Symbol[])toAddL.toArray(new Symbol[toAddL.size()]);
- paramsToAdd.put(methSym, toAdd);
- }
-
- return toAdd;
- }
-
- /**
- * Return true iff the given symbol is not a polymorphic
- * primitive, which shouldn't get type parameters as value
- * parameters.
- */
- private boolean monoPrimitive(Symbol sym) {
- return sym.isJava()
- || sym == ARRAY_CONSTRUCTOR
- || sym == defs.OBJECT_SYNCHRONIZED
- || sym == defs.ANY_IS
- || sym == defs.ANY_IS_ERASED
- || sym == defs.ANY_AS
- || sym == defs.ANY_AS_ERASED;
- }
-
- public Type transformInfo(Symbol symbol, Type type) {
- if (!global.runTimeTypes) return type;
-
- if (symbol.isClass()) {
- Symbol[] toAdd = membersToAdd(symbol);
-
- if (toAdd.length == 0)
- return type;
- else {
- Scope newMembers = new Scope(symbol.members());
-
- for (int i = 0; i < toAdd.length; ++i)
- newMembers.enterOrOverload(toAdd[i]);
-
- return Type.compoundType(type.parents(), newMembers, symbol);
- }
- } else if (type.typeParams().length > 0 && !monoPrimitive(symbol)) {
- // Polymorphic method/constructor:
- // - add a value parameter for every type parameter.
- switch (type) {
- case PolyType(Symbol[] tparams, // :
- Type.MethodType(Symbol[] vparams, Type result)):
- List newVParams =
- new LinkedList(Arrays.asList(paramsToAdd(symbol)));
- newVParams.addAll(Arrays.asList(vparams));
- Symbol[] newVParamsA = (Symbol[])
- newVParams.toArray(new Symbol[newVParams.size()]);
-
- return new Type.PolyType(tparams,
- new Type.MethodType(newVParamsA,
- result));
-
- default:
- throw Debug.abort("unexpected type: ", type);
- }
- } else
- return type;
- }
-
- /**
- * Return true iff the given type is trivial, that is if it
- * has neither a prefix, nor type parameters.
- */
- private boolean isTrivial(Type tp) {
- switch (tp) {
- case TypeRef(_, Symbol sym, Type[] args):
- if (sym == defs.ARRAY_CLASS)
- return isTrivial(args[0]);
- else
- return sym.isStatic() && args.length == 0;
- case SingleType(_, _):
- case ThisType(_):
- case CompoundType(_, _):
- return false;
- default:
- throw Debug.abort("unexpected type", tp);
- }
- }
-
- /**
- * Return true iff the given type is strongly trivial, that is
- * if it and all its ancestors are trivial.
- */
- private boolean isStronglyTrivial(Type tp) {
- if (isTrivial(tp)) {
- Type[] parents = tp.parents();
- for (int i = 0; i < parents.length; ++i) {
- if (!isStronglyTrivial(parents[i]))
- return false;
- }
- return true;
- } else
- return false;
- }
-
- private boolean isNestedClass(Symbol classSym) {
- return !classSym.owner().isPackageClass();
- }
-
- private boolean needsInstantiationMethod(Symbol classSym) {
- return !(isNestedClass(classSym) || isStronglyTrivial(classSym.type()));
- }
-
- public void apply(CompilationUnit unit) {
- transformer.apply(unit);
- }
-
- private class TV_Transformer extends TV_MiniTransformer {
- private Symbol currentOwner;
- private TreeList additionalTopLevelClasses;
-
- public TV_Transformer(Global global) {
- super(global);
- }
-
- public void apply(CompilationUnit unit) {
- unit.global.log("transforming " + unit);
- additionalTopLevelClasses = new TreeList();
- TreeList newUnitBody = new TreeList(transform(unit.body));
- newUnitBody.append(additionalTopLevelClasses);
- additionalTopLevelClasses = null;
- unit.body = newUnitBody.toArray();
- }
-
- public Tree transform(Tree tree) {
- switch (tree) {
- case ClassDef(_, _, _, _, _, Tree.Template impl):
- Symbol clsSym = tree.symbol();
-
- TreeList newBody = new TreeList();
- if (needsInstantiationMethod(clsSym)) {
- boolean lazy = isCyclic(clsSym);
-
- Symbol tcSym = getTConstructorSym(clsSym);
- newBody.append(tConstructorVal(clsSym, tcSym));
- Symbol ciSym = getClassInitSym(clsSym);
- newBody.append(classInitialiser(clsSym, ciSym, tcSym));
- Symbol imSym = getInstMethSym(clsSym);
- newBody.append(instantiatorBody(clsSym, imSym, lazy));
-
- if (lazy) {
- Symbol lpcSym = getLazyParentClassSym(clsSym);
- Tree lpc = lazyParentsClass(clsSym, lpcSym);
- additionalTopLevelClasses.append(lpc);
- }
- }
- newBody.append(transformStatements(impl.body, impl.symbol()));
-
- return gen.ClassDef(clsSym,
- transform(impl.parents,
- clsSym.primaryConstructor()),
- impl.symbol(),
- newBody.toArray());
-
- case DefDef(_, _, _, _, _, Tree rhs):
- Symbol symbol = getSymbolFor(tree);
-
- if (symbol.name == Names.getScalaType && symbol.isSynthetic()) {
- // Correct the body of the getScalaType method
- // which, until now, was a placeholder (introduced
- // by RefCheck).
- return gen.DefDef(symbol,
- scalaClassType(symbol.pos,
- symbol.owner().type(),
- symbol,
- EENV));
- } else
- return gen.DefDef(symbol, transform(rhs, symbol));
-
- case Block(Tree[] stats, Tree value):
- return gen.Block(tree.pos,
- transformStatements(stats),
- transform(value));
-
- case ValDef(_, _, Tree tpe, Literal(AConstant.ZERO)):
- // transform default values:
- // val x: T = _
- // becomes
- // val x: T = asValue(T).defaultValue()
- Symbol symbol = getSymbolFor(tree);
- Tree defaultValue =
- gen.mkRef(tree.pos,
- typeAsValue(tree.pos,
- tpe.type,
- currentOwner,
- EENV),
- defs.TYPE_DEFAULTVALUE());
- Tree rhs = gen.mkApply__(tree.pos, defaultValue);
- return gen.ValDef(symbol, rhs);
-
- case ValDef(_, _, _, Tree rhs):
- Symbol symbol = getSymbolFor(tree);
- return gen.ValDef(symbol, transform(rhs, symbol));
-
- case New(Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs)):
- if (fun.symbol() == ARRAY_CONSTRUCTOR
- && targs[0].type().symbol().isParameter()) {
- // Transform array creations:
- // new Array[T](size)
- // becomes
- // asValue(T).newArray[T](size)
- assert targs.length == 1;
- assert vargs.length == 1;
- Tree newArrayfun = gen.mkRef(tree.pos,
- typeAsValue(targs[0].pos,
- targs[0].type(),
- currentOwner,
- EENV),
- defs.TYPE_NEWARRAY());
- return gen.mkApplyTV(newArrayfun, targs, vargs);
- } else
- return super.transform(tree);
-
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs):
- Symbol funSym = fun.symbol();
-
- if (funSym == defs.ANY_IS) {
- assert targs.length == 1 && vargs.length == 0;
- Type type = targs[0].type;
- Tree expr = transform(qualifierOf(fun));
- return (isTrivial(type) && !isSpecial(type))
- ? super.transform(tree)
- : genInstanceTest(tree.pos, expr, type);
- } else if (funSym == defs.ANY_AS) {
- // Transform instance tests:
- // e.asInstanceOf[T]
- // becomes:
- // asValue(T).cast(e).asInstanceOf[T]
- // unless T is a trivial type for which a Java
- // instance test is sufficient, in which case the
- // erased version of asInstanceOf is used.
- assert targs.length == 1 && vargs.length == 0;
- Type type = targs[0].type;
- Tree expr = transform(qualifierOf(fun));
- return (isTrivial(type) && !isSpecial(type))
- ? super.transform(tree)
- : genTypeCast(tree.pos, expr, type);
- } else if (!monoPrimitive(funSym)) {
- // Transform applications to pass types as values:
- // f[T1, ...](v1, ...)
- // becomes
- // f[T1, ...](asValue(T1), ..., v1, ...)
- Tree[] newVArgs = transform(vargs);
- Tree[] finalVArgs =
- new Tree[newVArgs.length + targs.length];
- for (int i = 0; i < targs.length; ++i)
- finalVArgs[i] = typeAsValue(targs[i].pos,
- targs[i].type,
- currentOwner,
- EENV);
- System.arraycopy(newVArgs, 0,
- finalVArgs, targs.length,
- newVArgs.length);
- return gen.mkApplyTV(tree.pos,
- transform(fun),
- targs,
- finalVArgs);
- } else
- return super.transform(tree);
-
- default:
- return super.transform(tree);
- }
- }
-
- private Tree[] transformStatements(Tree[] stats) {
- ArrayList newStats = new ArrayList();
- int beginIdx = 0;
- for (int i = 0; i < stats.length; ++i) {
- Tree stat = stats[i];
- switch (stat) {
- case ClassDef(_, _, _, _, _, Tree.Template impl):
- Symbol clsSym = stat.symbol();
- boolean lazy = isCyclic(clsSym);
- Symbol tcSym = getTConstructorSym(clsSym);
- newStats.add(beginIdx++, tConstructorVal(clsSym, tcSym));
- Symbol insSym = getInstMethSym(clsSym);
- newStats.add(instantiatorBody(clsSym, insSym, lazy));
- if (lazy) {
- Symbol lpcSym = getLazyParentClassSym(clsSym);
- newStats.add(lazyParentsClass(clsSym, lpcSym));
- }
- break;
-
- case AbsTypeDef(_, _, _, _):
- case AliasTypeDef(_, _, _, _):
- Symbol tpSym = stat.symbol();
- Symbol insSym = getInstMethSym(tpSym);
- newStats.add(typeAccessorBody(tpSym, insSym));
- break;
- }
- newStats.add(transform(stat));
- }
- return (Tree[])newStats.toArray(new Tree[newStats.size()]);
- }
-
- private Tree[] transformStatements(Tree[] stats, Symbol currentOwner) {
- Symbol bkpOwner = this.currentOwner;
- this.currentOwner = currentOwner;
- Tree[] newStats = transformStatements(stats);
- this.currentOwner = bkpOwner;
- return newStats;
- }
-
- private Tree transform(Tree tree, Symbol currentOwner) {
- Symbol bkpOwner = this.currentOwner;
- this.currentOwner = currentOwner;
- Tree newTree = transform(tree);
- this.currentOwner = bkpOwner;
- return newTree;
- }
-
- private Tree[] transform(Tree[] trees, Symbol currentOwner) {
- Symbol bkpOwner = this.currentOwner;
- this.currentOwner = currentOwner;
- Tree[] newTrees = transform(trees);
- this.currentOwner = bkpOwner;
- return newTrees;
- }
-
- private int level(Symbol sym) {
- Symbol superClass = sym.parents()[0].symbol();
- assert superClass != Symbol.NONE : sym;
- if (superClass == defs.ANY_CLASS)
- return 0;
- else
- return 1 + level(superClass);
- }
-
- /**
- * Return a method giving access to the given type, as a
- * value.
- */
- private Tree.DefDef typeAccessorBody(Symbol typSym, Symbol accSym) {
- Tree rhs;
- if (typSym.isAbstractType())
- rhs = Tree.Empty;
- else if (typSym.isClass())
- rhs = scalaClassType(typSym.pos, typSym.type(), accSym, EENV);
- else {
- final Symbol[] vparams = accSym.valueParams();
- final int pos = accSym.pos;
-
- final HashMap varMap = new HashMap();
- Symbol[] tparams = typSym.typeParams();
- for (int i = 0; i < tparams.length; ++i)
- varMap.put(tparams[i], new Integer(i));
-
- TEnv tEnv = new TEnv() {
- public boolean definesVar(Symbol sym) {
- return varMap.containsKey(sym);
- }
-
- public Tree treeForVar(Symbol sym) {
- int idx = ((Integer)varMap.get(sym)).intValue();
- Tree array = gen.mkLocalRef(pos, vparams[0]);
- return gen.mkArrayGet(pos, array, idx);
- }
- };
-
- rhs = typeAsValue(typSym.pos, typSym.type(), accSym, tEnv);
- }
- return gen.DefDef(accSym, rhs);
- }
-
- private Tree tConstructorVal(Symbol clsSym, Symbol tcSym) {
- return gen.ValDef(tcSym,
- tcSym.isStatic()
- ? Tree.Empty
- : tConstructorRHS(tcSym.pos, clsSym, tcSym));
- }
-
- private Tree classInitialiser(Symbol clsSym,
- Symbol ciSym,
- Symbol tcSym) {
- if (tcSym.isStatic()) {
- int pos = tcSym.pos;
- Tree rhs = tConstructorRHS(pos, clsSym, ciSym);
- Tree assign = gen.Assign(pos, gen.Ident(pos, tcSym), rhs);
-
- return gen.DefDef(ciSym, assign);
- } else
- return Tree.Empty;
- }
-
- private Tree tConstructorRHS(int pos, Symbol clsSym, Symbol owner) {
- int zCount = 0, mCount = 0, pCount = 0;
- Symbol[] tparams = clsSym.typeParams();
-
- for (int i = 0; i < tparams.length; ++i) {
- if ((tparams[i].flags & Modifiers.COVARIANT) != 0)
- ++pCount;
- else if ((tparams[i].flags & Modifiers.CONTRAVARIANT) != 0)
- ++mCount;
- else
- ++zCount;
- }
-
- Ancestor[][] ancestors = computeAncestors(clsSym);
- int[] ancestorCode = getAncestorCode(ancestors);
-
- Tree outer = isNestedClass(clsSym)
- ? (clsSym.owner().isClass()
- ? gen.This(pos, clsSym.owner())
- : gen.mkGlobalRef(pos, defs.TYPECONSTRUCTOR_FUNCTIONOUTER()))
- : gen.mkNullLit(pos);
-
- Tree[] tcArgs = new Tree[] {
- gen.mkIntLit(pos, level(clsSym)),
- gen.mkSymbolNameLit(pos, clsSym),
- outer,
- gen.mkIntLit(pos, zCount),
- gen.mkIntLit(pos, mCount),
- gen.mkIntLit(pos, pCount),
- gen.mkIntLit(pos, ancestors.length),
- ancestorCode.length == 0
- ? gen.mkNullLit(pos)
- : mkNewIntLitArray(pos, getAncestorCode(ancestors), owner)
- };
-
- Symbol tcConst = defs.TYPECONSTRUCTOR_CLASS.primaryConstructor();
- Tree tcCall =
- gen.mkApply_V(pos, gen.mkGlobalRef(pos, tcConst), tcArgs);
- return gen.New(pos, tcCall);
- }
-
- private Tree mkNewIntLitArray(int pos, int[] values, Symbol owner) {
- Tree[] intLits = new Tree[values.length];
- for (int i = 0; i < values.length; ++i)
- intLits[i] = gen.mkIntLit(pos, values[i]);
- return gen.mkNewArray(pos, defs.INT_TYPE(), intLits, owner);
- }
-
- private Tree lazyParentsClass(Symbol clsSym, Symbol lazyClsSym) {
- int pos = clsSym.pos;
-
- Symbol typesSym = lazyClsSym.primaryConstructor().valueParams()[0];
-
- Symbol forceSym = lazyClsSym.newMethod(pos, 0, Names.force);
- forceSym.setInfo(lazyForceType);
- lazyClsSym.members().enter(forceSym);
- Tree.DefDef forceDef =
- gen.DefDef(forceSym,
- parentsArray(pos, clsSym, typesSym, forceSym));
-
- return gen.ClassDef(lazyClsSym, new Tree[] { forceDef });
- }
-
- /**
- * Return a method to instantiate the given type.
- */
- private Tree.DefDef instantiatorBody(Symbol clsSym,
- Symbol insSym,
- boolean lazy) {
- // TODO fix flags for all symbols below
- final int pos = clsSym.pos;
- final Symbol typesArr = insSym.valueParams()[0];
-
- Tree[] body = new Tree[2];
-
- // Generate call to "getInstantiation" method of
- // constructor.
- Tree getInstFun =
- gen.Select(pos,
- gen.mkLocalRef(pos, getTConstructorSym(clsSym)),
- defs.TYPECONSTRUCTOR_GETINSTANTIATION());
-
- Tree[] getInstArgs = new Tree[]{ gen.mkLocalRef(pos, typesArr) };
-
- Symbol instVal =
- insSym.newVariable(pos, 0, Name.fromString("inst"));
- instVal.setInfo(defs.SCALACLASSTYPE_TYPE());
-
- Tree instValDef =
- gen.ValDef(instVal,
- gen.mkApply_V(pos, getInstFun, getInstArgs));
-
- // Generate test to see if a call to "instantiate" is
- // necessary.
- Tree cond =
- gen.mkApply_V(pos,
- gen.Select(pos,
- gen.mkLocalRef(pos, instVal),
- defs.ANY_BANGEQ),
- new Tree[] { gen.mkNullLit(pos) });
- Tree thenP = gen.mkLocalRef(pos, instVal);
- Tree elseP = lazy
- ? lazyInstantiateCall(pos, clsSym, typesArr)
- : strictInstantiateCall(pos, clsSym, typesArr, insSym);
- Tree ifExpr =
- gen.If(pos, cond, thenP, elseP, defs.SCALACLASSTYPE_TYPE());
-
- return gen.DefDef(insSym, gen.mkBlock(pos, instValDef, ifExpr));
- }
-
- private Tree strictInstantiateCall(int pos,
- Symbol clsSym,
- Symbol tpArraySym,
- Symbol owner) {
- Tree instFun =
- gen.Select(pos,
- gen.mkLocalRef(pos, getTConstructorSym(clsSym)),
- defs.TYPECONSTRUCTOR_INSTANTIATE());
- Tree[] instArgs = new Tree[] {
- gen.mkLocalRef(pos, tpArraySym),
- parentsArray(pos, clsSym, tpArraySym, owner)
- };
- return gen.mkApply_V(pos, instFun, instArgs);
- }
-
- private Tree lazyInstantiateCall(int pos,
- Symbol clsSym,
- Symbol tpArraySym) {
- Tree instFun =
- gen.Select(pos,
- gen.mkLocalRef(pos, getTConstructorSym(clsSym)),
- defs.TYPECONSTRUCTOR_INSTANTIATE());
- Symbol lpcSym = getLazyParentClassSym(clsSym);
- Tree lazyConstr =
- gen.mkPrimaryConstructorLocalRef(pos, lpcSym);
- Tree[] lazyConstrArgs = new Tree[] {
- gen.mkLocalRef(pos, tpArraySym)
- };
- Tree[] instArgs = new Tree[] {
- gen.mkLocalRef(pos, tpArraySym),
- gen.New(pos, gen.mkApply_V(lazyConstr, lazyConstrArgs))
- };
- return gen.mkApply_V(pos, instFun, instArgs);
- }
-
- private Tree parentsArray(final int pos,
- final Symbol clsSym,
- final Symbol tpArraySym,
- final Symbol owner) {
- final HashMap varMap = new HashMap();
- final Symbol[] tparams = clsSym.typeParams();
- for (int i = 0; i < tparams.length; ++i)
- varMap.put(tparams[i], new Integer(i));
-
- // Type environment mapping the type parameters of the
- // class to their corresponding element in the "types"
- // array passed to this instantiator.
- TEnv tEnv = new TEnv() {
- public boolean definesVar(Symbol sym) {
- return varMap.containsKey(sym);
- }
- public Tree treeForVar(Symbol sym) {
- int idx = ((Integer)varMap.get(sym)).intValue();
- Tree array = gen.mkLocalRef(pos, tpArraySym);
- return gen.mkArrayGet(pos, array, idx);
- }
- public boolean definesVarArray(Symbol[] syms) {
- if (syms.length == tparams.length) {
- for (int i = 0; i < syms.length; ++i) {
- if (syms[i] != tparams[i])
- return false;
- }
- return true;
- } else
- return false;
- }
- public Tree treeForVarArray(Symbol[] syms) {
- assert definesVarArray(syms);
- return gen.mkLocalRef(pos, tpArraySym);
- }
- };
-
- Type[] parents = clsSym.parents();
- TreeList parentTypes = new TreeList();
- for (int i = 0; i < parents.length; ++i) {
- Type parent = parents[i];
- if (!isStronglyTrivial(parent))
- parentTypes.append(typeAsValue(pos, parent, owner, tEnv));
- }
- boolean emptyParents = (parentTypes.length() == 0);
- return emptyParents
- ? gen.mkGlobalRef(pos, defs.SCALACLASSTYPE_EMPTYARRAY())
- : gen.mkNewArray(pos,
- defs.SCALACLASSTYPE_TYPE(),
- parentTypes.toArray(),
- owner);
- }
-
- /**
- * Generate code to test if the given expression is an
- * instance of the given type.
- */
- private Tree genInstanceTest(int pos, Tree expr, Type tp) {
- Tree tpVal = typeAsValue(pos, tp, currentOwner, EENV);
-
- if (isKnowClassType(tp)) {
- Symbol val =
- currentOwner.newVariable(pos,
- Modifiers.SYNTHETIC,
- Names.LOCAL(currentOwner));
- val.setType(expr.type);
-
- Tree valDef = gen.ValDef(val, expr);
-
- Tree cheapTest =
- gen.mkIsInstanceOf(pos, gen.mkLocalRef(pos, val), tp, true);
- Symbol isNonTrivialInst = defs.CLASSTYPE_ISNONTRIVIALINSTANCE();
- Tree scalaTpVal = gen.mkAsInstanceOf(pos,
- tpVal,
- defs.CLASSTYPE_TYPE(),
- true);
- Tree expensiveTest =
- gen.mkApply_V(pos,
- gen.Select(pos, scalaTpVal, isNonTrivialInst),
- new Tree[] { gen.mkLocalRef(pos, val) });
-
- Tree bothTests =
- gen.mkApply_V(pos,
- gen.Select(pos,
- cheapTest,
- defs.BOOLEAN_AND()),
- new Tree[] { expensiveTest });
-
- return gen.mkBlock(pos, valDef, bothTests);
- } else {
- Tree fun = gen.Select(pos, tpVal, defs.TYPE_ISINSTANCE());
- return gen.mkApply_V(pos, fun, new Tree[] { expr });
- }
- }
-
- /**
- * Generate code to cast the given value to the given type.
- */
- private Tree genTypeCast(int pos, Tree expr, Type tp) {
- Tree tpVal = typeAsValue(pos, tp, currentOwner, EENV);
- Tree fun = gen.Select(pos, tpVal, defs.TYPE_CAST());
- Tree castCall = gen.mkApply_V(pos, fun, new Tree[] { expr });
- return gen.mkAsInstanceOf(pos, castCall, tp);
- }
-
- private boolean isSpecial(Type tp) {
- switch (tp) {
- case TypeRef(_, Symbol sym, _):
- return (sym == defs.ANY_CLASS)
- || (sym == defs.ANYVAL_CLASS)
- || (sym == defs.ALLREF_CLASS)
- || (sym == defs.ALL_CLASS);
- default:
- return false;
- }
- }
-
- private boolean isKnowClassType(Type tp) {
- switch (tp) {
- case TypeRef(_, Symbol sym, _):
- return (sym != defs.ARRAY_CLASS) && !sym.isParameter();
- default:
- return false;
- }
- }
-
- private void addConstructorsNeededBy(HashSet roots,
- Type tp,
- HashSet set){
- switch (tp) {
- case TypeRef(_, Symbol pSym, Type[] args):
- if (!pSym.isParameter()) {
- set.add(pSym);
- set.addAll(constructorsNeededBy(roots, pSym));
- for (int i = 0; i < args.length; ++i)
- addConstructorsNeededBy(roots, args[i], set);
- }
- break;
- case CompoundType(Type[] parts, _):
- for (int i = 0; i < parts.length; ++i)
- addConstructorsNeededBy(roots, parts[i], set);
- default:
- ; // nothing to do
- }
- }
-
- private HashSet constructorsNeededBy(HashSet roots, Symbol sym) {
- HashSet constr = new HashSet();
- if (roots.add(sym)) {
- Type[] parents = sym.parents();
- for (int i = 0; i < parents.length; ++i)
- addConstructorsNeededBy(roots, parents[i], constr);
- }
- return constr;
- }
-
- private HashSet constructorsNeededBy(Symbol sym) {
- HashSet constr = (HashSet)constructorNeed.get(sym);
- if (constr == null) {
- constr = constructorsNeededBy(new HashSet(), sym);
- constructorNeed.put(sym, constr);
- }
- return constr;
- }
-
- private boolean isCyclic(Symbol sym) {
- HashSet constrs = constructorsNeededBy(sym);
- if (constrs.contains(sym))
- return true;
- Iterator constrsIt = constrs.iterator();
- while (constrsIt.hasNext()) {
- Symbol constr = (Symbol)constrsIt.next();
- if (constr.isAbstractType())
- return true;
- }
- return false;
- }
-
- /**
- * Transform a type into a tree representing it.
- */
- private Tree typeAsValue(int pos, Type tp, Symbol owner, TEnv env) {
- switch (tp) {
- case ConstantType(Type base, _):
- return typeAsValue(pos, base, owner, env);
-
- case TypeRef(Type pre, Symbol sym, Type[] args):
- if (env.definesVar(sym)) {
- assert args.length == 0;
- return env.treeForVar(sym);
- } else if (sym == defs.ARRAY_CLASS) {
- assert args.length == 1;
- return arrayType(pos, args[0], owner, env);
- } else if (predefTypes.containsKey(sym)) {
- return gen.mkGlobalRef(pos, (Symbol)predefTypes.get(sym));
- } else if (sym.isJava()) {
- assert args.length <= 1
- : Debug.show(sym) + " " + args.length;
- return javaClassType(pos, sym);
- } else if (!sym.isParameter()) {
- // Reference to a "global" type.
- return scalaClassType(pos, tp, owner, env);
- } else {
- assert !isValuePrefix(pre) : tp;
- return gen.mkLocalRef(pos, getAccessorSym(sym));
- }
-
- case SingleType(Type pre, Symbol sym):
- return singleType(pos, (Type.SingleType)tp);
-
- case ThisType(Symbol sym):
- return thisType(pos, sym);
-
- case CompoundType(Type[] parts, Scope members):
- return compoundType(pos, parts, members, owner, env);
-
- default:
- throw Debug.abortIllegalCase(tp);
- }
- }
-
- private Tree arrayType(int pos,
- Type elemType,
- Symbol owner,
- TEnv env) {
- Type realElemType = elemType;
- int dimensions = 1;
- while (realElemType.symbol() == defs.ARRAY_CLASS) {
- realElemType = realElemType.typeArgs()[0];
- ++dimensions;
- }
-
- if (isTrivial(elemType)) {
- Tree nameLit;
- if (basicTypes.containsKey(elemType))
- nameLit =
- gen.mkStringLit(pos, (String)basicTypes.get(elemType));
- else
- nameLit = gen.mkSymbolNameLit(pos, realElemType.symbol());
-
- Tree constr =
- gen.mkGlobalRef(pos, defs.JAVACLASSTYPE_JAVAARRAYTYPE());
- Tree[] args = new Tree[]{
- nameLit,
- gen.mkIntLit(pos, dimensions)
- };
- return gen.mkApply_V(constr, args);
- } else {
- Tree constr =
- gen.mkGlobalRef(pos,
- defs.JAVAREFARRAYTYPE_JAVAREFARRAYTYPE());
- Tree[] args = new Tree[]{
- typeAsValue(pos, elemType, owner, env),
- gen.mkIntLit(pos, dimensions)
- };
- return gen.mkApply_V(constr, args);
- }
- }
-
- private Tree javaClassType(int pos, Symbol sym) {
- Tree constr =
- gen.mkGlobalRef(pos, defs.JAVACLASSTYPE_JAVACLASSTYPE());
- Tree nameLit = gen.mkSymbolNameLit(pos, sym);
- Tree[] args = new Tree[] { nameLit };
- return gen.mkApply_V(constr, args);
- }
-
- private Tree thisType(int pos, Symbol sym) {
- Tree constr =
- gen.mkPrimaryConstructorGlobalRef(pos, defs.SINGLETYPE_CLASS);
- Tree[] args = new Tree[] { gen.This(pos, sym) };
- return gen.New(pos, gen.mkApply_V(constr, args));
- }
-
- private Tree singleType(int pos, Type.SingleType tp) {
- Tree constr =
- gen.mkPrimaryConstructorGlobalRef(pos, defs.SINGLETYPE_CLASS);
- Tree[] args = new Tree[] { gen.mkQualifier(pos, tp) };
- return gen.New(pos, gen.mkApply_V(constr, args));
- }
-
- private Tree compoundType(int pos,
- Type[] parts,
- Scope members,
- Symbol owner,
- TEnv env) {
- Tree[] partsT = new Tree[parts.length];
- for (int i = 0; i < parts.length; ++i)
- partsT[i] = typeAsValue(pos, parts[i], owner, env);
-
- Tree[] constrArgs = new Tree[] {
- gen.mkNewArray(pos, defs.CLASSTYPE_TYPE(), partsT, owner),
- gen.mkBooleanLit(pos, members.isEmpty())
- };
- Tree constr =
- gen.mkPrimaryConstructorGlobalRef(pos,
- defs.COMPOUNDTYPE_CLASS);
- return gen.New(pos, gen.mkApply_V(constr, constrArgs));
- }
-
- private Tree scalaClassType(int pos, Type tp, Symbol owner, TEnv env) {
- if (isStronglyTrivial(tp))
- return javaClassType(pos, tp.symbol());
-
- switch (tp) {
- case TypeRef(Type pre, Symbol sym, Type[] args):
- Symbol insSym = getInstMethSym(sym);
- Tree preFun = (isNestedClass(sym) && sym.owner().isClass())
- ? gen.Select(pos, gen.mkQualifier(pos, pre), insSym)
- : gen.Ident(pos, insSym);
-
- Tree insArg;
- int[] perm = typeParamsPermutation(sym.typeParams());
- Symbol[] permArgs = new Symbol[args.length];
- for (int i = 0; i < args.length; ++i)
- permArgs[i] = args[perm[i]].symbol();
-
- if (env.definesVarArray(permArgs))
- insArg = env.treeForVarArray(permArgs);
- else {
- Tree[] tps = new Tree[args.length];
- for (int i = 0; i < args.length; ++i)
- tps[i] = typeAsValue(pos, args[perm[i]], owner, env);
- insArg = gen.mkNewArray(pos, defs.TYPE_TYPE(), tps, owner);
- }
-
- return gen.mkApply_V(pos, preFun, new Tree[] { insArg });
-
- default:
- throw Debug.abort("unexpected type: ", tp);
- }
- }
-
- private final int VARIANT =
- Modifiers.COVARIANT | Modifiers.CONTRAVARIANT;
-
- /**
- * Compute the (unique) permutation which puts all invariant
- * type parameters first, followed by the contravariant ones,
- * then the covariants, preserving the relative ordering of
- * arguments with same variance.
- */
- private int[] typeParamsPermutation(Symbol[] params) {
- int[] tparamsPerm = new int[params.length];
- int permIdx = 0;
-
- for (int i = 0; i < params.length; ++i)
- if ((params[i].flags & VARIANT) == 0)
- tparamsPerm[permIdx++] = i;
- for (int i = 0; i < params.length; ++i)
- if ((params[i].flags & Modifiers.CONTRAVARIANT) != 0)
- tparamsPerm[permIdx++] = i;
- for (int i = 0; i < params.length; ++i)
- if ((params[i].flags & Modifiers.COVARIANT) != 0)
- tparamsPerm[permIdx++] = i;
- assert permIdx == tparamsPerm.length;
-
- return tparamsPerm;
- }
-
- private boolean isValuePrefix(Type pre) {
- switch (pre) {
- case ThisType(Symbol clazz):
- return !(clazz.isPackage() || clazz.isNone());
- case NoPrefix:
- return false;
- default:
- return true;
- }
- }
-
- private Ancestor[][] computeAncestors0(Symbol classSym) {
- Symbol[] nstParents = notStronglyTrivialParents(classSym);
- int level = level(classSym);
- ArrayList/*<Ancestor>*/[] ancestor = new ArrayList[level + 1];
-
- for (int l = 0; l < ancestor.length; ++l)
- ancestor[l] = new ArrayList();
-
- if (!isTrivial(classSym.type()))
- ancestor[level].add(new Ancestor(classSym, -1, -1));
-
- // Go over parents from left to right and add missing
- // ancestors to the set, remembering where they come from.
- for (int p = 0; p < nstParents.length; ++p) {
- Symbol parentSymbol = nstParents[p];
- Ancestor[][] parentAncestors = computeAncestors(parentSymbol);
- assert parentAncestors.length <= ancestor.length;
-
- for (int l = 0; l < parentAncestors.length; ++l) {
- ArrayList/*<Ancestor>*/ myRow = ancestor[l];
- Ancestor[] parentRow = parentAncestors[l];
- parentRowLoop:
- for (int i = 0; i < parentRow.length; ++i) {
- Symbol sym = parentRow[i].symbol;
- assert !isTrivial(sym.type()) : sym;
-
- Iterator myRowIt = myRow.iterator();
- while (myRowIt.hasNext()) {
- Ancestor myAncestor = (Ancestor)myRowIt.next();
- if (myAncestor.symbol == sym)
- continue parentRowLoop;
- }
- myRow.add(new Ancestor(sym, p, i));
- }
- }
- }
-
- int ancestorsLen = ancestor.length;
- while (ancestorsLen > 0 && ancestor[ancestorsLen - 1].isEmpty())
- --ancestorsLen;
-
- Ancestor[][] finalAncestor = new Ancestor[ancestorsLen][];
- for (int i = 0; i < finalAncestor.length; ++i) {
- finalAncestor[i] = (Ancestor[])
- ancestor[i].toArray(new Ancestor[ancestor[i].size()]);
- }
-
- return finalAncestor;
- }
-
- /** Return the non-trivial ancestors of the class */
- private Ancestor[][] computeAncestors(Symbol classSym) {
- Ancestor[][] ancestor = (Ancestor[][])ancestorCache.get(classSym);
- if (ancestor == null) {
- ancestor = computeAncestors0(classSym);
- ancestorCache.put(classSym, ancestor);
-// debugPrintAncestor(classSym, ancestor);
- }
- return ancestor;
- }
-
- /** Return the parents which are not strongly trivial. */
- private Symbol[] notStronglyTrivialParents(Symbol classSym) {
- Type[] parentTypes = classSym.parents();
- ArrayList nstParents = new ArrayList(parentTypes.length);
- for (int i = 0; i < parentTypes.length; ++i) {
- if (!isStronglyTrivial(parentTypes[i]))
- nstParents.add(parentTypes[i].symbol());
- }
- return (Symbol[])
- nstParents.toArray(new Symbol[nstParents.size()]);
- }
-
- private int[] getAncestorCode(Ancestor[][] ancestor) {
- ArrayList/*<Ancestor>*/[] prunedRows =
- new ArrayList[ancestor.length];
-
- int totalSize = 0;
- for (int l = 0; l < ancestor.length; ++l) {
- Ancestor[] row = ancestor[l];
- ArrayList/*<Ancestor>*/ prunedRow = new ArrayList(row.length);
- for (int i = 0; i < row.length; ++i) {
- if (row[i].parentIndex > 0)
- prunedRow.add(row[i]);
- }
- prunedRows[l] = prunedRow;
- if (!prunedRow.isEmpty())
- totalSize += 2 + 2 * prunedRow.size();
- }
-
- int[] res = new int[totalSize];
- int i = 0;
- for (int l = 0; l < prunedRows.length; ++l) {
- ArrayList row = prunedRows[l];
- if (!row.isEmpty()) {
- res[i++] = l;
- res[i++] = row.size();
- Iterator ancIt = row.iterator();
- while (ancIt.hasNext()) {
- Ancestor anc = (Ancestor)ancIt.next();
- res[i++] = anc.parentIndex;
- res[i++] = anc.position;
- }
- }
- }
- assert i == totalSize;
- return res;
- }
- }
-
- /**
- * Minimalistic transformer, which simply transforms calls to
- * isInstanceOf/asInstanceOf by calls to their erased
- * counterparts. Used when full run time types are disabled.
- */
- private class TV_MiniTransformer extends GenTransformer {
- private final Definitions defs;
-
- public TV_MiniTransformer(Global global) {
- super(global);
- defs = global.definitions;
- }
-
- public Tree transform(Tree tree) {
- switch (tree) {
- case Apply(TypeApply(Tree fun, Tree[] targs), Tree[] vargs):
- Symbol funSym = fun.symbol();
- if (funSym == defs.ANY_IS || funSym == defs.ANY_AS) {
- assert vargs.length == 0;
- Symbol erasedSym = (funSym == defs.ANY_AS)
- ? defs.ANY_AS_ERASED
- : defs.ANY_IS_ERASED;
- return gen.mkApplyTV(tree.pos,
- gen.Select(fun.pos,
- transform(qualifierOf(fun)),
- erasedSym),
- targs,
- vargs);
- } else
- return super.transform(tree);
-
- default:
- return super.transform(tree);
- }
- }
- }
-
- /**
- * Extract qualifier from a tree, which must be a Select node.
- */
- private Tree qualifierOf(Tree tree) {
- switch (tree) {
- case Select(Tree qualifier, _): return qualifier;
- default: throw Debug.abort("cannot extract qualifier from ", tree);
- }
- }
-
- // Debugging function
- private void debugPrintAncestor(Symbol sym, Ancestor[][] ancestor) {
- System.out.println("ancestor for " + Debug.show(sym));
- for (int l = 0; l < ancestor.length; ++l) {
- System.out.print(" [" + l + "] ");
- for (int i = 0; i < ancestor[l].length; ++i) {
- if (i > 0)
- System.out.print(" ");
- System.out.println(" " + Debug.show(ancestor[l][i].symbol)
- + "/par" + ancestor[l][i].parentIndex
- + "/pos" + ancestor[l][i].position);
- }
- if (ancestor[l].length == 0)
- System.out.println("<empty>");
- }
- }
-
- //////////////////////////////////////////////////////////////////////
-
- private static class TEnv {
- public boolean definesVar(Symbol sym) {
- return false;
- }
- public Tree treeForVar(Symbol sym) {
- throw Debug.abort("no tree for variable " + sym);
- }
- public boolean definesVarArray(Symbol[] syms) {
- return false;
- }
- public Tree treeForVarArray(Symbol[] syms) {
- throw Debug.abort("no tree for variable array " + syms);
- }
- }
-
- private static class Ancestor {
- public static final Ancestor[] EMPTY_ARRAY = new Ancestor[0];
-
- public final Symbol symbol;
- public final int parentIndex;
- public final int position;
-
- public Ancestor(Symbol symbol, int parentIndex, int position) {
- this.symbol = symbol;
- this.parentIndex = parentIndex;
- this.position = position;
- }
- }
-}
diff --git a/sources/scalac/transformer/WholeProgPhase.java b/sources/scalac/transformer/WholeProgPhase.java
deleted file mode 100644
index 7591352c21..0000000000
--- a/sources/scalac/transformer/WholeProgPhase.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.transformer;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-
-/**
- * This class represents the wholeprog phase for the java version of
- * the compiler. It doesn't do anything but permit to make a bridge
- * between the java implementation of Socos and the scala one. See
- * scala.tools.scalac.wholeprog.WholeProgPhase for implementation.
- */
-public abstract class WholeProgPhase extends Phase {
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public WholeProgPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/typechecker/AnalyzerPhase.java b/sources/scalac/typechecker/AnalyzerPhase.java
deleted file mode 100644
index 517d4713dc..0000000000
--- a/sources/scalac/typechecker/AnalyzerPhase.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.typechecker;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.ast.TreeGen;
-import scalac.symtab.Definitions;
-import scalac.symtab.Symbol;
-
-
-public abstract class AnalyzerPhase extends Phase {
-
- public final TreeGen gen;
-
- /** Initializes this instance. */
- public AnalyzerPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- global.definitions = new Definitions(global);
- this.gen = new TreeGen(global, global.make);
- }
-
- public abstract void addConsoleImport(Symbol module);
-
-}
diff --git a/sources/scalac/typechecker/Infer.java b/sources/scalac/typechecker/Infer.java
deleted file mode 100644
index 528ca7b47d..0000000000
--- a/sources/scalac/typechecker/Infer.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.typechecker;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-public abstract class Infer {
-
- /** throw a type error if arguments not within bounds.
- */
- public abstract void checkBounds(Symbol[] tparams, Type[] targs, String prefix);
-
-
- public abstract Type skipViewParams(Symbol[] tparams, Type tp);
-
-}
diff --git a/sources/scalac/util/AbstractFileReader.java b/sources/scalac/util/AbstractFileReader.java
deleted file mode 100644
index bf3d6f437d..0000000000
--- a/sources/scalac/util/AbstractFileReader.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.util;
-
-import java.io.IOException;
-
-import scala.tools.util.AbstractFile;
-
-public class AbstractFileReader {
-
- /** the buffer containing the file
- */
- public byte[] buf;
-
- /** the current input pointer
- */
- public int bp;
-
- /** the file path name
- */
- public final String path;
-
- /** constructor
- */
- public AbstractFileReader(AbstractFile f) throws IOException {
- buf = f.read();
- bp = 0;
- path = f.getPath();
- }
-
- /** return byte at offset 'pos'
- */
- public byte byteAt(int pos) {
- return buf[pos];
- }
-
- /** read a byte
- */
- public byte nextByte() {
- return buf[bp++];
- }
-
- /** read some bytes
- */
- public byte[] nextBytes(int len) {
- byte[] res = new byte[len];
- System.arraycopy(buf, bp, res, 0, len);
- bp += len;
- return res;
- }
-
- /** read a character
- */
- public char nextChar() {
- return
- (char)(((buf[bp++] & 0xff) << 8) +
- (buf[bp++] & 0xff));
- }
-
- /** read an integer
- */
- public int nextInt() {
- return ((buf[bp++] & 0xff) << 24) +
- ((buf[bp++] & 0xff) << 16) +
- ((buf[bp++] & 0xff) << 8) +
- (buf[bp++] & 0xff);
- }
-
- /** extract a character at position bp from buf
- */
- public char getChar(int mybp) {
- return (char)(((buf[mybp] & 0xff) << 8) + (buf[mybp+1] & 0xff));
- }
-
- /** extract an integer at position bp from buf
- */
- public int getInt(int mybp) {
- return ((buf[mybp ] & 0xff) << 24) +
- ((buf[mybp+1] & 0xff) << 16) +
- ((buf[mybp+2] & 0xff) << 8) +
- (buf[mybp+3] & 0xff);
- }
-
- /** extract a long integer at position bp from buf
- */
- public long getLong(int mybp) {
- return ((long)(getInt(mybp)) << 32) + (getInt(mybp + 4) & 0xffffffffL);
- }
-
- /** extract a float at position bp from buf
- */
- public strictfp float getFloat(int mybp) {
- return Float.intBitsToFloat(getInt(mybp));
- }
-
- /** extract a double at position bp from buf
- */
- public strictfp double getDouble(int mybp) {
- return Double.longBitsToDouble(getLong(mybp));
- }
-
- /** skip next 'n' bytes
- */
- public void skip(int n) {
- bp += n;
- }
-}
diff --git a/sources/scalac/util/ArrayApply.java b/sources/scalac/util/ArrayApply.java
deleted file mode 100644
index 087278af5b..0000000000
--- a/sources/scalac/util/ArrayApply.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-public abstract class ArrayApply {
-
- //########################################################################
- // Arrays interface - Object
-
- public static String toString(Object[] src) {
- return append(new StringBuffer(), src).toString();
- }
-
- public static String toString(Object[] src, String infix) {
- return append(new StringBuffer(), src, infix).toString();
- }
-
- public static String toString(Object[] src, String prefix, String infix,
- String suffix)
- {
- return append(new StringBuffer(), src, prefix,infix,suffix).toString();
- }
-
- //########################################################################
- // Arrays interface - StringBuffer
-
- public static StringBuffer append(StringBuffer buffer, Object[] src) {
- return append(buffer, src, "[", ",", "]");
- }
-
- public static StringBuffer append(StringBuffer buffer, Object[] src,
- String infix)
- {
- return append(buffer, src, "", infix, "");
- }
-
- public static StringBuffer append(StringBuffer buffer, Object[] src,
- String prefix, String infix, String suffix)
- {
- buffer.append(prefix);
- for (int i = 0; i < src.length; i++) {
- if (i > 0) buffer.append(infix);
- buffer.append(src[i]);
- }
- buffer.append(suffix);
- return buffer;
- }
-}
diff --git a/sources/scalac/util/Debug.java b/sources/scalac/util/Debug.java
deleted file mode 100644
index 3e889beb62..0000000000
--- a/sources/scalac/util/Debug.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2005, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import scala.tools.util.debug.Debugger;
-import scala.tools.util.debug.ToStringDebugger;
-
-import scalac.Global;
-import scalac.ast.Tree;
-import scalac.symtab.Modifiers;
-import scalac.symtab.Scope;
-import scalac.symtab.Symbol;
-import scalac.symtab.Type;
-
-/**
- * Debugging class, used e.g. to obtain string representations of
- * compiler data structures that are not "pretty-printed" and thus
- * easier to relate to the source code.
- *
- * All methods are static to be easily useable in any context.
- *
- * @author Michel Schinz
- * @version 1.0
- */
-public class Debug extends scala.tools.util.debug.Debug {
-
- //########################################################################
- // Private Initialization
-
- /**
- * Forces the initialization of this class. Returns the boolean
- * value true so that it can be invoked from an assert statement.
- */
- public static boolean initialize() {
- // nothing to do, everything is done in the static initializer
- return true;
- }
-
- static {
- addDebugger(new ToStringDebugger(Tree.class));
- addDebugger(new ToStringDebugger(Type.class));
- addDebugger(SymbolDebugger.object);
- addDebugger(ScopeDebugger.object);
- }
-
- //########################################################################
- // Public Methods - Logging
-
- public static boolean log(Object a) {
- return logAll(new Object[] {a});
- }
-
- public static boolean log(Object a, Object b) {
- return logAll(new Object[] {a, b});
- }
-
- public static boolean log(Object a, Object b, Object c) {
- return logAll(new Object[] {a, b, c});
- }
-
- public static boolean log(Object a, Object b, Object c, Object d) {
- return logAll(new Object[] {a, b, c, d});
- }
-
- public static boolean logAll(Object[] args) {
- return Global.instance.log(showAll(args, null));
- }
-
- //########################################################################
- // showTree
-
- private static void append(StringBuffer buf, Name[] names) {
- for (int i = 0; i < names.length; i++) {
- if (i > 0) buf.append(",");
- append(buf, names[i]);
- }
- }
-
- private static void append(StringBuffer buf, Name name) {
- buf.append("\"" + name + '"');
- }
-
- private static void append(StringBuffer buf, String str) {
- buf.append("\"" + str + '"');
- }
-
- private static void append(StringBuffer buf, Tree[] trees, boolean showType) {
- buf.append('[');
- for (int i = 0; i < trees.length; i++) {
- if (i > 0) buf.append(',');
- append(buf, trees[i], showType);
- }
- buf.append(']');
- }
-
- private static void append(StringBuffer buf, Tree[][] trees) {
- for (int i = 0; i < trees.length; i++) {
- buf.append('[');
- append(buf, trees[i]);
- buf.append(']');
- }
- }
-
- private static void append(StringBuffer buf, Tree tree, boolean showType) {
- switch (tree) {
- case Empty:
- buf.append("Empty(");
- break;
- case Attributed(Tree attribute, Tree definition):
- buf.append("Attributed(");
- append(buf, attribute);
- buf.append(',');
- append(buf, definition);
- break;
- case DocDef(String comment, Tree definition):
- buf.append("DocDef(");
- append(buf, comment);
- buf.append(',');
- append(buf, definition);
- break;
- case ClassDef(int mods, Name name, Tree.AbsTypeDef[] tparams,
- Tree.ValDef[][] vparams, Tree tpe, Tree.Template impl):
- buf.append("ClassDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, tparams);
- buf.append(',');
- append(buf, vparams);
- buf.append(',');
- append(buf, tpe);
- buf.append(',');
- append(buf, impl);
- break;
- case PackageDef(Tree packaged, Tree.Template impl):
- buf.append("PackageDef(");
- append(buf, packaged);
- buf.append(',');
- append(buf, impl);
- break;
- case ModuleDef(int mods, Name name, Tree tpe, Tree.Template impl):
- buf.append("ModuleDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, tpe);
- buf.append(',');
- append(buf, impl);
- break;
- case ValDef(int mods, Name name, Tree tpe, Tree rhs):
- buf.append("ValDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, tpe, showType);
- buf.append(',');
- append(buf, rhs, showType);
- break;
- case PatDef(int mods, Tree pat, Tree rhs):
- buf.append("PatDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, pat);
- buf.append(',');
- append(buf, rhs);
- break;
- case DefDef(int mods, Name name, Tree.AbsTypeDef[] tparams,
- Tree.ValDef[][] vparams, Tree tpe, Tree rhs):
- buf.append("DefDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, tparams);
- buf.append(',');
- append(buf, vparams);
- buf.append(',');
- append(buf, tpe);
- buf.append(',');
- append(buf, rhs);
- break;
- case AbsTypeDef(int mods, Name name, Tree rhs, Tree lobound):
- buf.append("AbsTypeDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, rhs);
- buf.append(',');
- append(buf, lobound);
- break;
- case AliasTypeDef(int mods, Name name, Tree.AbsTypeDef[] tparams, Tree rhs):
- buf.append("AliasTypeDef(");
- Modifiers.Helper.toString(buf, mods);
- buf.append(',');
- append(buf, name);
- buf.append(',');
- append(buf, tparams);
- buf.append(',');
- append(buf, rhs);
- break;
- case Import(Tree expr, Name[] selectors):
- buf.append("Import(");
- append(buf, expr);
- buf.append(",");
- append(buf, selectors);
- break;
- case CaseDef(Tree pat, Tree guard, Tree body):
- buf.append("CaseDef(");
- buf.append(",");
- append(buf, pat);
- buf.append(",");
- append(buf, guard);
- buf.append(",");
- append(buf, body);
- break;
- case Template(Tree[] parents, Tree[] body):
- buf.append("Template(");
- append(buf, parents);
- buf.append(',');
- append(buf, body);
- break;
- case LabelDef(Name name, Tree.Ident[] params, Tree rhs):
- buf.append("LabelDef(");
- buf.append(",");
- append(buf, name);
- buf.append(',');
- append(buf, params);
- buf.append(',');
- append(buf, rhs);
- break;
- case Block(Tree[] stats, Tree expr):
- buf.append("Block(");
- append(buf, stats);
- buf.append(',');
- append(buf, expr);
- break;
- case Sequence(Tree[] trees):
- buf.append("Sequence(");
- buf.append(',');
- append(buf, trees);
- break;
- case Alternative(Tree[] trees):
- buf.append("Alternative(");
- buf.append(',');
- append(buf, trees);
- break;
- case Bind(Name name, Tree rhs):
- buf.append("Bind(");
- append(buf, name);
- buf.append(',');
- append(buf, rhs);
- break;
- case Visitor(Tree.CaseDef[] cases):
- buf.append("ClassDef(");
- append(buf, cases);
- break;
- case Function(Tree.ValDef[] vparams, Tree body):
- buf.append("Function(");
- append(buf, vparams);
- buf.append(',');
- append(buf, body);
- break;
- case Assign(Tree lhs, Tree rhs):
- buf.append("Assign(");
- append(buf, lhs);
- buf.append(',');
- append(buf, rhs);
- break;
- case If(Tree cond, Tree thenp, Tree elsep):
- buf.append("If(");
- append(buf, cond);
- buf.append(',');
- append(buf, thenp);
- buf.append(',');
- append(buf, elsep);
- break;
- case Switch(Tree test, int[] tags, Tree[] bodies, Tree otherwise):
- buf.append("Switch(");
- buf.append(',');
- append(buf, test);
- buf.append(',');
- buf.append(tags); // TODO
- buf.append(',');
- append(buf, bodies);
- buf.append(",");
- append(buf, otherwise);
- break;
- case Return(Tree expr):
- buf.append("Return(");
- append(buf, expr, showType);
- buf.append(')');
- break;
- case Throw(Tree expr):
- buf.append("Throw(");
- append(buf, expr, showType);
- break;
- case New(Tree init):
- buf.append("New(");
- append(buf, init, showType);
- break;
- case Create(Tree qualifier, Tree[] targs):
- buf.append("Create(");
- append(buf, qualifier);
- buf.append(',');
- append(buf, targs);
- break;
- case Typed(Tree expr, Tree tpe):
- buf.append("Typed(");
- append(buf, expr, showType);
- buf.append(",");
- append(buf, tpe, showType);
- break;
- case TypeApply(Tree fun, Tree[] args):
- buf.append("TypeApply(");
- append(buf, fun, showType);
- buf.append(',');
- append(buf, args, showType);
- break;
- case Apply(Tree fun, Tree[] args):
- buf.append("Apply(");
- append(buf, fun, showType);
- buf.append(',');
- append(buf, args, showType);
- break;
- case Super(Name qualifier, Name mixin):
- buf.append("Super(");
- append(buf, qualifier);
- buf.append(',');
- append(buf, mixin);
- break;
- case This(Name qualifier):
- buf.append("This(");
- append(buf, qualifier);
- break;
- case Select(Tree qualifier, Name selector):
- buf.append("Select(");
- append(buf, qualifier, showType);
- buf.append(',');
- append(buf, selector);
- break;
- case Ident(Name name):
- buf.append("Ident(");
- append(buf, name);
- break;
- case Literal(scalac.atree.AConstant value):
- buf.append("Literal(" + value);
- break;
- case TypeTerm():
- buf.append("TypeTerm(");
- break;
- case SingletonType(Tree ref):
- buf.append("SingletonType(");
- append(buf, ref, showType);
- break;
- case SelectFromType(Tree qualifier, Name selector):
- buf.append("SelectFromType(");
- append(buf, qualifier, showType);
- buf.append(',');
- append(buf, selector);
- break;
- case FunType(Tree[] argtpes, Tree restpe):
- buf.append("FunType(");
- append(buf, argtpes);
- buf.append(',');
- append(buf, restpe);
- break;
- case CompoundType(Tree[] parents, Tree[] refinements):
- buf.append("CompoundType(");
- append(buf, parents);
- buf.append(',');
- append(buf, refinements);
- break;
- case AppliedType(Tree tpe, Tree[] args):
- buf.append("AppliedType(");
- append(buf, tpe);
- buf.append(',');
- append(buf, args);
- break;
- case Try(Tree block, Tree catcher, Tree finalizer):
- buf.append("Try(");
- append(buf, block);
- buf.append(',');
- append(buf, catcher);
- buf.append(',');
- append(buf, finalizer);
- break;
- default:
- buf.append(tree.getClass().getName() + "(");
- }
- buf.append(')');
- if (showType) buf.append(":" + tree.type);
- }
-
- public static String showTree(Tree tree, boolean showType) {
- StringBuffer buf = new StringBuffer();
- append(buf, tree, showType);
- return buf.toString();
- }
-
- public static String showTree(Tree tree) {
- return showTree(tree, false);
- }
-
- public static String showTree(Tree[] trees, boolean showType) {
- StringBuffer buf = new StringBuffer();
- append(buf, trees, showType);
- return buf.toString();
- }
-
- public static String showTree(Tree[] trees) {
- return showTree(trees, false);
- }
-
- //########################################################################
-}
-
-/** This class implements a debugger for symbols. */
-public class SymbolDebugger implements Debugger {
-
- //########################################################################
- // Public Constants
-
- /** The unique instance of this class. */
- public static final SymbolDebugger object = new SymbolDebugger();
-
- //########################################################################
- // Protected Constructors
-
- /** Initializes this instance. */
- protected SymbolDebugger() {}
-
- //########################################################################
- // Public Methods
-
- public boolean canAppend(Object object) {
- return object instanceof Symbol;
- }
-
- public void append(StringBuffer buffer, Object object) {
- Symbol symbol = (Symbol)object;
- if (!symbol.isNone() && !symbol.owner().isRoot() && !symbol.isRoot()) {
- Debug.append(buffer, symbol.owner());
- buffer.append(".");
- }
- buffer.append(symbol.name);
- if (Global.instance.uniqid) {
- buffer.append('#');
- buffer.append(symbol.id);
- }
- if (symbol.isConstructor()) {
- buffer.append('(');
- buffer.append(symbol.constructorClass().name);
- buffer.append(')');
- }
- }
-
- //########################################################################
-}
-
-/** This class implements a debugger for scopes. */
-public class ScopeDebugger implements Debugger {
-
- //########################################################################
- // Public Constants
-
- /** The unique instance of this class. */
- public static final ScopeDebugger object = new ScopeDebugger();
-
- //########################################################################
- // Protected Constructors
-
- /** Initializes this instance. */
- protected ScopeDebugger() {}
-
- //########################################################################
- // Public Methods
-
- public boolean canAppend(Object object) {
- return object instanceof Scope;
- }
-
- public void append(StringBuffer buffer, Object object) {
- Scope scope = (Scope)object;
- buffer.append('{');
- for (Scope.SymbolIterator i = scope.iterator(); i.hasNext();) {
- Debug.append(buffer, i.next());
- if (i.hasNext()) buffer.append(',');
- }
- buffer.append('}');
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/EmptyPhase.java b/sources/scalac/util/EmptyPhase.java
deleted file mode 100644
index 5600fc85b9..0000000000
--- a/sources/scalac/util/EmptyPhase.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import scalac.Global;
-import scalac.Phase;
-import scalac.PhaseDescriptor;
-import scalac.CompilationUnit;
-
-/** This class implements a phase that does nothing. */
-public class EmptyPhase extends Phase {
-
- //########################################################################
- // Public Constructors
-
- /** Initializes this instance. */
- public EmptyPhase(Global global, PhaseDescriptor descriptor) {
- super(global, descriptor);
- }
-
- //########################################################################
- // Public Methods
-
- /** Applies this phase to the given compilation unit. */
- public void apply(CompilationUnit unit) {
- // do nothing
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/FreshNameCreator.java b/sources/scalac/util/FreshNameCreator.java
deleted file mode 100644
index 3675f359f0..0000000000
--- a/sources/scalac/util/FreshNameCreator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import java.util.HashMap;
-
-public class FreshNameCreator {
-
- protected int counter = 0;
- protected HashMap counters = new HashMap();
-
- /**
- * Create a fresh name with the given prefix. It is guaranteed
- * that the returned name has never been returned by a previous
- * call to this function with the same separator character (which
- * has to be a non-digit).
- */
- public Name newName(String prefix, char separator) {
- prefix += separator;
- Integer ival = (Integer)counters.get(prefix);
- if (ival == null)
- counters.put(prefix, ival = new Integer(0));
- else
- counters.put(prefix, ival = new Integer(ival.intValue() + 1));
- return Name.fromString(prefix + ival);
- }
-
- /** Same, with `$' as the separator character
- */
- public Name newName(String prefix) {
- return newName(prefix, '$');
- }
-
- /** Same, but with a name as prefix. The new name is a type
- * (respectively, constructor) name if the prefix is one.
- */
- public Name newName(Name prefixName, char separator) {
- Name name = newName(prefixName.toString(), separator);
- if (prefixName.isTypeName()) return name.toTypeName();
- else return name;
- }
-
- /** Same, with `$' as the separator character
- */
- public Name newName(Name prefix) {
- return newName(prefix, '$');
- }
-
- public Name newName() {
- return Name.fromString("$" + (counter++) + "$");
- }
-}
diff --git a/sources/scalac/util/Name.java b/sources/scalac/util/Name.java
deleted file mode 100644
index af088d6f79..0000000000
--- a/sources/scalac/util/Name.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-/** This class implements the common part of TermName and TypeName. */
-public abstract class Name {
-
- //########################################################################
- // Public Fields
-
- /** The unique identifier */
- public final int index;
-
- //########################################################################
- // Private Fields
-
- /** The related term name */
- private final TermName term;
-
- /** The related type name (null if not yet created) */
- private TypeName type;
-
- //########################################################################
- // Protected Constructors
-
- /** Initializes this instance. */
- protected Name(int index, TermName term) {
- this.index = index;
- this.term = term == null ? (TermName)this : term;
- this.type = term == null ? null : (TypeName)this;
- }
-
- //########################################################################
- // Public Factories
-
- /** Returns the term name with given ASCII representation. */
- public static TermName fromAscii(byte[] bytes, int start, int count) {
- return TermName.fromAscii(bytes, start, count);
- }
-
- /** Returns the term name with given string representation. */
- public static TermName fromString(String string) {
- return TermName.fromString(string);
- }
-
- //########################################################################
- // Public Methods
-
- /** Is this name a variable identifier? */
- public final boolean isVariable() {
- char first = charAt(0);
- return (('a' <= first && first <= 'z') || first == '_')
- && this != Names.false_
- && this != Names.true_
- && this != Names.null_;
- }
-
- /** Is this name a term name? */
- public final boolean isTermName() {
- return this == term;
- }
-
- /** Is this name a type name? */
- public final boolean isTypeName() {
- return this == type;
- }
-
- /** Returns the term name with the same representation. */
- public final TermName toTermName() {
- return term;
- }
-
- /** Returns the type name with the same representation. */
- public final TypeName toTypeName() {
- return type != null ? type : (type = new TypeName(term));
- }
-
- /** Returns the result of "toString().length()". */
- public final int length() {
- return toString().length();
- }
-
- /** Returns the result of "toString().charAt(index)". */
- public final char charAt(int index) {
- return toString().charAt(index);
- }
-
- /** Returns the result of "toString().indexOf(ch)". */
- public final int indexOf(char ch) {
- return toString().indexOf(ch);
- }
-
- /** Returns the result of "toString().indexOf(ch, start)". */
- public final int indexOf(char ch, int start) {
- return toString().indexOf(ch, start);
- }
-
- /** Returns the result of "toString().lastIndexOf(ch)". */
- public final int lastIndexOf(char ch) {
- return toString().lastIndexOf(ch);
- }
-
- /** Returns the result of "toString().lastIndexOf(ch, start)". */
- public final int lastIndexOf(char ch, int start) {
- return toString().lastIndexOf(ch, start);
- }
-
- /** Returns the hash code of this name. */
- public final int hashCode() {
- return index;
- }
-
- /** Returns the string representation of this name. */
- public String toString() {
- return term.toString();
- }
-
- /**
- * Returns the ASCII representation of this name. The returned
- * array is not a copy. Therefore, it is forbidden to modify it.
- */
- public byte[] toAsciiUnsafe() {
- return term.toAsciiUnsafe();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/NameTransformer.java b/sources/scalac/util/NameTransformer.java
deleted file mode 100644
index b04b665379..0000000000
--- a/sources/scalac/util/NameTransformer.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-** **
-** $Id$
-\* */
-
-package scalac.util;
-
-/** A name transformer for replacing operator symbols in names by predefined
- * names of the form $opname.
- *
- * @author Martin Odersky, Christine Roeckl
- * @version 1.1
- */
-public class NameTransformer {
-
- public static String[] operatorName = new String[128];
-
- static {
- operatorName['~'] = "$tilde";
- operatorName['='] = "$eq";
- operatorName['<'] = "$less";
- operatorName['>'] = "$greater";
- operatorName['!'] = "$bang";
- operatorName['#'] = "$hash";
- operatorName['%'] = "$percent";
- operatorName['^'] = "$up";
- operatorName['&'] = "$amp";
- operatorName['|'] = "$bar";
- operatorName['*'] = "$times";
- operatorName['/'] = "$div";
- operatorName['+'] = "$plus";
- operatorName['-'] = "$minus";
- operatorName[':'] = "$colon";
- operatorName['\\']= "$bslash";
- }
-
- /** Replace operator symbols by corresponding "$op_name" in names.
- */
- public static Name encode(Name name) {
- String string = name.toString();
- StringBuffer buffer = null;
- for (int i = 0; i < string.length(); i++) {
- char c = string.charAt(i);
- if (c < 128) {
- String operator = operatorName[c];
- if (operator != null) {
- if (buffer == null) {
- int capacity = string.length() - 1 + operator.length();
- buffer = new StringBuffer(capacity);
- buffer.append(string.substring(0, i));
- }
- buffer.append(operator);
- continue;
- }
- }
- if (buffer != null) buffer.append(c);
- }
- return buffer == null ? name : Name.fromString(buffer.toString());
- }
-
- /** Replace "$op_name" by corresponding operator symbols in names.
- */
- public static String decode(Name name) {
- return decode(name.toString());
- }
- public static String decode(String string) {
- StringBuffer buffer = null;
- for (int i = 0; i < string.length(); i++) {
- char c = string.charAt(i);
- if (c == '$') {
- int index = -1;
- int length = -1; // an operator may be a prefix of another one
- for (int j = 0; j < operatorName.length; j++) {
- String operator = operatorName[j];
- if (operator == null) continue;
- if (operator.length() <= length) continue;
- if (!string.startsWith(operator, i)) continue;
- index = j;
- length = operator.length();
- }
- if (length >= 0) {
- if (buffer == null) {
- int capacity = string.length() - length + 1;
- buffer = new StringBuffer(capacity);
- buffer.append(string.substring(0, i));
- }
- buffer.append((char)index);
- i += length - 1;
- continue;
- }
- }
- if (buffer != null) buffer.append(c);
- }
- return buffer == null ? string : buffer.toString();
- }
-
-}
diff --git a/sources/scalac/util/Names.java b/sources/scalac/util/Names.java
deleted file mode 100644
index 66a67f819c..0000000000
--- a/sources/scalac/util/Names.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002-2004, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-**
-** $Id$
-\* */
-package scalac.util;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolNameWriter;
-import scalac.symtab.ClassSymbol;
-
-public class Names {
-
- private static final SymbolNameWriter writer =
- new SymbolNameWriter().setAllSeparators('$').setRootSeparator('\0');
-
- private static final String ALIAS_PREFIX = "alias$";
- private static final String LOCAL_PREFIX = "local$";
- private static final String MIXIN_PREFIX = "mixin$";
- private static final String OUTER_PREFIX = "outer$";
- private static final String SUPER_PREFIX = "super$";
- private static final String ACCESS_PREFIX = "access$";
- private static final String TUPLE_FIELD_PREFIX = "_";
- private static final String TYPE_PREFIX = "type$";
- private static final String INSTANTIATE_PREFIX = "instantiate$";
- private static final String LAZYPARENTS_PREFIX = "LazyParents$";
- private static final String TYPECONSTRUCTOR_PREFIX = "tConstructor$";
-
- public static Name ALIAS(ClassSymbol clasz) {
- return Name.fromString(ALIAS_PREFIX + clasz.name).toTypeName();
- }
-
- public static Name LOCAL(Symbol clasz) {
- return Name.fromString(LOCAL_PREFIX + clasz.name);
- }
-
- public static Name MIXIN(Symbol member) {
- Name name = Name.fromString(MIXIN_PREFIX + member.owner().name
- + (member.isInitializer() ? INLINED_INITIALIZER : member.name));
- if (member.name.isTypeName()) name = name.toTypeName();
- return name;
- }
-
- public static Name OUTER(Symbol constructor) {
- if (constructor.isClass())
- return Name.fromString(OUTER_PREFIX + constructor.owner().name);
- assert constructor.isConstructor(): Debug.show(constructor);
- Symbol clasz = constructor.constructorClass();
- Symbol[] constructors = clasz.allConstructors().alternativeSymbols();
- int index = 0;
- while (constructors[index] != constructor) index++;
- String name = OUTER_PREFIX + index +"$"+ clasz.owner().name;
- return Name.fromString(name);
- }
-
- public static Name OUTER(Symbol constructor, Symbol member) {
- Name name = Name.fromString(OUTER(constructor) + "$" + member.name);
- if (member.name.isTypeName()) name = name.toTypeName();
- return name;
- }
-
- public static Name ACCESS(Symbol member, boolean svper) {
- assert member.isTerm() && member.owner().isClass(): Debug.show(member);
- String prefix = svper ? ACCESS_PREFIX + SUPER_PREFIX : ACCESS_PREFIX;
- return Name.fromString(writer.toString(prefix, member));
- }
-
- public static Name TUPLE_FIELD(int index) {
- return Name.fromString(TUPLE_FIELD_PREFIX + index);
- }
-
- public static Name TYPE(Symbol sym) {
- return Name.fromString(TYPE_PREFIX + sym.name);
- }
-
- public static Name INSTANTIATE(Symbol sym, boolean isStatic) {
- return Name.fromString(INSTANTIATE_PREFIX
- + sym.name
- + (isStatic ? "$" : ""));
- }
-
- public static Name LAZYPARENTS(Symbol clsSym) {
- return Name.fromString(LAZYPARENTS_PREFIX + clsSym.name).toTypeName();
- }
-
- public static Name TYPECONSTRUCTOR(Symbol sym, boolean isStatic) {
- return Name.fromString(TYPECONSTRUCTOR_PREFIX
- + sym.name
- + (isStatic ? "$" : ""));
- }
-
- public static final Name ERROR = Name.fromString("<error>");
- public static final Name NOSYMBOL = Name.fromString("<none>");
- public static final Name EMPTY = Name.fromString("");
- public static final Name IMPORT_WILDCARD = Name.fromString("_");
- public static final Name PATTERN_WILDCARD = Name.fromString("_");
- public static final Name COMPOUND_NAME = Name.fromString("<ct>");
- public static final Name ANON_CLASS_NAME = Name.fromString("$anon");
- public static final Name ZERO = Name.fromString("<zero>");
- public static final Name STAR = Name.fromString("*");
- public static final Name ROOT = Name.fromString("<root>");
-
- public static final Name CONSTRUCTOR = Name.fromString("<init>");
- public static final Name CLASS_CONSTRUCTOR = Name.fromString("<clinit>");
- public static final Name INITIALIZER = Name.fromString("<init>");
- public static final Name INLINED_INITIALIZER = Name.fromString("$init$");
-
- public static final Name _EQ = encode("_=");
- public static final Name MINUS = encode("-");
- public static final Name PLUS = encode("+");
- public static final Name TILDE = encode("~");
- public static final Name EQEQ = encode("==");
- public static final Name BANG = encode("!");
- public static final Name BANGEQ = encode("!=");
- public static final Name BARBAR = encode("||");
- public static final Name AMPAMP = encode("&&");
- public static final Name COLONCOLON = encode("::");
- public static final Name PERCENT = encode("%");
- public static final Name PLUSEQ = encode("+=");
- public static final Name MINUSEQ = encode("-=");
-
- public static final Name All = Name.fromString("All");
- public static final Name AllRef = Name.fromString("AllRef");
- public static final Name Any = Name.fromString("Any");
- public static final Name AnyVal = Name.fromString("AnyVal");
- 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");
- public static final Name Do = Name.fromString("Do");
- public static final Name Double = Name.fromString("Double");
- public static final Name Element = Name.fromString("Element");
- public static final Name Finally = Name.fromString("Finally");
- public static final Name Float = Name.fromString("Float");
- public static final Name Function = Name.fromString("Function");
- public static final Name GetType = Name.fromString("GetType");
- public static final Name Int = Name.fromString("Int");
- public static final Name Labelled = Name.fromString("Labelled");
- public static final Name List = Name.fromString("List");
- public static final Name Long = Name.fromString("Long");
- public static final Name Nil = Name.fromString("Nil");
- public static final Name Object = Name.fromString("Object");
- public static final Name PartialFunction = Name.fromString("PartialFunction");
- public static final Name Predef = Name.fromString("Predef");
- public static final Name ScalaObject = Name.fromString("ScalaObject");
- public static final Name ScalaRunTime = Name.fromString("ScalaRunTime");
- public static final Name Seq = Name.fromString("Seq");
- public static final Name Short = Name.fromString("Short");
- public static final Name String = Name.fromString("String");
- public static final Name Symbol = Name.fromString("Symbol");
- public static final Name Text = Name.fromString("Text");
- public static final Name Throwable = Name.fromString("Throwable");
- public static final Name Try = Name.fromString("Try");
- public static final Name Tuple = Name.fromString("Tuple");
- public static final Name Type = Name.fromString("Type");
- public static final Name Tuple2 = Name.fromString("Tuple2");
- public static final Name Unit = Name.fromString("Unit");
- public static final Name While = Name.fromString("While");
- public static final Name apply = Name.fromString("apply");
- public static final Name array = Name.fromString("array");
- public static final Name asInstanceOf = Name.fromString("asInstanceOf");
- public static final Name asInstanceOfE = Name.fromString("asInstanceOf$erased");
- public static final Name box = Name.fromString("box");
- public static final Name caseArity = Name.fromString("caseArity");
- public static final Name caseElement = Name.fromString("caseElement");
- public static final Name cur = Name.fromString("cur"); // used in translation of automata
- public static final Name cast = Name.fromString("cast");
- public static final Name clone = Name.fromString("clone");
- public static final Name coerce = Name.fromString("coerce");
- public static final Name defaultValue = Name.fromString("defaultValue");
- public static final Name elem = Name.fromString("elem");
- public static final Name elements = Name.fromString("elements");
- public static final Name emptyArray = Name.fromString("EMPTY_ARRAY");
- public static final Name eq = Name.fromString("eq");
- public static final Name equals = Name.fromString("equals");
- public static final Name fail = Name.fromString("fail");
- public static final Name false_ = Name.fromString("false");
- public static final Name filter = Name.fromString("filter");
- public static final Name finalize = Name.fromString("finalize");
- public static final Name flatmap = Name.fromString("flatMap");
- public static final Name foreach = Name.fromString("foreach");
- public static final Name force = Name.fromString("force");
- public static final Name functionOuter = Name.fromString("FUNCTION_OUTER");
- public static final Name get = Name.fromString("get");
- public static final Name getClass = Name.fromString("getClass");
- public static final Name getInstantiation = Name.fromString("getInstantiation");
- public static final Name getScalaType = Name.fromString("getScalaType");
- public static final Name isInstance = Name.fromString("isInstance");
- public static final Name hashCode = Name.fromString("hashCode");
- public static final Name hasNext = Name.fromString("hasNext");
- public static final Name head = Name.fromString("head");
- public static final Name isInstanceOf = Name.fromString("isInstanceOf");
- public static final Name isInstanceOfE = Name.fromString("isInstanceOf$erased");
- public static final Name isDefinedAt = Name.fromString("isDefinedAt");
- public static final Name isEmpty = Name.fromString("isEmpty");
- public static final Name instantiate = Name.fromString("instantiate");
- public static final Name java = Name.fromString("java");
- public static final Name javaRefArrayType = Name.fromString("javaRefArrayType");
- public static final Name javaArrayType = Name.fromString("javaArrayType");
- public static final Name javaClassType = Name.fromString("javaClassType");
- public static final Name lang = Name.fromString("lang");
- 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 ne = Name.fromString("ne");
- 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 notify = Name.fromString("notify");
- public static final Name notifyAll = Name.fromString("notifyAll");
- public static final Name null_ = Name.fromString("null");
- public static final Name predef = Name.fromString("predef");
- public static final Name print = Name.fromString("print");
- public static final Name readResolve = Name.fromString("readResolve");
- public static final Name report = Name.fromString("report");
- public static final Name result = Name.fromString("$result");
- public static final Name runtime = Name.fromString("runtime");
- public static final Name scala = Name.fromString("scala");
- public static final Name setParents = Name.fromString("setParents");
- public static final Name synchronized_ = Name.fromString("synchronized");
- public static final Name tag = Name.fromString("$tag");
- public static final Name tail = Name.fromString("tail");
- public static final Name toString = Name.fromString("toString");
- public static final Name that = Name.fromString("that");
- public static final Name that1 = Name.fromString("that1");
- public static final Name this_ = Name.fromString("this");
- public static final Name throw_ = Name.fromString("throw");
- public static final Name true_ = Name.fromString("true");
- public static final Name update = Name.fromString("update");
- public static final Name view = Name.fromString("view");
- public static final Name wait = Name.fromString("wait");
- public static final Name isNonTrivialInstance = Name.fromString("isNonTrivialInstance");
- public static final Name xml = Name.fromString("xml");
-
-
- public static final Name
- ZNOT = encode("!"),
- ZAND = encode("&&"),
- ZOR = encode("||"),
- NOT = encode("~"),
- ADD = encode("+"),
- SUB = encode("-"),
- MUL = encode("*"),
- DIV = encode("/"),
- MOD = encode("%"),
- EQ = encode("=="),
- NE = encode("!="),
- LT = encode("<"),
- LE = encode("<="),
- GT = encode(">"),
- GE = encode(">="),
- OR = encode("|"),
- XOR = encode("^"),
- AND = encode("&"),
- LSL = encode("<<"),
- LSR = encode(">>>"),
- ASR = encode(">>");
-
- private static Name encode(String string) {
- return NameTransformer.encode(Name.fromString(string));
- }
-}
diff --git a/sources/scalac/util/OptionParser.java b/sources/scalac/util/OptionParser.java
deleted file mode 100644
index 9521ca388e..0000000000
--- a/sources/scalac/util/OptionParser.java
+++ /dev/null
@@ -1,541 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import scala.tools.util.Position;
-import scala.tools.util.Reporter;
-
-import java.text.Format;
-import java.text.MessageFormat;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.StringTokenizer;
-
-import scalac.PhaseDescriptor;
-//import scalac.optimizer.OptimizePhase;
-
-public class CommandParser {
-
- private final String product;
- private final String version;
- private final String syntax;
- private final Reporter reporter;
- private final List/*<ArgumentParser>*/ parsers;
-
- public CommandParser(String product, String version, String syntax,
- Reporter reporter)
- {
- this.product = product;
- this.version = version;
- this.syntax = syntax;
- this.reporter = reporter;
- this.parsers = new ArrayList();
- }
-
- public String product() {
- return product;
- }
-
- public String version() {
- return version;
- }
-
- public String syntax() {
- return syntax;
- }
-
- public Reporter reporter() {
- return reporter;
- }
-
- public boolean add(ArgumentParser parser) {
- return parsers.add(parser);
- }
-
- public void add(int index, ArgumentParser parser) {
- parsers.add(index, parser);
- }
-
- public boolean remove(ArgumentParser parser) {
- return parsers.remove(parser);
- }
-
- public List parsers() {
- return parsers;
- }
-
- public boolean parse(String[] args) {
- int errors = reporter.errors();
- for (int i = 0; i < args.length; ) {
- for (int j = 0; j < parsers.size(); j++) {
- ArgumentParser parser = (ArgumentParser)parsers.get(j);
- if (parser.matches(args, i)) {
- i = parser.consume(args, i);
- break;
- }
- }
- }
- return reporter.errors() == errors;
- }
-
- public String getHelpMessage() {
- Format format = new MessageFormat(" {0}\t {1}");
- List options = new ArrayList(parsers.size());
- for (int i = 0; i < parsers.size(); i++) {
- if (!(parsers.get(i) instanceof OptionParser)) continue;
- OptionParser parser = (OptionParser)parsers.get(i);
- String option = parser.getHelpMessage(format);
- if (option != null) options.add(option);
- }
- StringBuffer buffer = new StringBuffer();
- buffer.append("usage: ").append(product());
- if (options.size() > 0) buffer.append(" <options>");
- if (syntax != null) buffer.append(' ').append(syntax);
- buffer.append(Strings.EOL);
- if (options.size() > 0) {
- buffer.append("where possible options include:");
- buffer.append(Strings.EOL);
- buffer.append(Strings.format(options));
- }
- return buffer.toString();
- }
-
- public void error(String message) {
- reporter.error(new Position(product), message);
- }
-
- public void warning(String message) {
- reporter.warning(new Position(product), message);
- }
-}
-
-public abstract class ArgumentParser {
-
- public final CommandParser command;
-
- public ArgumentParser(CommandParser command) {
- this.command = command;
- }
-
- public abstract boolean matches(String[] args, int index);
- public abstract int consume(String[] args, int index);
-
-}
-
-public class UnknownArgumentParser extends ArgumentParser {
-
- public UnknownArgumentParser(CommandParser command) {
- super(command);
- }
-
- public boolean matches(String[] args, int index) {
- return true;
- }
-
- public int consume(String[] args, int index) {
- command.error("don't known what to do with '" + args[index] + "'");
- return index + 1;
- }
-}
-
-public class ScalaFileArgumentParser extends ArgumentParser {
-
- public final List list;
-
- public ScalaFileArgumentParser(CommandParser command) {
- super(command);
- this.list = new ArrayList();
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].endsWith(".scala");
- }
-
- public int consume(String[] args, int index) {
- list.add(args[index]);
- return index + 1;
- }
-
- public String[] toArray() {
- return (String[])list.toArray(new String[list.size()]);
- }
-}
-
-public class ScalaProgramArgumentParser extends ArgumentParser {
-
- public String main;
- public String[] args;
-
- public ScalaProgramArgumentParser(CommandParser command) {
- super(command);
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("--");
- }
-
- public int consume(String[] args, int index) {
- if (index + 1 < args.length) {
- this.main = args[index + 1];
- this.args = new String[args.length - index - 2];
- System.arraycopy(args, index + 2, this.args, 0, this.args.length);
- return args.length;
- } else {
- command.error("option --: missing module name");
- return args.length;
- }
- }
-}
-
-public abstract class OptionParser extends ArgumentParser {
-
- public final String option;
- public final String description;
-
- public OptionParser(CommandParser command, String option,
- String description)
- {
- super(command);
- this.option = option;
- this.description = description;
- }
-
- public String getHelpSyntax() {
- return "-" + option;
- }
-
- public String getHelpDescription() {
- return description;
- }
-
- public void getHelpMessageArgs(List args) {
- args.add(getHelpSyntax());
- args.add(getHelpDescription());
- }
-
- public String getHelpMessage(Format format) {
- if (description == null) return null;
- List args = new ArrayList();
- getHelpMessageArgs(args);
- return format.format(args.toArray());
- }
-
- public void error(String message) {
- command.error("option -" + option + ": " + message);
- }
-
- public void warning(String message) {
- command.warning("option -" + option + ": " + message);
- }
-}
-/*
-public class OptimizeOptionParser extends OptionParser {
-
- private final OptimizePhase optimizer;
- public boolean optimize;
-
- public OptimizeOptionParser(CommandParser command,
- String option, String description, OptimizePhase optimizer)
- {
- super(command, option, description);
- this.optimizer = optimizer;
- this.optimize = false;
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("-" + option);
- }
-
- public int consume(String[] args, int index) {
- optimizer.setOptions(args[index].substring(1 + option.length()));
- optimize = true;
- return index + 1;
- }
-
- public String getHelpSyntax() {
- return super.getHelpSyntax() + "[:<options>]";
- }
-}
-*/
-public class VersionOptionParser extends OptionParser {
-
- private final String version;
-
- public VersionOptionParser(CommandParser command,
- String option, String description, String version)
- {
- super(command, option, description);
- this.version = version;
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("-" + option);
- }
-
- public int consume(String[] args, int index) {
- System.out.println(version);
- System.exit(0);
- return index + 1;
- }
-}
-
-public class HelpOptionParser extends OptionParser {
-
- public HelpOptionParser(CommandParser command,
- String option, String description)
- {
- super(command, option, description);
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("-?") ||
- args[index].equals("-" + option) ||
- args[index].equals("--" + option);
- }
-
- public int consume(String[] args, int index) {
- System.out.println(command.getHelpMessage());
- System.exit(0);
- return index + 1;
- }
-
- public String getHelpSyntax() {
- return "-? " + super.getHelpSyntax();
- }
-}
-
-public class UnknownOptionParser extends OptionParser {
-
- public UnknownOptionParser(CommandParser command) {
- super(command, "", null);
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].startsWith("-");
- }
-
- public int consume(String[] args, int index) {
- command.error("unknown option " + args[index]);
- return index + 1;
- }
-}
-
-public class BooleanOptionParser extends OptionParser {
-
- public boolean value;
-
- public BooleanOptionParser(CommandParser command,
- String option, String description, boolean value)
- {
- super(command, option, description);
- this.value = value;
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("-" + option);
- }
-
- public int consume(String[] args, int index) {
- value = true;
- return index + 1;
- }
-}
-
-public class StringOptionParser extends OptionParser {
-
- public String value;
- public String argument;
-
- public StringOptionParser(CommandParser command,
- String option, String description, String argument, String value)
- {
- super(command, option, description);
- this.argument = argument;
- this.value = value;
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].equals("-" + option);
- }
-
- public int consume(String[] args, int index) {
- if (index + 1 < args.length) {
- value = args[index + 1];
- return index + 2;
- } else {
- error("missing argument");
- return index + 1;
- }
- }
-
- public String getHelpSyntax() {
- String syntax = super.getHelpSyntax();
- if (argument != null) syntax = syntax + " <" + argument + ">";
- return syntax;
- }
-}
-
-public class PhaseSetOptionParser extends OptionParser {
-
- private final PhaseDescriptor[] phases;
- private final int flag;
- private final PrefixMatcher matcher;
-
- public PhaseSetOptionParser(CommandParser command,
- String option, String description, PhaseDescriptor[] phases, int flag)
- {
- super(command, option, description);
- this.phases = phases;
- this.flag = flag;
- this.matcher = new PrefixMatcher();
- for (int i = 0; i < phases.length; i++) {
- PhaseDescriptor phase = phases[i];
- matcher.insert(phase.name(), phase, phase.description());
- }
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].startsWith("-" + option + ":");
- }
-
- public int consume(String[] args, int index) {
- StringTokenizer tokens = new StringTokenizer(
- args[index].substring(option.length() + 2), ",");
- while (tokens.hasMoreTokens()) consumePhase(tokens.nextToken());
- return index + 1;
- }
-
- public void consumePhase(String token) {
- if (token.equals("all")) {
- for (int i = 0; i < phases.length; i++)
- phases[i].addFlag(flag, false);
- return;
- }
- PhaseDescriptor phase = lookup(getPhaseName(token));
- if (phase != null) {
- boolean before = getBeforeFlag(token);
- boolean after = getAfterFlag(token) || !before;
- if (before) phase.addFlag(flag, true);
- if (after) phase.addFlag(flag, false);
- }
- }
-
- public PhaseDescriptor lookup(String name) {
- if (name.length() == 0) {
- error("illegal zero-length phase name");
- return null;
- }
- PrefixMatcher.Entry[] entries = matcher.lookup(name);
- if (entries.length == 1) return (PhaseDescriptor)entries[0].value;
- error(matcher.getErrorMessage(name, entries, "phase name"));
- return null;
- }
-
- public boolean getBeforeFlag(String token) {
- for (int i = token.length(); 0 < i--; ) {
- switch (token.charAt(i)) {
- case '-': return true;
- case '+': continue;
- default : return false;
- }
- }
- return false;
- }
-
- public boolean getAfterFlag(String token) {
- for (int i = token.length(); 0 < i--; ) {
- switch (token.charAt(i)) {
- case '-': continue;
- case '+': return true;
- default : return false;
- }
- }
- return false;
- }
-
- public String getPhaseName(String token) {
- for (int i = token.length(); 0 < i--; ) {
- switch (token.charAt(i)) {
- case '-': continue;
- case '+': continue;
- default : return token.substring(0, i + 1);
- }
- }
- return "";
- }
-
- public String getHelpSyntax() {
- return super.getHelpSyntax() + ":<phases>";
- }
-}
-
-public class PrintOptionParser extends PhaseSetOptionParser {
-
- public boolean tokens;
-
- public PrintOptionParser(CommandParser command,
- String option, String description, PhaseDescriptor[] phases, int flag)
- {
- super(command, option, description, phases, flag);
- this.tokens = false;
- }
-
- public void consumePhase(String token) {
- if ("tokens".equals(token))
- tokens = true;
- else
- super.consumePhase(token);
- }
-
-}
-
-public class ChoiceOptionParser extends OptionParser {
-
- public final String argument;
- public final String[] choices;
-
- public String value;
-
- public ChoiceOptionParser(CommandParser command,
- String option, String description, String argument, String[] choices,
- String value)
- {
- super(command, option, description);
- this.argument = argument;
- this.choices = choices;
- this.value = value;
- }
-
- public boolean matches(String[] args, int index) {
- return args[index].startsWith("-" + option + ":");
- }
-
- public int consume(String[] args, int index) {
- String choice = args[index].substring(option.length() + 2);
- boolean found = false;
- for (int i = 0; i < choices.length; i++) {
- if (choices[i].equals(choice)) { found = true; break; }
- }
- if (found) {
- value = choice;
- } else if (choice.length() > 0) {
- error("unknown " + argument + " '" + choice + "'");
- } else {
- error("missing " + argument);
- }
- return index + 1;
- }
-
- public String getHelpSyntax() {
- String syntax = super.getHelpSyntax();
- if (argument != null) syntax = syntax + ":<" + argument + ">";
- return syntax;
- }
-}
diff --git a/sources/scalac/util/PrefixMatcher.java b/sources/scalac/util/PrefixMatcher.java
deleted file mode 100644
index 1b0acd8d7a..0000000000
--- a/sources/scalac/util/PrefixMatcher.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ArrayList;
-
-public class PrefixMatcher {
-
- public static class Entry {
-
- private Entry prev;
- private Entry next;
-
- public final String key;
- public final Object value;
- public final String argument;
- public final String description;
-
- public Entry(String key, Object value, String argument,
- String description)
- {
- this.key = key;
- this.value = value;
- this.argument = argument;
- this.description = description;
- }
- }
-
- private final Map entries;
- private Entry first;
- private Entry last;
-
- public PrefixMatcher() {
- this.entries = new HashMap();
- }
-
- public void insert(String key, Object value) {
- insert(key, value, null, null);
- }
-
- public void insert(String key, Object value, String description) {
- insert(key, value, null, description);
- }
-
- public void insert(String key, Object value, String argument,
- String description)
- {
- assert key != null && !entries.containsKey(key) : key;
- Entry entry = new Entry(key, value, argument, description);
- if (first == null) {
- first = last = entry;
- } else {
- last.next = entry;
- entry.prev = last;
- last = entry;
- }
- entries.put(key, entry);
- }
-
- public Entry[] lookup(String key) {
- Object value = entries.get(key);
- if (value != null) return new Entry[] { (Entry)value };
- List list = new ArrayList();
- for (Entry i = first; i != null; i = i.next) {
- if (i.key.startsWith(key)) list.add(i);
- }
- return (Entry[])list.toArray(new Entry[list.size()]);
- }
-
- public String getErrorMessage(String key, Entry[] entries, String what) {
- switch (entries.length) {
- case 0:
- return "unknown " + what + " '" + key + "'";
- case 1:
- return null;
- case 2:
- return "ambigous " + what + " '" + key + "', both '" +
- entries[0].key + "' and '" + entries[1].key + "' match";
- default:
- StringBuffer buffer = new StringBuffer();
- buffer.append("ambigous ").append(what);
- buffer.append(" '").append(key).append("'");
- for (int i = 0; i < entries.length; i++) {
- buffer.append(i < entries.length - 1 ? ", " : " and ");
- buffer.append('\'').append(entries[i].key).append('\'');
- }
- buffer.append(" match");
- return buffer.toString();
- }
- }
-
- public List getHelpStrings(String separator1, String separator2) {
- List strings = new ArrayList();
- for (Entry entry = first; entry != null; entry = entry.next) {
- if (entry.description != null)
- if (entry.argument != null)
- strings.add(entry.key + separator1 + entry.argument +
- separator2 + entry.description);
- else
- strings.add(entry.key + separator2 + entry.description);
- }
- return strings;
- }
-
-}
diff --git a/sources/scalac/util/SourceRepresentation.java b/sources/scalac/util/SourceRepresentation.java
deleted file mode 100644
index 83c1372769..0000000000
--- a/sources/scalac/util/SourceRepresentation.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import java.io.File;
-
-import scalac.symtab.Symbol;
-import scalac.symtab.SymbolNameWriter;
-
-public final class SourceRepresentation {
-
- /** The file name writer */
- private static SymbolNameWriter fileNameWriter = new SymbolNameWriter()
- .setAllSeparators(File.separatorChar)
- .setRootSeparator('\0');
-
- public static int digit2int(char ch, int base) {
- if ('0' <= ch && ch <= '9' && ch < '0' + base)
- return ch - '0';
- else if ('A' <= ch && ch < 'A' + base - 10)
- return ch - 'A' + 10;
- else if ('a' <= ch && ch < 'a' + base - 10)
- return ch - 'a' + 10;
- else
- return -1;
- }
-
- public static byte int2digit(int x) {
- if (x <= 9)
- return (byte)(x + '0');
- else
- return (byte)(x - 10 + 'A');
- }
-
-/* the next 4 functions convert between three fundamental name
- * representations:
- * - string each character 16 bit,
- * - source characters outside 0..127 are represented by
- * unicode escapes, \ u X X X X
- * - ascii characters outside 0..127 are represented by two or three
- * byte sequences with high bit set (as in class file format).
- */
-
-/** convert source bytes in source[offset..offset+len-1] to ascii.
- */
- public static int source2ascii(byte source[], int offset, int len, byte ascii[]) {
- int j = 0;
- int i = 0;
- while (i < len) {
- if (source[offset + i] == '\\' && i + 1 < len) {
- i++;
- switch (source[offset + i]) {
- case 'n':
- ascii[j++] = (byte)'\n'; i++; continue;
- case 't':
- ascii[j++] = (byte)'\t'; i++; continue;
- case 'b':
- ascii[j++] = (byte)'\b'; i++; continue;
- case 'r':
- ascii[j++] = (byte)'\r'; i++; continue;
- case 'f':
- ascii[j++] = (byte)'\f'; i++; continue;
- case 'u':
- if (i + 4 < len) {
- int code = 0;
- int k = 1;
- int d = 0;
- while (k <= 4 && d >= 0) {
- // !!! (char)
- d = digit2int((char)source[offset + i + k], 16);
- code = code * 16 + d;
- k++;
- }
- if (d >= 0) {
- if (code <= 0x7F)
- ascii[j++] = (byte)code;
- else
- if (code <= 0x3FF) {
- ascii[j++] = (byte)(0xC0 | (code >> 6));
- ascii[j++] = (byte)(0x80 | (code & 0x3F));
- } else {
- ascii[j++] = (byte)(0xE0 | (code >> 12));
- ascii[j++] = (byte)(0x80 |
- ((code >> 6) & 0x3F));
- ascii[j++] = (byte)(0x80 | (code & 0x3F));
- }
- i = i + 5;
- continue;
- }
- }
- }
- }
- byte b = source[offset + i++];
- if (b >= 0)
- ascii[j++] = b;
- else {
- ascii[j++] = (byte)(0xC0 | ((b >> 6) & 0x3));
- ascii[j++] = (byte)(0x80 | (b & 0x3F));
- }
- }
- return j;
- }
-
-/** convert ascii bytes in ascii[offset..offset+len-1] to a string
- */
- public static String ascii2string(byte ascii[], int offset, int len) {
- char cs[] = new char[len];
- int i = offset;
- int j = 0;
- len += offset;
- while (i < len) {
- int b = ascii[i++] & 0xFF;
- if (b >= 0xE0) {
- b = ((b & 0x0F) << 12) | (ascii[i++] & 0x3F) << 6;
- b = b | (ascii[i++] & 0x3F);
- }
- else
- if (b >= 0xC0)
- b = ((b & 0x1F) << 6) | (ascii[i++] & 0x3F);
- cs[j++] = (char)b;
- }
- return new String(cs, 0, j);
- }
-
-/** convert string to array of source bytes
- */
- public static byte[] string2source(String s) {
- byte[] source = new byte[s.length() * 6];
- int j = 0;
- for (int i = 0; i < s.length(); i++) {
- char ch = s.charAt(i);
- switch (ch) {
- case '\n':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'n';
- break;
- case '\t':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'t';
- break;
- case '\b':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'b';
- break;
- case '\r':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'r';
- break;
- case '\f':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'f';
- break;
- case '\"':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'\"';
- break;
- case '\'':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'\'';
- break;
- case '\\':
- source[j++] = (byte)'\\';
- source[j++] = (byte)'\\';
- break;
- default:
- if ((' ' <= ch) && (ch <= 127))
- source[j++] = (byte)ch;
- else {
- source[j++] = (byte)'\\';
- source[j++] = (byte)'u';
- source[j++] = int2digit((ch >> 12) & 0xF);
- source[j++] = int2digit((ch >> 8) & 0xF);
- source[j++] = int2digit((ch >> 4) & 0xF);
- source[j++] = int2digit(ch & 0xF);
- }
- }
- }
- byte[] res = new byte[j];
- System.arraycopy(source, 0, res, 0, j);
- return res;
- }
-
-/** convert string to array of ascii bytes
- */
- public static byte[] string2ascii(String s) {
- byte[] source = string2source(s);
- byte[] ascii = new byte[source.length * 2];
- int alen = source2ascii(source, 0, source.length, ascii);
- byte[] res = new byte[alen];
- System.arraycopy(ascii, 0, res, 0, alen);
- return res;
- }
-
-/** escape all characters outside 32..127 in string s
- */
- public static String escape(String s) {
- try {
- return new String(string2source(s), "8859_1");
- } catch (java.io.UnsupportedEncodingException e) {
- throw new InternalError(e.getMessage());
- }
- }
-
-/** escape character c, if outside 32..127.
- */
- public static String escape(char c) {
- char[] s = {c};
- return escape(new String(s));
- }
-
- /**
- * Returns the external file name with given suffix associated to
- * given class. The file name use File.separatorChar as file
- * separator.
- */
- public static String externalizeFileName(Symbol clasz, String suffix) {
- assert clasz.isClassType(): Debug.show(clasz);
- return fileNameWriter.toString(clasz, suffix);
- }
-
-}
diff --git a/sources/scalac/util/Strings.java b/sources/scalac/util/Strings.java
deleted file mode 100644
index 8d5c1d85c5..0000000000
--- a/sources/scalac/util/Strings.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-public abstract class Strings {
-
- //########################################################################
- // Strings constants
-
- final public static String[] EMPTY_ARRAY = new String[0];
-
- //########################################################################
- // Strings interface
-
- /** The line separator */
- public static String EOL = System.getProperty("line.separator", "\n");
-
- /** Returns a string where all tabs have been replaced by white
- * spaces to make the corresponding fields the same width.
- */
- public static String format(List strings) {
- List[] lines = new List[strings.size()];
- List widths = new ArrayList();
- int height = 0;
- for (Iterator iterator = strings.iterator(); iterator.hasNext(); ) {
- String string = (String)iterator.next();
- List line = lines[height++] = new ArrayList();
- for (int last = 0; last < string.length(); ) {
- int next = string.indexOf('\t', last);
- if (next < 0) next = string.length();
- String substring = string.substring(last, next);
- int index = line.size();
- if (index == widths.size()) widths.add(new Integer(0));
- int width = ((Integer)widths.get(index)).intValue();
- widths.set(
- index, new Integer(Math.max(width, substring.length())));
- line.add(substring);
- last = next + 1;
- }
- }
- StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < lines.length; i++) {
- List line = lines[i];
- for (int j = 0; true; j++) {
- String string = (String)line.get(j);
- buffer.append(string);
- if (j == line.size() - 1) break;
- int width = ((Integer)widths.get(j)).intValue();
- for (int k = string.length(); k<width; k++) buffer.append(' ');
- }
- buffer.append(EOL);
- }
- return buffer.toString();
- }
-
- /** Returns the first char of the string or -1 if the string is empty. */
- public static int firstChar(String string) {
- return string.length() == 0 ? -1 : string.charAt(0);
- }
-
- /** Returns the last char of the string or -1 if the string is empty. */
- public static int lastChar(String string) {
- return string.length() == 0 ? -1 : string.charAt(string.length() - 1);
- }
-
- /** Returns a copy of the string, with leading whitespace omitted. */
- public static String trimLeading(String string) {
- for (int i = 0; i < string.length(); i++)
- if (string.charAt(i) > ' ') return string.substring(i);
- return "";
- }
-
- /** Returns a copy of the string, with trailing whitespace omitted. */
- public static String trimTrailing(String string) {
- for (int i = string.length() - 1; i >= 0; i--)
- if (string.charAt(i) > ' ') return string.substring(0, i + 1);
- return "";
- }
-
- /** Returns the stack trace of the exception */
- public static String stackTrace(Throwable exception) {
- StringWriter buffer = new StringWriter();
- PrintWriter writer = new PrintWriter(buffer);
- exception.printStackTrace(writer);
- writer.close();
- return buffer.toString();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/TermName.java b/sources/scalac/util/TermName.java
deleted file mode 100644
index 8215a8ce2e..0000000000
--- a/sources/scalac/util/TermName.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-import java.util.HashMap;
-
-/** Instances of this class represent term names. */
-public final class TermName extends Name {
-
- //########################################################################
- // Private Variables
-
- /** Hashtable from string representation to term names. */
- private static HashMap/*<String,TermName>*/ strings = new HashMap();
-
- /** Hashtable from ASCII representation to term names. */
- private static TermName[] asciis = new TermName[0x00008000];
-
- //########################################################################
- // Private Fields
-
- /** The string representation */
- private final String string;
-
- /** The ASCII representation (null if not yet computed) */
- private byte[] ascii;
-
- /** The next name stored in the same bucket of the ASCII table */
- private TermName next;
-
- //########################################################################
- // Private Constructors
-
- /** Initializes this instance. */
- private TermName(String string) {
- super(2 * strings.size(), null);
- this.string = string;
- strings.put(string, this);
- }
-
- //########################################################################
- // Public Factories
-
- /** Returns the term name with given ASCII representation. */
- public static TermName fromAscii(byte[] bytes, int start, int count) {
- int index = hashValue(bytes, start, count) & (asciis.length - 1);
- for (TermName name = asciis[index]; name != null; name = name.next)
- if (name.equals(bytes, start, count)) return name;
- TermName name = fromString(
- SourceRepresentation.ascii2string(bytes, start, count));
- byte[] ascii = new byte[count];
- for (int i = 0; i < ascii.length; i++) ascii[i] = bytes[start + i];
- name.setAscii(ascii, index);
- return name;
- }
-
- /** Returns the term name with given string representation. */
- public static TermName fromString(String string) {
- Object value = strings.get(string);
- return value != null ? (TermName)value : new TermName(string);
- }
-
- //########################################################################
- // Public Methods
-
- /** Returns the string representation of this name. */
- public String toString() {
- return string;
- }
-
- /**
- * Returns the ASCII representation of this name. The returned
- * array is not a copy. Therefore, it is forbidden to modify it.
- */
- public byte[] toAsciiUnsafe() {
- if (ascii == null) {
- byte[] ascii = SourceRepresentation.string2ascii(string);
- int index = hashValue(ascii, 0, ascii.length) & (asciis.length-1);
- setAscii(ascii, index);
- }
- return ascii;
- }
-
- //########################################################################
- // Private Methods & Functions
-
- /** Sets the ASCII representation to given one. */
- private void setAscii(byte[] ascii, int index) {
- assert this.ascii == null: this;
- this.ascii = ascii;
- this.next = asciis[index];
- asciis[index] = this;
- }
-
- /** Is this name's ASCII representations equal to given one? */
- private boolean equals(byte[] bytes, int start, int count) {
- if (ascii.length != count) return false;
- for (int i = 0; i < count; i++)
- if (ascii[i] != bytes[start + i]) return false;
- return true;
- }
-
- /** Returns the hash code of the ASCII representation. */
- private static int hashValue(byte[] bytes, int start, int count) {
- if (count <= 0) return 0;
- return count * (41 * 41 * 41)
- + bytes[start] * (41 * 41)
- + bytes[start + count - 1] * 41
- + bytes[start + (count >> 1)];
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/TypeName.java b/sources/scalac/util/TypeName.java
deleted file mode 100644
index cfe3b5193f..0000000000
--- a/sources/scalac/util/TypeName.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-/** Instances of this class represent type names. */
-public final class TypeName extends Name {
-
- //########################################################################
- // Protected Constructors
-
- /** Initializes this instance. */
- protected TypeName(TermName term) {
- super(term.index + 1, term);
- }
-
- //########################################################################
- // Public Factories
-
- /** Returns the type name with given ASCII representation. */
- public static TypeName fromAscii(byte[] bytes, int start, int count) {
- return TermName.fromAscii(bytes, start, count).toTypeName();
- }
-
- /** Returns the type name with given string representation. */
- public static TypeName fromString(String string) {
- return TermName.fromString(string).toTypeName();
- }
-
- //########################################################################
-}
diff --git a/sources/scalac/util/TypeNames.java b/sources/scalac/util/TypeNames.java
deleted file mode 100644
index 9f7fea1144..0000000000
--- a/sources/scalac/util/TypeNames.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/* ____ ____ ____ ____ ______ *\
-** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
-** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
-** /_____/\____/\___/\____/____/ **
-\* */
-
-// $Id$
-
-package scalac.util;
-
-public class TypeNames {
-
- public static final Name EMPTY = Names.EMPTY.toTypeName();
- public static final Name WILDCARD_STAR = Name.fromString("_*").toTypeName();
-
-}
diff --git a/support/make/csc.mk b/support/make/csc.mk
deleted file mode 100644
index bfdfad7cd6..0000000000
--- a/support/make/csc.mk
+++ /dev/null
@@ -1,105 +0,0 @@
-############################################################-*-Makefile-*-####
-# CSC - Compile C# Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make csc [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# CSC_COMPILER = compiler name, for example CSC
-# $(CSC_COMPILER) = compiler command
-# $(CSC_COMPILER)_FLAGS = compiler-specific compilation flags
-# CSC_FLAGS += compilation flags
-# CSC_OUTPUTFILE = name of the generated assembly file
-# CSC_REFERENCE = list of referenced assenblies
-# CSC_ENCODING = character encoding used by source files
-# CSC_SOURCE = version of source code
-# CSC_TARGET = compilation target (exe, winexe, library, module)
-# CSC_DEFINE = defines the symbols listed by the semicolon
-# separated list
-# CSC_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable SC_CLASSPATH with target LIBRARY, one may define the
-# variable LIBRARY_SC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "sources/scala/AnyVal.cs"
-#
-# make csc CSC_FILES=sources/scala/AnyVal.cs
-#
-#
-# Compile the whole runtime
-#
-# make csc target=LIBRARY
-#
-#
-# A Makefile rule that compiles all modified files from the runtime
-#
-# .latest-library : $(LIBRARY_CSC_FILES)
-# @$(MAKE) csc target=LIBRARY LIBRARY_CSC_FILES='$?'
-# touch $@
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-CSC_COMPILER ?= $(MSIL_PLATFORM)_CSC
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-MONO_CSC ?= mcs
-MSCLR_CSC ?= csc
-
-##############################################################################
-# Values
-
-csc_COMPILER = $(call CSC_LOOKUP,CSC_COMPILER)
-csc_compiler = $(call CSC_LOOKUP,$(csc_COMPILER))
-csc_compiler_flags = $(call CSC_LOOKUP,$(csc_COMPILER)_FLAGS)
-csc_FLAGS = $(call CSC_LOOKUP,CSC_FLAGS)
-csc_LIBDIR = $(call CSC_LOOKUP,CSC_LIBDIR)
-csc_REFERENCE = $(call CSC_LOOKUP,CSC_REFERENCE)
-csc_OUTPUTFILE = $(call CSC_LOOKUP,CSC_OUTPUTFILE)
-csc_ENCODING = $(call CSC_LOOKUP,CSC_ENCODING)
-csc_TARGET = $(call CSC_LOOKUP,CSC_TARGET)
-csc_DEFINE = $(call CSC_LOOKUP,CSC_DEFINE)
-csc_FILES = $(call CSC_LOOKUP,CSC_FILES)
-
-##############################################################################
-# Command
-
-csc += $(csc_compiler)
-csc += $(csc_compiler_flags)
-csc += $(csc_FLAGS)
-csc += $(csc_LIBDIR:%=/lib:$(call CYGWIN_PATH,%))
-csc += $(csc_REFERENCE:%=/r:$(call CYGWIN_PATH,%))
-csc += $(csc_OUTPUTFILE:%=/out:$(call CYGWIN_FILE,%))
-csc += $(csc_ENCODING:%=/codepage:%)
-csc += $(csc_TARGET:%=/target:%)
-csc += $(csc_DEFINE:%=/define:%)
-csc += $(csc_FILES:%=$(call CYGWIN_FILE,'%'))
-
-##############################################################################
-# Functions
-
-CSC_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-csc:
- $(strip $(csc))
-
-.PHONY : csc
-
-##############################################################################
diff --git a/support/make/cygwin.mk b/support/make/cygwin.mk
deleted file mode 100644
index 2fc301ea09..0000000000
--- a/support/make/cygwin.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-############################################################-*-Makefile-*-####
-# CYGWIN - Cygwin Support
-##############################################################################
-# $Id$
-
-##############################################################################
-# Exports
-#
-# CYGWIN_TEST : a variable that is non-empty under cygwin
-# CYGWIN_PATH : a function that converts file paths
-# CYGWIN_FILE : a function that converts file names
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-UNAME ?= uname
-CYGPATH ?= cygpath
-
-##############################################################################
-# Values
-
-CYGWIN_TEST = $(filter CYGWIN%,$(shell $(UNAME)))
-
-##############################################################################
-# Functions
-
-CYGWIN_PATH = $(if $(CYGWIN_TEST),`$(CYGPATH) -w -p $(1)`,$(1))
-CYGWIN_FILE = $(if $(CYGWIN_TEST),`$(CYGPATH) -w $(1)`,$(1))
-
-##############################################################################
diff --git a/support/make/default.mk b/support/make/default.mk
deleted file mode 100644
index dcc8bc7bfa..0000000000
--- a/support/make/default.mk
+++ /dev/null
@@ -1,43 +0,0 @@
-############################################################-*-Makefile-*-####
-# DEFAULT - Default Rules
-##############################################################################
-# $Id$
-
-##############################################################################
-# Defaults
-
-FIND ?= find
-RM ?= rm
-
-##############################################################################
-# Commands
-
-all : default
-force : default.force
-fastclean : default.fastclean
-clean : default.clean
-distclean : default.distclean
-
-default :
-
-default.force : fastclean
-
-default.fastclean :
-
-default.clean : fastclean
-
-default.distclean : clean
- $(FIND) . '(' -name '*~' -o -name core ')' -exec $(RM) '{}' ';'
-
-.PHONY : all
-.PHONY : force
-.PHONY : fastclean
-.PHONY : clean
-.PHONY : distclean
-.PHONY : default
-.PHONY : default.force
-.PHONY : default.fastclean
-.PHONY : default.clean
-.PHONY : default.distclean
-
-##############################################################################
diff --git a/support/make/exec.mk b/support/make/exec.mk
deleted file mode 100644
index b0f9c518a1..0000000000
--- a/support/make/exec.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-############################################################-*-Makefile-*-####
-# EXEC - Execute Command
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make exec CMD=<command>
-#
-##############################################################################
-# Examples
-#
-# Print names of all source files:
-#
-# make exec CMD='echo $(PROJECT_SOURCES)'
-#
-#
-# Execute a java program with the project classpath:
-#
-# make exec CMD='java -cp $(PROJECT_CLASSPATH) scalac.Main'
-#
-##############################################################################
-
-##############################################################################
-# Variables
-
-EXEC_CMD ?= $(CMD)
-
-##############################################################################
-# Rules
-
-exec :
- @if [ -z '$(EXEC_CMD)' ]; then \
- $(ECHO) "Usage: $(MAKE) $@ CMD=<command>"; \
- exit 1; \
- fi
- @$(EXEC_CMD)
-
-.PHONY : exec
-
-##############################################################################
diff --git a/support/make/grep.mk b/support/make/grep.mk
deleted file mode 100644
index d8c9c66498..0000000000
--- a/support/make/grep.mk
+++ /dev/null
@@ -1,51 +0,0 @@
-############################################################-*-Makefile-*-####
-# GREP - Search Regular Expressions
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make grep [FLAGS=<flags>] REGEX=<regex> [FILES=<files>]
-#
-##############################################################################
-# Examples
-#
-# Search for "runtime" in all source files:
-#
-# make grep REGEX=runtime
-#
-#
-# Search for "runtime" in the compiler source files:
-#
-# make grep REGEX=runtime FILES='$(COMPILER_SOURCES)'
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-GREP ?= grep
-
-##############################################################################
-# Variables
-
-GREP_BINARY ?= $(GREP)
-GREP_FLAGS ?= $(FLAGS)
-GREP_REGEX ?= $(REGEX)
-GREP_FILES ?= $(if $(FILES),$(FILES),$(PROJECT_SOURCES))
-
-##############################################################################
-# Rules
-
-grep :
- @if [ -z '$(GREP_REGEX)' ]; then \
- echo "Usage:" \
- "$(MAKE) $@ [FLAGS=<flags>] REGEX=<regex> [FILES=<files>]";\
- exit 1; \
- fi
- @$(GREP_BINARY) $(GREP_FLAGS) '$(GREP_REGEX)' $(GREP_FILES:%='%')
-
-.PHONY : grep
-
-##############################################################################
diff --git a/support/make/ilasm.mk b/support/make/ilasm.mk
deleted file mode 100644
index 47a5116ea4..0000000000
--- a/support/make/ilasm.mk
+++ /dev/null
@@ -1,93 +0,0 @@
-############################################################-*-Makefile-*-####
-# ILASM - MSIL Assembler
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make ilasm [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# ILASM_ASSEMBLER = assembler name, for example ILASM
-# $(ILASM_ASSEMBLER) = assembler command
-# $(ILASM_ASSEMBLER)_FLAGS = assembler-specific compilation flags
-# ILASM_FLAGS += compilation flags
-# ILASM_OUTPUTFILE = name of the output assembly file
-# ILASM_KEYFILE = key file
-# ILASM_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable SC_CLASSPATH with target LIBRARY, one may define the
-# variable LIBRARY_SC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "scala.il"
-#
-# make ilasm ILASM_FILES=scala.il
-#
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-ILASM_ASSEMBLER ?= $(MSIL_PLATFORM)_ILASM
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-MONO_ILASM ?= ilasm
-MSCLR_ILASM ?= ilasm
-
-##############################################################################
-# Values
-
-ilasm_ASSEMBLER = $(call ILASM_LOOKUP,ILASM_ASSEMBLER)
-ilasm_assembler = $(call ILASM_LOOKUP,$(ilasm_ASSEMBLER))
-ilasm_assembler_flags = $(call ILASM_LOOKUP,$(ilasm_ASSEMBLER)_FLAGS)
-ilasm_FLAGS = $(call ILASM_LOOKUP,ILASM_FLAGS)
-ilasm_OUTPUTFILE = $(call ILASM_LOOKUP,ILASM_OUTPUTFILE)
-ilasm_KEYFILE = $(call ILASM_LOOKUP,ILASM_KEYFILE)
-ilasm_FILES = $(call ILASM_LOOKUP,ILASM_FILES)
-
-
-##############################################################################
-
-MONO_ILASM_OUT_FLAG = /output:
-MONO_ILASM_KEY_FLAG = /key:
-
-MSCLR_ILASM_OUT_FLAG = /out=
-MSCLR_ILASM_KEY_FLAG = /key=
-
-ILASM_OUT_FLAG = $($(MSIL_PLATFORM)_ILASM_OUT_FLAG)
-ILASM_KEY_FLAG = $($(MSIL_PLATFORM)_ILASM_KEY_FLAG)
-
-##############################################################################
-# Command
-
-ilasm += $(ilasm_assembler)
-ilasm += $(ilasm_assembler_flags)
-ilasm += $(ilasm_FLAGS)
-ilasm += $(ilasm_OUTPUTFILE:%=$(ILASM_OUT_FLAG)$(call CYGWIN_FILE,%))
-ilasm += $(ilasm_KEYFILE:%=$(ILASM_KEY_FLAG)$(call CYGWIN_FILE,%))
-ilasm += $(ilasm_FILES:%=$(call CYGWIN_FILE,'%'))
-
-##############################################################################
-# Functions
-
-ILASM_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-ilasm :
- $(strip $(ilasm))
-
-.PHONY : ilasm
-
-##############################################################################
diff --git a/support/make/ildasm.mk b/support/make/ildasm.mk
deleted file mode 100644
index 1fc85b7d1b..0000000000
--- a/support/make/ildasm.mk
+++ /dev/null
@@ -1,85 +0,0 @@
-############################################################-*-Makefile-*-####
-# ILDASM - MSIL Disassembler
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make idlasm [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# ILDASM_ASSEMBLER = assembler name, for example ILDASM
-# $(ILDASM_ASSEMBLER) = assembler command
-# $(ILDASM_ASSEMBLER)_FLAGS = assembler-specific compilation flags
-# ILDASM_FLAGS += compilation flags
-# ILDASM_OUTPUTFILE = name of the output assembly file
-# ILDASM_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable SC_CLASSPATH with target LIBRARY, one may define the
-# variable LIBRARY_SC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Disassembly file "lib/scala.dll"
-#
-# make ildasm ILDASM_FILES=lib/scala.dll
-#
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-ILDASM_DISASSEMBLER ?= $(MSIL_PLATFORM)_ILDASM
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-MONO_ILDASM ?= monodis
-MSCLR_ILDASM ?= ildasm
-
-##############################################################################
-# Values
-
-ildasm_DISASSEMBLER = $(call ILDASM_LOOKUP,ILDASM_DISASSEMBLER)
-ildasm_disassembler = $(call ILDASM_LOOKUP,$(ildasm_DISASSEMBLER))
-ildasm_disassembler_flags = $(call ILDASM_LOOKUP,$(ildasm_DISASSEMBLER)_FLAGS)
-ildasm_FLAGS = $(call ILDASM_LOOKUP,ILDASM_FLAGS)
-ildasm_OUTPUTFILE = $(call ILDASM_LOOKUP,ILDASM_OUTPUTFILE)
-ildasm_FILES = $(call ILDASM_LOOKUP,ILDASM_FILES)
-
-##############################################################################
-
-MONO_ILDASM_OUT_FLAG = --output=
-MSCLR_ILDASM_OUT_FLAG = /out=
-
-ILDASM_OUT_FLAG = $($(MSIL_PLATFORM)_ILDASM_OUT_FLAG)
-
-##############################################################################
-# Command
-
-ildasm += $(ildasm_disassembler)
-ildasm += $(ildasm_disassembler_flags)
-ildasm += $(ildasm_FLAGS)
-ildasm += $(ildasm_OUTPUTFILE:%=$(ILDASM_OUT_FLAG)$(call CYGWIN_FILE,%))
-ildasm += $(ildasm_FILES:%=$(call CYGWIN_FILE,'%'))
-
-##############################################################################
-# Functions
-
-ILDASM_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-ildasm :
- $(strip $(ildasm))
-
-.PHONY : ildasm
-
-##############################################################################
diff --git a/support/make/jar.mk b/support/make/jar.mk
deleted file mode 100644
index 97e4785a82..0000000000
--- a/support/make/jar.mk
+++ /dev/null
@@ -1,81 +0,0 @@
-############################################################-*-Makefile-*-####
-# JAR - Build Java Archive
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make jar [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# JAR = archive command
-# JAR_FLAGS += archive flags
-# JAR_ARCHIVE = archive file
-# JAR_MANIFEST = manifest file
-# JAR_INPUTDIR = directory containing the files to archive
-# JAR_FILES += paths (relative to INPUTDIR) of the files to archive
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable JAR_ARCHIVE with target PROJECT, one may define the
-# variable PROJECT_JAR_ARCHIVE
-#
-##############################################################################
-# Examples
-#
-# Build the PROJECT java archive
-#
-# make jar target=PROJECT
-#
-#
-# Build a java archive containing all files in ./classes
-#
-# make jar JAR_ARCHIVE=test.jar JAR_INPUTDIR=./classes JAR_FILES=.
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-JAR ?= jar
-
-##############################################################################
-# Values
-
-jar = $(call JAR_LOOKUP,JAR)
-jar_FLAGS = $(call JAR_LOOKUP,JAR_FLAGS)
-jar_ARCHIVE = $(call JAR_LOOKUP,JAR_ARCHIVE)
-jar_MANIFEST = $(call JAR_LOOKUP,JAR_MANIFEST)
-jar_INPUTDIR = $(call JAR_LOOKUP,JAR_INPUTDIR)
-jar_inputdir = $(jar_INPUTDIR:%=-C $(call CYGWIN_FILE,%))
-jar_FILES = $(call JAR_LOOKUP,JAR_FILES)
-
-##############################################################################
-# Command
-
-jar += c$(jar_FLAGS)f$(jar_MANIFEST:%=m)
-jar += $(jar_ARCHIVE:%=$(call CYGWIN_FILE,%))
-jar += $(jar_MANIFEST:%=$(call CYGWIN_FILE,%))
-jar += $(jar_FILES:%=$(jar_inputdir) $(call CYGWIN_FILE,%))
-
-##############################################################################
-# Functions
-
-JAR_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-jar:
- @[ -d "$(dir $(jar_ARCHIVE))" ] || $(MKDIR) -p "$(dir $(jar_ARCHIVE))"
- $(strip $(jar)) || ( $(RM) $(jar_ARCHIVE) && exit 1 )
-
-.PHONY : jar
-
-##############################################################################
diff --git a/support/make/jc.mk b/support/make/jc.mk
deleted file mode 100644
index 2021fb81ad..0000000000
--- a/support/make/jc.mk
+++ /dev/null
@@ -1,113 +0,0 @@
-############################################################-*-Makefile-*-####
-# JC - Compile Java Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make jc [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# JC_PREPEND = e.g. '@' to silently run the compiler
-# JC_COMPILER = compiler name, for example JAVAC
-# $(JC_COMPILER) = compiler command
-# $(JC_COMPILER)_FLAGS = compiler-specific compilation flags
-# JC_FLAGS += compilation flags
-# JC_CLASSPATH = location of user class files
-# JC_SOURCEPATH = location of input source files
-# JC_BOOTCLASSPATH = location of bootstrap class files
-# JC_EXTDIRS = location of installed extensions
-# JC_OUTPUTDIR = directory where to place generated class files
-# JC_ENCODING = character encoding used by source files
-# JC_SOURCE = version of source code
-# JC_TARGET = version of target bytecode
-# JC_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable JC_CLASSPATH with target COMPILER, one may define the
-# variable COMPILER_JC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "sources/scalac/Main.java"
-#
-# make jc JC_FILES=sources/scalac/Main.java
-#
-#
-# Compile the whole runtime
-#
-# make jc target=RUNTIME
-#
-#
-# A Makefile rule that compiles all modified files from the runtime
-#
-# .latest-runtime : $(RUNTIME_JC_FILES)
-# @$(MAKE) jc target=RUNTIME RUNTIME_JC_FILES='$?'
-# touch $@
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-JC_COMPILER ?= JAVAC
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-JAVAC ?= javac
-
-##############################################################################
-# Values
-
-jc_PREPEND = $(call JC_LOOKUP,JC_PREPEND)
-jc_COMPILER = $(call JC_LOOKUP,JC_COMPILER)
-jc_compiler = $(call JC_LOOKUP,$(jc_COMPILER))
-jc_compiler_flags = $(call JC_LOOKUP,$(jc_COMPILER)_FLAGS)
-jc_FLAGS = $(call JC_LOOKUP,JC_FLAGS)
-jc_CLASSPATH = $(call JC_LOOKUP,JC_CLASSPATH)
-jc_SOURCEPATH = $(call JC_LOOKUP,JC_SOURCEPATH)
-jc_BOOTCLASSPATH = $(call JC_LOOKUP,JC_BOOTCLASSPATH)
-jc_EXTDIRS = $(call JC_LOOKUP,JC_EXTDIRS)
-jc_OUTPUTDIR = $(call JC_LOOKUP,JC_OUTPUTDIR)
-jc_ENCODING = $(call JC_LOOKUP,JC_ENCODING)
-jc_SOURCE = $(call JC_LOOKUP,JC_SOURCE)
-jc_TARGET = $(call JC_LOOKUP,JC_TARGET)
-jc_FILES = $(call JC_LOOKUP,JC_FILES)
-
-##############################################################################
-# Command
-
-jc += $(jc_PREPEND)
-jc += $(jc_compiler)
-jc += $(jc_compiler_flags)
-jc += $(jc_FLAGS)
-jc += $(jc_CLASSPATH:%=-classpath $(call CYGWIN_PATH,%))
-jc += $(jc_SOURCEPATH:%=-sourcepath $(call CYGWIN_PATH,%))
-jc += $(jc_BOOTCLASSPATH:%=-bootclasspath $(call CYGWIN_PATH,%))
-jc += $(jc_EXTDIRS:%=-extdirs $(call CYGWIN_PATH,%))
-jc += $(jc_OUTPUTDIR:%=-d $(call CYGWIN_FILE,%))
-jc += $(jc_ENCODING:%=-encoding %)
-jc += $(jc_SOURCE:%=-source %)
-jc += $(jc_TARGET:%=-target %)
-jc += $(jc_FILES:%=$(call CYGWIN_FILE,'%'))
-
-##############################################################################
-# Functions
-
-JC_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-jc :
- @[ -d "$(jc_OUTPUTDIR)" ] || $(MKDIR) -p "$(jc_OUTPUTDIR)"
- $(strip $(jc))
-
-.PHONY : jc
-
-##############################################################################
diff --git a/support/make/latex.mk b/support/make/latex.mk
deleted file mode 100644
index 43b5007422..0000000000
--- a/support/make/latex.mk
+++ /dev/null
@@ -1,92 +0,0 @@
-############################################################-*-Makefile-*-####
-# LATEX - Compile Latex Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make latex[.div|.ps|.pdf|.clean|.distclean]
-# make <*.[dvi|ps|pdf]>
-#
-##############################################################################
-# Variables
-#
-# LATEX_TARGETS += list of documents to generate
-# LATEX_SOURCES += list of documents required to generate targets
-#
-##############################################################################
-# Examples
-#
-# Generate all latex-produced documents
-#
-# make latex
-#
-#
-# Generate all latex-produced PostScript documents
-#
-# make latex
-#
-#
-# Generate reference in pdf format
-#
-# make reference.pdf
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-TEXINPUTS ?= .:
-BIBINPUTS ?= .
-LATEXMK ?= latexmk
-TOUCH ?= touch
-
-##############################################################################
-# Environment
-
-export TEXINPUTS
-export BIBINPUTS
-
-##############################################################################
-# Commands
-
-all : latex
-clean : latex.clean
-distclean : latex.distclean
-
-latex : $(LATEX_TARGETS)
-latex.dvi : $(filter %.dvi,$(LATEX_TARGETS))
-latex.ps : $(filter %.ps ,$(LATEX_TARGETS))
-latex.pdf : $(filter %.pdf,$(LATEX_TARGETS))
-
-latex.clean :
- $(LATEXMK) -c
-
-latex.distclean :
- $(LATEXMK) -C
-
-.PHONY : latex
-.PHONY : latex.dvi
-.PHONY : latex.ps
-.PHONY : latex.pdf
-.PHONY : latex.clean
-.PHONY : latex.distclean
-
-##############################################################################
-# Rules
-
-%.dvi : %.tex $(LATEX_SOURCES)
- $(LATEXMK) $(LATEXMK_FLAGS) -g $<
-
-%.ps : %.dvi
- $(LATEXMK) $(LATEXMK_FLAGS) -ps $*.tex
-
-%.pdf : %.tex $(LATEX_SOURCES)
- $(LATEXMK) $(LATEXMK_FLAGS) -g -pdf $<
-
-.PRECIOUS : %.dvi
-.PRECIOUS : %.ps
-.PRECIOUS : %.pdf
-
-##############################################################################
diff --git a/support/make/rmic.mk b/support/make/rmic.mk
deleted file mode 100644
index dd0233e610..0000000000
--- a/support/make/rmic.mk
+++ /dev/null
@@ -1,96 +0,0 @@
-############################################################-*-Makefile-*-####
-# RMIC - Generate Stubs for Java Class Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make rmic [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# RMIC_COMPILER = compiler name, for example RMIC
-# $(RMIC_COMPILER) = compiler command
-# $(RMIC_COMPILER)_FLAGS = compiler-specific compilation flags
-# RMIC_FLAGS += compilation flags
-# RMIC_CLASSPATH = location of user class files
-# RMIC_BOOTCLASSPATH = location of bootstrap class files
-# RMIC_EXTDIRS = location of installed extensions
-# RMIC_OUTPUTDIR = directory where to place generated class files
-# RMIC_CLASSES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable RMIC_CLASSPATH with target COMPILER, one may define the
-# variable COMPILER_RMIC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "objects/main/lib/scala/scala/runtime/distributed/ChannelImpl"
-#
-# make rmic RMIC_CLASSES=objects/main/lib/scala/scala/runtime/distributed/ChannelImpl
-#
-#
-# Compile the whole runtime
-#
-# make rmic target=RUNTIME
-#
-#
-# A Makefile rule that compiles all modified files from the runtime
-#
-# .latest-runtime : $(RUNTIME_RMIC_CLASSES)
-# @$(MAKE) rmic target=RUNTIME RUNTIME_RMIC_CLASSES='$?'
-# touch $@
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-RMIC_COMPILER ?= RMIC
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-RMIC ?= rmic
-
-##############################################################################
-# Values
-
-rmic_COMPILER = $(call RMIC_LOOKUP,RMIC_COMPILER)
-rmic_compiler = $(call RMIC_LOOKUP,$(rmic_COMPILER))
-rmic_FLAGS = $(call RMIC_LOOKUP,RMIC_FLAGS)
-rmic_CLASSPATH = $(call RMIC_LOOKUP,RMIC_CLASSPATH)
-rmic_BOOTCLASSPATH = $(call RMIC_LOOKUP,RMIC_BOOTCLASSPATH)
-rmic_EXTDIRS = $(call RMIC_LOOKUP,RMIC_EXTDIRS)
-rmic_OUTPUTDIR = $(call RMIC_LOOKUP,RMIC_OUTPUTDIR)
-rmic_CLASSES = $(call RMIC_LOOKUP,RMIC_CLASSES)
-
-##############################################################################
-# Command
-
-rmic += $(rmic_compiler)
-rmic += $(rmic_FLAGS)
-rmic += $(rmic_CLASSPATH:%=-classpath $(call CYGWIN_PATH,%))
-rmic += $(rmic_BOOTCLASSPATH:%=-bootclasspath $(call CYGWIN_PATH,%))
-rmic += $(rmic_EXTDIRS:%=-extdirs $(call CYGWIN_PATH,%))
-rmic += $(rmic_OUTPUTDIR:%=-d $(call CYGWIN_FILE,%))
-rmic += $(rmic_CLASSES)
-
-##############################################################################
-# Functions
-
-RMIC_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-rmic :
- @[ -d "$(rmic_OUTPUTDIR)" ] || $(MKDIR) -p "$(rmic_OUTPUTDIR)"
- $(strip $(rmic))
-
-.PHONY : rmic
-
-##############################################################################
diff --git a/support/make/sc.mk b/support/make/sc.mk
deleted file mode 100644
index 55eac3064e..0000000000
--- a/support/make/sc.mk
+++ /dev/null
@@ -1,110 +0,0 @@
-############################################################-*-Makefile-*-####
-# SC - Compile Scala Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make sc [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# SC_COMPILER = compiler name, for example SCALAC
-# $(SC_COMPILER) = compiler command
-# $(SC_COMPILER)_FLAGS = compiler-specific compilation flags
-# SC_FLAGS += compilation flags
-# SC_CLASSPATH = location of user class files
-# SC_SOURCEPATH = location of input source files
-# SC_BOOTCLASSPATH = location of bootstrap class files
-# SC_EXTDIRS = location of installed extensions
-# SC_OUTPUTDIR = directory where to place generated class files
-# SC_ENCODING = character encoding used by source files
-# SC_SOURCE = version of source code
-# SC_TARGET = version of target bytecode
-# SC_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable SC_CLASSPATH with target LIBRARY, one may define the
-# variable LIBRARY_SC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "sources/scala/Predef.scala"
-#
-# make sc SC_FILES=sources/scala/Predef.scala
-#
-#
-# Compile the whole runtime
-#
-# make sc target=LIBRARY
-#
-#
-# A Makefile rule that compiles all modified files from the runtime
-#
-# .latest-library : $(LIBRARY_SC_FILES)
-# @$(MAKE) sc target=LIBRARY LIBRARY_SC_FILES='$?'
-# touch $@
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-SC_COMPILER ?= SCALAC
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-SCALAC ?= scalac
-
-##############################################################################
-# Values
-
-sc_COMPILER = $(call SC_LOOKUP,SC_COMPILER)
-sc_compiler = $(call SC_LOOKUP,$(sc_COMPILER))
-sc_compiler_flags = $(call SC_LOOKUP,$(sc_COMPILER)_FLAGS)
-sc_FLAGS = $(call SC_LOOKUP,SC_FLAGS)
-sc_CLASSPATH = $(call SC_LOOKUP,SC_CLASSPATH)
-sc_SOURCEPATH = $(call SC_LOOKUP,SC_SOURCEPATH)
-sc_BOOTCLASSPATH = $(call SC_LOOKUP,SC_BOOTCLASSPATH)
-sc_EXTDIRS = $(call SC_LOOKUP,SC_EXTDIRS)
-sc_OUTPUTDIR = $(call SC_LOOKUP,SC_OUTPUTDIR)
-sc_ENCODING = $(call SC_LOOKUP,SC_ENCODING)
-sc_SOURCE = $(call SC_LOOKUP,SC_SOURCE)
-sc_TARGET = $(call SC_LOOKUP,SC_TARGET)
-sc_FILES = $(call SC_LOOKUP,SC_FILES)
-
-##############################################################################
-# Command
-
-sc += $(sc_compiler)
-sc += $(sc_compiler_flags)
-sc += $(sc_FLAGS)
-sc += $(sc_CLASSPATH:%=-classpath $(call CYGWIN_PATH,%))
-sc += $(sc_SOURCEPATH:%=-sourcepath $(call CYGWIN_PATH,%))
-sc += $(sc_BOOTCLASSPATH:%=-bootclasspath $(call CYGWIN_PATH,%))
-sc += $(sc_EXTDIRS:%=-extdirs $(call CYGWIN_PATH,%))
-sc += $(sc_OUTPUTDIR:%=-d $(call CYGWIN_FILE,%))
-sc += $(sc_ENCODING:%=-encoding %)
-sc += $(sc_SOURCE:%=-source %)
-sc += $(sc_TARGET:%=-target:%)
-sc += $(sc_FILES:%=$(call CYGWIN_FILE,'%'))
-
-##############################################################################
-# Functions
-
-SC_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-sc :
- @[ -d "$(sc_OUTPUTDIR)" ] || $(MKDIR) -p "$(sc_OUTPUTDIR)"
- $(strip $(sc))
-
-.PHONY : sc
-
-##############################################################################
diff --git a/support/make/scalatex.mk b/support/make/scalatex.mk
deleted file mode 100644
index 01bd2b186f..0000000000
--- a/support/make/scalatex.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-############################################################-*-Makefile-*-####
-# SCALATEX - Evaluate Embedded Scala Scripts
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make scalatex[.clean|.distclean]
-# make <*.tex>
-#
-##############################################################################
-# Examples
-#
-# Generate all .tex files produced by processing a .scala.tex file
-#
-# make scalatex
-#
-#
-# Generate tutorial.tex by processing tutorial.scala.tex
-#
-# make tutorial.tex
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-SCSH ?= scsh
-
-##############################################################################
-# Values
-
-scalatex_ENV ?= CLASSPATH=$(PROJECT_CLASSPATH)
-scalatex_SCRIPT ?= $(PROJECT_SUPPORTDIR)/latex/scalatex.scm
-
-##############################################################################
-# Commands
-
-all : scalatex
-clean : scalatex.clean
-distclean : scalatex.distclean
-
-scalatex : $(patsubst %.scala.tex,%.tex,$(wildcard *.scala.tex))
-
-scalatex.clean :
-
-scalatex.distclean :
- @for file in *.scala.tex; do \
- [ "$$file" = "*.scala.tex" ] || ( \
- echo $(RM) "$${file%.scala.tex}.tex"; \
- $(RM) "$${file%.scala.tex}.tex" ); \
- done
-
-.PHONY : scalatex
-.PHONY : scalatex.clean
-.PHONY : scalatex.distclean
-
-##############################################################################
-# Rules
-
-%.tex : %.scala.tex
- $(scalatex_ENV) $(SCSH) -e main -s $(scalatex_SCRIPT) $< $@
-
-.PRECIOUS : %.tex
-
-##############################################################################
diff --git a/support/make/sdc.mk b/support/make/sdc.mk
deleted file mode 100644
index b65a91aa22..0000000000
--- a/support/make/sdc.mk
+++ /dev/null
@@ -1,111 +0,0 @@
-############################################################-*-Makefile-*-####
-# SDC - Compile Scala Documentation Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make sdc [target=<target>] {<VARIABLE>=<value>}
-#
-##############################################################################
-# Variables
-#
-# SDC_COMPILER = compiler name, for example SCALADOC
-# $(SDC_COMPILER) = compiler command
-# $(SDC_COMPILER)_FLAGS = compiler-specific compilation flags
-# SDC_FLAGS += compilation flags
-# SDC_CLASSPATH = location of user class files
-# SDC_SOURCEPATH = location of input source files
-# SDC_BOOTCLASSPATH = location of bootstrap class files
-# SDC_EXTDIRS = location of installed extensions
-# SDC_OUTPUTDIR = directory where to place generated class files
-# SDC_ENCODING = character encoding used by source files
-# SDC_SOURCE = version of source code
-# SDC_TARGET = version of target bytecode
-# SDC_FILES += files to compile
-#
-# All variables may have target specific values which override the
-# normal value. Those values are specified by variables whose name is
-# prefixed with the target name. For example, to override the value of
-# the variable SDC_CLASSPATH with target LIBRARY, one may define the
-# variable LIBRARY_SDC_CLASSPATH.
-#
-##############################################################################
-# Examples
-#
-# Compile file "sources/scala/Predef.scala"
-#
-# make sdc SDC_FILES=sources/scala/Predef.scala
-#
-#
-# Compile the whole runtime
-#
-# make sdc target=LIBRARY
-#
-#
-# A Makefile rule that compiles all modified files from the runtime
-#
-# .latest-library : $(LIBRARY_SDC_FILES)
-# @$(MAKE) sdc target=LIBRARY LIBRARY_SDC_FILES='$?'
-# touch $@
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-SDC_COMPILER ?= SCALADOC
-CYGWIN_PATH ?= $(1)
-CYGWIN_FILE ?= $(1)
-SCALADOC ?= scaladoc
-
-##############################################################################
-# Values
-
-sdc_COMPILER = $(call SDC_LOOKUP,SDC_COMPILER)
-sdc_compiler = $(call SDC_LOOKUP,$(sdc_COMPILER))
-sdc_compiler_flags = $(call SDC_LOOKUP,$(sdc_COMPILER)_FLAGS)
-sdc_FLAGS = $(call SDC_LOOKUP,SDC_FLAGS)
-sdc_CLASSPATH = $(call SDC_LOOKUP,SDC_CLASSPATH)
-sdc_SOURCEPATH = $(call SDC_LOOKUP,SDC_SOURCEPATH)
-sdc_BOOTCLASSPATH = $(call SDC_LOOKUP,SDC_BOOTCLASSPATH)
-sdc_EXTDIRS = $(call SDC_LOOKUP,SDC_EXTDIRS)
-sdc_OUTPUTDIR = $(call SDC_LOOKUP,SDC_OUTPUTDIR)
-sdc_ENCODING = $(call SDC_LOOKUP,SDC_ENCODING)
-sdc_SOURCE = $(call SDC_LOOKUP,SDC_SOURCE)
-sdc_TARGET = $(call SDC_LOOKUP,SDC_TARGET)
-sdc_FILES = $(call SDC_LOOKUP,SDC_FILES)
-
-##############################################################################
-# Command
-
-sdc += $(sdc_compiler)
-sdc += $(sdc_compiler_flags)
-sdc += $(sdc_FLAGS)
-sdc += $(sdc_CLASSPATH:%=-classpath $(call CYGWIN_PATH,%))
-sdc += $(sdc_SOURCEPATH:%=-sourcepath $(call CYGWIN_PATH,%))
-sdc += $(sdc_BOOTCLASSPATH:%=-bootclasspath $(call CYGWIN_PATH,%))
-sdc += $(sdc_EXTDIRS:%=-extdirs $(call CYGWIN_PATH,%))
-sdc += $(sdc_OUTPUTDIR:%=-d $(call CYGWIN_FILE,%))
-sdc += $(sdc_ENCODING:%=-encoding %)
-sdc += $(sdc_SOURCE:%=-source %)
-sdc += $(sdc_TARGET:%=-target %)
-sdc += $(sdc_FILES:%=$(call CYGWIN_FILE,'%'))
-sdc += -- scala
-
-##############################################################################
-# Functions
-
-SDC_LOOKUP = $(if $($(target)_$(1)),$($(target)_$(1)),$($(1)))
-
-##############################################################################
-# Rules
-
-sdc :
- @[ -d "$(sdc_OUTPUTDIR)" ] || $(MKDIR) -p "$(sdc_OUTPUTDIR)"
- $(strip $(sdc))
-
-.PHONY : sdc
-
-##############################################################################
diff --git a/support/make/verbfilter.mk b/support/make/verbfilter.mk
deleted file mode 100644
index 984313b30b..0000000000
--- a/support/make/verbfilter.mk
+++ /dev/null
@@ -1,80 +0,0 @@
-############################################################-*-Makefile-*-####
-# VERBFILTER - Verbfilter Latex Files
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make verbfilter[.clean|.distclean]
-# make [VERBFILTER=<verbfilter-source-file>] <*.tex>
-#
-##############################################################################
-# Variables
-#
-# VERBFILTER = Verb filter source file
-#
-##############################################################################
-# Examples
-#
-# Generate all .tex files produced by verbfiltering a .verb.tex file
-#
-# make verbfilter
-#
-#
-# Generate reference.tex by verbfiltering reference.verb.tex with the
-# specified verbfilter
-#
-# make VERBFILTER=../../support/latex/verbfilterScala reference.tex
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-JAVA ?= java
-JAVAC ?= javac
-VERBFILTER ?= $(PROJECT_SUPPORTDIR)/latex/verbfilterScala.java
-
-##############################################################################
-# Values
-
-verbfilter = $(VERBFILTER:%.java=%)
-verbfilter_CLASS = $(PROJECT_OUTPUTDIR)/$(verbfilter).class
-
-##############################################################################
-# Commands
-
-all : verbfilter
-clean : verbfilter.clean
-distclean : verbfilter.distclean
-
-verbfilter : $(patsubst %.verb.tex,%.tex,$(wildcard *.verb.tex))
-
-verbfilter.clean :
-
-verbfilter.distclean :
- @for file in *.verb.tex; do \
- [ "$$file" = "*.verb.tex" ] || ( \
- echo $(RM) "$${file%.verb.tex}.tex"; \
- $(RM) "$${file%.verb.tex}.tex" ); \
- done
- $(RM) $(verbfilter_CLASS)
-
-.PHONY : verbfilter
-.PHONY : verbfilter.clean
-.PHONY : verbfilter.distclean
-
-##############################################################################
-# Rules
-
-%.tex : %.verb.tex $(verbfilter_CLASS)
- $(JAVA) -cp $(dir $(verbfilter_CLASS)) $(notdir $(verbfilter)) $< $@
-
-$(verbfilter_CLASS) : $(VERBFILTER)
- $(JAVAC) $?
-
-.PRECIOUS : %.tex
-.PRECIOUS : $(verbfilter_CLASS)
-
-##############################################################################
diff --git a/support/make/wc.mk b/support/make/wc.mk
deleted file mode 100644
index e273544f48..0000000000
--- a/support/make/wc.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-############################################################-*-Makefile-*-####
-# WC - Count Bytes, Words and Lines
-##############################################################################
-# $Id$
-
-##############################################################################
-# Usage
-#
-# make wc [FLAGS=<flags>] [FILES=<files>]
-#
-##############################################################################
-# Examples
-#
-# Count lines in all source files:
-#
-# make wc
-#
-#
-# Count lines in the compiler source files:
-#
-# make wc FILES='$(COMPILER_SOURCES)'
-#
-##############################################################################
-
-##############################################################################
-# Defaults
-
-WC ?= wc
-
-##############################################################################
-# Variables
-
-WC_BINARY ?= $(WC)
-WC_FLAGS ?= $(FLAGS)
-WC_FILES ?= $(if $(FILES),$(FILES),$(PROJECT_SOURCES))
-
-##############################################################################
-# Rules
-
-wc :
- @$(WC_BINARY) $(WC_FLAGS) $(WC_FILES:%='%')
-
-.PHONY : wc
-
-##############################################################################
diff --git a/support/nightly-build/scala-nightly-test.scm b/support/nightly-build/scala-nightly-test.scm
deleted file mode 100755
index 9928601ac6..0000000000
--- a/support/nightly-build/scala-nightly-test.scm
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/sh
-exec scsh -e main -s "$0" "$@"
-!#
-
-;; Script to perform the nightly test/build of Scala.
-;;
-;; Always make sure that the latest version of this file is copied to
-;; ~scalatest/bin/scala-nightly-test.scm
-;;
-;; $Id$
-
-;; Makefile.private to use for the build.
-(define private-makefile "Makefile.private")
-(define source-private-makefile
- (expand-file-name (string-append "~scalatest/support/" private-makefile)))
-
-;; CVS repository containing the Scala compiler.
-(define scala-cvs-repository-dir
- (expand-file-name "~cvslamp/repositories/scala"))
-;; CVS module containing the compiler.
-(define scala-cvs-module-name "scala")
-
-;; E-mail address to which the failure notification should be sent.
-(define notify-email "scala-devel@groupes.epfl.ch")
-; (define notify-email "Michel.Schinz@epfl.ch") ; DEBUG
-
-;; Directory in which the distribution should be built.
-(define nightly-build-dir
- (expand-file-name "~linuxsoft/archives/scala/nightly"))
-
-;; End of configuration section.
-
-(define (main cmd-line)
- (let ((prog (car cmd-line))
- (args (cdr cmd-line)))
- (if (= 1 (length args))
- (scala-test (first args))
- (display-usage-and-exit prog))))
-
-(define (display-usage-and-exit prog)
- (format #t "Usage: ~a <result-dir>\n" prog)
- (exit 1))
-
-(define (get-public-link file)
- (temp-file-iterate (lambda (link) (create-symlink file link) link)
- (expand-file-name "~/public_html/log-~a.txt")))
-
-(define (get-checkout-dir base-dir date)
- (expand-file-name (format-date "~Y-~m-~d" date) base-dir))
-
-(define (start-section title)
- (format #t "\n* ~a\n\n" title))
-
-(define (scala-test base-dir)
- (let* ((checkout-dir (get-checkout-dir base-dir (date)))
- (log-file (expand-file-name "log" checkout-dir)))
- (create-directory checkout-dir)
- (call-with-output-file log-file
- (lambda (log-port)
- (with-current-output-port log-port
- (with-current-error-port log-port
- (stdports->stdio)
- (with-cwd checkout-dir
- (if (not (call-with-current-continuation scala-do-test))
- (let ((link (get-public-link log-file)))
- (send-warning-mail log-file
- (file-name-nondirectory link)))))))))))
-
-(define (scala-do-test return)
- (dynamic-wind
- (lambda ()
- (display "In Emacs, read this file in -*- Outline -*- mode\n")
- (start-section "Starting time")
- (display (format-date "~Y-~m-~d ~H:~M ~Z\n" (date))))
- (lambda ()
- (let ((fail-if-error (lambda (code) (if (not (zero? code))
- (return #f)))))
- (start-section "Checking out Scala module")
- (fail-if-error (run (cvs -d ,scala-cvs-repository-dir
- checkout
- -P
- ,scala-cvs-module-name)))
- (with-cwd scala-cvs-module-name
- (start-section "Creating link(s)")
- (create-symlink source-private-makefile private-makefile)
- (start-section "Compiling Scala compiler")
- (fail-if-error (run (make)))
- (start-section "Testing Scala compiler (1)")
- (fail-if-error (run (make test)))
- (start-section "Testing Scala compiler (2)")
- (fail-if-error
- (run (./objects/main/bin/scalatest --color=none
- --show-log)))
- (start-section "Creating nightly distribution")
- (run (rm -rf ,nightly-build-dir))
- (create-directory nightly-build-dir)
- (fail-if-error (run (make distrib) (< /dev/null)))
- #t)))
- (lambda ()
- (start-section "Ending time")
- (display (format-date "~Y-~m-~d ~H:~M ~Z\n" (date))))))
-
-(define (send-warning-mail log-file-name link-name)
- (send-mail
- notify-email
- `(("Subject" . "Failure of nightly scala test")
- ("To" . ,notify-email)
- ("Reply-To" . ,notify-email))
- (string-append
- "Tonight's automatic Scala test failed. More details can be found\n"
- "in file "log-file-name"\n"
- "which is available through the following URL:\n\n"
- " http://lamp.epfl.ch/~scalatest/"link-name)))
-
-(define (send-mail to headers body)
- (let ((mail-port (make-string-output-port)))
- (for-each (lambda (name/contents)
- (format mail-port "~a: ~a\n"
- (car name/contents)
- (cdr name/contents)))
- headers)
- (newline mail-port)
- (write-string body mail-port)
- (newline mail-port)
- (run (sendmail "-i" ,to)
- (<< ,(string-output-port-output mail-port)))))
-
-;;; Local Variables:
-;;; mode:scheme
-;;; End:
diff --git a/support/scripts/cvs-move-directory b/support/scripts/cvs-move-directory
deleted file mode 100755
index 44742ef9d1..0000000000
--- a/support/scripts/cvs-move-directory
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-########################################################-*-Shell-script-*-####
-# CVS-Move-Directory Command
-##############################################################################
-# $Id$
-
-source $0.sh;
-${0##*/} "$@";
-
-##############################################################################
diff --git a/support/scripts/cvs-move-directory.sh b/support/scripts/cvs-move-directory.sh
deleted file mode 100644
index 4f4b8b6be4..0000000000
--- a/support/scripts/cvs-move-directory.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-########################################################-*-Shell-script-*-####
-# CVS-Move-Directory Function
-##############################################################################
-# $Id$
-
-source ${0%/*}/stdlib.sh;
-
-##############################################################################
-# cvs-move-directory
-
-function cvs-move-directory-usage() {
- echo "Usage: $program <source-directory> <destination-directory>";
-}
-
-function cvs-move-directory-args() {
- case "$1" in
- -? | -h | --help ) $program-usage; exit 0;;
- --verbose ) verbose=true; return 1;;
- --version ) echo "$program (bash script) $version";exit 0;;
- -* ) args-option-unknown "$@";;
- * ) args-append-array args "$@";;
- esac;
-}
-
-function cvs-move-directory-update-repository() {
- [ $# = 2 -a -d "$1" -a -d "$1/CVS" ] || abort "internal error";
- local directory="$1"; shift 1;
- local repository="$1"; shift 1;
-
- runO "$directory/CVS/Repository" echo "$repository";
-
- local name;
- for name in `ls -A "$directory"`; do
- local file="$directory/$name";
- if [ -d "$file" -a -d "$file/CVS" ]; then
- cvs-move-directory-update-repository "$file" "$repository/$name";
- fi;
- done;
-}
-
-function cvs-move-directory() {
- local program="$FUNCNAME";
- local version='$Revision$';
- local -a args;
- args-loop "$@";
-
- # get source and destination directories
- [ ${#args[@]} == 2 ] || { $program-usage 1>&2; exit 1; };
- local src_dir="${args[0]}";
- local dst_dir="${args[1]}";
-
- if [ ! -d "$src_dir" ]; then
- abort "could not find source directory '$src_dir'";
- fi;
- if [ ! -d "$src_dir/CVS" ]; then
- abort "source directory '$src_dir' is not cvs-controlled";
- fi;
- if [ -d "$dst_dir" ]; then
- abort "destination directory '$dst_dir' exists already";
- fi;
-
- local src_name=`basename "$src_dir"`;
- local dst_name=`basename "$dst_dir"`;
- local src_parent=`dirname "$src_dir"`;
- local dst_parent=`dirname "$dst_dir"`;
- local src_entries="$src_parent/CVS/Entries";
- local dst_entries="$dst_parent/CVS/Entries";
- local dst_repository="$dst_parent/CVS/Repository";
-
- if [ ! -f "$src_entries" ]; then
- abort "could not find source entry file '$src_entries'";
- fi;
- if [ ! -f "$dst_entries" ]; then
- abort "could not find destination entry file '$dst_entries'";
- fi;
- if [ ! -f "$dst_repository" ]; then
- abort "could not find destination repository file '$dst_repository'";
- fi;
-
- run mv "$src_dir" "$dst_dir";
- runO "$src_entries~" grep -v "D/$src_name////" "$src_entries";
- run mv "$src_entries~" "$src_entries";
- runOO "$dst_entries" echo "D/$dst_name////";
-
- cvs-move-directory-update-repository "$dst_dir" \
- `head -1 $dst_repository`/"$dst_name";
-}
-
-##############################################################################
diff --git a/support/scripts/cvs-remove-directory b/support/scripts/cvs-remove-directory
deleted file mode 100755
index a56c9e8263..0000000000
--- a/support/scripts/cvs-remove-directory
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-########################################################-*-Shell-script-*-####
-# CVS-Remove-Directory Command
-##############################################################################
-# $Id$
-
-source $0.sh;
-${0##*/} "$@";
-
-##############################################################################
diff --git a/support/scripts/cvs-remove-directory.sh b/support/scripts/cvs-remove-directory.sh
deleted file mode 100644
index db46589b1f..0000000000
--- a/support/scripts/cvs-remove-directory.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-########################################################-*-Shell-script-*-####
-# CVS-Remove-Directory Function
-##############################################################################
-# $Id$
-
-source ${0%/*}/stdlib.sh;
-
-##############################################################################
-# cvs-move-directory
-
-function cvs-remove-directory-usage() {
- echo "Usage: $program <source-directory>";
-}
-
-function cvs-remove-directory-args() {
- case "$1" in
- -? | -h | --help ) $program-usage; exit 0;;
- --verbose ) verbose=true; return 1;;
- --version ) echo "$program (bash script) $version";exit 0;;
- -* ) args-option-unknown "$@";;
- * ) args-append-array args "$@";;
- esac;
-}
-
-function cvs-remove-directory() {
- local program="$FUNCNAME";
- local version='$Revision$';
- local -a args;
- args-loop "$@";
-
- # get source and destination directories
- [ ${#args[@]} == 1 ] || { $program-usage 1>&2; exit 1; };
- local src_dir="${args[0]}";
-
- if [ ! -d "$src_dir" ]; then
- abort "could not find source directory '$src_dir'";
- fi;
- if [ ! -d "$src_dir/CVS" ]; then
- abort "source directory '$src_dir' is not cvs-controlled";
- fi;
-
- local src_name=`basename "$src_dir"`;
- local src_parent=`dirname "$src_dir"`;
- local src_entries="$src_parent/CVS/Entries";
-
- if [ ! -f "$src_entries" ]; then
- abort "could not find source entry file '$src_entries'";
- fi;
-
- runO "$src_entries~" grep -v "D/$src_name////" "$src_entries";
- run mv "$src_entries~" "$src_entries";
-}
-
-##############################################################################
diff --git a/support/scripts/install b/support/scripts/install
deleted file mode 100755
index e0f19ad9d3..0000000000
--- a/support/scripts/install
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-########################################################-*-Shell-script-*-####
-# Install Command
-##############################################################################
-# $Id$
-
-source ${0%/*}/install.sh;
-install "$@"
-
-##############################################################################
diff --git a/support/scripts/install.sh b/support/scripts/install.sh
deleted file mode 100644
index fb26219b51..0000000000
--- a/support/scripts/install.sh
+++ /dev/null
@@ -1,131 +0,0 @@
-########################################################-*-Shell-script-*-####
-# Install Function
-##############################################################################
-# $Id$
-
-source ${0%/*}/stdlib.sh;
-
-##############################################################################
-# install
-
-function install-args() {
- case "$1" in
- --version ) echo "install (bash script) $version"; exit 0;;
- -d ) directory="true"; return 1;;
- --directory ) directory="true"; return 1;;
- -D ) leading="true"; return 1;;
- -o ) args-option-value owner "$@";;
- --owner=* ) args-inline-value owner "$@";;
- -g ) args-option-value group "$@";;
- --group=* ) args-inline-value group "$@";;
- -m ) args-option-value mode "$@";;
- --mode=* ) args-inline-value mode "$@";;
- -p ) preserve="true"; return 1;;
- --preserve-timestamps ) preserve="true"; return 1;;
- -* ) args-option-unknown "$@";;
- * ) args-append-array files "$@";;
- esac;
-}
-
-function install-attr() {
- local file="$1";
- if [ -n "$mode" ]; then
- run chmod "$mode" "$file";
- fi;
- if [ -n "$owner" -a -n "$group" ]; then
- run chown "$owner:$group" "$file";
- elif [ -n "$owner" ]; then
- run chown "$owner" "$file";
- elif [ -n "$group" ]; then
- run chown ":$group" "$file";
- fi;
-}
-
-function install-mkdir() {
- local dstpath="$1"; shift 1;
- if [ "$dstpath" != "." ]; then
- run mkdir -p "$dstpath";
- fi;
-}
-
-function install-copy() {
- local srcfile="$1"; shift 1;
- local dstfile="$1"; shift 1;
- run cp "$srcfile" "$dstfile";
- if [ "$preserve" == "true" ]; then
- touch -r "$srcfile" "$dstfile";
- fi;
- install-attr "$dstfile";
-}
-
-function install-dirs() {
- while [ $# -gt 0 ]; do
- local dstpath="$1"; shift 1;
- install-mkdir "$dstpath";
- install-attr "$dstpath";
- done;
-}
-
-function install-file() {
- local srcfile="$1"; shift 1;
- local dstfile="$1"; shift 1;
- local dstpath="`dirname "$dstfile"`";
- if [ "$leading" == "true" ]; then
- install-mkdir "$dstpath";
- fi;
- install-copy "$srcfile" "$dstfile";
-}
-
-function install-files() {
- local dstpath="$1"; shift 1;
- while [ $# -gt 0 ]; do
- local srcfile="$1"; shift 1;
- local dstfile="$dstpath/`basename "$srcfile"`";
- install-copy "$srcfile" "$dstfile";
- done;
-}
-
-function install() {
- local program="$FUNCNAME";
- local version='$Revision$';
- local directory="false";
- local leading="false";
- local owner="";
- local group="";
- local mode="";
- local preserve="false";
- local -a files;
-
- args-loop "$@";
-
- local count="${#files[@]}";
- if [ $count -lt 1 ]; then
- if [ "$directory" == "true" ]; then
- abort "missing target directory";
- else
- abort "missing source file";
- fi;
- fi;
-
- if [ "$directory" == "true" ]; then
- install-dirs "${files[@]}";
- else
- if [ $count -lt 2 ]; then
- abort "missing destination";
- fi;
-
- local last="${files[$(($count-1))]}";
- if [ -d "$last" ]; then
- unset files[$(($count-1))];
- install-files "$last" "${files[@]}";
- elif [ $count -eq 2 ]; then
- install-file "${files[@]}";
- else
- local text1="installing multiple files, but last";
- local text2="argument, '$last' is not a directory";
- abort "$text1 $text2";
- fi;
- fi;
-}
-
-##############################################################################
diff --git a/support/scripts/mirror b/support/scripts/mirror
deleted file mode 100755
index 179582d1de..0000000000
--- a/support/scripts/mirror
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-########################################################-*-Shell-script-*-####
-# Mirror Command
-##############################################################################
-# $Id$
-
-source ${0%/*}/mirror.sh;
-mirror "$@"
-
-##############################################################################
diff --git a/support/scripts/mirror.sh b/support/scripts/mirror.sh
deleted file mode 100644
index 64848ed538..0000000000
--- a/support/scripts/mirror.sh
+++ /dev/null
@@ -1,82 +0,0 @@
-########################################################-*-Shell-script-*-####
-# Mirror Function
-##############################################################################
-# $Id$
-
-source ${0%/*}/install.sh;
-
-##############################################################################
-# mirror
-
-# usage: mirror [-C prefix] [install-options] [files] dstdir
-# first cds into <prefix>, then mirrors <files> into <dstdir>
-
-function mirror-args() {
- case "$1" in
- --version ) echo "install (bash script) $version"; exit 0;;
- -C ) args-option-value prefix "$@";;
- -o ) args-option-value owner "$@";;
- --owner=* ) args-inline-value owner "$@";;
- -g ) args-option-value group "$@";;
- --group=* ) args-inline-value group "$@";;
- -m ) args-option-value mode "$@";;
- --mode=* ) args-inline-value mode "$@";;
- -p ) preserve="true"; return 1;;
- --preserve-timestamps ) preserve="true"; return 1;;
- -* ) args-option-unknown "$@";;
- * ) args-append-array files "$@";;
- esac;
-}
-
-function mirror-files() {
- local prefix="$1"; shift 1;
- local dstpath="$1"; shift 1;
- while [ $# -gt 0 ]; do
- local srcfile="$1"; shift 1;
- local dstfile="$dstpath/$srcfile";
- install "${instargs[@]}" "$prefix/$srcfile" "$dstfile";
- done;
-}
-
-function mirror() {
- local program="$FUNCNAME";
- local version='$Revision$';
- local prefix=".";
- local owner="";
- local group="";
- local mode="";
- local preserve="false";
- local -a files;
-
- args-loop "$@";
-
- if [ ! -d "$prefix" ]; then
- abort "could not find directory '$prefix'";
- fi;
-
- local count="${#files[@]}";
- if [ $count -lt 1 ]; then
- abort "missing target directory";
- fi;
-
- local -a instargs;
- instargs[${#instargs[@]}]="-D";
- if [ -n "$owner" ]; then
- instargs[${#instargs[@]}]="--owner=$owner";
- fi;
- if [ -n "$group" ]; then
- instargs[${#instargs[@]}]="--group=$group";
- fi;
- if [ -n "$mode" ]; then
- instargs[${#instargs[@]}]="--mode=$mode";
- fi;
- if [ "$preserve" == "true" ]; then
- instargs[${#instargs[@]}]="--preserve-timestamps";
- fi;
-
- local dstpath="${files[$(($count-1))]}";
- unset files[$(($count-1))];
- mirror-files "$prefix" "$dstpath" "${files[@]}";
-}
-
-##############################################################################
diff --git a/support/scripts/stdlib.sh b/support/scripts/stdlib.sh
deleted file mode 100644
index fed03dae2b..0000000000
--- a/support/scripts/stdlib.sh
+++ /dev/null
@@ -1,94 +0,0 @@
-########################################################-*-Shell-script-*-####
-# Bash Standard Library
-##############################################################################
-# $Id$
-
-function print() {
- while [ $# -gt 0 ]; do
- echo "$1";
- shift 1;
- done
-}
-
-function abort() {
- print "${program:-$0}: ""$@" 1>&2;
- exit 1;
-}
-
-function warning() {
- print "${program:-$0}: warning: ""$@" 1>&2;
-}
-
-function run_() {
- "$@" || exit $?;
-}
-
-function run() {
- [ "$verbose" = "true" ] && echo "$@";
- run_ "$@";
-}
-
-function runO() {
- local stdout="$1"; shift 1;
- [ "$verbose" = "true" ] && echo "$@" "1>" "$stdout";
- run_ "$@" 1> "$stdout";
-}
-
-function runOO() {
- local stdout="$1"; shift 1;
- [ "$verbose" = "true" ] && echo "$@" "1>>" "$stdout";
- run_ "$@" 1>> "$stdout";
-}
-
-##############################################################################
-
-# usage: args-loop <script> "$@"
-# process all arguments
-function args-loop() {
- while [ $# -gt 0 ]; do
- $program-args "$@";
- shift $?;
- done;
-}
-
-# usage: args-option-unknown "$@"
-# <option> ... => abort "unknown option <option>";
-function args-option-unknown() {
- abort "unknown option $1";
-}
-
-# usage: args-unknown "$@"
-# <argument> ... => abort "don't know what to do with argument <argument>";
-function args-unknown() {
- abort "don't know what to do with argument '$1'";
-}
-
-# usage: args-append-array <array> "$@"
-# <argument> ... => <array>[${#<array>[@]}]=<argument>; shift 1;
-function args-append-array() {
- local array="$1"; shift 1;
- eval "$array[\${#$array[@]}]=\"\$1\"";
- return 1;
-}
-
-# usage: args-option-value <value> "$@"
-# <option> <argument> ... => <value>=<argument>; shift 2;
-function args-option-value() {
- local value="$1"; shift 1;
- if [ $# -lt 2 ]; then
- abort "missing argument for option $1";
- fi;
- eval "$value=\"\$2\"";
- return 2;
-}
-
-# usage: args-inline-value <value> "$@"
-# <value-name>=<argument> ... => <value>=<argument>; shift 1;
-function args-inline-value() {
- local value="$1"; shift 1;
- local prefix="$value";
- eval "$value=\"\${1#--$prefix=}\"";
- return 1;
-}
-
-##############################################################################
diff --git a/support/scripts/version-manager b/support/scripts/version-manager
deleted file mode 100755
index 7c4d8f3d38..0000000000
--- a/support/scripts/version-manager
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-########################################################-*-Shell-script-*-####
-# Version-Manager Command
-##############################################################################
-# $Id$
-
-source $0.sh;
-${0##*/} "$@";
-
-##############################################################################
diff --git a/support/scripts/version-manager.sh b/support/scripts/version-manager.sh
deleted file mode 100644
index 9c7976872f..0000000000
--- a/support/scripts/version-manager.sh
+++ /dev/null
@@ -1,150 +0,0 @@
-########################################################-*-Shell-script-*-####
-# Version-Manager Function
-##############################################################################
-# $Id$
-
-source ${0%/*}/stdlib.sh;
-
-##############################################################################
-# version-manager
-
-function version-manager-usage() {
- echo "Usage: $program <version-file> update";
- echo " $program <version-file> increment";
- echo " $program <version-file> set <version-value>";
-}
-
-function version-manager-args() {
- case "$1" in
- -? | -h | --help ) $program-usage; exit 0;;
- --verbose ) verbose=true; return 1;;
- --version ) echo "$program (bash script) $version";exit 0;;
- -* ) args-option-unknown "$@";;
- * ) args-append-array args "$@";;
- esac;
-}
-
-function version-manager-compose() {
- [ $# = 5 ] || abort "internal error";
- local variable="$1"; shift 1;
- local value="$1.$2.$3.$4"; shift 4;
- eval "$variable=\"\$value\"";
-}
-
-function version-manager-decompose() {
- [ $# = 2 ] || abort "internal error";
- local array="$1"; shift 1;
- local value="$1"; shift 1;
- local v0=`expr "$value" : '\([0-9]*\)\.[0-9]*\.[0-9]*\.[0-9]*$'`;
- local v1=`expr "$value" : '[0-9]*\.\([0-9]*\)\.[0-9]*\.[0-9]*$'`;
- local v2=`expr "$value" : '[0-9]*\.[0-9]*\.\([0-9]*\)\.[0-9]*$'`;
- local v3=`expr "$value" : '[0-9]*\.[0-9]*\.[0-9]*\.\([0-9]*\)$'`;
- eval "$array[0]=\"\$v0\"";
- eval "$array[1]=\"\$v1\"";
- eval "$array[2]=\"\$v2\"";
- eval "$array[3]=\"\$v3\"";
-}
-
-function version-manager-check-syntax() {
- [ $# = 1 ] || abort "internal error";
- local value="$1"; shift 1;
- expr "$value" : '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$' 1> /dev/null 2>&1;
-}
-
-function version-manager-check-order() {
- [ $# = 8 ] || abort "internal error";
- local l0="$1"; local l1="$2"; local l2="$3"; local l3="$4"; shift 4;
- local r0="$1"; local r1="$2"; local r2="$3"; local r3="$4"; shift 4;
- [ $l0 -lt $r0 ] && return 0; [ $l0 -gt $r0 ] && return 1;
- [ $l1 -lt $r1 ] && return 0; [ $l1 -gt $r1 ] && return 1;
- [ $l2 -lt $r2 ] && return 0; [ $l2 -gt $r2 ] && return 1;
- [ $l3 -lt $r3 ] && return 0; [ $l3 -gt $r3 ] && return 1;
- return 1;
-}
-
-function version-manager() {
- local program="$FUNCNAME";
- local version='$Revision$';
- local -a args;
- args-loop "$@";
-
- # get file name and command name
- [ ${#args[@]} -ge 2 ] || { $program-usage 1>&2; exit 1; }
- local file="${args[0]}";
- local command="${args[1]}";
-
- # check command name and argument count
- case "$command" in
- update ) local nargs=0;;
- increment ) local nargs=0;;
- set ) local nargs=1;;
- * ) $program-usage 1>&2; exit 1;;
- esac;
- [ ${#args[@]} = $[$nargs+2] ] || { $program-usage 1>&2; exit 1; }
-
- # check new value syntax, if command is "set"
- if [ "$command" = "set" ]; then
- local new_value="${args[2]}";
- if ! $program-check-syntax "$new_value.0"; then
- local -a error;
- error[0]="version value '$new_value' does not conform";
- error[1]="to version syntax <int>.<int>.<int>";
- abort "${error[*]}";
- fi;
- new_value="$new_value.0";
- fi;
-
- # check file existence
- [ -f "$file" ] || abort "could not find file '$file'";
-
- # update version file
- run rm -f "$file";
- run cvs -Q update "$file";
-
- # get old value
- local old_value=`tail -1 "$file"`;
-
- # check old value syntax
- if ! $program-check-syntax "$old_value"; then
- local -a error;
- error[0]="version value '$old_value' in file '$file' does not conform";
- error[1]="to version syntax <int>.<int>.<int>.<int>";
- abort "${error[*]}";
- fi;
-
- # terminate if command is "update"
- [ "$command" = "update" ] && exit 0;
-
- # compute old and new arrays
- local -a old_array;
- local -a new_array;
- $program-decompose old_array "$old_value";
- if [ "$command" = "increment" ]; then
- $program-decompose new_array "$old_value";
- new_array[3]=$[${new_array[3]}+1];
- else
- $program-decompose new_array "$new_value";
- fi;
-
- # check order of old and new values
- if ! $program-check-order "${old_array[@]}" "${new_array[@]}"; then
- abort "new version must be greater than '$old_value'";
- fi;
-
- # compute new value
- local new_value;
- $program-compose new_value "${new_array[@]}";
-
- # rewrite version file
- runO "$file~" sed -es@"$old_value"@"$new_value"@ "$file";
- run mv "$file~" "$file";
-
- # commit version file
- runO /dev/null cvs -Q commit -m "Set version to $new_value" "$file";
-
- if [ "$command" = "set" ]; then
- echo "Successfully changed version to $new_value";
- fi;
-}
-
-##############################################################################
diff --git a/support/windows/scala_wrapper-footer.bat b/support/windows/scala_wrapper-footer.bat
deleted file mode 100755
index a9fd9b6605..0000000000
--- a/support/windows/scala_wrapper-footer.bat
+++ /dev/null
@@ -1,29 +0,0 @@
-
-if "%SCALA_HOME%" == "" goto error1
-if not exist "%SCALA_HOME%\VERSION-%VERSION%" goto error2
-
-set ARGS=
-
-:loop
-if '%1' == '' goto exec
-set ARGS=%ARGS% %1
-shift
-goto loop
-
-:exec
-%COMMAND% %ARGS%
-goto end
-
-:error1
-echo ERROR: environment variable SCALA_HOME is undefined. It should point to the directory containing the file "VERSION-%VERSION%".
-goto end
-
-:error2
-echo ERROR: environment variable SCALA_HOME points to the wrong directory "%SCALA_HOME%". It should point to the directory containing the file "VERSION-%VERSION%".
-goto end
-
-:end
-set VERSION=
-set COMMAND=
-
-if "%OS%"=="Windows_NT" @endlocal
diff --git a/support/windows/scala_wrapper-header.bat b/support/windows/scala_wrapper-header.bat
deleted file mode 100755
index 7f70f30cb1..0000000000
--- a/support/windows/scala_wrapper-header.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-@echo off
-
-rem Copyright (C) 2002-2005 LAMP/EPFL
-rem
-rem This is free software; see the distribution for copying conditions.
-rem There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
-rem PARTICULAR PURPOSE.
-
-if "%OS%"=="Windows_NT" @setlocal
-