static AssemblyDefinitionReference CreateAssemblyDefinitionReference(string assemblyName) { var assemblyDefinitionFile = new AssemblyDefinitionReference(); var path = Compilation.CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(assemblyName); if (string.IsNullOrEmpty(path)) { throw new System.Exception(string.Format("Could not get assembly definition filename for assembly '{0}'", assemblyName)); } assemblyDefinitionFile.asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(path); if (assemblyDefinitionFile.asset == null) { throw new FileNotFoundException(string.Format("Assembly definition file '{0}' not found", assemblyDefinitionFile.path), assemblyDefinitionFile.path); } assemblyDefinitionFile.data = CustomScriptAssemblyData.FromJson(assemblyDefinitionFile.asset.text); return(assemblyDefinitionFile); }
static void LoadAssemblyDefintionState(AssemblyDefinitionState state, string path) { var asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(path); if (asset == null) { return; } var data = CustomScriptAssemblyData.FromJsonNoFieldValidation(asset.text); if (data == null) { return; } try { data.ValidateFields(); } catch (Exception e) { Debug.LogException(e, asset); } state.asset = asset; state.assemblyName = data.name; state.references = new List <AssemblyDefinitionReference>(); state.precompiledReferences = new List <PrecompiledReference>(); state.defineConstraints = new List <DefineConstraint>(); state.versionDefines = new List <VersionDefine>(); state.autoReferenced = data.autoReferenced; state.allowUnsafeCode = data.allowUnsafeCode; state.overrideReferences = data.overrideReferences; // If the .asmdef has no references (true for newly created .asmdef), then use GUIDs. // Otherwise do not use GUIDs. This value might be changed below if any reference is a GUID. state.useGUIDs = (data.references == null || data.references.Length == 0); if (data.versionDefines != null) { foreach (var versionDefine in data.versionDefines) { if (!SymbolNameRestrictions.IsValid(versionDefine.define)) { var exception = new AssemblyDefinitionException($"Invalid version define {versionDefine.define}", path); Debug.LogException(exception, asset); } else { state.versionDefines.Add(new VersionDefine { name = versionDefine.name, expression = versionDefine.expression, define = versionDefine.define, }); } } } if (data.defineConstraints != null) { foreach (var defineConstraint in data.defineConstraints) { var symbolName = defineConstraint.StartsWith(DefineConstraintsHelper.Not) ? defineConstraint.Substring(1) : defineConstraint; if (!SymbolNameRestrictions.IsValid(symbolName)) { var exception = new AssemblyDefinitionException($"Invalid define constraint {symbolName}", path); Debug.LogException(exception, asset); } else { state.defineConstraints.Add(new DefineConstraint { name = defineConstraint, }); } } } if (data.references != null) { foreach (var reference in data.references) { try { var assemblyDefinitionFile = new AssemblyDefinitionReference { name = reference, serializedReference = reference }; // If any references is a GUID, use GUIDs. var isGuid = CompilationPipeline.GetAssemblyDefinitionReferenceType(reference) == AssemblyDefinitionReferenceType.Guid; if (isGuid) { state.useGUIDs = true; } assemblyDefinitionFile.Load(reference, isGuid); state.references.Add(assemblyDefinitionFile); } catch (AssemblyDefinitionException e) { UnityEngine.Debug.LogException(e, asset); state.references.Add(new AssemblyDefinitionReference()); } } } var nameToPrecompiledReference = EditorCompilationInterface.Instance.GetAllPrecompiledAssemblies() .Where(x => (x.Flags & AssemblyFlags.UserAssembly) == AssemblyFlags.UserAssembly) .ToDictionary(x => AssetPath.GetFileName(x.Path), x => x); foreach (var precompiledReferenceName in data.precompiledReferences ?? Enumerable.Empty <String>()) { try { var precompiledReference = new PrecompiledReference { name = precompiledReferenceName, }; PrecompiledAssembly assembly; if (nameToPrecompiledReference.TryGetValue(precompiledReferenceName, out assembly)) { precompiledReference.path = assembly.Path; precompiledReference.fileName = AssetPath.GetFileName(assembly.Path); } state.precompiledReferences.Add(precompiledReference); } catch (AssemblyDefinitionException e) { Debug.LogException(e, asset); state.precompiledReferences.Add(new PrecompiledReference()); } } var platforms = CompilationPipeline.GetAssemblyDefinitionPlatforms(); state.platformCompatibility = new bool[platforms.Length]; state.compatibleWithAnyPlatform = true; string[] dataPlatforms = null; if (data.includePlatforms != null && data.includePlatforms.Length > 0) { state.compatibleWithAnyPlatform = false; dataPlatforms = data.includePlatforms; } else if (data.excludePlatforms != null && data.excludePlatforms.Length > 0) { state.compatibleWithAnyPlatform = true; dataPlatforms = data.excludePlatforms; } if (dataPlatforms != null) { foreach (var platform in dataPlatforms) { var platformIndex = GetPlatformIndex(platforms, platform); state.platformCompatibility[platformIndex] = true; } } }
static AssemblyDefintionState LoadAssemblyDefintionState(string path) { var asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(path); if (asset == null) { return(null); } var data = CustomScriptAssemblyData.FromJson(asset.text); if (data == null) { return(null); } var state = new AssemblyDefintionState(); state.asset = asset; state.name = data.name; state.references = new List <AssemblyDefinitionReference>(); state.precompiledReferences = new List <PrecompiledReference>(); state.defineConstraints = new List <DefineConstraint>(); state.autoReferenced = ToMixedBool(data.autoReferenced); state.allowUnsafeCode = ToMixedBool(data.allowUnsafeCode); state.overrideReferences = ToMixedBool(data.overrideReferences); if (data.defineConstraints != null) { foreach (var defineConstaint in data.defineConstraints) { try { var symbolName = defineConstaint.StartsWith(DefineConstraintsHelper.Not) ? defineConstaint.Substring(1) : defineConstaint; if (!SymbolNameRestrictions.IsValid(symbolName)) { throw new AssemblyDefinitionException($"Invalid define constraint {symbolName}", path); } state.defineConstraints.Add(new DefineConstraint { name = defineConstaint, displayValue = MixedBool.False, }); } catch (AssemblyDefinitionException e) { Debug.LogException(e, asset); state.modified = true; } } } if (data.references != null) { foreach (var reference in data.references) { try { var assemblyDefinitionFile = new AssemblyDefinitionReference(); var referencePath = Compilation.CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(reference); if (string.IsNullOrEmpty(referencePath)) { throw new AssemblyDefinitionException(string.Format("Could not find assembly reference '{0}'", reference), path); } assemblyDefinitionFile.asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(referencePath); if (assemblyDefinitionFile.asset == null) { throw new AssemblyDefinitionException(string.Format("Reference assembly definition file '{0}' not found", referencePath), path); } assemblyDefinitionFile.data = CustomScriptAssemblyData.FromJson(assemblyDefinitionFile.asset.text); assemblyDefinitionFile.displayValue = MixedBool.False; state.references.Add(assemblyDefinitionFile); } catch (AssemblyDefinitionException e) { UnityEngine.Debug.LogException(e, asset); state.references.Add(new AssemblyDefinitionReference()); state.modified = true; } } } var nameToPrecompiledReference = EditorCompilationInterface.Instance.GetAllPrecompiledAssemblies() .Where(x => (x.Flags & AssemblyFlags.UserAssembly) == AssemblyFlags.UserAssembly) .ToDictionary(x => AssetPath.GetFileName(x.Path), x => x); foreach (var precompiledReferenceName in data.precompiledReferences ?? Enumerable.Empty <String>()) { try { var precompiledReference = new PrecompiledReference(); var precompiledAssemblyPossibleReference = nameToPrecompiledReference.ContainsKey(precompiledReferenceName); if (!precompiledAssemblyPossibleReference && !data.overrideReferences) { throw new AssemblyDefinitionException(string.Format("Referenced precompiled assembly '{0}' not found", precompiledReferenceName), path); } precompiledReference.precompiled = nameToPrecompiledReference[precompiledReferenceName]; precompiledReference.displayValue = MixedBool.True; state.precompiledReferences.Add(precompiledReference); } catch (AssemblyDefinitionException e) { Debug.LogException(e, asset); state.precompiledReferences.Add(new PrecompiledReference()); state.modified = true; } } var platforms = CompilationPipeline.GetAssemblyDefinitionPlatforms(); state.platformCompatibility = new MixedBool[platforms.Length]; var OptinalUnityAssemblies = CustomScriptAssembly.OptinalUnityAssemblies; state.optionalUnityReferences = new MixedBool[OptinalUnityAssemblies.Length]; if (data.optionalUnityReferences != null) { for (int i = 0; i < OptinalUnityAssemblies.Length; i++) { var optionalUnityReferences = OptinalUnityAssemblies[i].OptionalUnityReferences.ToString(); var any = data.optionalUnityReferences.Any(x => x == optionalUnityReferences); if (any) { state.optionalUnityReferences[i] = MixedBool.True; } } } state.compatibleWithAnyPlatform = MixedBool.True; string[] dataPlatforms = null; if (data.includePlatforms != null && data.includePlatforms.Length > 0) { state.compatibleWithAnyPlatform = MixedBool.False; dataPlatforms = data.includePlatforms; } else if (data.excludePlatforms != null && data.excludePlatforms.Length > 0) { state.compatibleWithAnyPlatform = MixedBool.True; dataPlatforms = data.excludePlatforms; } if (dataPlatforms != null) { foreach (var platform in dataPlatforms) { var platformIndex = GetPlatformIndex(platforms, platform); state.platformCompatibility[platformIndex] = MixedBool.True; } } return(state); }
static AssemblyDefintionState LoadAssemblyDefintionState(string path) { var asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(path); if (asset == null) { return(null); } var data = CustomScriptAssemblyData.FromJson(asset.text); if (data == null) { return(null); } var state = new AssemblyDefintionState(); state.asset = asset; state.name = data.name; state.references = new List <AssemblyDefinitionReference>(); state.allowUnsafeCode = ToMixedBool(data.allowUnsafeCode); if (data.references != null) { foreach (var reference in data.references) { try { var assemblyDefinitionFile = new AssemblyDefinitionReference(); var referencePath = Compilation.CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(reference); if (string.IsNullOrEmpty(referencePath)) { throw new AssemblyDefinitionException(string.Format("Could not find assembly reference '{0}'", reference), path); } assemblyDefinitionFile.asset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(referencePath); if (assemblyDefinitionFile.asset == null) { throw new AssemblyDefinitionException(string.Format("Reference assembly definition file '{0}' not found", referencePath), path); } assemblyDefinitionFile.data = CustomScriptAssemblyData.FromJson(assemblyDefinitionFile.asset.text); assemblyDefinitionFile.displayValue = MixedBool.False; state.references.Add(assemblyDefinitionFile); } catch (AssemblyDefinitionException e) { UnityEngine.Debug.LogException(e, asset); state.references.Add(new AssemblyDefinitionReference()); state.modified = true; } } } var platforms = CompilationPipeline.GetAssemblyDefinitionPlatforms(); state.platformCompatibility = new MixedBool[platforms.Length]; var OptinalUnityAssemblies = CustomScriptAssembly.OptinalUnityAssemblies; state.optionalUnityReferences = new MixedBool[OptinalUnityAssemblies.Length]; if (data.optionalUnityReferences != null) { for (int i = 0; i < OptinalUnityAssemblies.Length; i++) { var optionalUnityReferences = OptinalUnityAssemblies[i].OptionalUnityReferences.ToString(); var any = data.optionalUnityReferences.Any(x => x == optionalUnityReferences); if (any) { state.optionalUnityReferences[i] = MixedBool.True; } } } state.compatibleWithAnyPlatform = MixedBool.True; string[] dataPlatforms = null; if (data.includePlatforms != null && data.includePlatforms.Length > 0) { state.compatibleWithAnyPlatform = MixedBool.False; dataPlatforms = data.includePlatforms; } else if (data.excludePlatforms != null && data.excludePlatforms.Length > 0) { state.compatibleWithAnyPlatform = MixedBool.True; dataPlatforms = data.excludePlatforms; } if (dataPlatforms != null) { foreach (var platform in dataPlatforms) { var platformIndex = GetPlatformIndex(platforms, platform); state.platformCompatibility[platformIndex] = MixedBool.True; } } return(state); }