public void Compile() { Profiler.BeginSample("UdonSharp Compile"); System.Diagnostics.Stopwatch compileTimer = new System.Diagnostics.Stopwatch(); compileTimer.Start(); int totalErrorCount = 0; try { EditorUtility.DisplayProgressBar("UdonSharp Compile", "Parsing Syntax Trees...", 0f); UdonSharpProgramAsset[] allPrograms = UdonSharpProgramAsset.GetAllUdonSharpPrograms(); List <(UdonSharpProgramAsset, string)> programAssetsAndPaths = new List <(UdonSharpProgramAsset, string)>(); foreach (UdonSharpProgramAsset programAsset in allPrograms) { if (programAsset == null || programAsset.sourceCsScript == null) { continue; } programAssetsAndPaths.Add((programAsset, AssetDatabase.GetAssetPath(programAsset.sourceCsScript))); } UdonSharpProgramAsset[] programAssetsToCompile = modules.Select(e => e.programAsset).Where(e => e != null && e.sourceCsScript != null).ToArray(); try { beforeCompile?.Invoke(programAssetsToCompile); } catch (System.Exception e) { Debug.LogError($"Exception thrown by pre compile listener\n{e}"); } object syntaxTreeLock = new object(); List <(UdonSharpProgramAsset, Microsoft.CodeAnalysis.SyntaxTree)> programsAndSyntaxTrees = new List <(UdonSharpProgramAsset, Microsoft.CodeAnalysis.SyntaxTree)>(); Dictionary <UdonSharpProgramAsset, (string, Microsoft.CodeAnalysis.SyntaxTree)> syntaxTreeSourceLookup = new Dictionary <UdonSharpProgramAsset, (string, Microsoft.CodeAnalysis.SyntaxTree)>(); string[] defines = UdonSharpUtils.GetProjectDefines(isEditorBuild); Parallel.ForEach(programAssetsAndPaths, (currentProgram) => { string programSource = UdonSharpUtils.ReadFileTextSync(currentProgram.Item2); Microsoft.CodeAnalysis.SyntaxTree programSyntaxTree = CSharpSyntaxTree.ParseText(programSource, CSharpParseOptions.Default.WithDocumentationMode(DocumentationMode.None).WithPreprocessorSymbols(defines)); lock (syntaxTreeLock) { programsAndSyntaxTrees.Add((currentProgram.Item1, programSyntaxTree)); syntaxTreeSourceLookup.Add(currentProgram.Item1, (programSource, programSyntaxTree)); } });
public ModuleBinding[] LoadSyntaxTreesAndCreateModules(IEnumerable <string> sourcePaths, string[] scriptingDefines) { ConcurrentBag <ModuleBinding> syntaxTrees = new ConcurrentBag <ModuleBinding>(); Parallel.ForEach(sourcePaths, (currentSource) => { string programSource = UdonSharpUtils.ReadFileTextSync(currentSource); var programSyntaxTree = CSharpSyntaxTree.ParseText(programSource, CSharpParseOptions.Default.WithDocumentationMode(DocumentationMode.None).WithPreprocessorSymbols(scriptingDefines).WithLanguageVersion(LanguageVersion.CSharp7_3)); syntaxTrees.Add(new ModuleBinding() { tree = programSyntaxTree, filePath = currentSource, sourceText = programSource }); }); ModuleBindings = syntaxTrees.ToArray(); return(ModuleBindings); }
public void Compile() { Profiler.BeginSample("UdonSharp Compile"); System.Diagnostics.Stopwatch compileTimer = new System.Diagnostics.Stopwatch(); compileTimer.Start(); int totalErrorCount = 0; try { EditorUtility.DisplayProgressBar("UdonSharp Compile", "Initializing...", 0f); UdonSharpProgramAsset[] allPrograms = UdonSharpProgramAsset.GetAllUdonSharpPrograms(); List <(UdonSharpProgramAsset, string)> programAssetsAndPaths = new List <(UdonSharpProgramAsset, string)>(); foreach (UdonSharpProgramAsset programAsset in allPrograms) { if (programAsset == null) { continue; } if (programAsset.sourceCsScript == null) { Debug.LogWarning($"[<color=#FF00FF>UdonSharp</color>] Program asset '{AssetDatabase.GetAssetPath(programAsset)}' is missing a source C# script"); continue; } programAssetsAndPaths.Add((programAsset, AssetDatabase.GetAssetPath(programAsset.sourceCsScript))); programAsset.compileErrors.Clear(); // Clear compile errors to keep them from stacking if not resolved } CheckProgramAssetCollisions(allPrograms); UdonSharpProgramAsset[] programAssetsToCompile = modules.Select(e => e.programAsset).Where(e => e != null && e.sourceCsScript != null).ToArray(); EditorUtility.DisplayProgressBar("UdonSharp Compile", "Executing pre-build events...", 0f); try { beforeCompile?.Invoke(programAssetsToCompile); } catch (System.Exception e) { Debug.LogError($"Exception thrown by pre compile listener\n{e}"); } EditorUtility.DisplayProgressBar("UdonSharp Compile", "Parsing Syntax Trees...", 0f); object syntaxTreeLock = new object(); List <(UdonSharpProgramAsset, Microsoft.CodeAnalysis.SyntaxTree)> programsAndSyntaxTrees = new List <(UdonSharpProgramAsset, Microsoft.CodeAnalysis.SyntaxTree)>(); Dictionary <UdonSharpProgramAsset, (string, Microsoft.CodeAnalysis.SyntaxTree)> syntaxTreeSourceLookup = new Dictionary <UdonSharpProgramAsset, (string, Microsoft.CodeAnalysis.SyntaxTree)>(); string[] defines = UdonSharpUtils.GetProjectDefines(isEditorBuild); Parallel.ForEach(programAssetsAndPaths, (currentProgram) => { string programSource = UdonSharpUtils.ReadFileTextSync(currentProgram.Item2); #pragma warning disable CS1701 // Warning about System.Collections.Immutable versions potentially not matching Microsoft.CodeAnalysis.SyntaxTree programSyntaxTree = CSharpSyntaxTree.ParseText(programSource, CSharpParseOptions.Default.WithDocumentationMode(DocumentationMode.None).WithPreprocessorSymbols(defines)); #pragma warning restore CS1701 lock (syntaxTreeLock) { programsAndSyntaxTrees.Add((currentProgram.Item1, programSyntaxTree)); syntaxTreeSourceLookup.Add(currentProgram.Item1, (programSource, programSyntaxTree)); } });