@@ -21,14 +21,42 @@ import StdNames.nme
2121object Interactive {
2222 import ast .tpd ._
2323
24- object Include { // should be an enum, really.
25- type Set = Int
26- val overridden : Int = 1 // include trees whose symbol is overridden by `sym`
27- val overriding : Int = 2 // include trees whose symbol overrides `sym` (but for performance only in same source file)
28- val references : Int = 4 // include references
29- val definitions : Int = 8 // include definitions
30- val linkedClass : Int = 16 // include `symbol.linkedClass`
31- val imports : Int = 32 // include imports in the results
24+ object Include {
25+ case class Set private (val bits : Int ) extends AnyVal {
26+ def | (that : Set ): Set = Set (bits | that.bits)
27+
28+ def isEmpty : Boolean = bits == 0
29+ def isOverridden : Boolean = (bits & overridden.bits) != 0
30+ def isOverriding : Boolean = (bits & overriding.bits) != 0
31+ def isReferences : Boolean = (bits & references.bits) != 0
32+ def isDefinitions : Boolean = (bits & definitions.bits) != 0
33+ def isLinkedClass : Boolean = (bits & linkedClass.bits) != 0
34+ def isImports : Boolean = (bits & imports.bits) != 0
35+ }
36+
37+ /** The empty set */
38+ val empty : Set = Set (0 )
39+
40+ /** Include trees whose symbol is overridden by `sym` */
41+ val overridden : Set = Set (1 << 0 )
42+
43+ /**
44+ * Include trees whose symbol overrides `sym` (but for performance only in same source
45+ * file)
46+ */
47+ val overriding : Set = Set (1 << 1 )
48+
49+ /** Include references */
50+ val references : Set = Set (1 << 2 )
51+
52+ /** Include definitions */
53+ val definitions : Set = Set (1 << 3 )
54+
55+ /** Include `sym.linkedClass */
56+ val linkedClass : Set = Set (1 << 4 )
57+
58+ /** Include imports in the results */
59+ val imports : Set = Set (1 << 5 )
3260 }
3361
3462 /** Does this tree define a symbol ? */
@@ -112,9 +140,9 @@ object Interactive {
112140
113141 ( sym == tree.symbol
114142 || sym.exists && sym == tree.symbol.sourceSymbol
115- || include != 0 && sym.name == tree.symbol.name && sym.maybeOwner != tree.symbol.maybeOwner
116- && ( ( include & Include .overridden) != 0 && overrides(sym, tree.symbol)
117- || ( include & Include .overriding) != 0 && overrides(tree.symbol, sym)
143+ || ! include.isEmpty && sym.name == tree.symbol.name && sym.maybeOwner != tree.symbol.maybeOwner
144+ && ( include.isOverridden && overrides(sym, tree.symbol)
145+ || include.isOverriding && overrides(tree.symbol, sym)
118146 )
119147 )
120148 }
@@ -290,7 +318,7 @@ object Interactive {
290318 def namedTrees (trees : List [SourceTree ], nameSubstring : String )
291319 (implicit ctx : Context ): List [SourceTree ] = {
292320 val predicate : NameTree => Boolean = _.name.toString.contains(nameSubstring)
293- namedTrees(trees, 0 , predicate)
321+ namedTrees(trees, Include .empty , predicate)
294322 }
295323
296324 /** Find named trees with a non-empty position satisfying `treePredicate` in `trees`.
@@ -299,15 +327,13 @@ object Interactive {
299327 */
300328 def namedTrees (trees : List [SourceTree ], include : Include .Set , treePredicate : NameTree => Boolean )
301329 (implicit ctx : Context ): List [SourceTree ] = safely {
302- val includeReferences = (include & Include .references) != 0
303- val includeImports = (include & Include .imports) != 0
304330 val buf = new mutable.ListBuffer [SourceTree ]
305331
306332 def traverser (source : SourceFile ) = {
307333 new untpd.TreeTraverser {
308334 override def traverse (tree : untpd.Tree )(implicit ctx : Context ) = {
309335 tree match {
310- case imp : untpd.Import if includeImports && tree.hasType =>
336+ case imp : untpd.Import if include.isImports && tree.hasType =>
311337 val tree = imp.asInstanceOf [tpd.Import ]
312338 val selections = tpd.importSelections(tree)
313339 traverse(imp.expr)
@@ -318,7 +344,7 @@ object Interactive {
318344 && ! tree.symbol.is(Synthetic )
319345 && tree.pos.exists
320346 && ! tree.pos.isZeroExtent
321- && (includeReferences || isDefinition(tree))
347+ && (include.isReferences || isDefinition(tree))
322348 && treePredicate(tree))
323349 buf += SourceTree (tree, source)
324350 traverseChildren(tree)
@@ -350,13 +376,11 @@ object Interactive {
350376 predicate : NameTree => Boolean = util.common.alwaysTrue
351377 )(implicit ctx : Context ): List [SourceTree ] = {
352378 val linkedSym = symbol.linkedClass
353- val includeDeclaration = (includes & Include .definitions) != 0
354- val includeLinkedClass = (includes & Include .linkedClass) != 0
355379 val fullPredicate : NameTree => Boolean = tree =>
356380 ( ! tree.symbol.isPrimaryConstructor
357- && (includeDeclaration || ! Interactive .isDefinition(tree))
381+ && (includes.isDefinitions || ! Interactive .isDefinition(tree))
358382 && ( Interactive .matchSymbol(tree, symbol, includes)
359- || ( includeLinkedClass
383+ || ( includes.isLinkedClass
360384 && linkedSym.exists
361385 && Interactive .matchSymbol(tree, linkedSym, includes)
362386 )
@@ -469,7 +493,7 @@ object Interactive {
469493 }
470494 (trees, Include .definitions | Include .overriding)
471495 case _ =>
472- (Nil , 0 )
496+ (Nil , Include .empty )
473497 }
474498
475499 findTreesMatching(trees, include, sym)
0 commit comments