From 6eab12dda6edcc21726e771fdf32cdf3275ec9b6 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 2 Jul 2004 12:18:44 +0000 Subject: *** empty log message *** --- doc/reference/ExamplesPart.tex | 6 ++--- doc/reference/ReferencePart.tex | 4 ++-- sources/scala/tools/scalac/ast/parser/Parser.scala | 4 ++-- .../tools/scalac/ast/printer/HTMLPrinter.scala | 4 ++-- .../tools/scalac/ast/printer/TextTreePrinter.scala | 4 ++-- .../tools/scalac/backend/GenJVMFromICode.scala | 4 +--- sources/scala/tools/scalac/icode/IBasicBlock.scala | 6 ++--- .../scala/tools/scalac/icode/ICInstruction.scala | 6 ++--- sources/scala/tools/scalac/icode/ICTypeStack.scala | 4 ++-- sources/scala/tools/scalac/icode/ICode.scala | 4 ++-- sources/scala/tools/scalac/icode/ICodePhase.scala | 6 ++--- .../scala/tools/scalac/icode/ICodePrinter.scala | 4 ++-- .../tools/scalac/transformer/TransMatch.scala | 4 ++-- .../matching/FullRegularTranslator.scala | 4 ++-- .../transformer/matching/MutableGrammar.scala | 4 ++-- .../scala/tools/scalac/typechecker/Analyzer.scala | 25 ++++++++++++++++--- sources/scala/tools/scalac/typechecker/View.scala | 4 ++-- sources/scala/tools/scalac/util/NewArray.scala | 5 +--- .../scalac/wholeprog/ApplicationBuilder.scala | 4 ++-- sources/scala/tools/scalac/wholeprog/Inline.scala | 4 ++-- .../tools/scalac/wholeprog/MonomorphicCS.scala | 4 ++-- sources/scalac/ast/TreeInfo.java | 28 ++++++++++++---------- sources/scalac/typechecker/RefCheck.java | 4 +++- test/files/neg/imports.check | 12 +++++++++- 24 files changed, 93 insertions(+), 65 deletions(-) diff --git a/doc/reference/ExamplesPart.tex b/doc/reference/ExamplesPart.tex index a335b1d739..f6bcd5d595 100644 --- a/doc/reference/ExamplesPart.tex +++ b/doc/reference/ExamplesPart.tex @@ -833,7 +833,7 @@ two given numbers \code{a} and \code{b}: \begin{lstlisting} def powerOfTwo(x: int): int = if (x == 0) 1 else x * powerOfTwo(x - 1); def sumPowersOfTwo(a: int, b: int): int = - if (a > b) 0 else powerOfTwo(x) + sumPowersOfTwo(a + 1, b) + if (a > b) 0 else powerOfTwo(a) + sumPowersOfTwo(a + 1, b) \end{lstlisting} \end{enumerate} These functions are all instances of @@ -1438,10 +1438,10 @@ method is invoked by simply mentioning its name. \begin{lstlisting} class Rational(n: int, d: int) extends AnyRef { ... // as before - def square = Rational(numer*numer, denom*denom); + def square = new Rational(numer*numer, denom*denom); } val r = new Rational(3,4); -System.out.println(r.square); // prints``9/16'' +System.out.println(r.square); // prints``9/16''* \end{lstlisting} That is, parameterless methods are accessed just as value fields such as \code{numer} are. The difference between values and parameterless diff --git a/doc/reference/ReferencePart.tex b/doc/reference/ReferencePart.tex index 4c29bd1a74..79b4cdf146 100644 --- a/doc/reference/ReferencePart.tex +++ b/doc/reference/ReferencePart.tex @@ -513,12 +513,12 @@ c: (Int) (String, String) String A polymorphic method type is denoted internally as ~\lstinline@[$\tps\,$]$T$@~ where \lstinline@[$\tps\,$]@ is a type parameter section -~\lstinline@[$a_1$ <: $L_1$ >: $U_1 \commadots a_n$ <: $L_n$ >: $U_n$]@~ +~\lstinline@[$a_1$ >: $L_1$ <: $U_1 \commadots a_n$ >: $L_n$ <: $U_n$]@~ for some $n \geq 0$ and $T$ is a (value or method) type. This type represents named methods that take type arguments ~\lstinline@$S_1 \commadots S_n$@~ which conform (\sref{sec:param-types}) to the lower bounds -~\lstinline@$S_1 \commadots S_n$@~ and the upper bounds +~\lstinline@$L_1 \commadots L_n$@~ and the upper bounds ~\lstinline@$U_1 \commadots U_n$@~ and that yield results of type $T$. \example The declarations diff --git a/sources/scala/tools/scalac/ast/parser/Parser.scala b/sources/scala/tools/scalac/ast/parser/Parser.scala index 39d79db828..60111dd803 100644 --- a/sources/scala/tools/scalac/ast/parser/Parser.scala +++ b/sources/scala/tools/scalac/ast/parser/Parser.scala @@ -7,7 +7,7 @@ \* */ import scalac.symtab.Modifiers; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.ast._; import scalac.atree.AConstant; import scalac._; @@ -22,7 +22,7 @@ import scala.collection.mutable.ListBuffer; package scala.tools.scalac.ast.parser { -import scalac_symtab.Type; + /** A recursive descent parser for the programming language Scala. * diff --git a/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala b/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala index f313cf7801..a40a71399e 100644 --- a/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala +++ b/sources/scala/tools/scalac/ast/printer/HTMLPrinter.scala @@ -8,12 +8,12 @@ // $Id$ import scalac.CompilationUnit; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.ast.Tree; package scala.tools.scalac.ast.printer { -import scalac_symtab.Symbol; + import java.io.OutputStream; import java.io.PrintWriter; import java.lang.Math; diff --git a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala index a2d877cfb3..98b5d35119 100644 --- a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala +++ b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala @@ -9,7 +9,7 @@ import scalac.ast.printer._; import scalac.ast._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util.Debug; import scalac.{Global => scalac_Global, Phase}; import scalac.CompilationUnit; @@ -18,7 +18,7 @@ import scalac.util.TypeNames; package scala.tools.scalac.ast.printer { -import scalac_symtab._; + import java.io._; /** diff --git a/sources/scala/tools/scalac/backend/GenJVMFromICode.scala b/sources/scala/tools/scalac/backend/GenJVMFromICode.scala index 73acdb59ad..41e6a424c6 100644 --- a/sources/scala/tools/scalac/backend/GenJVMFromICode.scala +++ b/sources/scala/tools/scalac/backend/GenJVMFromICode.scala @@ -6,7 +6,7 @@ // $Id$ -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.{Global => scalac_Global}; import scalac.atree._; import scalac.CompilationUnit; @@ -20,8 +20,6 @@ import java.io.File; package scala.tools.scalac.backend { -import scalac_symtab._; - /* This class implements the backend which create * Java Virtual Machine's bytecode with * The Intermediate Code of the compiler */ diff --git a/sources/scala/tools/scalac/icode/IBasicBlock.scala b/sources/scala/tools/scalac/icode/IBasicBlock.scala index 034c2276d6..6eb073468f 100644 --- a/sources/scala/tools/scalac/icode/IBasicBlock.scala +++ b/sources/scala/tools/scalac/icode/IBasicBlock.scala @@ -7,13 +7,13 @@ // $Id$ -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.atree._; package scala.tools.scalac.icode { -import scalac_symtab.Symbol; -import scalac_symtab.Type; + + /** This class represents a basic block */ class IBasicBlock (theLabel: int) { diff --git a/sources/scala/tools/scalac/icode/ICInstruction.scala b/sources/scala/tools/scalac/icode/ICInstruction.scala index d6521b84b9..2cf541e258 100644 --- a/sources/scala/tools/scalac/icode/ICInstruction.scala +++ b/sources/scala/tools/scalac/icode/ICInstruction.scala @@ -8,14 +8,14 @@ // $Id$ -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.atree._; package scala.tools.scalac.icode { -import scalac_symtab.Symbol; -import scalac_symtab.Type; + + /** This class represents an instruction of intermediate code */ abstract class ICInstruction { diff --git a/sources/scala/tools/scalac/icode/ICTypeStack.scala b/sources/scala/tools/scalac/icode/ICTypeStack.scala index 8e3e9d5be8..c7b2110190 100644 --- a/sources/scala/tools/scalac/icode/ICTypeStack.scala +++ b/sources/scala/tools/scalac/icode/ICTypeStack.scala @@ -7,12 +7,12 @@ // $Id$ import scalac.atree._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.{Global => scalac_Global}; package scala.tools.scalac.icode { -import scalac_symtab._; + /* This class simulates the type of the opperand * stack of the ICode. */ diff --git a/sources/scala/tools/scalac/icode/ICode.scala b/sources/scala/tools/scalac/icode/ICode.scala index 566cf12c24..514c15e0e5 100644 --- a/sources/scala/tools/scalac/icode/ICode.scala +++ b/sources/scala/tools/scalac/icode/ICode.scala @@ -11,13 +11,13 @@ import scalac.{Global => scalac_Global} import scala.collection.mutable.HashMap; import scala.collection.mutable.HashSet; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.atree._; import scalac.util.Debug; package scala.tools.scalac.icode { -import scalac_symtab._; + /** This class represents the intermediate code of a method*/ class ICode(label: String, global: scalac_Global) { diff --git a/sources/scala/tools/scalac/icode/ICodePhase.scala b/sources/scala/tools/scalac/icode/ICodePhase.scala index 513c7ed65c..6b3f29cdf4 100644 --- a/sources/scala/tools/scalac/icode/ICodePhase.scala +++ b/sources/scala/tools/scalac/icode/ICodePhase.scala @@ -6,7 +6,7 @@ // $Id$ -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.transformer.{ICodePhase => scalac_ICodePhase} import scalac.{Global => scalac_Global} import scalac.{CompilationUnit => scalac_CompilationUnit} @@ -18,8 +18,8 @@ import ch.epfl.lamp.util.CodePrinter; package scala.tools.scalac.icode { -import scalac_symtab.Symbol; -import scalac_symtab.Type; + + /** This class represents the ICode phase. This phase use the ATrees * that represents the code with some primitives backends-like diff --git a/sources/scala/tools/scalac/icode/ICodePrinter.scala b/sources/scala/tools/scalac/icode/ICodePrinter.scala index 7af0d6fa5e..2934f59033 100644 --- a/sources/scala/tools/scalac/icode/ICodePrinter.scala +++ b/sources/scala/tools/scalac/icode/ICodePrinter.scala @@ -13,11 +13,11 @@ import scalac.CompilationUnit; import scalac.{Global => scalac_Global} import scalac.atree._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; package scala.tools.scalac.icode { -import scalac_symtab.Symbol; + /* This class implements a Printer for the ICode */ class ICodePrinter (printer: CodePrinter) extends ATreePrinter (printer: CodePrinter) { diff --git a/sources/scala/tools/scalac/transformer/TransMatch.scala b/sources/scala/tools/scalac/transformer/TransMatch.scala index 04e96e359a..a86c63e9cb 100644 --- a/sources/scala/tools/scalac/transformer/TransMatch.scala +++ b/sources/scala/tools/scalac/transformer/TransMatch.scala @@ -11,7 +11,7 @@ import java.util._; import scalac.{Global => scalac_Global}; import scalac._; import scalac.ast._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util._; // Names import scalac.transformer.{ OwnerTransformer => scalac_transformer_OwnerTransformer }; @@ -28,7 +28,7 @@ import scalac.transformer.matching.AlgebraicMatcher ; */ package scala.tools.scalac.transformer { -import scalac_symtab._; + import matching.FullRegularTranslator ; import matching.GrammarPrinter ; //DEBUG diff --git a/sources/scala/tools/scalac/transformer/matching/FullRegularTranslator.scala b/sources/scala/tools/scalac/transformer/matching/FullRegularTranslator.scala index fce0920e2e..486bb4b2d4 100644 --- a/sources/scala/tools/scalac/transformer/matching/FullRegularTranslator.scala +++ b/sources/scala/tools/scalac/transformer/matching/FullRegularTranslator.scala @@ -8,14 +8,14 @@ import scala.collection.immutable; import scalac.ast._ ; import scalac.{Global => scalac_Global} -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util.Names ; package scala.tools.scalac.transformer.matching { - import scalac_symtab.Symbol ; + import PatternInfo.minimalWidth; import TreeInfo.isSequenceValued; diff --git a/sources/scala/tools/scalac/transformer/matching/MutableGrammar.scala b/sources/scala/tools/scalac/transformer/matching/MutableGrammar.scala index 816d2b7c93..7a7c7e2b2c 100644 --- a/sources/scala/tools/scalac/transformer/matching/MutableGrammar.scala +++ b/sources/scala/tools/scalac/transformer/matching/MutableGrammar.scala @@ -2,11 +2,11 @@ import scala.collection.immutable; import scala.collection.mutable; import scala.runtime.matching._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; package scala.tools.scalac.transformer.matching { -import scalac_symtab.Symbol; + object InitialGrammar { /** returns an initial grammar, with any tree rule and any hedge rule */ diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index 8266dd1c59..5c973103d5 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -23,7 +23,7 @@ import scalac.atree.AConstant; import scalac.atree.AConstant$CHAR; import scalac.atree.AConstant$INT; import scalac.symtab.classfile._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import Tree._; import java.util.HashMap; import scala.tools.scalac.util.NewArray; @@ -37,7 +37,6 @@ import java.lang.{Boolean, Byte, Short, Character, Integer, Object} */ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer(global) { - import scalac_symtab._; import Modifiers._; import Kinds._; @@ -1636,6 +1635,25 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } } + 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; @@ -2834,7 +2852,8 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } case Tree$Select(qual, name) => - val qualmode: int = EXPRmode | POLYmode | QUALmode; + val qualmode: int = if (name == Names.match) EXPRmode + else EXPRmode | POLYmode | QUALmode; var qual1: Tree = transform(qual, qualmode); if (name.isTypeName()) qual1 = checkStable(qual1); diff --git a/sources/scala/tools/scalac/typechecker/View.scala b/sources/scala/tools/scalac/typechecker/View.scala index 814e29cc7c..12006c292c 100755 --- a/sources/scala/tools/scalac/typechecker/View.scala +++ b/sources/scala/tools/scalac/typechecker/View.scala @@ -5,12 +5,12 @@ ** ** $Id$ \* */ -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.ast._; package scala.tools.scalac.typechecker { -import scalac_symtab._; + 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 index d8e159fd75..ba6e1b002f 100644 --- a/sources/scala/tools/scalac/util/NewArray.scala +++ b/sources/scala/tools/scalac/util/NewArray.scala @@ -8,14 +8,11 @@ import scalac.ast._; import scalac.checkers.Checker; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util.Name; package scala.tools.scalac.util { -import scalac_symtab.Symbol; -import scalac_symtab.Type; - object NewArray { def Tree(xs: Tree*): Array[Tree] = { diff --git a/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala b/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala index c82248bcd6..5eb35ab95e 100644 --- a/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala +++ b/sources/scala/tools/scalac/wholeprog/ApplicationBuilder.scala @@ -2,7 +2,7 @@ import scalac.{Global => scalac_Global} import scalac.{CompilationUnit => scalac_CompilationUnit} import scalac.atree._; -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util.Name; import scalac.util._; import scala.collection.mutable._; @@ -10,7 +10,7 @@ import scalac.ast._; package scala.tools.scalac.wholeprog { -import scalac_symtab._; + /** * This class builds the set of classes included in the Application (whole diff --git a/sources/scala/tools/scalac/wholeprog/Inline.scala b/sources/scala/tools/scalac/wholeprog/Inline.scala index 101b20b960..d5f0f0db46 100644 --- a/sources/scala/tools/scalac/wholeprog/Inline.scala +++ b/sources/scala/tools/scalac/wholeprog/Inline.scala @@ -11,7 +11,7 @@ import scalac.{Global => scalac_Global} import scalac.{CompilationUnit => scalac_CompilationUnit} -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util._; import scala.collection.mutable._; import scalac.ast._; @@ -21,7 +21,7 @@ import scala.tools.util._; package scala.tools.scalac.wholeprog { -import scalac_symtab._; + /** Perform inlining of the sites passed as parameter */ class InlineMethods(sites: List[Tuple3[GNode[Symbol, MethodNode], GNode[Symbol, MethodNode], CallSite]], diff --git a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala index 83b1b7cabd..7605586cec 100644 --- a/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala +++ b/sources/scala/tools/scalac/wholeprog/MonomorphicCS.scala @@ -14,7 +14,7 @@ import scalac.{Global => scalac_Global} import scalac.{CompilationUnit => scalac_CompilationUnit} -import scalac.{symtab => scalac_symtab} +import scalac.symtab._; import scalac.util._; import scala.collection.mutable._; import scalac.ast._; @@ -23,7 +23,7 @@ import scala.tools.scalac.wholeprog.graph._; package scala.tools.scalac.wholeprog { -import scalac_symtab._; + class MonomorphicCallSites(globall: scalac_Global, application: Set[Symbol]) { type CallGraph = Graph[Symbol, MethodNode, CallEdge]; diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java index ed442bdf5d..caeb7d72c0 100644 --- a/sources/scalac/ast/TreeInfo.java +++ b/sources/scalac/ast/TreeInfo.java @@ -200,19 +200,21 @@ public class TreeInfo { switch (tree) { case Import(Tree expr, Name[] selectors): Type pre = tree.symbol().type(); - 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); - } - } + 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(); diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 797d38fc08..dc383e5067 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -849,10 +849,12 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { Tree[] body1; if (sym.isCaseClass()) { body1 = addCaseMethods(templ.body, sym); - } else { + } else if ((sym.flags & ABSTRACT) == 0) { body1 = new Tree[templ.body.length + 1]; System.arraycopy(templ.body, 0, body1, 0, templ.body.length); body1[templ.body.length] = tagMethod(sym); + } else { + body1 = templ.body; } return copy.Template(templ, templ.parents, body1); } diff --git a/test/files/neg/imports.check b/test/files/neg/imports.check index 911d300c6f..309b1659a1 100644 --- a/test/files/neg/imports.check +++ b/test/files/neg/imports.check @@ -1,3 +1,4 @@ +testing: /home/odersky/scala/test/files/neg/imports.scala [FAILED] imports.scala:26: not found: value v_coi def method: C_coi = v_coi; ^ @@ -7,6 +8,9 @@ imports.scala:27: not found: value v_coi imports.scala:29: not found: value v_coi check("C_coi", "v_coi ", v_coi); ^ +imports.scala:56: illegal cyclic reference involving object o_cio +import o_cio.v_cio; + ^ imports.scala:47: not found: value v_cio def method: C_cio = v_cio; ^ @@ -16,6 +20,12 @@ imports.scala:48: not found: value v_cio imports.scala:50: not found: value v_cio check("C_cio", "v_cio ", v_cio); ^ +imports.scala:79: illegal cyclic reference involving value import o_ico +object o_ico { + ^ +imports.scala:88: illegal cyclic reference involving value import o_ioc +object o_ioc { + ^ imports.scala:136: not found: value v_oci def method: C_oci = v_oci; ^ @@ -25,4 +35,4 @@ imports.scala:137: not found: value v_oci imports.scala:139: not found: value v_oci check("C_oci", "v_oci ", v_oci); ^ -9 errors found +12 errors found -- cgit v1.2.3