scala.reflect.io.AbstractFile Scala Examples
The following examples show how to use scala.reflect.io.AbstractFile.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: DependencyAnalyzer.scala From cuesheet with Apache License 2.0 | 5 votes |
package com.kakao.cuesheet.deps import java.net.{URL, URLClassLoader} import com.kakao.mango.concurrent.KeyedSingletons import com.kakao.mango.logging.Logging import com.kakao.mango.reflect.Accessible import scala.reflect.io.AbstractFile class DependencyAnalyzer(loader: ClassLoader = getClass.getClassLoader) extends Logging { val chain: List[ClassLoader] = DependencyAnalyzer.classLoaderChain(loader) lazy val graph = { // collect all nodes val nodes = for ( loader <- chain; url <- DependencyAnalyzer.components(loader) ) yield { DependencyNode.resolve(url) } new DependencyGraph(nodes) } } object DependencyAnalyzer extends KeyedSingletons[ClassLoader, DependencyAnalyzer] with Logging { def components(loader: ClassLoader): Seq[URL] = { loader match { case _ if loader.getClass.getName.startsWith("sun.misc.Launcher$ExtClassLoader") => Nil // ignore extension class loader case loader: URLClassLoader => loader.getURLs case _ if loader.getClass.getName == "scala.tools.nsc.interpreter.AbstractFileClassLoader" => val root = Accessible.field(loader.getClass, "root") Seq(root.get(loader).asInstanceOf[AbstractFile].toURL) case _ if loader.getClass.getName == "scala.reflect.internal.util.AbstractFileClassLoader" => val root = Accessible.field(loader.getClass, "root") Seq(root.get(loader).asInstanceOf[AbstractFile].toURL) case _ if Seq(loader.getClass.getName).exists(c => c.startsWith("xsbt.") || c.startsWith("sbt.")) => Nil // ignore SBT's internal loader case _ => throw new RuntimeException("Unknown ClassLoader Type: " + loader.getClass.getName) } } override def newInstance(loader: ClassLoader): DependencyAnalyzer = { new DependencyAnalyzer(loader) } def apply(): DependencyAnalyzer = apply(getClass.getClassLoader) }
Example 2
Source File: SuppressingReporter.scala From silencer with Apache License 2.0 | 5 votes |
package com.github.ghik.silencer import scala.collection.mutable.ArrayBuffer import scala.reflect.internal.util.{Position, SourceFile} import scala.reflect.io.AbstractFile import scala.tools.nsc.reporters.{FilteringReporter, ForwardingReporter} import scala.util.matching.Regex class SuppressingReporter( original: FilteringReporter, globalFilters: List[Regex], protected val lineContentFilters: List[Regex], protected val pathFilters: List[Regex], protected val sourceRoots: List[AbstractFile] ) extends ForwardingReporter(original) with SuppressingReporterBase { //Suppressions are sorted by end offset of their suppression ranges so that nested suppressions come before //their containing suppressions. This is ensured by FindSuppressions traverser in SilencerPlugin. //This order is important for proper unused @silent annotation detection. def isSuppressed(suppressions: List[Suppression], pos: Position, msg: String): Boolean = suppressions.find(_.suppresses(pos, msg)) match { case Some(suppression) => suppression.used = true true case _ => false } def setSuppressions(source: SourceFile, suppressions: List[Suppression]): Unit = { fileSuppressions(source) = suppressions for ((pos, msg) <- deferredWarnings.remove(source).getOrElse(Seq.empty)) warning(pos, msg) // will invoke `filter` } override def reset(): Unit = { super.reset() deferredWarnings.clear() fileSuppressions.clear() } override def filter(pos: Position, msg: String, severity: Severity): Int = { def globallySuppressed: Boolean = matchesPathFilter(pos) || anyMatches(globalFilters, msg) || matchesLineContentFilter(pos) def locallySuppressed: Boolean = fileSuppressions.get(pos.source) match { case Some(suppressions) => isSuppressed(suppressions, pos, msg) case None => deferredWarnings.getOrElseUpdate(pos.source, new ArrayBuffer) += ((pos, msg)) true } if (severity == WARNING && (globallySuppressed || locallySuppressed)) 2 else super.filter(pos, msg, severity) } }
Example 3
Source File: SuppressingReporterBase.scala From silencer with Apache License 2.0 | 5 votes |
package com.github.ghik.silencer import java.io.File import scala.collection.mutable import scala.collection.mutable.ArrayBuffer import scala.reflect.internal.util.{Position, SourceFile} import scala.reflect.io.AbstractFile import scala.tools.nsc.reporters.Reporter import scala.util.matching.Regex // Code that's shared between the version-dependent sources for 2.12 and 2.13 trait SuppressingReporterBase { self: Reporter => protected def pathFilters: List[Regex] protected def lineContentFilters: List[Regex] protected def sourceRoots: List[AbstractFile] protected val deferredWarnings = new mutable.HashMap[SourceFile, ArrayBuffer[(Position, String)]] protected val fileSuppressions = new mutable.HashMap[SourceFile, List[Suppression]] protected val normalizedPathCache = new mutable.HashMap[SourceFile, String] def checkUnused(source: SourceFile): Unit = fileSuppressions(source).foreach(_.reportUnused(this)) protected def relativize(dir: AbstractFile, child: AbstractFile): Option[String] = { val childPath = child.canonicalPath val dirPath = dir.canonicalPath + File.separator if (childPath.startsWith(dirPath)) Some(childPath.substring(dirPath.length)) else None } protected def matchesPathFilter(pos: Position): Boolean = pathFilters.nonEmpty && pos.isDefined && { val filePath = normalizedPathCache.getOrElseUpdate(pos.source, { val file = pos.source.file val relIt = sourceRoots.iterator.flatMap(relativize(_, file)) val relPath = if (relIt.hasNext) relIt.next() else file.canonicalPath relPath.replace("\\", "/") }) anyMatches(pathFilters, filePath) } protected def matchesLineContentFilter(pos: Position): Boolean = lineContentFilters.nonEmpty && pos.isDefined && anyMatches(lineContentFilters, pos.source.lineToString(pos.line - 1)) protected def anyMatches(patterns: List[Regex], value: String): Boolean = patterns.exists(_.findFirstIn(value).isDefined) }
Example 4
Source File: SuppressingReporter.scala From silencer with Apache License 2.0 | 5 votes |
package com.github.ghik.silencer import scala.collection.mutable.ArrayBuffer import scala.reflect.internal.util.{Position, SourceFile} import scala.reflect.io.AbstractFile import scala.tools.nsc.reporters.Reporter import scala.util.matching.Regex class SuppressingReporter( original: Reporter, globalFilters: List[Regex], protected val lineContentFilters: List[Regex], protected val pathFilters: List[Regex], protected val sourceRoots: List[AbstractFile] ) extends Reporter with SuppressingReporterBase { //Suppressions are sorted by end offset of their suppression ranges so that nested suppressions come before //their containing suppressions. This is ensured by FindSuppressions traverser in SilencerPlugin. //This order is important for proper unused @silent annotation detection. def suppressOrForward(suppressions: List[Suppression], pos: Position, msg: String): Unit = suppressions.find(_.suppresses(pos, msg)) match { case Some(suppression) => suppression.used = true case None => original.warning(pos, msg) } def setSuppressions(source: SourceFile, suppressions: List[Suppression]): Unit = { fileSuppressions(source) = suppressions for ((pos, msg) <- deferredWarnings.remove(source).getOrElse(Seq.empty)) { suppressOrForward(suppressions, pos, msg) } updateCounts() } override def reset(): Unit = { super.reset() original.reset() deferredWarnings.clear() fileSuppressions.clear() } protected def info0(pos: Position, msg: String, severity: Severity, force: Boolean): Unit = { severity match { case INFO => original.info(pos, msg, force) case WARNING if matchesPathFilter(pos) || anyMatches(globalFilters, msg) || matchesLineContentFilter(pos) => () case WARNING if !pos.isDefined => original.warning(pos, msg) case WARNING if !fileSuppressions.contains(pos.source) => deferredWarnings.getOrElseUpdate(pos.source, new ArrayBuffer) += ((pos, msg)) case WARNING => suppressOrForward(fileSuppressions(pos.source), pos, msg) case ERROR => original.error(pos, msg) } updateCounts() } private def updateCounts(): Unit = { INFO.count = original.INFO.count WARNING.count = original.WARNING.count ERROR.count = original.ERROR.count } private def originalSeverity(severity: Severity): original.Severity = severity match { case INFO => original.INFO case WARNING => original.WARNING case ERROR => original.ERROR } override def hasErrors: Boolean = original.hasErrors || cancelled override def hasWarnings: Boolean = original.hasWarnings override def resetCount(severity: Severity): Unit = { super.resetCount(severity) original.resetCount(originalSeverity(severity)) } override def flush(): Unit = { super.flush() original.flush() } }