summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-12-28 13:18:42 -0800
committerEugene Burmako <xeno.by@gmail.com>2013-01-05 01:39:16 +0300
commit1f1e36922af099d647931a61ebdf5cec97ab54ac (patch)
tree79fe8ab4e990498d6d16e64cfcefe6aa83dd14bc /src
parent348c8fac9f897f9661f84e32949b8a4e0c99e93a (diff)
downloadscala-1f1e36922af099d647931a61ebdf5cec97ab54ac.tar.gz
scala-1f1e36922af099d647931a61ebdf5cec97ab54ac.tar.bz2
scala-1f1e36922af099d647931a61ebdf5cec97ab54ac.zip
Made Symbol#associatedFile always return non-null
So we don't have to clutter everything with null checks.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala6
-rw-r--r--src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala4
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala3
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala37
4 files changed, 26 insertions, 24 deletions
diff --git a/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala b/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala
index 35390adcd9..216157e19a 100755
--- a/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala
+++ b/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala
@@ -88,7 +88,7 @@ trait MemberLookupBase {
// (4) if we still haven't found anything, create a tooltip
Tooltip(query)
case List(l) => l
- case links =>
+ case links =>
val chosen = chooseLink(links)
def linkToString(link: LinkTo) = {
val chosenInfo =
@@ -203,11 +203,11 @@ trait MemberLookupBase {
def findExternalLink(sym: Symbol, name: String): Option[LinkToExternal] = {
val sym1 =
if (sym == AnyClass || sym == AnyRefClass || sym == AnyValClass || sym == NothingClass) ListClass
- else if (sym.isPackage)
+ else if (sym.isPackage)
/* Get package object which has associatedFile ne null */
sym.info.member(newTermName("package"))
else sym
- Option(sym1.associatedFile) flatMap (_.underlyingSource) flatMap { src =>
+ sym1.associatedFile.underlyingSource flatMap { src =>
val path = src.path
settings.extUrlMapping get path map { url =>
LinkToExternal(name, url + "#" + name)
diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
index bbff03f67f..129331f435 100644
--- a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
+++ b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
@@ -12,7 +12,7 @@ import scala.tools.nsc.util.{ ClassPath }
import classfile.ClassfileParser
import scala.reflect.internal.MissingRequirementError
import scala.reflect.internal.util.Statistics
-import scala.tools.nsc.io.{ AbstractFile }
+import scala.reflect.io.{ AbstractFile, NoAbstractFile }
/** This class ...
*
@@ -250,7 +250,7 @@ abstract class SymbolLoaders {
protected def doComplete(root: Symbol) {
val start = if (Statistics.canEnable) Statistics.startTimer(classReadNanos) else null
classfileParser.parse(classfile, root)
- if (root.associatedFile eq null) {
+ if (root.associatedFile eq NoAbstractFile) {
root match {
// In fact, the ModuleSymbol forwards its setter to the module class
case _: ClassSymbol | _: ModuleSymbol =>
diff --git a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
index 27944b8767..ea03aca8c4 100644
--- a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
@@ -13,6 +13,7 @@ import scala.reflect.runtime.ReflectionUtils
import scala.reflect.macros.runtime.AbortMacroException
import scala.util.control.NonFatal
import scala.tools.nsc.util.stackTraceString
+import scala.reflect.io.NoAbstractFile
trait ContextErrors {
self: Analyzer =>
@@ -642,7 +643,7 @@ trait ContextErrors {
val addendums = List(
if (sym0.associatedFile eq sym1.associatedFile)
Some("conflicting symbols both originated in file '%s'".format(sym0.associatedFile.canonicalPath))
- else if ((sym0.associatedFile ne null) && (sym1.associatedFile ne null))
+ else if ((sym0.associatedFile ne NoAbstractFile) && (sym1.associatedFile ne NoAbstractFile))
Some("conflicting symbols originated in files '%s' and '%s'".format(sym0.associatedFile.canonicalPath, sym1.associatedFile.canonicalPath))
else None ,
if (isBug) Some("Note: this may be due to a bug in the compiler involving wildcards in package objects") else None
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 3d43500ef1..ae68c1bcfd 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -11,7 +11,7 @@ import scala.collection.mutable.ListBuffer
import util.{ Statistics, shortClassOfInstance }
import Flags._
import scala.annotation.tailrec
-import scala.reflect.io.AbstractFile
+import scala.reflect.io.{ AbstractFile, NoAbstractFile }
trait Symbols extends api.Symbols { self: SymbolTable =>
import definitions._
@@ -1916,8 +1916,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
(this.rawInfo ne NoType)
&& (this.effectiveOwner == that.effectiveOwner)
&& ( !this.effectiveOwner.isPackageClass
- || (this.associatedFile eq null)
- || (that.associatedFile eq null)
+ || (this.associatedFile eq NoAbstractFile)
+ || (that.associatedFile eq NoAbstractFile)
|| (this.associatedFile.path == that.associatedFile.path) // Cheap possibly wrong check, then expensive normalization
|| (this.associatedFile.canonicalPath == that.associatedFile.canonicalPath)
)
@@ -2176,17 +2176,16 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
case _ => NoSymbol
}
- /** Desire to re-use the field in ClassSymbol which stores the source
- * file to also store the classfile, but without changing the behavior
- * of sourceFile (which is expected at least in the IDE only to
- * return actual source code.) So sourceFile has classfiles filtered out.
- */
- private def sourceFileOnly(file: AbstractFile): AbstractFile =
- if ((file eq null) || (file.path endsWith ".class")) null else file
-
- final def sourceFile: AbstractFile = sourceFileOnly(associatedFile)
+ // Desire to re-use the field in ClassSymbol which stores the source
+ // file to also store the classfile, but without changing the behavior
+ // of sourceFile (which is expected at least in the IDE only to
+ // return actual source code.) So sourceFile has classfiles filtered out.
+ final def sourceFile: AbstractFile =
+ if ((associatedFile eq NoAbstractFile) || (associatedFile.path endsWith ".class")) null else associatedFile
- /** Overridden in ModuleSymbols to delegate to the module class. */
+ /** Overridden in ModuleSymbols to delegate to the module class.
+ * Never null; if there is no associated file, returns NoAbstractFile.
+ */
def associatedFile: AbstractFile = enclosingTopLevelClass.associatedFile
def associatedFile_=(f: AbstractFile) { abort("associatedFile_= inapplicable for " + this) }
@@ -2932,7 +2931,11 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
if (c.isOverloaded) c.alternatives.head else c
}
- override def associatedFile = if (owner.isPackageClass) _associatedFile else super.associatedFile
+ override def associatedFile = (
+ if (!owner.isPackageClass) super.associatedFile
+ else if (_associatedFile eq null) NoAbstractFile // guarantee not null, but save cost of initializing the var
+ else _associatedFile
+ )
override def associatedFile_=(f: AbstractFile) { _associatedFile = f }
override def reset(completer: Type): this.type = {
@@ -2981,9 +2984,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
clone.typeOfThis = typeOfThis
clone.thisSym setName thisSym.name
}
- if (_associatedFile ne null)
- clone.associatedFile = _associatedFile
-
+ clone.associatedFile = _associatedFile
clone
}
@@ -3169,7 +3170,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
override def enclosingTopLevelClass: Symbol = this
override def enclosingPackageClass: Symbol = this
override def enclMethod: Symbol = this
- override def associatedFile = null
+ override def associatedFile = NoAbstractFile
override def ownerChain: List[Symbol] = List()
override def ownersIterator: Iterator[Symbol] = Iterator.empty
override def alternatives: List[Symbol] = List()