private static SettingsProvider CreateSettingsProvider() { var serializedObject = CscSettings.GetSerializedObject(); var keywords = SettingsProvider.GetSearchKeywordsFromSerializedObject(serializedObject); return(new SettingsProvider("Project/C# Compiler", SettingsScope.Project) { label = "C# Compiler", keywords = keywords, guiHandler = OnGUI, }); }
private static void OnGUI(string searchContext) { var serializedObject = CscSettings.GetSerializedObject(); var spUseDefaultCompiler = serializedObject.FindProperty("m_UseDefaultCompiler"); var spPackageName = serializedObject.FindProperty("m_PackageName"); var spPackageVersion = serializedObject.FindProperty("m_PackageVersion"); var spLanguageVersion = serializedObject.FindProperty("m_LanguageVersion"); using (var ccs = new EditorGUI.ChangeCheckScope()) { EditorGUILayout.PropertyField(spUseDefaultCompiler); if (ccs.changed) { Core.RequestScriptCompilation(); } } EditorGUILayout.PropertyField(spPackageName); EditorGUILayout.PropertyField(spPackageVersion); EditorGUILayout.PropertyField(spLanguageVersion); serializedObject.ApplyModifiedProperties(); }
private static void ChangeCompilerProcess(object compiler, object scriptAssembly, CscSettings setting) { var tProgram = Type.GetType("UnityEditor.Utils.Program, UnityEditor"); var tScriptCompilerBase = Type.GetType("UnityEditor.Scripting.Compilers.ScriptCompilerBase, UnityEditor"); var fiProcess = tScriptCompilerBase.GetField("process", BindingFlags.NonPublic | BindingFlags.Instance); var psi = compiler.Get("process", fiProcess).Call("GetProcessStartInfo") as ProcessStartInfo; LogDebug("current process: {0}", (psi.FileName + " " + psi.Arguments)); var command = (psi.FileName + " " + psi.Arguments) .Replace(EditorApplication.applicationContentsPath, "@APP_CONTENTS@") .Replace('\\', '/'); var isDefaultCsc = Regex.IsMatch(command, "@APP_CONTENTS@/[^ ]*(mcs|csc)"); // csc is not Unity default. It is already modified. if (!isDefaultCsc) { LogDebug(" <color=#bbbb44><Skipped> current csc is not Unity default. It is already modified.</color>"); return; } var cscToolExe = CustomCompiler.GetInstalledPath(setting.PackageId); // csc is not installed. if (string.IsNullOrEmpty(cscToolExe)) { LogDebug(" <color=#bbbb44><Skipped> custom csc is not installed.</color>"); return; } // Kill current process. compiler.Call("Dispose"); var responseFile = Regex.Replace(psi.Arguments, "^.*@(.+)$", "$1"); var text = File.ReadAllText(responseFile); text = Regex.Replace(text, "[\r\n]+", "\n"); text = Regex.Replace(text, "^-", "/"); text = Regex.Replace(text, "\n/langversion:[^\n]+\n", "\n/langversion:" + setting.LanguageVersion + "\n"); text = Regex.Replace(text, "\n/debug\n", "\n/debug:portable\n"); text += "\n/preferreduilang:en-US"; // Change exe file path. LogDebug("Change csc to {0}", cscToolExe); if (Application.platform == RuntimePlatform.WindowsEditor) { psi.FileName = Path.GetFullPath(cscToolExe); psi.Arguments = "/shared /noconfig @" + responseFile; } else { psi.FileName = Path.Combine(EditorApplication.applicationContentsPath, "MonoBleedingEdge/bin/mono"); psi.Arguments = cscToolExe + " /noconfig @" + responseFile; } text = Regex.Replace(text, "\n", Environment.NewLine); File.WriteAllText(responseFile, text); LogDebug("Restart compiler process: {0} {1}", psi.FileName, psi.Arguments); var program = tProgram.New(psi); program.Call("Start"); compiler.Set("process", program, fiProcess); }