コード例 #1
0
ファイル: FindUsagesHandler.cs プロジェクト: derigel23/Nitra
      public void Execute(IDataContext context, DelegateExecute nextExecute)
      {
        var solution = context.GetData(JetBrains.ProjectModel.DataContext.DataConstants.SOLUTION);
        if (solution != null)
        {
          var documentOffset = context.GetData(JetBrains.DocumentModel.DataConstants.DOCUMENT_OFFSET);
          if (documentOffset == null)
            return;

          //var psiServices = solution.GetPsiServices();
          var psiFile = documentOffset.Document.GetPsiSourceFile(solution);
          if (psiFile == null)
            return;
          var projectFile = psiFile.ToProjectFile();
          if (projectFile == null)
            return;
          var project = projectFile.GetProject();
          if (project == null)
            return;
          var nitraProject = _nitraSolution.GetProject(project);
          if (nitraProject == null)
            return;
          var nitraFile = nitraProject.TryGetFile(projectFile);
          if (nitraFile == null)
            return;

          var pos = documentOffset.Value;
          var symbolCollector = new CollectSymbolsAndRefsInSpanAstVisitor(new NSpan(pos));
          nitraFile.Ast.Accept(symbolCollector);


          var popupWindowContext = context.GetData(JetBrains.UI.DataConstants.PopupWindowContextSource);
          if (popupWindowContext == null)
            return;

          var symbols = symbolCollector.Refs.Where(r => r.IsSymbolEvaluated).Select(r => r.Symbol).ToArray();

          if (symbols.Length == 0)
          {
            if (symbolCollector.Names.Count == 0)
              return;

            symbols = symbolCollector.Names.Where(n => n.IsSymbolEvaluated).Select(n => n.Symbol).ToArray();
          }

          List<IOccurence> items = new List<IOccurence>();
          var s = nitraFile.Project.Solution;

          foreach (var p in s.Projects)
          {
            foreach (var file in p.Files)
            {

              foreach (var symbol in symbols)
              {
                var collectRefs = new CollectSymbolRefsAstVisitor(symbol);
                file.Ast.Accept(collectRefs);

                foreach (var r in collectRefs.FoundSymbols)
                {
                  var refNitraFile = r.File as XXLanguageXXFile; // TODO: add INitraReSharperFile
                  if (refNitraFile == null)
                    continue;
                  items.Add(new RangeOccurence(refNitraFile.PsiSourceFile, new DocumentRange(refNitraFile.Document, new TextRange(r.Span.StartPos, r.Span.EndPos))));
                }
              }
            }
          }

          var descriptor = new NitraOccurenceBrowserDescriptor(solution, items);
          FindResultsBrowser.ShowResults(descriptor);
        }
        nextExecute();
      }
コード例 #2
0
            public void Execute(IDataContext context, DelegateExecute nextExecute)
            {
                var solution = context.GetData(JetBrains.ProjectModel.DataContext.DataConstants.SOLUTION);

                if (solution != null)
                {
                    var documentOffset = context.GetData(JetBrains.DocumentModel.DataConstants.DOCUMENT_OFFSET);
                    if (documentOffset == null)
                    {
                        return;
                    }

                    //var psiServices = solution.GetPsiServices();
                    var psiFile = documentOffset.Document.GetPsiSourceFile(solution);
                    if (psiFile == null)
                    {
                        return;
                    }
                    var projectFile = psiFile.ToProjectFile();
                    if (projectFile == null)
                    {
                        return;
                    }
                    var project = projectFile.GetProject();
                    if (project == null)
                    {
                        return;
                    }
                    var nitraProject = _nitraSolution.GetProject(project);
                    if (nitraProject == null)
                    {
                        return;
                    }
                    var nitraFile = nitraProject.TryGetFile(projectFile);
                    if (nitraFile == null)
                    {
                        return;
                    }

                    var pos             = documentOffset.Value;
                    var symbolCollector = new CollectSymbolsAndRefsInSpanAstVisitor(new NSpan(pos));
                    nitraFile.Ast.Accept(symbolCollector);


                    var popupWindowContext = context.GetData(JetBrains.UI.DataConstants.PopupWindowContextSource);
                    if (popupWindowContext == null)
                    {
                        return;
                    }

                    var symbols = symbolCollector.Refs.Where(r => r.IsSymbolEvaluated).Select(r => r.Symbol).ToArray();

                    if (symbols.Length == 0)
                    {
                        if (symbolCollector.Names.Count == 0)
                        {
                            return;
                        }

                        symbols = symbolCollector.Names.Where(n => n.IsSymbolEvaluated).Select(n => n.Symbol).ToArray();
                    }

                    List <IOccurence> items = new List <IOccurence>();
                    var s = nitraFile.Project.Solution;

                    foreach (var p in s.Projects)
                    {
                        foreach (var file in p.Files)
                        {
                            foreach (var symbol in symbols)
                            {
                                var collectRefs = new CollectSymbolRefsAstVisitor(symbol);
                                file.Ast.Accept(collectRefs);

                                foreach (var r in collectRefs.FoundSymbols)
                                {
                                    var refNitraFile = r.File as XXLanguageXXFile; // TODO: add INitraReSharperFile
                                    if (refNitraFile == null)
                                    {
                                        continue;
                                    }
                                    items.Add(new RangeOccurence(refNitraFile.PsiSourceFile, new DocumentRange(refNitraFile.Document, new TextRange(r.Span.StartPos, r.Span.EndPos))));
                                }
                            }
                        }
                    }

                    var descriptor = new NitraOccurenceBrowserDescriptor(solution, items);
                    FindResultsBrowser.ShowResults(descriptor);
                }
                nextExecute();
            }