diff --git a/main/src/main/scala/sbt/KeyIndex.scala b/main/src/main/scala/sbt/KeyIndex.scala index 1e3c41699..b870db02a 100644 --- a/main/src/main/scala/sbt/KeyIndex.scala +++ b/main/src/main/scala/sbt/KeyIndex.scala @@ -11,10 +11,19 @@ package sbt object KeyIndex { def empty: ExtendableKeyIndex = new KeyIndex0(emptyBuildIndex) - def apply(known: Iterable[ScopedKey[_]]): ExtendableKeyIndex = - (empty /: known) { _ add _ } - def aggregate(known: Iterable[ScopedKey[_]], extra: BuildUtil[_]): ExtendableKeyIndex = - (empty /: known) { (index, key) => index.addAggregated(key, extra) } + def apply(known: Iterable[ScopedKey[_]], projects: Map[URI, Set[String]]): ExtendableKeyIndex = + (base(projects) /: known) { _ add _ } + def aggregate(known: Iterable[ScopedKey[_]], extra: BuildUtil[_], projects: Map[URI, Set[String]]): ExtendableKeyIndex = + (base(projects) /: known) { (index, key) => index.addAggregated(key, extra) } + private[this] def base(projects: Map[URI, Set[String]]): ExtendableKeyIndex = + { + val data = for( (uri, ids) <- projects) yield { + val data = ids.map(id => Option(id) -> new ConfigIndex(Map.empty)) + Option(uri) -> new ProjectIndex(data.toMap) + } + new KeyIndex0(new BuildIndex(data.toMap)) + } + def combine(indices: Seq[KeyIndex]): KeyIndex = new KeyIndex { def buildURIs = concat(_.buildURIs) diff --git a/main/src/main/scala/sbt/Load.scala b/main/src/main/scala/sbt/Load.scala index 6f1420206..6434ce6be 100755 --- a/main/src/main/scala/sbt/Load.scala +++ b/main/src/main/scala/sbt/Load.scala @@ -140,7 +140,7 @@ object Load val delegates = config.delegates(loaded) val data = Def.make(settings)(delegates, config.scopeLocal, Project.showLoadingKey( loaded ) ) Project.checkTargets(data) foreach error - val index = structureIndex(data, settings, loaded.extra(data)) + val index = structureIndex(data, settings, loaded.extra(data), projects) val streams = mkStreams(projects, loaded.root, data) (rootEval, new sbt.BuildStructure(projects, loaded.root, settings, data, index, streams, delegates, config.scopeLocal)) } @@ -174,13 +174,14 @@ object Load def setDefinitionKey[T](tk: Task[T], key: ScopedKey[_]): Task[T] = if(isDummy(tk)) tk else Task(tk.info.set(Keys.taskDefinitionKey, key), tk.work) - def structureIndex(data: Settings[Scope], settings: Seq[Setting[_]], extra: KeyIndex => BuildUtil[_]): sbt.StructureIndex = + def structureIndex(data: Settings[Scope], settings: Seq[Setting[_]], extra: KeyIndex => BuildUtil[_], projects: Map[URI, LoadedBuildUnit]): sbt.StructureIndex = { val keys = Index.allKeys(settings) val attributeKeys = Index.attributeKeys(data) ++ keys.map(_.key) val scopedKeys = keys ++ data.allKeys( (s,k) => ScopedKey(s,k)) - val keyIndex = KeyIndex(scopedKeys) - val aggIndex = KeyIndex.aggregate(scopedKeys, extra(keyIndex)) + val projectsMap = projects.mapValues(_.defined.keySet) + val keyIndex = KeyIndex(scopedKeys, projectsMap) + val aggIndex = KeyIndex.aggregate(scopedKeys, extra(keyIndex), projectsMap) new sbt.StructureIndex(Index.stringToKeyMap(attributeKeys), Index.taskToKeyMap(data), Index.triggers(data), keyIndex, aggIndex) } @@ -189,7 +190,7 @@ object Load { val transformed = finalTransforms(newSettings) val newData = makeSettings(transformed, structure.delegates, structure.scopeLocal) - val newIndex = structureIndex(newData, transformed, index => BuildUtil(structure.root, structure.units, index, newData)) + val newIndex = structureIndex(newData, transformed, index => BuildUtil(structure.root, structure.units, index, newData), structure.units) val newStreams = mkStreams(structure.units, structure.root, newData) new sbt.BuildStructure(units = structure.units, root = structure.root, settings = transformed, data = newData, index = newIndex, streams = newStreams, delegates = structure.delegates, scopeLocal = structure.scopeLocal) } diff --git a/main/src/test/scala/TestBuild.scala b/main/src/test/scala/TestBuild.scala index e72f13a21..cd852086d 100644 --- a/main/src/test/scala/TestBuild.scala +++ b/main/src/test/scala/TestBuild.scala @@ -188,7 +188,8 @@ object TestBuild val data = Def.make(settings)(env.delegates, const(Nil), display) val keys = data.allKeys( (s, key) => ScopedKey(s, key)) val keyMap = keys.map(k => (k.key.label, k.key)).toMap[String, AttributeKey[_]] - new Structure(env, current, data, KeyIndex(keys), keyMap) + val projectsMap = env.builds.map(b => (b.uri, b.projects.map(_.id).toSet)).toMap + new Structure(env, current, data, KeyIndex(keys, projectsMap), keyMap) } implicit lazy val mkEnv: Gen[Env] =