/// <summary> /// Checks all preconditions and builds both class code elements. /// </summary> /// <returns>Result to check if there were errors or user input is required.</returns> /// <param name="suppressLoggingOfChanges">If set to <c>true</c> changes will not be printed to console.</param> public CodeGeneratorResult PrepareCodeGeneration(bool suppressLoggingOfChanges) { CodeGeneratorResult result = BuildClasses(); if (result.Error) { return(result); } if (!existingClass.IsEmpty() && !config.IgnoreExistingCode) { int remaining = CodeElementUtils.CleanupExistingClass(existingClass, newClass, config.KeepObsoleteMembers); if (remaining > 0 && !suppressLoggingOfChanges) { string consoleMessage = ""; List <MemberCodeElement> previousMembers = existingClass.GetAllMembers(); int previousMembersCount = previousMembers.Count; for (int i = 0; i < previousMembersCount; i++) { consoleMessage += previousMembers [i].GetSignature() + "\n"; } Logger.Info("Members found in previous version that will be marked as obsolete: " + consoleMessage); } } return(result); }
/// <summary> /// Builds the new and the existing classes' ClassCodeElements, evaluates all changes and returns a list of them. /// </summary> /// <param name="go">Go.</param> public List <ClassMemberCompareElement> Compare(GameObject go) { CodeGeneratorResult result = BuildClasses(); if (result.Success) { if (!existingClass.IsEmpty()) { List <ClassMemberCompareElement> comparisonResult = CodeElementUtils.CompareClasses(existingClass, newClass, config.IgnoreExistingCode, config.KeepObsoleteMembers); // only Get, Set and Is methods of the existing class are analysed by reflection so remove all // other methods that are provided by default comparisonResult.RemoveAll((element) => element.Member == "Awake" || element.Member == "InitialiseEventManager"); if (builder.allTransitionsHash != existingAllTransitionsHash) { comparisonResult.Add(new ClassMemberCompareElement(ClassMemberCompareElement.Result.New, "", "Transition definition changes", "", "Transition changes", "")); } string message = ""; comparisonResult.ForEach((s) => message += s + "\n"); Logger.Debug("Comparison between new and existing class reveals " + comparisonResult.Count + " changes: " + message); return(comparisonResult); } } return(new List <ClassMemberCompareElement> ()); }
/// <summary> /// Callback from InternalAPIAccess to process a single Animator state. /// </summary> /// <param name="layer">Layer index.</param> /// <param name="layerName">Layer name.</param> /// <param name="item">State name.</param> public void ProcessAnimatorState(StateInfo info) { string layerPrefix = (info.Layer > 0 || config.ForceLayerPrefix ? null : info.LayerName); string name = CodeGenerationUtils.GenerateStateName(config.AnimatorStatePrefix, info.Name, layerPrefix); name = name.FirstCharToUpper(); string fieldName = CodeGenerationUtils.GenerateStateName(config.AnimatorStateHashPrefix, info.Name, layerPrefix); fieldName = fieldName.FirstCharToLower(); // field declaration GenericFieldCodeElement field = new GenericFieldCodeElement(typeof(int), fieldName, "" + info.Id); field.ReadOnly = true; field.Summary.Add("Hash of Animator state " + info.Name); classCodeElement.Fields.Add(field); string methodName = "Is" + name; // IsXXX method () MethodCodeElement <bool> method = new MethodCodeElement <bool> (methodName); method.Origin = "state " + info.Name; method.Code.Add("return " + fieldName + " == animator.GetCurrentAnimatorStateInfo (" + info.Layer + ").nameHash" + ";"); method.Summary.Add("true if the current Animator state of layer " + info.Layer + " is \"" + info.Name + "\"."); classCodeElement.Methods.Add(method); // overloaded IsXXX (int nameHash) MethodCodeElement <bool> methodWithLayerParameter = new MethodCodeElement <bool> (methodName); methodWithLayerParameter.Origin = "state " + info.Name; methodWithLayerParameter.AddParameter(typeof(int), "nameHash"); methodWithLayerParameter.Code.Add("return nameHash == " + fieldName + ";"); methodWithLayerParameter.Summary.Add("true if the given (state) nameHash equals Animator.StringToHash (\"" + info.Name + "\")."); classCodeElement.Methods.Add(methodWithLayerParameter); // state dictionary is filled in overriden method InitialiseEventManager object [] parameters = new object[] { info.Id, info.Layer, info.LayerName, info.Name, info.Tag, info.Speed, info.FootIK, info.Mirror, info.Motion.Name, info.Motion.Duration }; string parameterList = CodeElementUtils.GetCallParameterString(parameters); EventManagerInitialiser.Code.Add(StateInfoDict + ".Add (" + info.Id + ", new StateInfo (" + parameterList + "));"); }
void ProcessTransition(TransitionInfo info) { TransitionInfos.Add(info.Id, info); object [] parameters = new object[] { info.Id, info.Name, info.Layer, info.LayerName, info.SourceId, info.DestId, info.Atomic, info.Duration, info.Mute, info.Offset, info.Solo, }; string parameterList = CodeElementUtils.GetCallParameterString(parameters); EventManagerInitialiser.Code.Add(TransitionInfoDict + ".Add (" + info.Id + ", new TransitionInfo (" + parameterList + "));"); }