mirror of https://github.com/sbt/sbt.git
46 lines
1.5 KiB
Scala
46 lines
1.5 KiB
Scala
package sbt
|
|
|
|
import java.net.URI
|
|
|
|
object Resolve
|
|
{
|
|
def apply(index: BuildUtil[_], current: ScopeAxis[Reference], key: AttributeKey[_], mask: ScopeMask): Scope => Scope =
|
|
{
|
|
val rs =
|
|
resolveProject(current, mask) _ ::
|
|
resolveExtra(mask) _ ::
|
|
resolveTask(mask) _ ::
|
|
resolveConfig(index, key, mask) _ ::
|
|
Nil
|
|
scope => (scope /: rs) { (s, f) => f(s) }
|
|
}
|
|
def resolveTask(mask: ScopeMask)(scope: Scope): Scope =
|
|
if(mask.task) scope else scope.copy(task = Global)
|
|
|
|
def resolveProject(current: ScopeAxis[Reference], mask: ScopeMask)(scope: Scope): Scope =
|
|
if(mask.project) scope else scope.copy(project = current)
|
|
|
|
def resolveExtra(mask: ScopeMask)(scope: Scope): Scope =
|
|
if(mask.extra) scope else scope.copy(extra = Global)
|
|
|
|
def resolveConfig[P](index: BuildUtil[P], key: AttributeKey[_], mask: ScopeMask)(scope: Scope): Scope =
|
|
if(mask.config)
|
|
scope
|
|
else
|
|
{
|
|
val (resolvedRef, proj) = scope.project match {
|
|
case Select(ref) =>
|
|
val r = index resolveRef ref
|
|
(Some(r), index.projectFor(r))
|
|
case Global | This =>
|
|
(None, index.rootProject(index.root))
|
|
}
|
|
val task = scope.task.toOption
|
|
val keyIndex = index.keyIndex
|
|
val definesKey = (c: ScopeAxis[ConfigKey]) => keyIndex.keys(resolvedRef, c.toOption.map(_.name), task) contains key.label
|
|
val projectConfigs = index.configurations(proj).map(ck => Select(ck))
|
|
val config: ScopeAxis[ConfigKey] = (Global +: projectConfigs) find definesKey getOrElse Global
|
|
scope.copy(config = config)
|
|
}
|
|
}
|