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