Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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 + "));");
        }