public static Dictionary <string, string> GetUnityReferences(ScriptAssembly scriptAssembly, TargetAssembly targetAssembly, PrecompiledAssembly[] unityAssemblies, EditorScriptCompilationOptions options, UnityReferencesOptions unityReferencesOptions) { return(GetUnityReferences(scriptAssembly, targetAssembly, unityAssemblies, null, options, unityReferencesOptions)); }
public static Dictionary <string, string> GetUnityReferences(ScriptAssembly scriptAssembly, TargetAssembly targetAssembly, PrecompiledAssembly[] unityAssemblies, HashSet <string> predefinedCustomTargetReferences, EditorScriptCompilationOptions options, UnityReferencesOptions unityReferencesOptions) { var references = new Dictionary <string, string>(); bool assemblyEditorOnly = (scriptAssembly.Flags & AssemblyFlags.EditorOnly) == AssemblyFlags.EditorOnly; bool buildingForEditor = (options & EditorScriptCompilationOptions.BuildingForEditor) == EditorScriptCompilationOptions.BuildingForEditor; bool excludeUnityModules = unityReferencesOptions == UnityReferencesOptions.ExcludeModules; bool isOverridingUnityAssembly = false; // Add Unity assemblies (UnityEngine.dll, UnityEditor.dll) referencees. if (unityAssemblies == null) { return(references); } foreach (var unityAssembly in unityAssemblies) { if ((unityAssembly.Flags & (AssemblyFlags.UserOverride | AssemblyFlags.UserOverrideCandidate)) != AssemblyFlags.None) { var unityAssemblyFileName = AssetPath.GetFileName(unityAssembly.Path); // This scriptAssembly is overriding this unityAssembly so it should probably not depend on itself. if (unityAssemblyFileName == scriptAssembly.Filename) { isOverridingUnityAssembly = true; continue; } // Custom targets may override Unity references, do not add them to avoid duplicated references. if (predefinedCustomTargetReferences != null && predefinedCustomTargetReferences.Contains(unityAssemblyFileName)) { continue; } // If this scriptAssembly/targetAssembly explicitly references another // scriptAssembly that has actually overridden this unityAssembly, we should // not add the unityAssembly to the references as well. It's possible // that this scriptAssembly is using new APIs that don't exist in the shipped // copy of the unityAssembly. if (targetAssembly != null && targetAssembly.References.Any(ta => ta.Filename == unityAssemblyFileName)) { continue; } } var isUnityModule = (unityAssembly.Flags & AssemblyFlags.UnityModule) == AssemblyFlags.UnityModule; if (isUnityModule && excludeUnityModules) { continue; } var moduleExcludedForRuntimeCode = (unityAssembly.Flags & AssemblyFlags.ExcludedForRuntimeCode) == AssemblyFlags.ExcludedForRuntimeCode; // Add Unity editor assemblies (UnityEditor.dll) to all assemblies when building inside the editor if ((buildingForEditor && !moduleExcludedForRuntimeCode) || assemblyEditorOnly) { if ((unityAssembly.Flags & AssemblyFlags.UseForMono) != 0) { references[Path.GetFileName(unityAssembly.Path)] = unityAssembly.Path; } } else { bool unityAssemblyEditorOnly = (unityAssembly.Flags & AssemblyFlags.EditorOnly) == AssemblyFlags.EditorOnly; // Add Unity runtime assemblies (UnityEngine.dll) to all assemblies if (!unityAssemblyEditorOnly && !moduleExcludedForRuntimeCode) { if (IsPrecompiledAssemblyCompatibleWithBuildTarget(unityAssembly, scriptAssembly.BuildTarget)) { references[Path.GetFileName(unityAssembly.Path)] = unityAssembly.Path; } } } } // UserOverride assemblies should not have a dependency on Editor assemblies. if (isOverridingUnityAssembly && !assemblyEditorOnly) { references = references.Where(kvp => !kvp.Key.Contains("UnityEditor")).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); } return(references); }
public static PrecompiledAssembly[] GetUnityReferences(ScriptAssembly scriptAssembly, PrecompiledAssembly[] unityAssemblies, EditorScriptCompilationOptions options, UnityReferencesOptions unityReferencesOptions) { return(GetUnityReferences(scriptAssembly, null, unityAssemblies, options, unityReferencesOptions)); }