//
// Copyright (c) BovineLabs. All rights reserved.
//
namespace BovineLabs.Vision.Editor.ShaderGraph
{
using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.Compilation;
///
/// Adds our assembly to the shader graph AssemblyInfo to give us internal access. A nasty hack required for now.
///
[InitializeOnLoad]
public static class UpdateShaderGraphAssemblyInfo
{
private const string ShaderGraphAssemblyName = "Unity.ShaderGraph.Editor";
private const string AssemblyInfoName = "AssemblyInfo.cs";
// This line should refer to your own assembly
private const string VisibleLine = "[assembly: InternalsVisibleTo(\"BovineLabs.Vision.Editor\")]";
static UpdateShaderGraphAssemblyInfo()
{
CompilationPipeline.assemblyCompilationStarted += OnAssemblyCompilationStarted;
}
private static void OnAssemblyCompilationStarted(string assemblyName)
{
var asmdef = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(assemblyName);
var name = Path.GetFileNameWithoutExtension(asmdef);
if (name == null || !name.Equals(ShaderGraphAssemblyName))
{
return;
}
var directory = Path.GetDirectoryName(asmdef);
var assemblyInfoPath = Path.Combine(directory ?? throw new NullReferenceException(), AssemblyInfoName);
var assemblyInfo = File.ReadAllLines(assemblyInfoPath);
// Already setup
if (assemblyInfo.Contains(VisibleLine))
{
return;
}
TurnOffReadOnly(assemblyInfoPath);
File.AppendAllText(assemblyInfoPath, VisibleLine);
}
private static void TurnOffReadOnly(string file)
{
File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly);
}
}
}