Esempio n. 1
0
        // Returns a symbol table for all items. Used to resolve references and provide completion
        public ISymbolTable GetSymbolTable()
        {
            var elements = Map.Select(i =>
            {
                if (!myDeclaredElements.ContainsKey(i.Key))
                {
                    lock (this)
                    {
                        if (!myDeclaredElements.ContainsKey(i.Key))
                        {
                            var element = new AsmDefNameDeclaredElement(mySolution.GetComponent <JavaScriptServices>(),
                                                                        i.Value.Name, i.Key, i.Value.DeclarationOffset);
                            myDeclaredElements.Add(i.Key, element);
                            return(element);
                        }
                    }
                }
                return(myDeclaredElements[i.Key]);
            }).ToList();

            if (elements.IsEmpty())
            {
                return(EmptySymbolTable.INSTANCE);
            }
            var psiServices = elements.First().GetPsiServices();

            return(new DeclaredElementsSymbolTable <IDeclaredElement>(psiServices, elements));
        }
        public override void Rename(IRenameRefactoring executer, IProgressIndicator pi, bool hasConflictsWithDeclarations,
                                    IRefactoringDriver driver)
        {
            // Rename the "declaration"
            var declaredElement  = myPointer.FindDeclaredElement();
            var originalTreeNode = declaredElement?.GetTreeNode();

            if (originalTreeNode == null)
            {
                return;
            }

            var originalRange     = originalTreeNode.GetDocumentRange();
            var factory           = JavaScriptElementFactory.GetInstance(originalTreeNode);
            var literalExpression = factory.CreateExpression("\"$0\"", NewName);
            var newExpression     = originalTreeNode.ReplaceBy(literalExpression);

            RemoveFromTextualOccurrences(executer, originalRange);

            var references = executer.Workflow.GetElementReferences(declaredElement);

            if (!Enumerable.Any(references))
            {
                return;
            }

            pi.Start(references.Count);

            // Create a new declared element (other implementations don't appear to cache this, either)
            var element = new AsmDefNameDeclaredElement(declaredElement.GetJsServices(), NewName,
                                                        declaredElement.SourceFile, newExpression.GetTreeStartOffset().Offset);

            // Rename/bind the references
            foreach (var pair in LanguageUtil.SortReferences(references.Where(r => r.IsValid())))
            {
                foreach (var sortedReference in LanguageUtil.GetSortedReferences(pair.Value))
                {
                    InterruptableActivityCookie.CheckAndThrow(pi);

                    var referenceRange = sortedReference.GetDocumentRange();

                    if (sortedReference.IsValid())
                    {
                        sortedReference.BindTo(element);
                    }

                    RemoveFromTextualOccurrences(executer, referenceRange);

                    pi.Advance();
                }
            }

            element.GetPsiServices().Caches.Update();
            myNewPointer = element.CreateElementPointer();
        }
 public AsmDefNameAtomicRename(AsmDefNameDeclaredElement declaredElement, string newName)
 {
     myPointer = declaredElement.CreateElementPointer();
     NewName   = newName;
     OldName   = declaredElement.ShortName;
 }