@@ -195,15 +195,6 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
195195 refInfos.register(tree)
196196 tree
197197
198- override def prepareForTemplate (tree : Template )(using Context ): Context =
199- ctx.fresh.setProperty(resolvedKey, Resolved ())
200-
201- override def prepareForPackageDef (tree : PackageDef )(using Context ): Context =
202- ctx.fresh.setProperty(resolvedKey, Resolved ())
203-
204- override def prepareForStats (trees : List [Tree ])(using Context ): Context =
205- ctx.fresh.setProperty(resolvedKey, Resolved ())
206-
207198 override def transformOther (tree : Tree )(using Context ): tree.type =
208199 tree match
209200 case imp : Import =>
@@ -254,7 +245,6 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
254245 case ByNameTypeTree (result) =>
255246 transformAllDeep(result)
256247 // case _: InferredTypeTree => // do nothing
257- // case _: Export => // nothing to do
258248 // case _ if tree.isType =>
259249 case _ =>
260250 tree
@@ -317,15 +307,6 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
317307 && ctxsym.thisType.baseClasses.contains(sym.owner)
318308 && ctxsym.thisType.member(sym.name).hasAltWith(d => d.containsSym(sym) && ! name.exists(_ != d.name))
319309
320- // Attempt to cache a result at the given context. Not all contexts bear a cache, including NoContext.
321- // If there is already any result for the name and prefix, do nothing.
322- def addCached (where : Context , result : Precedence ): Unit =
323- if where.moreProperties ne null then
324- where.property(resolvedKey) match
325- case Some (resolved) =>
326- resolved.record(sym, name, prefix, result)
327- case none =>
328-
329310 // Avoid spurious NoSymbol and also primary ctors which are never warned about.
330311 // Selections C.this.toString should be already excluded, but backstopped here for eq, etc.
331312 if ! sym.exists || sym.isPrimaryConstructor || sym.isEffectiveRoot || defn.topClasses(sym.owner) then return
@@ -334,12 +315,10 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
334315 // If the sym is an enclosing definition (the owner of a context), it does not count toward usages.
335316 val isLocal = sym.isLocalToBlock
336317 var candidate : Context = NoContext
337- var cachePoint : Context = NoContext // last context with Resolved cache
338318 var importer : ImportSelector | Null = null // non-null for import context
339319 var precedence = NoPrecedence // of current resolution
340320 var enclosed = false // true if sym is owner of an enclosing context
341321 var done = false
342- var cached = false
343322 val ctxs = ctx.outersIterator
344323 while ! done && ctxs.hasNext do
345324 val cur = ctxs.next()
@@ -349,24 +328,7 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
349328 if cur.owner eq sym.owner then
350329 done = true // for local def, just checking that it is not enclosing
351330 else
352- val cachedPrecedence =
353- cur.property(resolvedKey) match
354- case Some (resolved) =>
355- // conservative, cache must be nested below the result context
356- if precedence.isNone then
357- cachePoint = cur // no result yet, and future result could be cached here
358- resolved.hasRecord(sym, name, prefix)
359- case none => NoPrecedence
360- cached = ! cachedPrecedence.isNone
361- if cached then
362- // if prefer cached precedence, then discard previous result
363- if precedence.weakerThan(cachedPrecedence) then
364- candidate = NoContext
365- importer = null
366- cachePoint = cur // actual cache context
367- precedence = cachedPrecedence // actual cached precedence
368- done = true
369- else if cur.isImportContext then
331+ if cur.isImportContext then
370332 val sel = matchingSelector(cur.importInfo.nn)
371333 if sel != null then
372334 if cur.importInfo.nn.isRootImport then
@@ -400,13 +362,6 @@ class CheckUnused private (phaseMode: PhaseMode, suffix: String) extends MiniPha
400362 refInfos.addRef(sym)
401363 if candidate != NoContext && candidate.isImportContext && importer != null then
402364 refInfos.sels.put(importer, ())
403- // possibly record that we have performed this look-up
404- // if no result was found, take it as Definition (local or rooted head of fully qualified path)
405- val adjusted = if precedence.isNone then Definition else precedence
406- if ! cached && (cachePoint ne NoContext ) then
407- addCached(cachePoint, adjusted)
408- if cachePoint ne ctx then
409- addCached(ctx, adjusted) // at this ctx, since cachePoint may be far up the outer chain
410365 end resolveUsage
411366end CheckUnused
412367
@@ -418,15 +373,8 @@ object CheckUnused:
418373
419374 val refInfosKey = Property .StickyKey [RefInfos ]
420375
421- val resolvedKey = Property .Key [Resolved ]
422-
423376 inline def refInfos (using Context ): RefInfos = ctx.property(refInfosKey).get
424377
425- inline def resolved (using Context ): Resolved =
426- ctx.property(resolvedKey) match
427- case Some (res) => res
428- case _ => throw new MatchError (" no Resolved for context" )
429-
430378 /** Attachment holding the name of an Ident as written by the user. */
431379 val OriginalName = Property .StickyKey [Name ]
432380
@@ -493,24 +441,6 @@ object CheckUnused:
493441 refs.addOne(sym)
494442 end RefInfos
495443
496- // Symbols already resolved in the given Context (with name and prefix of lookup).
497- class Resolved :
498- import PrecedenceLevels .*
499- private val seen = mutable.Map .empty[Symbol , List [(Name , Type , Precedence )]].withDefaultValue(Nil )
500- // if a result has been recorded, return it; otherwise, NoPrecedence.
501- def hasRecord (symbol : Symbol , name : Name , prefix : Type )(using Context ): Precedence =
502- seen(symbol).find((n, p, _) => n == name && p =:= prefix) match
503- case Some ((_, _, r)) => r
504- case none => NoPrecedence
505- // "record" the look-up result, if there is not already a result for the name and prefix.
506- def record (symbol : Symbol , name : Name , prefix : Type , result : Precedence )(using Context ): Unit =
507- require(NoPrecedence .weakerThan(result))
508- seen.updateWith(symbol):
509- case svs @ Some (vs) =>
510- if vs.exists((n, p, _) => n == name && p =:= prefix) then svs
511- else Some ((name, prefix, result) :: vs)
512- case none => Some ((name, prefix, result) :: Nil )
513-
514444 // Names are resolved by definitions and imports, which have four precedence levels:
515445 object PrecedenceLevels :
516446 opaque type Precedence = Int
0 commit comments