From 5d4d8b21cec21fe23490e66182a9b4890e15a9d1 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 7 Jan 2006 18:55:52 +0000 Subject: --- .../scala/tools/nsc/CompilationUnits.scala | 2 +- src/compiler/scala/tools/nsc/Global.scala | 2 + src/compiler/scala/tools/nsc/Settings.scala | 2 +- src/compiler/scala/tools/nsc/ast/Trees.scala | 2 +- .../scala/tools/nsc/ast/parser/MarkupParsers.scala | 2 +- .../scala/tools/nsc/ast/parser/Parsers.scala | 102 ++++++++++++++++----- .../scala/tools/nsc/ast/parser/Scanners.scala | 20 +++- .../tools/nsc/backend/icode/BasicBlocks.scala | 2 +- .../nsc/backend/icode/ExceptionHandlers.scala | 2 +- .../tools/nsc/backend/icode/Linearizers.scala | 2 +- .../scala/tools/nsc/backend/icode/Members.scala | 2 +- .../scala/tools/nsc/backend/icode/Opcodes.scala | 2 +- .../scala/tools/nsc/backend/icode/Primitives.scala | 2 +- .../scala/tools/nsc/backend/icode/TypeKinds.scala | 2 +- .../scala/tools/nsc/backend/icode/TypeStacks.scala | 2 +- .../tools/nsc/matching/AlgebraicMatchers.scala | 2 +- src/compiler/scala/tools/nsc/matching/Autom2.scala | 2 +- .../scala/tools/nsc/matching/BerrySethis.scala | 2 +- .../scala/tools/nsc/matching/CodeFactory.scala | 2 +- .../scala/tools/nsc/matching/DetWordAutoms.scala | 2 +- .../scala/tools/nsc/matching/LeftTracers.scala | 2 +- .../scala/tools/nsc/matching/MatcherLabels.scala | 2 +- .../tools/nsc/matching/NondetWordAutoms.scala | 2 +- .../scala/tools/nsc/matching/PatternMatchers.scala | 2 +- .../tools/nsc/matching/PatternNodeCreator.scala | 2 +- .../scala/tools/nsc/matching/PatternNodes.scala | 2 +- .../scala/tools/nsc/matching/RightTracers.scala | 2 +- .../tools/nsc/matching/SequenceMatchers.scala | 2 +- .../scala/tools/nsc/matching/WordAutoms.scala | 2 +- .../scala/tools/nsc/symtab/Constants.scala | 6 +- .../scala/tools/nsc/symtab/Definitions.scala | 2 +- .../scala/tools/nsc/symtab/InfoTransformers.scala | 2 +- src/compiler/scala/tools/nsc/symtab/Scopes.scala | 2 +- src/compiler/scala/tools/nsc/symtab/StdNames.scala | 2 +- src/compiler/scala/tools/nsc/symtab/Symbols.scala | 2 +- src/compiler/scala/tools/nsc/symtab/Types.scala | 4 +- .../nsc/symtab/classfile/ClassfileParser.scala | 23 ++++- .../scala/tools/nsc/typechecker/Analyzer.scala | 2 +- .../scala/tools/nsc/typechecker/Codification.scala | 2 +- .../scala/tools/nsc/typechecker/Contexts.scala | 2 +- .../scala/tools/nsc/typechecker/EtaExpansion.scala | 2 +- .../scala/tools/nsc/typechecker/Infer.scala | 2 +- .../scala/tools/nsc/typechecker/Namers.scala | 2 +- .../tools/nsc/typechecker/SyntheticMethods.scala | 2 +- .../scala/tools/nsc/typechecker/Typers.scala | 10 +- .../scala/tools/nsc/typechecker/Variances.scala | 2 +- 46 files changed, 168 insertions(+), 77 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/CompilationUnits.scala b/src/compiler/scala/tools/nsc/CompilationUnits.scala index 0c39d99c16..30a4e77064 100644 --- a/src/compiler/scala/tools/nsc/CompilationUnits.scala +++ b/src/compiler/scala/tools/nsc/CompilationUnits.scala @@ -10,7 +10,7 @@ import scala.tools.nsc.util.FreshNameCreator; import scala.tools.util.AbstractFile; import scala.collection.mutable.HashSet; -[_trait_] abstract class CompilationUnits: Global { +mixin class CompilationUnits requires Global { class CompilationUnit(val source: SourceFile, val mixinOnly: boolean) { diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index e8d72fb88d..3e1ce5bf50 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -150,6 +150,8 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable def rootLoader: LazyType = new loaders.PackageLoader(classPath.getRoot()); + val migrateMsg = "migration problem when moving from Scala version 1.0 to version 2.0:\n"; + // Phases ------------------------------------------------------------ var globalPhase: Phase = NoPhase; diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala index 9cb74fd726..f7c58d7749 100644 --- a/src/compiler/scala/tools/nsc/Settings.scala +++ b/src/compiler/scala/tools/nsc/Settings.scala @@ -61,8 +61,8 @@ class Settings(error: String => unit) { val extdirs = StringSetting ("-extdirs", "dirs", "Override location of installed extensions", extdirsDefault) val outdir = StringSetting ("-d", "directory", "Specify where to place generated class files", "") val encoding = StringSetting ("-encoding", "encoding", "Specify character encoding used by source files", "ISO-8859-1") - val separate = ChoiceSetting ("-separate", "Read symbol files for separate compilation", List("yes","no"), "default") val target = ChoiceSetting ("-target", "Specify which backend to use", List("jvm", "msil"), "jvm") + val migrate = BooleanSetting("-migrate", "Assist in migrating from Scala version 1.0") val debug = BooleanSetting("-debug", "Output debugging messages") val statistics = BooleanSetting("-statistics", "Print compiler statistics") val explaintypes = BooleanSetting("-explaintypes", "Explain type errors in more detail") diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala index 48f6cbbd7b..bd853d3f93 100644 --- a/src/compiler/scala/tools/nsc/ast/Trees.scala +++ b/src/compiler/scala/tools/nsc/ast/Trees.scala @@ -11,7 +11,7 @@ import java.io.PrintWriter; import scala.tools.nsc.util.{Position,SourceFile}; import symtab.Flags._; -[_trait_] abstract class Trees: Global { +mixin class Trees requires Global { //statistics var nodeCount = 0; diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala index cf4244cb3f..b6293cd50c 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala @@ -20,7 +20,7 @@ import scala.tools.nsc.util.Position; import scala.xml.{Text,TextBuffer}; -trait MarkupParsers: SyntaxAnalyzer { +trait MarkupParsers requires SyntaxAnalyzer { import global._ ; import posAssigner.atPos; diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index 5d548cbf4c..0e51f1ab8d 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -38,7 +38,7 @@ import Tokens._; * (4) Wraps naked case definitions in a match as follows: * { cases } ==> (x => x.match {cases}), except when already argument to match */ -[_trait_] abstract class Parsers: SyntaxAnalyzer { +mixin class Parsers requires SyntaxAnalyzer { import global._; import posAssigner.atPos; @@ -106,9 +106,22 @@ import Tokens._; unit.error(pos, msg); in.errpos = pos; } - if (skipIt) skip(); + if (skipIt) { + in.skipping = true; + skip(); + in.skipping = false; + } } + def syntaxErrorMigrate(msg: String) = + syntaxError(in.currentPos, migrateMsg + msg, false); + + def warning(msg: String) = + if (in.currentPos != in.errpos) { + unit.warning(in.currentPos, msg); + in.errpos = in.currentPos; + } + def accept(token: int): int = { val pos = in.currentPos; if (in.token != token) @@ -311,10 +324,19 @@ import Tokens._; in.nextToken(); name } else { + if (settings.migrate.value && + in.token == REQUIRES || in.token == IMPLICIT || in.token == MIXIN) + syntaxErrorMigrate(""+in+" is now a reserved word; cannot be used as identifier"); accept(IDENTIFIER); nme.ERROR } + def selector(t: Tree) = { + if (in.token == MATCH && settings.migrate.value) + syntaxErrorMigrate("Period should be omitted before `match'") + Select(t, ident()) + } + /** StableRef ::= StableId * | [Ident `.'] this * SimpleType ::= StableRef [`.' type] @@ -329,7 +351,7 @@ import Tokens._; t = atPos(in.skipToken()) { Super(nme.EMPTY.toTypeName, mixinQualifierOpt()) } - t = atPos(accept(DOT)) { Select(t, ident()) } + t = atPos(accept(DOT)) { selector(t) } if (in.token == DOT) t = { selectors(t, typeOK, in.skipToken()) } } else { @@ -345,7 +367,7 @@ import Tokens._; } else if (in.token == SUPER) { in.nextToken(); t = atPos(i.pos) { Super(i.name.toTypeName, mixinQualifierOpt()) } - t = atPos(accept(DOT)) { Select(t, ident())} + t = atPos(accept(DOT)) { selector(t)} if (in.token == DOT) t = { selectors(t, typeOK, in.skipToken()) } } else { @@ -361,7 +383,7 @@ import Tokens._; in.nextToken(); atPos(pos) { SingletonTypeTree(t) } } else { - val t1 = atPos(pos) { Select(t, ident()); } + val t1 = atPos(pos) { selector(t); } if (in.token == DOT) { selectors(t1, typeOK, in.skipToken()) } else t1 } @@ -439,7 +461,14 @@ import Tokens._; } } - def newLineOpt(): unit = if (in.token == NEWLINE) in.nextToken(); + def newLineOpt(): unit = + if (in.token == NEWLINE) { + if (settings.migrate.value) in.newNewLine = false; + in.nextToken(); + } + + def newLineOptWhenFollowedBy(token: int): unit = + if (in.token == NEWLINE && in.next.token == token) newLineOpt(); //////// TYPES /////////////////////////////////////////////////////////////// @@ -452,7 +481,11 @@ import Tokens._; /** RequiresTypedOpt ::= [`:' SimpleType | requires SimpleType] */ def requiresTypeOpt(): Tree = - if (in.token == COLON | in.token == REQUIRES) { in.nextToken(); simpleType() } + if (in.token == COLON | in.token == REQUIRES) { + if (in.token == COLON) + warning("`:' has been deprecated; use `requires' instead"); + in.nextToken(); simpleType() + } else TypeTree(); /** Types ::= Type {`,' Type} @@ -511,10 +544,10 @@ import Tokens._; } /** SimpleType ::= SimpleType TypeArgs - * | SimpleType `#' Id - * | StableId - * | StableRef `.' type - * | `(' Type `)' + * | SimpleType `#' Id + * | StableId + * | StableRef `.' type + * | `(' Type `)' */ def simpleType(): Tree = { val pos = in.currentPos; @@ -814,13 +847,19 @@ import Tokens._; } isNew = true case _ => + if (settings.migrate.value) { + if (in.token == MATCH) + syntaxErrorMigrate("`match' must be preceded by a selector expression") + else if (in.token == REQUIRES || in.token == IMPLICIT || in.token == MIXIN) + syntaxErrorMigrate(""+in+" is now a reserved word; cannot be used as identifier"); + } syntaxError("illegal start of simple expression", true); t = errorTermTree } while (true) { in.token match { case DOT => - t = atPos(in.skipToken()) { Select(t, ident()) } + t = atPos(in.skipToken()) { selector(t) } case LBRACKET => t match { case Ident(_) | Select(_, _) => @@ -1054,6 +1093,9 @@ import Tokens._; //Console.println("successfully parsed xml pattern "+r); DEBUG r case _ => + if (settings.migrate.value && + in.token == REQUIRES || in.token == IMPLICIT || in.token == MIXIN) + syntaxErrorMigrate(""+in+" is now a reserved word; cannot be used as identifier"); syntaxError("illegal start of simple pattern", true); errorPatternTree } @@ -1128,11 +1170,11 @@ import Tokens._; //////// PARAMETERS ////////////////////////////////////////////////////////// - /** ParamClauses ::= {`(' [Param {`,' Param}] ')'} - * [`(' implicit Param {`,' Param} `)'] + /** ParamClauses ::= {[NL] `(' [Param {`,' Param}] ')'} + * [[NL] `(' implicit Param {`,' Param} `)'] * Param ::= Id `:' ParamType - * ClassParamClauses ::= {`(' [ClassParam {`' ClassParam}] ')'} - * [`(' implicit ClassParam {`,' ClassParam} `)'] + * ClassParamClauses ::= {[NL] `(' [ClassParam {`' ClassParam}] ')'} + * [[NL] [`(' implicit ClassParam {`,' ClassParam} `)'] * ClassParam ::= [[modifiers] (val | var)] Param */ def paramClauses(owner: Name, implicitViews: List[Tree], ofCaseClass: boolean): List[List[ValDef]] = { @@ -1178,11 +1220,13 @@ import Tokens._; } val vds = new ListBuffer[List[ValDef]]; val pos = in.currentPos; + newLineOptWhenFollowedBy(LPAREN); while (implicitmod == 0 && in.token == LPAREN) { in.nextToken(); vds += paramClause(); accept(RPAREN); - caseParam = false + caseParam = false; + newLineOptWhenFollowedBy(LPAREN); } val result = vds.toList; if (owner == nme.CONSTRUCTOR && @@ -1214,7 +1258,7 @@ import Tokens._; } else t } - /** TypeParamClauseOpt ::= [`[' TypeParam {`,' TypeParam} `]'] + /** TypeParamClauseOpt ::= [[NL] `[' TypeParam {`,' TypeParam} `]'] * TypeParam ::= [`+' | `-'] FunTypeParam * FunTypeParamClauseOpt ::= [`[' FunTypeParam {`,' FunTypeParam} `]'] * FunTypeParam ::= Id TypeBounds @@ -1240,6 +1284,7 @@ import Tokens._; param } val params = new ListBuffer[AbsTypeDef]; + newLineOptWhenFollowedBy(LBRACKET); if (in.token == LBRACKET) { in.nextToken(); params += typeParam(); @@ -1285,7 +1330,7 @@ import Tokens._; var pos = 0; if (in.token == THIS) { t = atPos(in.currentPos) { This(nme.EMPTY.toTypeName) } - t = atPos(accept(DOT)) { Select(t, ident()) } + t = atPos(accept(DOT)) { selector(t) } pos = accept(DOT); } else { val i = atPos(in.currentPos) { Ident(ident()) } @@ -1293,7 +1338,7 @@ import Tokens._; if (in.token == THIS) { in.nextToken(); t = atPos(i.pos) { This(i.name.toTypeName) } - t = atPos(accept(DOT)) { Select(t, ident()) } + t = atPos(accept(DOT)) { selector(t) } pos = accept(DOT); } else { t = i; @@ -1478,8 +1523,9 @@ import Tokens._; val statlist = new ListBuffer[Tree]; statlist += selfInvocation(); val stats = - if (in.token == SEMI || in.token == NEWLINE) { in.nextToken(); blockStatSeq(statlist) } - else statlist.toList; + if (in.token == SEMI || in.token == NEWLINE) { + in.nextToken(); blockStatSeq(statlist) + } else statlist.toList; accept(RBRACE); makeBlock(stats) } @@ -1566,9 +1612,13 @@ import Tokens._; */ def classTemplate(mods: Modifiers, name: Name, vparamss: List[List[ValDef]]): Template = atPos(in.currentPos) { - def acceptEmptyTemplateBody(msg: String): unit = - if (!(in.token == SEMI || in.token == NEWLINE || in.token == COMMA || in.token == RBRACE)) + def acceptEmptyTemplateBody(msg: String): unit = { + if (in.token == LPAREN && settings.migrate.value) + syntaxErrorMigrate("mixin classes may not have parameters"); + if (!(in.token == SEMI || in.token == NEWLINE || + in.token == COMMA || in.token == RBRACE)) syntaxError(msg, true); + } val parents = new ListBuffer[Tree]; val argss = new ListBuffer[List[Tree]]; if (in.token == EXTENDS) { @@ -1584,6 +1634,8 @@ import Tokens._; parents += simpleType() } } else { + if (in.token == WITH && settings.migrate.value) + syntaxErrorMigrate("`extends' needed before `with'") if (in.token != LBRACE) acceptEmptyTemplateBody("`extends' or `{' expected"); argss += List() } @@ -1591,7 +1643,7 @@ import Tokens._; parents += scalaScalaObjectConstr; if (mods.hasFlag(Flags.CASE)) parents += caseClassConstr; val ps = parents.toList; - if (in.token == NEWLINE && in.next.token == LBRACE) in.nextToken(); + newLineOptWhenFollowedBy(LBRACE); var body = if (in.token == LBRACE) templateBody() else { acceptEmptyTemplateBody("`{' expected"); List() } diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala index 717d4fd23a..1266252ffd 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala @@ -10,7 +10,7 @@ import scala.tools.nsc.util.{Position, SourceFile} import SourceFile.{LF, FF, CR, SU} import scala.tools.nsc.util.CharArrayReader -[_trait_] abstract class Scanners: SyntaxAnalyzer { +mixin class Scanners requires SyntaxAnalyzer { import global._ @@ -94,6 +94,16 @@ import scala.tools.nsc.util.CharArrayReader */ var sepRegions: List[int] = List() + /** A new line was inserted where in version 1.0 it would not be. + * Only significant if settings.migrate.value is set + */ + var newNewLine = false; + + /** Parser is currently skipping ahead because of an error. + * Only significant if settings.migrate.value is set + */ + var skipping = false; + // Get next token ------------------------------------------------------------ /** read next token and return last position @@ -123,6 +133,12 @@ import scala.tools.nsc.util.CharArrayReader sepRegions = sepRegions.tail } + if (newNewLine && !skipping) { + unit.warning(pos, migrateMsg + "new line will start a new statement here;\n" + + "to suppress it, enclose expression in parentheses (...)") + newNewLine = false + } + val lastToken = token if (next.token == EMPTY) { fetchToken() @@ -157,7 +173,9 @@ import scala.tools.nsc.util.CharArrayReader (sepRegions.isEmpty || sepRegions.head == RBRACE)) { next.copyFrom(this) pos = in.lineStartPos + if (settings.migrate.value) newNewLine = lastToken != RBRACE && token != EOF; token = NEWLINE + /* } else if (lastToken == RBRACE) { System.out.println("failing to insert NL after RBRACE: " + sepRegions + " " + diff --git a/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala b/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala index 6fdbe98c57..4fc5891be8 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala @@ -11,7 +11,7 @@ import scala.tools.nsc.ast._; import scala.collection.mutable.Map; import scala.tools.nsc.util.Position; -trait BasicBlocks: ICodes { +mixin class BasicBlocks requires ICodes { import opcodes._; /** This class represents a basic block. Each diff --git a/src/compiler/scala/tools/nsc/backend/icode/ExceptionHandlers.scala b/src/compiler/scala/tools/nsc/backend/icode/ExceptionHandlers.scala index 126e20ebef..1e80d0eac0 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/ExceptionHandlers.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/ExceptionHandlers.scala @@ -17,7 +17,7 @@ import scala.collection.mutable.HashSet; * all our handlers will catch `Throwable' and rely on proper ordering * in the generated code to preserve nesting. */ -trait ExceptionHandlers: ICodes { +mixin class ExceptionHandlers requires ICodes { import global.{Symbol, NoSymbol}; class ExceptionHandler(val method: IMethod, label: String, val cls: Symbol) { diff --git a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala index 7a0b77f6fa..8a3ad0fe23 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala @@ -10,7 +10,7 @@ package scala.tools.nsc.backend.icode; import scala.tools.nsc.ast._; import scala.collection.mutable.Stack; -trait Linearizers: ICodes { +mixin class Linearizers requires ICodes { import opcodes._; trait Linearizer { diff --git a/src/compiler/scala/tools/nsc/backend/icode/Members.scala b/src/compiler/scala/tools/nsc/backend/icode/Members.scala index f12c4ef62c..28826a5439 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Members.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Members.scala @@ -13,7 +13,7 @@ import scala.{Symbol => scala_Symbol}; import scala.tools.nsc.symtab.Flags; -trait Members: ICodes { +mixin class Members requires ICodes { import global._; /** diff --git a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala index bb2b0c39eb..40e2e64639 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala @@ -48,7 +48,7 @@ import scala.tools.nsc.util.Position; * erased types of Scala and references Symbols to refer named entities * in the source files. */ -[_trait_] abstract class Opcodes: ICodes { +mixin class Opcodes requires ICodes { import global.{Symbol, NoSymbol, Type, Name, Constant}; /** This class represents an instruction of the intermediate code. diff --git a/src/compiler/scala/tools/nsc/backend/icode/Primitives.scala b/src/compiler/scala/tools/nsc/backend/icode/Primitives.scala index 5cebb0edaf..b134819853 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Primitives.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Primitives.scala @@ -9,7 +9,7 @@ package scala.tools.nsc.backend.icode; import java.io.PrintWriter; -[_trait_] abstract class Primitives: ICodes { +mixin class Primitives requires ICodes { /** This class represents a primitive operation. */ class Primitive { diff --git a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala index c1f0c204c6..362aeb9100 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala @@ -25,7 +25,7 @@ package scala.tools.nsc.backend.icode; import scala.collection.mutable.{Map, HashMap}; -[_trait_] abstract class TypeKinds: ICodes { +mixin class TypeKinds requires ICodes { import global._; /** This class represents a type kind. Type kinds diff --git a/src/compiler/scala/tools/nsc/backend/icode/TypeStacks.scala b/src/compiler/scala/tools/nsc/backend/icode/TypeStacks.scala index 1f0f8b887c..69f1f34cb7 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/TypeStacks.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/TypeStacks.scala @@ -9,7 +9,7 @@ package scala.tools.nsc.backend.icode; import scala.tools.nsc.backend.icode.Primitives; -trait TypeStacks: ICodes { +trait TypeStacks requires ICodes { import opcodes._; import global.{Symbol, Type, definitions}; diff --git a/src/compiler/scala/tools/nsc/matching/AlgebraicMatchers.scala b/src/compiler/scala/tools/nsc/matching/AlgebraicMatchers.scala index 4137b128eb..a5ce51e472 100644 --- a/src/compiler/scala/tools/nsc/matching/AlgebraicMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/AlgebraicMatchers.scala @@ -9,7 +9,7 @@ package scala.tools.nsc.matching; /** the pattern matcher, tweaked to work with regular patterns * @author Burak Emir */ -trait AlgebraicMatchers : TransMatcher { +mixin class AlgebraicMatchers requires TransMatcher { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/Autom2.scala b/src/compiler/scala/tools/nsc/matching/Autom2.scala index b99db700b4..f455e1f619 100644 --- a/src/compiler/scala/tools/nsc/matching/Autom2.scala +++ b/src/compiler/scala/tools/nsc/matching/Autom2.scala @@ -4,7 +4,7 @@ package scala.tools.nsc.matching ; import scala.tools.nsc.util.Position; -trait Autom2: TransMatcher { +mixin class Autom2 requires TransMatcher { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/BerrySethis.scala b/src/compiler/scala/tools/nsc/matching/BerrySethis.scala index 85638903b0..dad2e75f85 100644 --- a/src/compiler/scala/tools/nsc/matching/BerrySethis.scala +++ b/src/compiler/scala/tools/nsc/matching/BerrySethis.scala @@ -4,7 +4,7 @@ import java.util.{ HashSet, HashMap, TreeSet, TreeMap, Vector }; //import scala.compiler.printer.XMLAutomPrinter; -trait BerrySethis: TransMatcher { +mixin class BerrySethis requires TransMatcher { import global._; /** a Berry-Sethi style construction for nfas. diff --git a/src/compiler/scala/tools/nsc/matching/CodeFactory.scala b/src/compiler/scala/tools/nsc/matching/CodeFactory.scala index d4678738ec..870ae1dfe5 100644 --- a/src/compiler/scala/tools/nsc/matching/CodeFactory.scala +++ b/src/compiler/scala/tools/nsc/matching/CodeFactory.scala @@ -5,7 +5,7 @@ package scala.tools.nsc.matching ; import scala.tools.nsc.util.Position; -[_trait_] abstract class CodeFactory: TransMatcher { +mixin class CodeFactory requires TransMatcher { import global._ ; diff --git a/src/compiler/scala/tools/nsc/matching/DetWordAutoms.scala b/src/compiler/scala/tools/nsc/matching/DetWordAutoms.scala index 8e4d2943be..545940f510 100644 --- a/src/compiler/scala/tools/nsc/matching/DetWordAutoms.scala +++ b/src/compiler/scala/tools/nsc/matching/DetWordAutoms.scala @@ -7,7 +7,7 @@ package scala.tools.nsc.matching ; import java.util._ ; -trait DetWordAutoms: TransMatcher { +mixin class DetWordAutoms requires TransMatcher { import global._; class DetWordAutom { diff --git a/src/compiler/scala/tools/nsc/matching/LeftTracers.scala b/src/compiler/scala/tools/nsc/matching/LeftTracers.scala index b58e11b4cb..0d77065d40 100644 --- a/src/compiler/scala/tools/nsc/matching/LeftTracers.scala +++ b/src/compiler/scala/tools/nsc/matching/LeftTracers.scala @@ -10,7 +10,7 @@ import java.util._ ; import scala.tools.nsc.util.Position; -trait LeftTracers: TransMatcher { +mixin class LeftTracers requires TransMatcher { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/MatcherLabels.scala b/src/compiler/scala/tools/nsc/matching/MatcherLabels.scala index 06c8cd2baa..65ce90cb8c 100644 --- a/src/compiler/scala/tools/nsc/matching/MatcherLabels.scala +++ b/src/compiler/scala/tools/nsc/matching/MatcherLabels.scala @@ -1,6 +1,6 @@ package scala.tools.nsc.matching ; -[_trait_] abstract class MatcherLabels: TransMatcher { +mixin class MatcherLabels requires TransMatcher { import global._ ; diff --git a/src/compiler/scala/tools/nsc/matching/NondetWordAutoms.scala b/src/compiler/scala/tools/nsc/matching/NondetWordAutoms.scala index cd1d8b576e..3afa3d376d 100644 --- a/src/compiler/scala/tools/nsc/matching/NondetWordAutoms.scala +++ b/src/compiler/scala/tools/nsc/matching/NondetWordAutoms.scala @@ -1,7 +1,7 @@ package scala.tools.nsc.matching ; import java.util._ ; -trait NondetWordAutoms { +mixin class NondetWordAutoms { /** a nondeterministic word automaton. * states are represented (implicitly) as Integer objects. */ diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala index 7d4292e3ff..38febba140 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala @@ -8,7 +8,7 @@ package scala.tools.nsc.matching ; import scala.tools.nsc.util.Position; -trait PatternMatchers: (TransMatcher with PatternNodes) extends AnyRef with PatternNodeCreator { +mixin class PatternMatchers requires (TransMatcher with PatternNodes) extends AnyRef with PatternNodeCreator { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/PatternNodeCreator.scala b/src/compiler/scala/tools/nsc/matching/PatternNodeCreator.scala index 79ba780469..703763f1a7 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternNodeCreator.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternNodeCreator.scala @@ -6,7 +6,7 @@ import scala.tools.nsc.util.Position; * we inherit the globals from PatternTool. */ -trait PatternNodeCreator: (TransMatcher with PatternNodes) { +mixin class PatternNodeCreator requires (TransMatcher with PatternNodes) { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/PatternNodes.scala b/src/compiler/scala/tools/nsc/matching/PatternNodes.scala index 551d964c39..e13db74083 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternNodes.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternNodes.scala @@ -10,7 +10,7 @@ package scala.tools.nsc.matching ; import scala.tools.nsc.util.Position; -trait PatternNodes: TransMatcher { +mixin class PatternNodes requires TransMatcher { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/RightTracers.scala b/src/compiler/scala/tools/nsc/matching/RightTracers.scala index f0daf20fed..754fd0bf1d 100644 --- a/src/compiler/scala/tools/nsc/matching/RightTracers.scala +++ b/src/compiler/scala/tools/nsc/matching/RightTracers.scala @@ -11,7 +11,7 @@ import java.util._ ; import scala.tools.nsc.util.Position; import scala.tools.nsc.symtab.Flags; -trait RightTracers: TransMatcher { +mixin class RightTracers requires TransMatcher { import global._ ; import java.util._ ; diff --git a/src/compiler/scala/tools/nsc/matching/SequenceMatchers.scala b/src/compiler/scala/tools/nsc/matching/SequenceMatchers.scala index d2d8aa7414..334b8273d0 100644 --- a/src/compiler/scala/tools/nsc/matching/SequenceMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/SequenceMatchers.scala @@ -14,7 +14,7 @@ import java.util._ ; * is the "Builder" for "Director" class TransMatch. */ -trait SequenceMatchers: TransMatcher { +mixin class SequenceMatchers requires TransMatcher { import global._; diff --git a/src/compiler/scala/tools/nsc/matching/WordAutoms.scala b/src/compiler/scala/tools/nsc/matching/WordAutoms.scala index de17fc6445..836253ca8e 100644 --- a/src/compiler/scala/tools/nsc/matching/WordAutoms.scala +++ b/src/compiler/scala/tools/nsc/matching/WordAutoms.scala @@ -10,7 +10,7 @@ import java.util._ ; import scala.tools.nsc.util.Position; -trait WordAutoms: TransMatcher { +mixin class WordAutoms requires TransMatcher { import global._ ; /** translates a recognizer to scala code diff --git a/src/compiler/scala/tools/nsc/symtab/Constants.scala b/src/compiler/scala/tools/nsc/symtab/Constants.scala index 3a6746cf61..8fcc383c2c 100644 --- a/src/compiler/scala/tools/nsc/symtab/Constants.scala +++ b/src/compiler/scala/tools/nsc/symtab/Constants.scala @@ -9,7 +9,7 @@ package scala.tools.nsc.symtab; import classfile.PickleFormat._; -[_trait_] abstract class Constants: SymbolTable { +mixin class Constants requires SymbolTable { import definitions._; @@ -178,7 +178,9 @@ import classfile.PickleFormat._; Constant(floatValue) else if (target == DoubleClass && ByteTag <= tag && tag <= DoubleTag) Constant(doubleValue) - else null + else { + null + } } def stringValue: String = diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index af2f8e55d8..63f6b90706 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -9,7 +9,7 @@ import scala.tools.nsc.util.Position; import collection.mutable.HashMap; import Flags._; -[_trait_] abstract class Definitions: SymbolTable { +mixin class Definitions requires SymbolTable { object definitions { diff --git a/src/compiler/scala/tools/nsc/symtab/InfoTransformers.scala b/src/compiler/scala/tools/nsc/symtab/InfoTransformers.scala index e1ff9bbac5..87f4ba7b12 100644 --- a/src/compiler/scala/tools/nsc/symtab/InfoTransformers.scala +++ b/src/compiler/scala/tools/nsc/symtab/InfoTransformers.scala @@ -5,7 +5,7 @@ // $Id$ package scala.tools.nsc.symtab; -[_trait_] abstract class InfoTransformers: SymbolTable { +mixin class InfoTransformers requires SymbolTable { abstract class InfoTransformer { var prev: InfoTransformer = this; diff --git a/src/compiler/scala/tools/nsc/symtab/Scopes.scala b/src/compiler/scala/tools/nsc/symtab/Scopes.scala index fe8ffaa47b..81c12dc177 100644 --- a/src/compiler/scala/tools/nsc/symtab/Scopes.scala +++ b/src/compiler/scala/tools/nsc/symtab/Scopes.scala @@ -5,7 +5,7 @@ // $Id$ package scala.tools.nsc.symtab; -[_trait_] abstract class Scopes: SymbolTable { +mixin class Scopes requires SymbolTable { class ScopeEntry(val sym: Symbol, val owner: Scope) { diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala index a07933af4f..8a4cc204df 100644 --- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala +++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala @@ -7,7 +7,7 @@ package scala.tools.nsc.symtab; import scala.tools.nsc.util.NameTransformer; -[_trait_] abstract class StdNames: SymbolTable { +mixin class StdNames requires SymbolTable { object nme { diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index e8fed63916..c4e7153809 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -9,7 +9,7 @@ import scala.tools.util.AbstractFile; import scala.tools.nsc.util.{Position, SourceFile}; import Flags._; -[_trait_] abstract class Symbols: SymbolTable { +mixin class Symbols requires SymbolTable { import definitions._; private var ids = 0; diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 58ef0187e1..7fda6f09ed 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -30,7 +30,7 @@ import Flags._; case TypeVar(_, _) => */ -[_trait_] abstract class Types: SymbolTable { +mixin class Types requires SymbolTable { import definitions._; //statistics @@ -413,7 +413,7 @@ import Flags._; // Subclasses ------------------------------------------------------------ - [_trait_] abstract class UniqueType { + mixin class UniqueType { private val hashcode = { val h = super.hashCode(); if (h < 0) -h else h } override def hashCode() = hashcode; } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index e5803d18e5..ffd5add6f0 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -65,7 +65,8 @@ abstract class ClassfileParser { parseClass() } catch { case e: RuntimeException => - if (settings.debug.value) e.printStackTrace(); + e.printStackTrace(); + if (settings.debug.value) throw new IOException("class file '" + in.file + "' is broken") } busy = false @@ -249,6 +250,7 @@ abstract class ClassfileParser { parseAttributes(clazz, classInfo); if (!isScala) { clazz.setFlag(sflags); + setPrivateWithin(clazz, jflags); if (!hasMeta) { clazz.setInfo(classInfo); } @@ -281,6 +283,7 @@ abstract class ClassfileParser { val info = pool.getType(in.nextChar()); val sym = getOwner(jflags) .newValue(Position.NOPOS, name).setFlag(sflags).setInfo(info); + setPrivateWithin(sym, jflags); parseAttributes(sym, info); getScope(jflags).enter(sym); } @@ -303,12 +306,19 @@ abstract class ClassfileParser { } val sym = getOwner(jflags) .newMethod(Position.NOPOS, name).setFlag(sflags).setInfo(info); + setPrivateWithin(sym, jflags); parseAttributes(sym, info); getScope(jflags).enter(sym); } } def parseAttributes(sym: Symbol, symtype: Type): unit = { + def convertTo(c: Constant, pt: Type): Constant = { + if (pt.symbol == definitions.BooleanClass && c.tag == IntTag) + Constant(if (c.value == 0) false else true) + else + c convertTo pt + } def parseAttribute(): unit = { val attrName = pool.getName(in.nextChar()); val attrLen = in.nextInt(); @@ -324,8 +334,9 @@ abstract class ClassfileParser { in.skip(attrLen) case nme.ConstantValueATTR => val c = pool.getConstant(in.nextChar()); - val c1 = c convertTo symtype; - sym.setInfo(ConstantType(c1)); + val c1 = convertTo(c, symtype); + if (c1 != null) sym.setInfo(ConstantType(c1)); + else System.out.println("failure to convert "+c+" to "+symtype);//debug case nme.InnerClassesATTR => parseInnerClasses() case nme.ScalaSignatureATTR => @@ -385,8 +396,6 @@ abstract class ClassfileParser { res = res | PRIVATE else if ((flags & JAVA_ACC_PROTECTED) != 0) res = res | PROTECTED - else if ((flags & JAVA_ACC_PUBLIC) == 0) - res = res | PRIVATE; if ((flags & JAVA_ACC_ABSTRACT) != 0) res = res | DEFERRED; if ((flags & JAVA_ACC_FINAL) != 0) @@ -399,4 +408,8 @@ abstract class ClassfileParser { res = res | STATIC; res | JAVA; } + + private def setPrivateWithin(sym: Symbol, jflags: int): unit = + if ((jflags & (JAVA_ACC_PRIVATE | JAVA_ACC_PROTECTED | JAVA_ACC_PUBLIC)) == 0) + sym.privateWithin = sym.toplevelClass.owner } diff --git a/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala b/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala index e895524915..0118dadbaf 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Analyzer.scala @@ -7,7 +7,7 @@ package scala.tools.nsc.typechecker; /** The main attribution phase. */ -[_trait_] abstract class Analyzer +mixin class Analyzer extends AnyRef with Contexts with Namers diff --git a/src/compiler/scala/tools/nsc/typechecker/Codification.scala b/src/compiler/scala/tools/nsc/typechecker/Codification.scala index 59ddca225a..2542f0d9f8 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Codification.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Codification.scala @@ -10,7 +10,7 @@ import scala.collection.immutable.ListMap; import scala.collection.mutable.ListBuffer; import scala.tools.nsc.util.FreshNameCreator; -[_trait_] abstract class Codification: Analyzer { +mixin class Codification requires Analyzer { import global._; diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index d0cfa6f3a1..c6aa1d8c8e 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -8,7 +8,7 @@ package scala.tools.nsc.typechecker; import symtab.Flags._; import scala.tools.nsc.util.Position; -[_trait_] abstract class Contexts: Analyzer { +mixin class Contexts requires Analyzer { import global._; val NoContext = new Context { diff --git a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala index 36dd960342..28bbff53c2 100644 --- a/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala +++ b/src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala @@ -8,7 +8,7 @@ package scala.tools.nsc.typechecker; import scala.collection.mutable.ListBuffer; import symtab.Flags._; -[_trait_] abstract class EtaExpansion: Analyzer { +mixin class EtaExpansion requires Analyzer { import global._; import posAssigner.atPos; diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index d80f573029..9c9c969b39 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -8,7 +8,7 @@ package scala.tools.nsc.typechecker; import scala.collection.mutable.ListBuffer; import symtab.Flags._; -[_trait_] abstract class Infer: Analyzer { +mixin class Infer requires Analyzer { import global._; import definitions._; import posAssigner.atPos; diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 739cb4935a..0c8937f1f9 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -10,7 +10,7 @@ import symtab.Flags; import symtab.Flags._; /** Methods to create symbols and to enter them into scopes. */ -trait Namers: Analyzer { +trait Namers requires Analyzer { import global._; import definitions._; diff --git a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala index ae4cdb2b58..71b21084a0 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala @@ -18,7 +18,7 @@ import scala.collection.mutable.ListBuffer; * unless they are defined in the class or a baseclass * different from java.lang.Object */ -[_trait_] abstract class SyntheticMethods: Analyzer { +mixin class SyntheticMethods requires Analyzer { import global._; // the global environment import definitions._; // standard classes and methods import typer.{typed}; // methods to type trees diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 4179674f94..076ec2479a 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -11,7 +11,7 @@ import scala.tools.nsc.util.Position import scala.collection.mutable.{HashMap, ListBuffer} /** Methods to create symbols and to enter them into scopes. */ -[_trait_] abstract class Typers: Analyzer { +mixin class Typers requires Analyzer { import global._ import definitions._ import posAssigner.atPos @@ -354,8 +354,12 @@ import scala.collection.mutable.{HashMap, ListBuffer} mt.paramTypes.isEmpty && isCompatible(mt.resultType, pt)) { // (4.3) typed(Apply(tree, List()) setPos tree.pos) } else { - if (context.reportGeneralErrors) - error(tree.pos, "missing arguments for "+tree.symbol) + if (context.reportGeneralErrors) { + if (settings.migrate.value && !tree.symbol.isConstructor && isCompatible(mt, pt)) + error(tree.pos, migrateMsg + " method can be converted to function only if an expected function type is given"); + else + error(tree.pos, "missing arguments for "+tree.symbol) + } setError(tree) } case _ => diff --git a/src/compiler/scala/tools/nsc/typechecker/Variances.scala b/src/compiler/scala/tools/nsc/typechecker/Variances.scala index ca7c52d242..100230d70f 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Variances.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Variances.scala @@ -9,7 +9,7 @@ import symtab.Flags._; /** Variances form a lattice, 0 <= COVARIANT <= Variances, 0 <= CONTRAVARIANT <= VARIANCES */ -[_trait_] abstract class Variances { +mixin class Variances { val global: Global; import global._; -- cgit v1.2.3