mixedreality/com.microsoft.mixedreality..../Core/Utilities/Editor/AssemblyDefinition.cs

294 lines
9.6 KiB
C#

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Utilities.Editor
{
/// <summary>
/// A class that represents a Unity assembly definition (asmdef) file.
/// </summary>
[Serializable]
public class AssemblyDefinition
{
/// <summary>
/// Creates a new, empty assembly definition.
/// </summary>
public AssemblyDefinition() { }
[SerializeField]
private string name = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string Name
{
get => name;
set => name = value;
}
[SerializeField]
private string[] references = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] References
{
get => references;
set => references = value;
}
#if !UNITY_2019_3_OR_NEWER
[SerializeField]
private string[] optionalUnityReferences = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] OptionalUnityReferences
{
get => optionalUnityReferences;
set => optionalUnityReferences = value;
}
#endif // !UNITY_2019_3_OR_NEWER
[SerializeField]
private string[] includePlatforms = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] IncludePlatforms
{
get => includePlatforms;
set => includePlatforms = value;
}
[SerializeField]
private string[] excludePlatforms = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] ExcludePlatforms
{
get => excludePlatforms;
set => excludePlatforms = value;
}
[SerializeField]
private bool allowUnsafeCode = false;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public bool AllowUnsafeCode
{
get => allowUnsafeCode;
set => allowUnsafeCode = value;
}
[SerializeField]
private bool overrideReferences = false;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public bool OverrideReferences
{
get => overrideReferences;
set => overrideReferences = value;
}
[SerializeField]
private string[] precompiledReferences = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] PrecompiledReferences
{
get => precompiledReferences;
set => precompiledReferences = value;
}
[SerializeField]
private bool autoReferenced = true;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public bool AutoReferenced
{
get => autoReferenced;
set => autoReferenced = value;
}
[SerializeField]
private string[] defineConstraints = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public string[] DefineConstraints
{
get => defineConstraints;
set => defineConstraints = value;
}
#if UNITY_2019_3_OR_NEWER
[SerializeField]
private VersionDefine[] versionDefines = null;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public VersionDefine[] VersionDefines
{
get => versionDefines;
set => versionDefines = value;
}
[SerializeField]
private bool noEngineReferences = false;
/// <summary>
/// Please see <see href="https://docs.unity3d.com/Manual/class-AssemblyDefinitionImporter.html">Assembly Definition properties</see> on the Unity documentation site.
/// </summary>
public bool NoEngineReferences
{
get => noEngineReferences;
set => noEngineReferences = value;
}
#endif // UNITY_2019_3_OR_NEWER
/// <summary>
/// Loads an existing assembly definition file.
/// </summary>
/// <param name="fileName">The file to be loaded.</param>
/// <returns>The assembly definition that has been loaded, or null.</returns>
public static AssemblyDefinition Load(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
Debug.LogError("An assembly definition file name must be specified.");
return null;
}
FileInfo file = new FileInfo(fileName);
if (!file.Exists)
{
Debug.LogError($"The {fileName} file could not be found.");
return null;
}
return JsonUtility.FromJson<AssemblyDefinition>(File.ReadAllText(file.FullName));
}
/// <summary>
/// Saves an assembly definition file.
/// </summary>
/// <param name="fileName">The name by which to save the assembly definition file.</param>
/// <remarks>
/// If the specified file exists, it will be overwritten.
/// </remarks>
public void Save(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
Debug.LogError("A name for the assembly definition file must be specified.");
return;
}
FileInfo file = new FileInfo(fileName);
bool readOnly = file.Exists && file.IsReadOnly;
if (readOnly)
{
file.IsReadOnly = false;
}
Debug.Log($"Saving {fileName}");
using (StreamWriter writer = new StreamWriter(fileName, false))
{
writer.Write(JsonUtility.ToJson(this, true));
}
if (readOnly)
{
file.IsReadOnly = true;
}
}
/// <summary>
/// Adds a reference to an existing assembly definition. Make sure to call Save() after using this method to save the changes.
/// </summary>
/// <param name="referenceName">The name of the reference to add to this assembly definition</param>
public void AddReference(string referenceName)
{
if (string.IsNullOrWhiteSpace(referenceName))
{
Debug.LogError($"The reference name is empty and was not added to the {Name} assembly definition file.");
return;
}
if (References == null)
{
References = new string[] { };
}
List<string> refs = References.ToList();
if (!refs.Contains(referenceName))
{
refs.Add(referenceName);
}
else
{
Debug.Log($"The {referenceName} reference name is already listed in the {Name} file.");
return;
}
References = refs.ToArray();
}
}
#if UNITY_2019_3_OR_NEWER
/// <summary>
/// Represents a subclass of a Unity assembly definition (asmdef) file.
/// </summary>
[Serializable]
public struct VersionDefine : IEquatable<VersionDefine>
{
public VersionDefine(string name, string expression, string define)
{
this.name = name;
this.expression = expression;
this.define = define;
}
[SerializeField]
private string name;
[SerializeField]
private string expression;
[SerializeField]
private string define;
bool IEquatable<VersionDefine>.Equals(VersionDefine other)
{
return name.Equals(other.name) &&
expression.Equals(other.expression) &&
define.Equals(other.define);
}
}
#endif // UNITY_2019_3_OR_NEWER
}