summaryrefslogtreecommitdiff
path: root/src/compiler/scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-01-07 18:55:52 +0000
committerMartin Odersky <odersky@gmail.com>2006-01-07 18:55:52 +0000
commit5d4d8b21cec21fe23490e66182a9b4890e15a9d1 (patch)
tree08ae4bea839be06376d87f559502fb7324096af2 /src/compiler/scala
parente30e2a33045b88afbaef190b94a692105d813aa0 (diff)
downloadscala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.tar.gz
scala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.tar.bz2
scala-5d4d8b21cec21fe23490e66182a9b4890e15a9d1.zip
Diffstat (limited to 'src/compiler/scala')
-rw-r--r--src/compiler/scala/tools/nsc/CompilationUnits.scala2
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala2
-rw-r--r--src/compiler/scala/tools/nsc/Settings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/Trees.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala102
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Scanners.scala20
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/BasicBlocks.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/ExceptionHandlers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Members.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Opcodes.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Primitives.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/TypeStacks.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/AlgebraicMatchers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/Autom2.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/BerrySethis.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/CodeFactory.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/DetWordAutoms.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/LeftTracers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/MatcherLabels.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/NondetWordAutoms.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternMatchers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternNodeCreator.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternNodes.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/RightTracers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/SequenceMatchers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/matching/WordAutoms.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Constants.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/InfoTransformers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Scopes.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala4
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala23
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Analyzer.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Codification.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/EtaExpansion.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SyntheticMethods.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala10
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Variances.scala2
46 files changed, 168 insertions, 77 deletions
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._;