CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-pantsbuild--zinc

Zinc is a standalone version of sbt's incremental compiler meant to be run in nailgun.

Pending
Overview
Eval results
Files

analysis-caching.mddocs/

Analysis and Caching

Incremental compilation analysis, dependency tracking, and caching infrastructure for optimized build performance.

Capabilities

Analysis Mapping

Analysis cache facade for incremental compilation with dependency tracking.

case class AnalysisMap private[AnalysisMap] (
  analysisLocations: Map[File, FileFPrint], // Map of classpath entries to cache file fingerprints
  log: Logger                               // Logger for analysis operations
) {
  /**
   * Check if a classpath entry defines a specific class
   * @param classpathEntry Classpath entry to check
   * @return Function to test class definition
   */
  def definesClass(classpathEntry: File): String => Boolean
  
  /**
   * Get analysis information for a classpath entry
   * @param classpathEntry Classpath entry to analyze
   * @return Optional analysis data
   */
  def getAnalysis(classpathEntry: File): Option[Analysis]
}

object AnalysisMap {
  /**
   * Create AnalysisMap with file fingerprints for cache validation
   * @param analysisLocations Mapping of classpath entries to analysis cache file locations
   * @param log Logger for analysis operations
   * @return AnalysisMap instance with fingerprint validation
   */
  def create(analysisLocations: Map[File, File], log: Logger): AnalysisMap
  
  /**
   * Create analysis store for cache file management
   * @param cacheFile Analysis cache file location
   * @return AnalysisStore for reading/writing analysis data
   */
  def cachedStore(cacheFile: File): AnalysisStore
}

File Fingerprinting

File fingerprint management for cache invalidation and dependency tracking.

class FileFPrint(val file: File, val fprint: String)

object FileFPrint {
  /**
   * Generate file fingerprint for cache validation
   * @param file File to fingerprint
   * @return Optional file fingerprint (None if file doesn't exist)
   */
  def fprint(file: File): Option[FileFPrint]
}

Cache Utilities

LRU cache implementation with soft references for memory-efficient caching.

object Cache {
  /**
   * Create LRU cache with soft references
   * @param maxSize Maximum cache size
   * @return Cache instance with specified size limit
   */
  def apply[K <: AnyRef, V <: AnyRef](maxSize: Int): gcache.Cache[K, V]
}

// Implicit extensions for cache operations
implicit class CacheExtensions[K <: AnyRef, V <: AnyRef](cache: gcache.Cache[K, V]) {
  /**
   * Get value from cache or compute and store if absent
   * @param key Cache key
   * @param value Value computation function
   * @return Cached or computed value
   */
  def getOrElseUpdate(key: K)(value: => V): V
  
  /**
   * Get all cache entries as sequence
   * @return Sequence of key-value pairs
   */
  def entries: Seq[(K, V)]
}

Usage Examples

Basic Analysis Mapping

import org.pantsbuild.zinc._
import org.pantsbuild.zinc.cache._
import java.io.File

// Create analysis mapping for dependency tracking
val analysisLocations = Map(
  new File("/path/to/upstream.jar") -> new File("/path/to/upstream-analysis.cache"),
  new File("/path/to/library.jar") -> new File("/path/to/library-analysis.cache")
)

val log = Loggers.create(Level.Info, color = true)
val analysisMap = AnalysisMap.create(analysisLocations, log)

// Check if a jar defines a specific class
val definesMyClass = analysisMap.definesClass(new File("/path/to/upstream.jar"))
val hasMyClass = definesMyClass("com.example.MyClass")

// Get analysis data for incremental compilation
val upstreamAnalysis = analysisMap.getAnalysis(new File("/path/to/upstream.jar"))

File Fingerprinting

import org.pantsbuild.zinc.FileFPrint
import java.io.File

// Generate fingerprints for cache validation
val sourceFile = new File("src/main/scala/Example.scala")
val fingerprint = FileFPrint.fprint(sourceFile)

fingerprint match {
  case Some(fp) => 
    println(s"File: ${fp.file}, Fingerprint: ${fp.fprint}")
  case None => 
    println("File does not exist or cannot be read")
}

Cache Management

import org.pantsbuild.zinc.cache.Cache
import java.io.File

// Create LRU cache for compiler instances
val compilerCache = Cache[String, AnyRef](maxSize = 10)

// Cache operations with automatic computation
val cachedValue = compilerCache.getOrElseUpdate("scala-2.12.17") {
  // Expensive compiler creation operation
  createCompilerInstance("2.12.17")
}

// View all cached entries
val allEntries = compilerCache.entries
println(s"Cache contains ${allEntries.size} entries")

Integration with Compilation

import org.pantsbuild.zinc._
import java.io.File

// Set up analysis mapping for incremental compilation
val settings = Settings.parse(args.toSeq).get
val inputs = Inputs(log, settings)

// Analysis mapping is automatically created from settings
val analysisMap = inputs.analysisMap

// Use in compilation process
val compiler = Compiler(Setup(settings), log)
compiler.compile(inputs, Some(new File(".")), reporter, progress)(log)

// Analysis data is automatically cached and reused for subsequent compilations

Advanced Configuration

Analysis Options

Configuration options specific to analysis and caching behavior.

case class AnalysisOptions(
  cache: Option[File],              // Analysis cache file location
  cacheMap: Map[File, File]         // Mapping of dependency analysis locations
)

Performance Tuning

The analysis and caching system provides several performance optimization features:

  • Incremental Analysis: Tracks API changes and recompiles only affected sources
  • Dependency Tracking: Maintains precise dependency graphs for minimal recompilation
  • File Fingerprinting: Uses content hashes to detect actual changes vs. timestamp updates
  • Memory Management: Uses soft references in caches to prevent memory leaks
  • Transactional Updates: Ensures analysis consistency even if compilation fails

Error Handling

Analysis operations handle various error conditions gracefully:

  • Missing analysis files are treated as empty analysis
  • Corrupted cache files trigger full recompilation
  • File access errors are logged and compilation continues
  • Invalid fingerprints trigger cache invalidation

Install with Tessl CLI

npx tessl i tessl/maven-org-pantsbuild--zinc

docs

analysis-caching.md

compiler-management.md

configuration.md

index.md

logging-reporting.md

main-entry.md

utilities.md

tile.json