private Dictionary <string, CSProjectInfo> CreateUnityProjects() { // Not all of these will be converted to C# objects, only the ones found to be referenced Dictionary <string, AssemblyDefinitionInfo> asmDefInfoMap = new Dictionary <string, AssemblyDefinitionInfo>(); SortedSet <AssemblyDefinitionInfo> asmDefDirectoriesSorted = new SortedSet <AssemblyDefinitionInfo>(Comparer <AssemblyDefinitionInfo> .Create((a, b) => a.Directory.FullName.CompareTo(b.Directory.FullName))); HashSet <string> builtInPackagesWithoutSource = new HashSet <string>(); // Parse the builtInPackagesFirst DirectoryInfo builtInPackagesDirectory = new DirectoryInfo(Utilities.BuiltInPackagesPath); foreach (DirectoryInfo packageDirectory in builtInPackagesDirectory.GetDirectories()) { FileInfo[] asmDefFiles = packageDirectory.GetFiles("*.asmdef", SearchOption.AllDirectories); if (asmDefFiles.Length == 0) { builtInPackagesWithoutSource.Add(packageDirectory.Name.ToLower()); continue; } foreach (FileInfo fileInfo in asmDefFiles) { AssemblyDefinitionInfo assemblyDefinitionInfo = AssemblyDefinitionInfo.Parse(fileInfo, this, null, true); asmDefDirectoriesSorted.Add(assemblyDefinitionInfo); asmDefInfoMap.Add(Path.GetFileNameWithoutExtension(fileInfo.Name), assemblyDefinitionInfo); } } Dictionary <string, string> packageCacheVersionedMap = new Dictionary <string, string>(); foreach (string directory in Directory.GetDirectories(Utilities.PackageLibraryCachePath)) { string directoryName = Path.GetFileName(directory); packageCacheVersionedMap.Add(directoryName.Split('@')[0], directoryName); } Dictionary <string, Assembly> unityAssemblies = CompilationPipeline.GetAssemblies().ToDictionary(t => t.name); Dictionary <string, CSProjectInfo> projectsMap = new Dictionary <string, CSProjectInfo>(); Queue <string> projectsToProcess = new Queue <string>(); // Parse the unity assemblies foreach (KeyValuePair <string, Assembly> pair in unityAssemblies) { if (!asmDefInfoMap.TryGetValue(pair.Key, out AssemblyDefinitionInfo assemblyDefinitionInfo)) { string asmDefPath = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(pair.Key); if (string.IsNullOrEmpty(asmDefPath)) { if (!pair.Key.StartsWith("Assembly-CSharp")) { throw new InvalidOperationException($"Failed to retrieve AsmDef for script assembly: {pair.Key}"); } Guid guid; switch (pair.Key) { case "Assembly-CSharp": guid = config.AssemblyCSharpGuid; break; case "Assembly-CSharp-firstpass": guid = config.AssemblyCSharpFirstPassGuid; break; case "Assembly-CSharp-Editor": guid = config.AssemblyCSharpEditorGuid; break; case "Assembly-CSharp-Editor-firstpass": guid = config.AssemblyCSharpFirstPassEditorGuid; break; default: throw new InvalidOperationException($"Predefined assembly '{assemblyDefinitionInfo.Name}' was not recognized, this generally means it should be added to the switch statement in CSProjectInfo:GetProjectType."); } assemblyDefinitionInfo = AssemblyDefinitionInfo.GetDefaultAssemblyCSharpInfo(pair.Value, guid); projectsToProcess.Enqueue(pair.Key); } else { assemblyDefinitionInfo = AssemblyDefinitionInfo.Parse(new FileInfo(Utilities.GetFullPathFromKnownRelative(asmDefPath)), this, pair.Value); if (asmDefPath.StartsWith("Assets/")) { // Add as mandatory projectsToProcess.Enqueue(pair.Key); } } asmDefDirectoriesSorted.Add(assemblyDefinitionInfo); asmDefInfoMap.Add(pair.Key, assemblyDefinitionInfo); } } // This will parse additional asmdefs that are not part of current compilation set, but we still need foreach (string asmdefGuid in AssetDatabase.FindAssets("t:asmdef")) { string asmDefPath = AssetDatabase.GUIDToAssetPath(asmdefGuid); string asmDefKey = Path.GetFileNameWithoutExtension(asmDefPath); if (!asmDefInfoMap.ContainsKey(asmDefKey)) { AssemblyDefinitionInfo assemblyDefinitionInfo = AssemblyDefinitionInfo.Parse(new FileInfo(Utilities.GetFullPathFromKnownRelative(asmDefPath)), this, null); asmDefDirectoriesSorted.Add(assemblyDefinitionInfo); asmDefInfoMap.Add(asmDefKey, assemblyDefinitionInfo); } } // Now we have all of the assembly definiton files, let's run a quick validation. ValidateAndPatchAssemblyDefinitions(asmDefInfoMap); int index = 0; ProcessSortedAsmDef(asmDefDirectoriesSorted.ToArray(), ref index, (uri) => true, (a) => { }); while (projectsToProcess.Count > 0) { string projectKey = projectsToProcess.Dequeue(); if (!projectsMap.ContainsKey(projectKey)) { GetProjectInfo(projectsMap, asmDefInfoMap, builtInPackagesWithoutSource, projectKey); } } return(projectsMap); }
private Dictionary <string, CSProjectInfo> CreateUnityProjects(string projectOutputPath) { // Not all of these will be converted to C# objects, only the ones found to be referenced Dictionary <string, AssemblyDefinitionInfo> asmDefInfoMap = new Dictionary <string, AssemblyDefinitionInfo>(); HashSet <string> builtInPackagesWithoutSource = new HashSet <string>(); // Parse the builtInPackagesFirst DirectoryInfo builtInPackagesDirectory = new DirectoryInfo(Utilities.BuiltInPackagesPath); foreach (DirectoryInfo packageDirectory in builtInPackagesDirectory.GetDirectories()) { FileInfo[] asmDefFiles = packageDirectory.GetFiles("*.asmdef", SearchOption.AllDirectories); if (asmDefFiles.Length == 0) { builtInPackagesWithoutSource.Add(packageDirectory.Name.ToLower()); continue; } foreach (FileInfo fileInfo in asmDefFiles) { AssemblyDefinitionInfo assemblyDefinitionInfo = AssemblyDefinitionInfo.Parse(fileInfo, this, null, true); asmDefInfoMap.Add(Path.GetFileNameWithoutExtension(fileInfo.Name), assemblyDefinitionInfo); } } Dictionary <string, Assembly> unityAssemblies = CompilationPipeline.GetAssemblies().ToDictionary(t => t.name); Dictionary <string, CSProjectInfo> projectsMap = new Dictionary <string, CSProjectInfo>(); Queue <string> projectsToProcess = new Queue <string>(); // Parse the unity assemblies foreach (KeyValuePair <string, Assembly> pair in unityAssemblies) { if (!asmDefInfoMap.TryGetValue(pair.Key, out AssemblyDefinitionInfo assemblyDefinitionInfo)) { string asmDefPath = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(pair.Key); if (string.IsNullOrEmpty(asmDefPath)) { if (!pair.Key.StartsWith("Assembly-CSharp")) { throw new InvalidOperationException($"Failed to retrieve AsmDef for script assembly: {pair.Key}"); } assemblyDefinitionInfo = AssemblyDefinitionInfo.GetDefaultAssemblyCSharpInfo(pair.Value); projectsToProcess.Enqueue(pair.Key); } else { assemblyDefinitionInfo = AssemblyDefinitionInfo.Parse(new FileInfo(Utilities.GetFullPathFromKnownRelative(asmDefPath)), this, pair.Value); if (asmDefPath.StartsWith("Assets/")) { // Add as mandatory projectsToProcess.Enqueue(pair.Key); } } asmDefInfoMap.Add(pair.Key, assemblyDefinitionInfo); } } while (projectsToProcess.Count > 0) { string projectKey = projectsToProcess.Dequeue(); if (!projectsMap.ContainsKey(projectKey)) { GetProjectInfo(projectsMap, asmDefInfoMap, builtInPackagesWithoutSource, projectKey, projectOutputPath); } } return(projectsMap); }