public void Initialize(IReadOnlyCollection <CustomScriptAssembly> assemblies, IReadOnlyCollection <CustomScriptAssemblyReference> customScriptAssemblyReferences) { var assemblyByNameLookup = assemblies.ToDictionary(x => x.Name, x => x); var assemblyByGuidLookup = assemblies.ToDictionary(x => x.GUID, x => x); bool rootOverridden = assemblies.Any(x => AssetPath.ComparePaths(x.PathPrefix, _projectPath)); if (!rootOverridden) { _npp.Insert(_globalAssemblyDefinition.PathPrefix, _globalAssemblyDefinition); _npp.Insert(_editorAssebmlyDefinition.PathPrefix, _editorAssebmlyDefinition); _npp.Insert(_globalFirstpassAssemblyDefinition.PathPrefix, _globalFirstpassAssemblyDefinition); _npp.Insert(_editorFirstpassAssemblyDefinition.PathPrefix, _editorFirstpassAssemblyDefinition); } foreach (var assemblyDef in assemblies) { _npp.Insert(assemblyDef.PathPrefix, assemblyDef); } if (!rootOverridden) { foreach (var globalFirstpassAssemblyReference in _globalFirstpassAssemblyReferences) { _npp.Insert(globalFirstpassAssemblyReference.PathPrefix, _globalFirstpassAssemblyDefinition); } } foreach (var assemblyReference in customScriptAssemblyReferences) { CustomScriptAssembly foundAssemblyDef = null; var foundAssemblyDefinition = GUIDReference.IsGUIDReference(assemblyReference.Reference) ? assemblyByGuidLookup.TryGetValue(GUIDReference.GUIDReferenceToGUID(assemblyReference.Reference), out foundAssemblyDef) : assemblyByNameLookup.TryGetValue(assemblyReference.Reference, out foundAssemblyDef); if (foundAssemblyDefinition) { _npp.Insert(assemblyReference.PathPrefix, foundAssemblyDef); } else { Console.WriteLine( $"Assembly reference {assemblyReference.FilePath} has no target assembly definition"); } } }
static void ConvertGUIDReferencesToAssemblyNames(List <CustomScriptAssembly> assemblies, Dictionary <string, CustomScriptAssembly> guidsToAssemblies) { foreach (var assembly in assemblies) { for (int i = 0; i < assembly.References.Length; ++i) { var reference = assembly.References[i]; if (!GUIDReference.IsGUIDReference(reference)) { continue; } var guid = Utility.FastToLower(GUIDReference.GUIDReferenceToGUID(reference)); reference = guidsToAssemblies.TryGetValue(guid, out var referenceAssembly) ? referenceAssembly.Name : string.Empty; assembly.References[i] = reference; } } }
public void SetAllCustomScriptAssemblyReferenceJsonsContents(string[] paths, string[] contents) { var assemblyRefs = new List <CustomScriptAssemblyReference>(); var exceptions = new List <Exception>(); // We only construct this lookup if it is required, which is when we are using guids instead of assembly names. Dictionary <string, CustomScriptAssembly> guidsToAssemblies = null; // To check if a path prefix is already being used we use a Dictionary where the key is the prefix and the value is the file path. var prefixToFilePathLookup = m_SkipCustomScriptAssemblyGraphValidation ? null : CustomScriptAssemblies.GroupBy(x => x.PathPrefix).ToDictionary(x => x.First().PathPrefix, x => new List <string>() { x.First().FilePath }, StringComparer.OrdinalIgnoreCase); for (var i = 0; i < paths.Length; ++i) { var path = paths[i]; CustomScriptAssemblyReference loadedCustomScriptAssemblyReference = null; try { var fullPath = AssetPath.IsPathRooted(path) ? AssetPath.GetFullPath(path) : AssetPath.Combine(m_ProjectDirectory, path); if (contents != null) { var jsonContents = contents[i]; loadedCustomScriptAssemblyReference = LoadCustomScriptAssemblyReferenceFromJson(fullPath, jsonContents); } else { loadedCustomScriptAssemblyReference = LoadCustomScriptAssemblyReferenceFromJsonPath(fullPath); } if (!m_SkipCustomScriptAssemblyGraphValidation) { // Check both asmdef and asmref files. if (prefixToFilePathLookup.TryGetValue(loadedCustomScriptAssemblyReference.PathPrefix, out var duplicateFilePaths)) { var filePaths = new List <string> { loadedCustomScriptAssemblyReference.FilePath }; filePaths.AddRange(duplicateFilePaths); throw new AssemblyDefinitionException( $"Folder '{loadedCustomScriptAssemblyReference.PathPrefix}' contains multiple assembly definition files", filePaths.ToArray()); } } // Convert GUID references to assembly names if (GUIDReference.IsGUIDReference(loadedCustomScriptAssemblyReference.Reference)) { // Generate the guid to assembly lookup? guidsToAssemblies = guidsToAssemblies ?? CustomScriptAssemblies.ToDictionary(x => x.GUID); var guid = Utility.FastToLower(GUIDReference.GUIDReferenceToGUID(loadedCustomScriptAssemblyReference.Reference)); if (guidsToAssemblies.TryGetValue(guid, out var foundAssembly)) { loadedCustomScriptAssemblyReference.Reference = foundAssembly.Name; } } } catch (Exception e) { m_CompilationSetupErrorsTracker.SetCompilationSetupErrors(CompilationSetupErrors.LoadError); exceptions.Add(e); } if (loadedCustomScriptAssemblyReference != null) { assemblyRefs.Add(loadedCustomScriptAssemblyReference); if (m_SkipCustomScriptAssemblyGraphValidation) { continue; } if (!prefixToFilePathLookup.TryGetValue(loadedCustomScriptAssemblyReference.PathPrefix, out var duplicateFilePaths)) { duplicateFilePaths = new List <string>(); prefixToFilePathLookup[loadedCustomScriptAssemblyReference.PathPrefix] = duplicateFilePaths; } duplicateFilePaths.Add(loadedCustomScriptAssemblyReference.FilePath); } } CustomScriptAssemblyReferences = assemblyRefs; Exceptions = exceptions.ToArray(); }