| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | /* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under the license found in the * LICENSE file in the root directory of this source tree. */using System;using System.Reflection;using System.Threading;using Meta.WitAi.Utilities;using UnityEngine;namespace Meta.WitAi{    internal class RegisteredMatchIntent    {        public Type type;        public MethodInfo method;        public MatchIntent matchIntent;    }    internal static class MatchIntentRegistry    {        private static DictionaryList<string, RegisteredMatchIntent> registeredMethods;        public static DictionaryList<string, RegisteredMatchIntent> RegisteredMethods        {            get            {                if (null == registeredMethods)                {                    // Note, first run this will not return any values. Initialize                    // scans assemblies on a different thread. This is ok for voice                    // commands since they are generally executed in realtime after                    // initialization is complete. This is a perf optimization.                    //                    // Best practice is to call Initialize in Awake of any method                    // that will be using the resulting data.                    Initialize();                }                return registeredMethods;            }        }        internal static void Initialize()        {            if (null != registeredMethods) return;            registeredMethods = new DictionaryList<string, RegisteredMatchIntent>();            new Thread(RefreshAssemblies).Start();        }        internal static void RefreshAssemblies()        {            if (Thread.CurrentThread.ThreadState == ThreadState.Aborted)            {                return;            }            // TODO: We could potentially build this list at compile time and cache it            // Work on a local dictionary to avoid thread complications            var dictionary = new DictionaryList<string, RegisteredMatchIntent>();            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())            {                try {                    foreach (Type t in assembly.GetTypes()) {                        try {                            foreach (var method in t.GetMethods()) {                                try {                                    foreach (var attribute in method.GetCustomAttributes(typeof(MatchIntent))) {                                        try {                                            var mi = (MatchIntent)attribute;                                            dictionary[mi.Intent].Add(new RegisteredMatchIntent() {                                                type = t,                                                method = method,                                                matchIntent = mi                                            });                                        } catch (Exception e) {                                            VLog.E(e);                                        }                                    }                                } catch (Exception e) {                                    VLog.E(e);                                }                            }                        } catch (Exception e) {                            VLog.E(e);                        }                    }                } catch (Exception e) {                    VLog.E(e);                }            }            registeredMethods = dictionary;        }    }}
 |