Exemple #1
0
            public static void Precache(Assembly asm)
            {
                if (asm == null || _LoadAssembly == null)
                {
                    return;
                }

                _Preloaded.Add(asm.GetName().Name);
                _Preloaded.Add(asm.FullName);

                try {
                    _LoadAssembly(asm.FullName);
                } catch {
                    // no-op.
                }

                foreach (Type type in asm.GetTypes())
                {
                    // Non-public type instances can still be passed / returned.

                    /*
                     * if (!type.IsPublic)
                     *  continue;
                     */

                    _Preloaded.Add(type.FullName);

                    if (!AllNamespaces.TryGetValue(type.Namespace ?? "", out CachedNamespace cns))
                    {
                        string          ns      = type.Namespace;
                        CachedNamespace cnsPrev = Global;
                        for (int i = 0, iPrev = -1; i != -1; iPrev = i, cnsPrev = cns)
                        {
                            i = ns.IndexOf('.', iPrev + 1);
                            string part = i == -1 ? ns.Substring(iPrev + 1) : ns.Substring(iPrev + 1, i - iPrev - 1);

                            if (cnsPrev.NamespaceMap.TryGetValue(part, out cns))
                            {
                                continue;
                            }

                            cns = new CachedNamespace(cnsPrev, part);
                            cnsPrev.NamespaceMap[part]  = cns;
                            AllNamespaces[cns.FullName] = cns;
                        }
                    }

                    if (!AllTypes.TryGetValue(type.FullName, out CachedType ctype))
                    {
                        string part = type.Name;
                        ctype                    = new CachedType(cns, type);
                        cns.TypeMap[part]        = ctype;
                        AllTypes[ctype.FullName] = ctype;
                    }
                }
            }
        private string GetModuleNamespace(UField field, out UnrealModuleType moduleAssetType, bool allowFoldersAsNamespace = true)
        {
            moduleAssetType = UnrealModuleType.Unknown;
            UPackage package = field.GetOutermost();

            if (package != null)
            {
                CachedNamespace cachedNamespace;
                if (namespaceCache.TryGetValue(package, out cachedNamespace))
                {
                    moduleAssetType = cachedNamespace.ModuleAssetType;
                    return(cachedNamespace.Namespace);
                }

                UnrealModuleType moduleType = UnrealModuleType.Unknown;
                moduleAssetType = UnrealModuleType.Unknown;

                string packageFilename = package.FileName.ToString();
                if (string.IsNullOrEmpty(packageFilename.ToString()) || packageFilename == FName.None.ToString())
                {
                    packageFilename = field.GetPathName();
                }

                string moduleName = FPackageName.GetShortName(package.GetName());
                if (packageFilename.StartsWith("/Script"))
                {
                    if (!modulesByName.TryGetValue(new FName(moduleName), out moduleType))
                    {
                        moduleType = UnrealModuleType.Unknown;
                        FMessage.Log(ELogVerbosity.Error, string.Format("Failed to find module for module '{0}'", moduleName));
                    }
                }
                else if (packageFilename.StartsWith("/Game/"))
                {
                    moduleType      = UnrealModuleType.Game;
                    moduleAssetType = UnrealModuleType.Game;
                    moduleName      = FPaths.GetBaseFilename(FPaths.ProjectFilePath);// {Module} same as {Game}
                }
                else if (packageFilename.StartsWith("/Engine/"))
                {
                    moduleType      = UnrealModuleType.Game;
                    moduleAssetType = UnrealModuleType.Engine;
                    moduleName      = Settings.Namespaces.Default;
                }
                else
                {
                    string rootName = null;
                    if (packageFilename.Length > 1 && packageFilename[0] == '/')
                    {
                        int slashIndex = packageFilename.IndexOf('/', 1);
                        if (slashIndex >= 0)
                        {
                            rootName   = packageFilename.Substring(1, slashIndex - 1);
                            moduleName = rootName;// Update ModuleName for {Module}

                            if (!modulesByName.TryGetValue(new FName(rootName), out moduleAssetType))
                            {
                                moduleAssetType = UnrealModuleType.Unknown;
                            }
                        }
                    }

                    if (moduleAssetType == UnrealModuleType.Unknown)
                    {
                        FMessage.Log(ELogVerbosity.Error, string.Format("Unknown module asset type root:'{0}' path:'{1}' name:'{2}' path2:'{3}'",
                                                                        rootName, packageFilename, field.GetName(), field.GetPathName()));
                    }
                    moduleType = UnrealModuleType.Game;
                }

                if (moduleType != UnrealModuleType.Unknown)
                {
                    string namespaceName = GetModuleNamespace(moduleType, moduleName, moduleAssetType, allowFoldersAsNamespace, packageFilename);
                    namespaceCache[package] = new CachedNamespace(namespaceName, moduleName, moduleType, moduleAssetType);
                    return(namespaceName);
                }
                else
                {
                    FMessage.Log(ELogVerbosity.Error, string.Format("Unknown module type {0} {1}", packageFilename, moduleName));
                }
            }
            return(null);
        }
Exemple #3
0
 public CachedType(CachedNamespace ns, Type type)
     : this(type) {
     Namespace = ns;
 }
Exemple #4
0
 public CachedNamespace(CachedNamespace ns, string name)
 {
     Name     = name;
     Parent   = ns;
     FullName = ns?.Name == null ? name : (ns.FullName + "." + name);
 }