Пример #1
0
		public void BuildDownFromTop(ScriptsBag scriptsBag, TreeSharedDependencyMap sharedDependencies)
		{
			// Loop through its dependencies, add to (create?) layer below
			int targetLayer = 0;

			var currentScript = Layers[0].Scripts.Values.First();

			var scriptsForLayer = new HashSet<string>(currentScript.Dependencies);
			bool layerAdded = true;

			for (targetLayer++; layerAdded; targetLayer++)
			{
				if (scriptsForLayer.Count == 0)
				{
					break;
				}

				// This layer may have already been added by PushDown; if not, add it
				EnsureLayer(targetLayer);

				foreach (string scriptName in scriptsForLayer)
				{
					// Has this script already been added to this tree?
					if (!ScriptLayerMap.ContainsKey(scriptName))
					{
						// No

						AddScriptToLayer(targetLayer, scriptName, scriptsBag, sharedDependencies);
						continue;
					}

					// Yes
					MaybePushDown(scriptName, targetLayer, scriptsBag, sharedDependencies);
				}

				if (!layerAdded)
					continue;

				scriptsForLayer = Layers[targetLayer].Scripts.Values.SelectMany(s => s.Dependencies).ToHashSet();
			}
		}
Пример #2
0
		// Recursive
		public void MaybePushDown(string scriptName, int targetLayer, ScriptsBag scriptsBag, TreeSharedDependencyMap sharedDependencies)
		{
			//if (ScriptLayerMap[scriptName] == targetLayer)
			//{
			// We don't need to do anything, the script is already here - skip it
			//}
			// The dependency script may not have been added yet in a recursive PushDown, even if it would have been had we waited -
			// check and allow for it (it needs to be added instead of pushed down)
			if (!ScriptLayerMap.ContainsKey(scriptName) || ScriptLayerMap[scriptName] < targetLayer)
			{
				// The script is already added higher in the tree, preventing it from loading before it's needed by the script
				// calling this as a dependency. That means it needs to be pushed lower in the tree, to the targetLayer.
				PushDown(scriptName, targetLayer, scriptsBag, sharedDependencies);
			}
		}
Пример #3
0
		public void AddScriptToLayer(int layerNumber, string scriptName, ScriptsBag scriptsBag, TreeSharedDependencyMap sharedDependencies)
		{
			ScriptLayerMap.Add(scriptName, layerNumber);
			Layers[layerNumber].AddScript(scriptName, scriptsBag[scriptName]);
			sharedDependencies.ScriptIsInTree(scriptName, this);
		}
Пример #4
0
		// Recursive
		public void PushDown(string scriptName, int targetLayer, ScriptsBag scriptsBag, TreeSharedDependencyMap sharedDependencies)
		{
			EnsureLayer(targetLayer);

			if (ScriptLayerMap.ContainsKey(scriptName))
				// Push script from current to target layer
				MoveScriptInTree(targetLayer, scriptName, scriptsBag);
			else
				AddScriptToLayer(targetLayer, scriptName, scriptsBag, sharedDependencies);

			// then loop through its dependencies
			// and proceed pushing them down recursively
			targetLayer++;
			var dependencies = scriptsBag[scriptName].Dependencies;
			foreach (string dependency in dependencies)
			{
				MaybePushDown(dependency, targetLayer, scriptsBag, sharedDependencies);
			}
		}