public AddTestityEventSerializedDelegateStep(ActionTypeRelationalMapper mapper, TestityGenericEventTracker tracker, ITypeMemberParser parser)
 {
     actionMapper = mapper;
     typeParser = parser;
     eventTracker = tracker;
 }
Example #2
0
		private static async Task<bool> TryBuildTask(string dllPath)
		{
			Assembly loadedAss = LoadAssembly(dllPath);

			IEnumerable<Type> potentialBehaviourTypes = null;
			//We assume this is a testity assembly
			//If someone called this builder then they WANT a Testity generated dll either way.
			try
			{
				//load the EngineScriptComponentTypes
				potentialBehaviourTypes = LoadBehaviourTypes(loadedAss);
			}
			catch (ReflectionTypeLoadException e)
			{
				Console.Write(e.Message + " LoaderExceptions:");
				foreach (var sube in e.LoaderExceptions)
					Console.WriteLine(sube.Message);

				Console.ReadKey();
				return false;
			}

			List<Task<ClassFile>> monobehaviourClassCompilationResults = new List<Task<ClassFile>>(potentialBehaviourTypes.Count());

			//Create the type mapper
			List<ITypeRelationalMapper> mappers = new List<ITypeRelationalMapper>();
			mappers.Add(new StringTypeRelationalMapper());
			mappers.Add(new EngineTypeRelationalMapper());
			mappers.Add(new PrimitiveTypeRelationalMapper(new UnityPrimitiveTypeExclusion()));
			mappers.Add(new ActionTypeRelationalMapper());
			mappers.Add(new DefaultTypeRelationalMapper());
			UnityBuildProcessTypeRelationalMapper chainMapper = new UnityBuildProcessTypeRelationalMapper(mappers);

			//create the InitializationExpressionBuilder
			List<IInitializationExpressionBuilderProvider> initProviders = new List<IInitializationExpressionBuilderProvider>();
			initProviders.Add(new ComponentAdapterInitializationExpressionBuilderProvider(new UnityComponentAdapterParser()));
			initProviders.Add(new SameTypeInitializationExpressionBuilderProvider());
			initProviders.Add(new DefaultInitializationExpressionBuilderProvider());

			ChainInitializationExpressionBuilderProvider chainInitProvider = new ChainInitializationExpressionBuilderProvider(initProviders);

			//Create the serializedmember type exclusion service. Indicates what types should be excluded when serializing types
			SerializedMemberStepTypeExclusionService excluder = new SerializedMemberStepTypeExclusionService()
				.AddExclusionRules(new ActionDelegateTypeExclusion(new Type[] { typeof(Action<>), typeof(Action<,>), typeof(Action<,,>), typeof(Action<,,,>) }));

			//TestityEventTracking service. It tracks all used TestityEvent types
			TestityGenericEventTracker tracker = new TestityGenericEventTracker();

			//Create build steps
			List<ITestityBuildStep> buildSteps = new List<ITestityBuildStep>();
			buildSteps.Add(new AddTestityBehaviourBaseClassMemberStep());
			buildSteps.Add(new AddSerializedMemberStep(chainMapper, new SerializedMemberParser(), excluder));
			buildSteps.Add(new AddTestityEventSerializedDelegateStep(new ActionTypeRelationalMapper(), tracker, new SerializedMemberParser()));
			buildSteps.Add(new AddMemberInitializationMethodStep(chainMapper, new SerializedMemberParser(), chainInitProvider));

			//Handle all the behaviour types
			//These are not the only types that need handling
			foreach (Type t in potentialBehaviourTypes)
			{
				Task<ClassFile> classCompile = Task.Factory.StartNew(() => new ClassFile(GenerateMonobehaviourClass(chainMapper, buildSteps, t), t.Name + "Script"));
				monobehaviourClassCompilationResults.Add(classCompile);
			}

			string outputPath = dllPath.TrimEnd(".dll".ToCharArray()) + @"MonoBehaviours\";

			if (!Directory.CreateDirectory(outputPath).Exists)
				throw new InvalidOperationException("Failed to create MonoBehaviour directory.");
			
			//write out all the MonoBehaviours
			while(monobehaviourClassCompilationResults.Count != 0)
			{
				Task<ClassFile> newFile = await Task.WhenAny(monobehaviourClassCompilationResults);

				WriteMonobehaviourToFile(outputPath, newFile.Result);

				//We should check for new genericTestityEvents after a class has been generated
				//This isn't that slow since it will usually be empty
				//TODO: Change this so it buffers them into another collection.
				//We want to handle them seperately and write them to a seperate folder to avoid collisions
				foreach (var kvp in tracker.GetAdditionsAndClear())
				{
					Console.WriteLine("New File: " + kvp.Key);
					Console.ReadKey();

					Task<ClassFile> classCompile = Task.Factory.StartNew(() => new ClassFile(GenerateTestityGenericEventSerializableClass(kvp.Key, kvp.Value), kvp.Key));
					monobehaviourClassCompilationResults.Add(classCompile);
				}

				//Remove the file. If you don't we're stuck in the loop forever
				monobehaviourClassCompilationResults.Remove(newFile);
			}

			return true;
        }