private void RequestCurrentContext(Lifetime lt, IPsiSourceFile sourceFile, Rd.Tasks.RdTask <ShaderContextDataBase> task) { var currentRoot = myShaderContextCache.GetPreferredRootFile(new CppFileLocation(sourceFile)); if (!currentRoot.IsValid()) { task.Set(new AutoShaderContextData()); return; } mySolution.Locks.Tasks.StartNew(lt, Scheduling.FreeThreaded, () => { using (ReadLockCookie.Create()) { var possibleRoots = myCppGlobalSymbolCache.IncludesGraphCache.CollectPossibleRootsForFile(new CppFileLocation(sourceFile)).ToList(); if (possibleRoots.Contains(currentRoot)) { mySolution.Locks.ExecuteOrQueueReadLockEx(lt, "SetCurrentContext", () => { task.Set(GetContextDataFor(currentRoot)); }); } else { mySolution.Locks.ExecuteOrQueueEx(lt, "SetCurrentContext", () => { task.Set(new AutoShaderContextData()); }); } } }); }
private void RequestShaderContexts(Lifetime lt, IPsiSourceFile sourceFile, Rd.Tasks.RdTask <List <ShaderContextDataBase> > task) { if (!lt.IsAlive) { task.SetCancelled(); return; } myPsiFiles.CommitAllDocumentsAsync(() => { var possibleRoots = myCppGlobalSymbolCache.IncludesGraphCache.CollectPossibleRootsForFile(new CppFileLocation(sourceFile)).ToList(); var result = new List <ShaderContextDataBase>(); foreach (var root in possibleRoots) { if (root.IsInjected()) { var item = GetContextDataFor(root); if (item != null) { result.Add(item); } } } task.Set(result); }, () => RequestShaderContexts(lt, sourceFile, task)); }