diff options
author | michelou <michelou@epfl.ch> | 2007-10-17 13:53:37 +0000 |
---|---|---|
committer | michelou <michelou@epfl.ch> | 2007-10-17 13:53:37 +0000 |
commit | c3f4ef6104761bd04c59aee70c0bace32aae05ec (patch) | |
tree | 071923e825a6776d983a90ff5907ca0eb4b215f3 | |
parent | 363a042442955607c69e2b25b5a848c67a2b05a8 (diff) | |
download | scala-c3f4ef6104761bd04c59aee70c0bace32aae05ec.tar.gz scala-c3f4ef6104761bd04c59aee70c0bace32aae05ec.tar.bz2 scala-c3f4ef6104761bd04c59aee70c0bace32aae05ec.zip |
fixed #185 and #187
4 files changed, 66 insertions, 47 deletions
diff --git a/src/compiler/scala/tools/nsc/Settings.scala b/src/compiler/scala/tools/nsc/Settings.scala index 91fcaa87f2..68df5f5ade 100644 --- a/src/compiler/scala/tools/nsc/Settings.scala +++ b/src/compiler/scala/tools/nsc/Settings.scala @@ -144,7 +144,7 @@ class Settings(error: String => Unit) { val logAll = BooleanSetting ("-Ylog-all", "Log all operations").hideToIDE val noimports = BooleanSetting ("-Yno-imports", "Compile without any implicit imports") val nopredefs = BooleanSetting ("-Yno-predefs", "Compile without any implicit predefined values") - val script = StringSetting ("-Xscript", "object", "compile as a script, wrapping the code into object.main()", "").hideToIDE + val script = StringSetting ("-Xscript", "object", "Compile as a script, wrapping the code into object.main()", "").hideToIDE val Xshowtrees = BooleanSetting ("-Yshow-trees", "Show detailed trees when used in connection with -print:phase").hideToIDE val skip = PhasesSetting ("-Yskip", "Skip") val Xsqueeze = ChoiceSetting ("-Ysqueeze", "if on, creates compact code in matching", List("on","on","off"), "on") @@ -156,6 +156,8 @@ class Settings(error: String => Unit) { /*default*/"off") /** scaladoc specific options */ + val memberaccess = ChoiceSetting ("-access", "Show only public, protected/public (default) or all classes and members", + List("public", "protected", "private"), "protected").dependsOn(doc) val pagebottom = StringSetting ("-bottom", "pagebottom", "Include bottom text for each page", "").dependsOn(doc) val doccharset = StringSetting ("-charset", "doccharset", "Charset for cross-platform viewing of generated documentation.", "").dependsOn(doc) val doctitle = StringSetting ("-doctitle", "doctitle", "Include title for the overview page", "Scala 2<br/>API Specification").dependsOn(doc) diff --git a/src/compiler/scala/tools/nsc/doc/DocDriver.scala b/src/compiler/scala/tools/nsc/doc/DocDriver.scala index e4ee365c5d..21a91a4f50 100644 --- a/src/compiler/scala/tools/nsc/doc/DocDriver.scala +++ b/src/compiler/scala/tools/nsc/doc/DocDriver.scala @@ -32,26 +32,33 @@ abstract class DocDriver extends ModelFrames with ModelToXML { } def process(units: Iterator[CompilationUnit]) { - assert(global.definitions != null); + assert(global.definitions != null) def g(pkg: Package, clazz: ClassOrObject) { - allClasses(pkg) += clazz; - clazz.decls.map(_._2).foreach { - case clazz : ClassOrObject => g(pkg, clazz) - case _ => + if (isAccessible(clazz.sym)) { + allClasses(pkg) += clazz + clazz.decls.map(_._2).foreach { + case clazz : ClassOrObject => g(pkg, clazz) + case _ => + } } } - def f(pkg: Package, tree: Tree): Unit = if (tree != EmptyTree && !tree.symbol.hasFlag(symtab.Flags.PRIVATE)) tree match { - case tree : PackageDef => - val pkg1 = new Package(tree.symbol.asInstanceOf[ModuleSymbol]); - tree.stats.foreach(stat => f(pkg1, stat)) - case tree : ClassDef => - assert(pkg != null); - g(pkg, new TopLevelClass(tree.symbol.asInstanceOf[ClassSymbol])) - case tree : ModuleDef => - assert(pkg != null); - g(pkg, new TopLevelObject(tree.symbol.asInstanceOf[ModuleSymbol])) - case _ => + def f(pkg: Package, tree: Tree) { + if (tree != EmptyTree && tree.hasSymbol) { + val sym = tree.symbol + if (sym != NoSymbol && !sym.hasFlag(symtab.Flags.PRIVATE)) tree match { + case tree : PackageDef => + val pkg1 = new Package(sym.asInstanceOf[ModuleSymbol]) + tree.stats.foreach(stat => f(pkg1, stat)) + case tree : ClassDef => + assert(pkg != null) + g(pkg, new TopLevelClass(sym.asInstanceOf[ClassSymbol])) + case tree : ModuleDef => + assert(pkg != null) + g(pkg, new TopLevelObject(sym.asInstanceOf[ModuleSymbol])) + case _ => + } + } } units.foreach(unit => f(null, unit.body)) @@ -94,7 +101,7 @@ abstract class DocDriver extends ModelFrames with ModelToXML { } } - for ((pkg0,classes0) <- allClasses) { + for ((pkg0, classes0) <- allClasses) { new ListClassFrame with Frame { def title = "List of classes and objects in package " + pkg0.fullName('.') @@ -115,21 +122,21 @@ abstract class DocDriver extends ModelFrames with ModelToXML { } } for (sym <- additions) sym match { - case sym : ClassSymbol => + case sym: ClassSymbol => val add = new TopLevelClass(sym) new ClassContentFrame with Frame { def clazz = add def title = add.kind + " " + add.name + " in package " + add.sym.owner.fullNameString('.') } - case sym :TypeSymbol => + case sym: TypeSymbol => val add = new TopLevelClass(sym) new ClassContentFrame with Frame { def clazz = add def title = add.kind + " " + add.name + " in package " + add.sym.owner.fullNameString('.') } - case sym :ModuleSymbol => + case sym: ModuleSymbol => val add = new TopLevelObject(sym) new ClassContentFrame with Frame { def clazz = add diff --git a/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala b/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala index 62fbd4a065..b7d00ec9c3 100644 --- a/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala +++ b/src/compiler/scala/tools/nsc/doc/ModelExtractor.scala @@ -206,6 +206,16 @@ trait ModelExtractor { 0 } + def isAccessible(sym: Symbol): Boolean = { + import symtab.Flags._ + settings.memberaccess.value match { + case "private" => sym.isPublic || (sym hasFlag PROTECTED) || (sym hasFlag PRIVATE) + case "protected" => sym.isPublic || (sym hasFlag PROTECTED) + case "public" => sym.isPublic + case _ => false + } + } + trait ClassOrObject extends Entity { def path : List[ClassOrObject] = this :: Nil; override def listName = path.map(_.name).mkString("",".",""); @@ -230,11 +240,11 @@ trait ModelExtractor { else this(arg) = new ConstructorParam(arg); }); } - object decls extends jcl.LinkedHashMap[Symbol,Member] { + object decls extends jcl.LinkedHashMap[Symbol, Member] { sym.tpe.decls.elements.foreach(e => { if (!constructorArgs.contains(e)) { - val m = Member(e); - if (!m.isEmpty && !this.contains(e)) this.put(e, m.get); + val m = Member(e) + if (!m.isEmpty && !this.contains(e)) this.put(e, m.get) } }); } @@ -300,9 +310,9 @@ trait ModelExtractor { override def kind = "def" } case class Val(override val sym: TermSymbol) extends ValDef(sym) { - def resultType0 : Type = sym.tpe; + def resultType0: Type = sym.tpe override def kind = { - import symtab.Flags._; + import symtab.Flags._ if (sym.hasFlag(ACCESSOR)) { val setterName = nme.getterToSetter(sym.name); val setter = sym.owner.info.decl(setterName); @@ -313,22 +323,22 @@ trait ModelExtractor { } } } - case class AbstractType(override val sym : Symbol) extends Member(sym) { - override def kind = "type"; + case class AbstractType(override val sym: Symbol) extends Member(sym) { + override def kind = "type" } - abstract class NestedClassOrObject(override val sym : Symbol) extends Member(sym) with ClassOrObject { - override def path : List[ClassOrObject] = ClassOrObject.this.path ::: (super.path); + abstract class NestedClassOrObject(override val sym: Symbol) extends Member(sym) with ClassOrObject { + override def path: List[ClassOrObject] = ClassOrObject.this.path ::: (super.path); } case class NestedClass(override val sym : ClassSymbol) extends NestedClassOrObject(sym) with Clazz; case class NestedObject(override val sym : ModuleSymbol) extends NestedClassOrObject(sym) with Object; - def isVisible(sym : Symbol) : Boolean = { - import symtab.Flags._; + def isVisible(sym : Symbol): Boolean = { + import symtab.Flags._ if (sym.isLocalClass) return false if (sym.isLocal) return false if (sym.isPrivateLocal) return false - if (sym.hasFlag(PRIVATE)) return false + if (sym.hasFlag(PRIVATE)) return !inIDE //false if (sym.hasFlag(SYNTHETIC)) return false if (sym.hasFlag(BRIDGE)) return false if (sym.nameString.indexOf("$") != -1) return false @@ -339,6 +349,7 @@ trait ModelExtractor { import global._ import symtab.Flags if (!isVisible(sym)) return None; + if (!isAccessible(sym)) return None; if (sym.hasFlag(Flags.ACCESSOR)) { if (sym.isSetter) return None; assert(sym.isGetter); diff --git a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala index 519ae106f7..6960280986 100644 --- a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala +++ b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala @@ -9,8 +9,6 @@ package scala.tools.nsc.reporters import java.io.{BufferedReader, InputStreamReader, IOException, PrintWriter} import util._ -import compat.StringBuilder - /** * This class implements a Reporter that displays messages on a text * console. @@ -25,7 +23,7 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr case INFO => null } - private def clabel(severity : Severity) = { + private def clabel(severity: Severity): String = { val label0 = label(severity) if (label0 eq null) "" else label0 + ": " } @@ -41,12 +39,11 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr private def getCountString(severity: Severity): String = countElementsAsString((severity).count, label(severity)) - /** Prints the message. */ def printMessage(msg: String) = writer.println(msg) /** Prints the message with the given position indication. */ - def printMessage(posIn: Position, msg: String): Unit = + def printMessage(posIn: Position, msg: String) { if (posIn ne null) { val pos = posIn.inUltimateSource(posIn.source.getOrElse(null)) val buf = new StringBuilder(msg) @@ -57,7 +54,7 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr //println(getSource.file) pos match { case FakePos(msg) => - buf.insert(0, msg) + buf.insert(0, msg + " ") case _ if !pos.source.isEmpty => val file = pos.source.get.file buf.insert(0, if (shortname) file.name else file.path) @@ -68,14 +65,16 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr printSourceLine(pos) } else printMessage(msg) + } - def print(pos: Position, msg: String, severity: Severity) = + def print(pos: Position, msg: String, severity: Severity) { printMessage(pos, clabel(severity) + msg) + } /** * @param pos ... */ - def printSourceLine(pos: Position) = { + def printSourceLine(pos: Position) { printMessage(pos.lineContent.stripLineEnd) printColumnMarker(pos) } @@ -89,20 +88,20 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr var i = 1 while (i < pos.column.get) { buffer.append(' ') - i = i + 1 + i += 1 } if (pos.column.get > 0) buffer.append('^') printMessage(buffer.toString()) } /** Prints the number of errors and warnings if their are non-zero. */ - def printSummary() = { + def printSummary() { if (WARNING.count > 0) printMessage(getCountString(WARNING) + " found") if ( ERROR.count > 0) printMessage(getCountString(ERROR ) + " found") } - def display(pos: Position, msg: String, severity: Severity): Unit = { - severity.count = severity.count + 1 + def display(pos: Position, msg: String, severity: Severity) { + severity.count += 1 print(pos, msg, severity) } @@ -114,9 +113,9 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr var line = reader.readLine() if (line ne null) { line = line.toLowerCase() - if ("abort".startsWith(line)) + if ("abort" startsWith line) throw new Error("user abort") - if ("resume".startsWith(line)) continue = false + if ("resume" startsWith line) continue = false } } } catch { |