diff --git a/sjsonnet/src/sjsonnet/Interpreter.scala b/sjsonnet/src/sjsonnet/Interpreter.scala index 6ce485bc..0427f0ef 100644 --- a/sjsonnet/src/sjsonnet/Interpreter.scala +++ b/sjsonnet/src/sjsonnet/Interpreter.scala @@ -23,24 +23,36 @@ class Interpreter(extVars: Map[String, String], std: Val.Obj = new Std().Std ) { self => - private val internedStrings = new mutable.HashMap[String, String] + protected val internedStrings = new mutable.HashMap[String, String] - private val internedStaticFieldSets = new mutable.HashMap[Val.StaticObjectFieldSet, java.util.LinkedHashMap[String, java.lang.Boolean]] + protected val internedStaticFieldSets = new mutable.HashMap[Val.StaticObjectFieldSet, java.util.LinkedHashMap[String, java.lang.Boolean]] val resolver = new CachedResolver(importer, parseCache, settings.strictImportSyntax, internedStrings, internedStaticFieldSets) { - override def process(expr: Expr, fs: FileScope): Either[Error, (Expr, FileScope)] = + override def process(expr: Expr, fs: FileScope): Either[Error, (Expr, FileScope)] = { handleException(new StaticOptimizer(evaluator, std, internedStrings, internedStaticFieldSets).optimize(expr), fs) + } + } + + /** + * A cache for parsing variables. + * */ + def createVarParseCache: ParseCache = new DefaultParseCache() + + val varResolver = new CachedResolver(importer, createVarParseCache, settings.strictImportSyntax, internedStrings, internedStaticFieldSets) { + override def process(expr: Expr, fs: FileScope): Either[Error, (Expr, FileScope)] = { + handleException(new StaticOptimizer(evaluator, std, internedStrings, internedStaticFieldSets).optimize(expr), fs) + } } + private def warn(e: Error): Unit = warnLogger("[warning] " + formatError(e)) def createEvaluator(resolver: CachedResolver, extVars: String => Option[Expr], wd: Path, settings: Settings, warn: Error => Unit): Evaluator = new Evaluator(resolver, extVars, wd, settings, warn) - - def parseVar(k: String, v: String) = { - resolver.parse(wd / Util.wrapInLessThanGreaterThan(k), StaticResolvedFile(v))(evaluator).fold(throw _, _._1) + def parseVar(k: String, v: String): Expr = { + varResolver.parse(wd / Util.wrapInLessThanGreaterThan(k), StaticResolvedFile(v))(evaluator).fold(throw _, _._1) } lazy val evaluator: Evaluator = createEvaluator(