Beispiel #1
0
        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,
            });
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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);
        }