示例#1
0
        private void HighlightDeclaration(IDeclaration declaration, HighlightingsConsumer consumer)
        {
            var nameDocumentRange = declaration.GetNameDocumentRange();

            if (nameDocumentRange.IsValid())
            {
                consumer.ConsumeHighlighting(HIGHLIGHTING_ID, nameDocumentRange);
            }
        }
示例#2
0
 private void HighlightDeclarationsInFile(IDeclaredElement declaredElement, IPsiView psiView,
                                          HighlightingsConsumer consumer)
 {
     foreach (var psiSourceFile in psiView.SortedSourceFiles)
     {
         foreach (var declaration in declaredElement.GetDeclarationsIn(psiSourceFile))
         {
             HighlightDeclaration(declaration, consumer);
         }
     }
 }
示例#3
0
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView,
                                                     HighlightingsConsumer consumer)
        {
            var psiView  = psiDocumentRangeView.View <FSharpLanguage>();
            var document = psiDocumentRangeView.DocumentRangeFromMainDocument.Document;
            var token    = psiView.GetSelectedTreeNode <FSharpIdentifierToken>();

            if (token == null)
            {
                var wildPat = psiView.GetSelectedTreeNode <IWildPat>();
                if (wildPat != null)
                {
                    consumer.ConsumeHighlighting(HighlightingId, wildPat.GetDocumentRange());
                }

                return;
            }

            // todo: type parameters: t<$caret$type> or t<'$caret$ttype>

            var fsFile     = psiView.GetSelectedTreeNode <IFSharpFile>();
            var sourceFile = fsFile?.GetSourceFile();

            if (sourceFile == null)
            {
                return;
            }

            var symbol = fsFile.GetSymbol(token.GetTreeStartOffset().Offset);

            if (symbol == null)
            {
                return;
            }

            var checkResults =
                fsFile.CheckerService.TryGetStaleCheckResults(sourceFile, OpName)?.Value ??
                fsFile.GetParseAndCheckResults(true, OpName)?.Value.CheckResults;

            var ranges = new HashSet <DocumentRange>();

            AddUsagesRanges(symbol, ranges, checkResults, document, fsFile);

            if (symbol is FSharpMemberOrFunctionOrValue mfv && mfv.IsConstructor &&
                mfv.DeclaringEntity?.Value is FSharpEntity entity)
            {
                AddUsagesRanges(entity, ranges, checkResults, document, fsFile);
            }

            foreach (var range in ranges)
            {
                consumer.ConsumeHighlighting(HighlightingId, range);
            }
        }
        protected override void CollectHighlightings(
            IPsiDocumentRangeView psiDocumentRangeView,
            HighlightingsConsumer consumer)
        {
            var psiView          = psiDocumentRangeView.View <CSharpLanguage>();
            var selectedArgument = psiView.GetSelectedTreeNode <ICSharpArgument>();

            if (selectedArgument == null)
            {
                return;
            }

            var invocationExpressions = psiView.ContainingNodes <IInvocationExpression>();

            foreach (var invocationExpression in invocationExpressions)
            {
                var templateArgument = invocationExpression.GetTemplateArgument();
                if (templateArgument == null)
                {
                    continue;
                }

                if (templateArgument.IndexOf() > selectedArgument.IndexOf())
                {
                    continue;
                }

                var templateString = templateArgument.TryGetTemplateText();
                if (templateString == null)
                {
                    continue;
                }

                var messageTemplate = _messageTemplate.Parse(templateString);
                if (selectedArgument == templateArgument)
                {
                    HighlightByNamedPlaceholder(
                        consumer,
                        psiView,
                        templateArgument,
                        messageTemplate,
                        invocationExpression.ArgumentList.Arguments);
                }
                else
                {
                    HighlightByArgument(consumer, selectedArgument, templateArgument, messageTemplate);
                }
            }
        }
示例#5
0
        protected override void CollectHighlightings(
            IPsiDocumentRangeView psiDocumentRangeView,
            HighlightingsConsumer consumer)
        {
            var psiView          = psiDocumentRangeView.View <CSharpLanguage>();
            var selectedArgument = psiView.GetSelectedTreeNode <ICSharpArgument>();

            if (selectedArgument == null)
            {
                return;
            }

            var invocationExpression = psiView.GetSelectedTreeNode <IInvocationExpression>();
            var templateArgument     = invocationExpression?.GetTemplateArgument();

            if (templateArgument == null)
            {
                return;
            }

            if (templateArgument.IndexOf() > selectedArgument.IndexOf())
            {
                return;
            }

            var templateString = StringLiteralAltererUtil.TryCreateStringLiteralByExpression(templateArgument.Value)
                                 ?.Expression.GetUnquotedText();

            if (templateString == null)
            {
                return;
            }

            var messageTemplate = _messageTemplate.Parse(templateString);

            if (selectedArgument == templateArgument)
            {
                HighlightByNamedPlaceholder(
                    consumer,
                    psiView,
                    templateArgument,
                    messageTemplate,
                    invocationExpression.ArgumentList.Arguments);
            }
            else
            {
                HighlightByArgument(consumer, selectedArgument, templateArgument, messageTemplate);
            }
        }
        public override Action GetDataProcessAction(
            HighlightingProlongedLifetime prolongedLifetime,
            IPsiDocumentRangeView psiDocumentRangeView)
        {
            var consumer = new HighlightingsConsumer();

            CollectHighlightings(psiDocumentRangeView, consumer);
            return(() =>
            {
                foreach (var highlightInfo in consumer.HighlightInfos)
                {
                    CaretDependentFeaturesUtil.HighlightForLifetime(prolongedLifetime.Lifetime, highlightInfo);
                }
            });
        }
        private static void HighlightByArgument(
            HighlightingsConsumer consumer,
            ICSharpArgument selectedArgument,
            ICSharpArgument templateArgument,
            MessageTemplate messageTemplate)
        {
            var argumentIndex        = selectedArgument.IndexOf() - templateArgument.IndexOf() - 1;
            var namedProperties      = messageTemplate.NamedProperties;
            var positionalProperties = messageTemplate.PositionalProperties;

            if (namedProperties != null && argumentIndex < namedProperties.Length)
            {
                var property = namedProperties[argumentIndex];
                consumer.ConsumeHighlighting(
                    GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                    templateArgument.GetTokenInformation(property).DocumentRange);
            }
            else if (positionalProperties != null)
            {
                foreach (var property in positionalProperties)
                {
                    if (!property.TryGetPositionalValue(out int position))
                    {
                        continue;
                    }

                    if (position != argumentIndex)
                    {
                        continue;
                    }

                    consumer.ConsumeHighlighting(
                        GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                        templateArgument.GetTokenInformation(property).DocumentRange);
                }
            }

            consumer.ConsumeHighlighting(
                GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                selectedArgument.GetDocumentRange());
        }
示例#8
0
        private void HighlightReferencesInFile(IDeclaredElement declaredElement,
                                               IPsiDocumentRangeView psiDocumentRangeView, HighlightingsConsumer consumer)
        {
            var searchDomain  = SearchDomainFactory.Instance.CreateSearchDomain(psiDocumentRangeView.SortedSourceFiles);
            var elements      = new[] { new DeclaredElementInstance(declaredElement) };
            var searchRequest = new SearchSingleFileDeclaredElementRequest(elements, elements, searchDomain);

            foreach (var occurrence in searchRequest.Search(NullProgressIndicator.Create()))
            {
                if (!(occurrence is ReferenceOccurrence referenceOccurrence))
                {
                    continue;
                }

                var primaryReference = referenceOccurrence.PrimaryReference;
                if (primaryReference == null)
                {
                    continue;
                }

                var documentRange = primaryReference.GetDocumentRange();
                consumer.ConsumeHighlighting(HIGHLIGHTING_ID, documentRange);
            }
        }
        private static void HighlightByNamedPlaceholder(
            HighlightingsConsumer consumer,
            IPsiView psiView,
            ICSharpArgument templateArgument,
            MessageTemplate messageTemplate,
            TreeNodeCollection <ICSharpArgument> arguments)
        {
            if (messageTemplate.NamedProperties != null)
            {
                var(selectedToken, index) = GetSelectedToken(psiView, templateArgument, messageTemplate.NamedProperties);
                if (selectedToken == null)
                {
                    return;
                }

                var argumentIndex = templateArgument.IndexOf() + index + 1;
                if (arguments.Count <= argumentIndex)
                {
                    return;
                }

                consumer.ConsumeHighlighting(
                    GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                    templateArgument.GetTokenInformation(selectedToken).DocumentRange);
                consumer.ConsumeHighlighting(
                    GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                    arguments[argumentIndex].GetDocumentRange());
            }
            else if (messageTemplate.PositionalProperties != null)
            {
                var(selectedToken, _) = GetSelectedToken(psiView, templateArgument, messageTemplate.PositionalProperties);
                if (selectedToken == null)
                {
                    return;
                }

                if (!selectedToken.TryGetPositionalValue(out int position))
                {
                    return;
                }

                foreach (var property in messageTemplate.PositionalProperties)
                {
                    if (!property.TryGetPositionalValue(out int propertyPosition))
                    {
                        continue;
                    }

                    if (propertyPosition != position)
                    {
                        continue;
                    }

                    consumer.ConsumeHighlighting(
                        GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                        templateArgument.GetTokenInformation(property).DocumentRange);
                }

                var argumentIndex = templateArgument.IndexOf() + position + 1;
                if (arguments.Count <= argumentIndex)
                {
                    return;
                }

                consumer.ConsumeHighlighting(
                    GeneralHighlightingAttributeIds.USAGE_OF_ELEMENT_UNDER_CURSOR,
                    arguments[argumentIndex].GetDocumentRange());
            }
        }
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView, HighlightingsConsumer consumer)
        {
            var view = psiDocumentRangeView.View <CSharpLanguage>();
            var node = view.GetSelectedTreeNode <IFunctionDeclaration>();

            if (node == null)
            {
                return;
            }

            var solution = psiDocumentRangeView.Solution;
            var swa      = solution.GetComponent <SolutionAnalysisService>();

            if (!UnityCallGraphUtil.IsSweaCompleted(swa))
            {
                return;
            }

            var contextProvider = solution.GetComponent <PerformanceCriticalContextProvider>();
            var settingsStore   = psiDocumentRangeView.GetSettingsStore();

            if (contextProvider.IsContextAvailable == false)
            {
                return;
            }

            if (settingsStore.GetValue((UnitySettings key) => key.PerformanceHighlightingMode) !=
                PerformanceHighlightingMode.CurrentMethod)
            {
                return;
            }

            var kind = UnityCallGraphUtil.GetProcessKindForGraph(swa);

            if (contextProvider.HasContext(node, kind))
            {
                consumer.ConsumeHighlighting(new UnityPerformanceContextHighlightInfo(node.GetDocumentRange()));
            }
        }
示例#11
0
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView, HighlightingsConsumer consumer)
        {
            var settingsStore = psiDocumentRangeView.GetSettingsStore();

            if (!settingsStore.GetValue((UnitySettings key) => key.EnablePerformanceCriticalCodeHighlighting))
            {
                return;
            }

            if (settingsStore.GetValue((UnitySettings key) => key.PerformanceHighlightingMode) != PerformanceHighlightingMode.CurrentMethod)
            {
                return;
            }

            var view = psiDocumentRangeView.View <CSharpLanguage>();
            var node = view.GetSelectedTreeNode <IFunctionDeclaration>();

            if (node != null)
            {
                var declaredElement = node.DeclaredElement;
                if (declaredElement == null)
                {
                    return;
                }

                var solution           = psiDocumentRangeView.Solution;
                var swa                = solution.GetComponent <SolutionAnalysisService>();
                var callGraphExtension = solution.GetComponent <CallGraphSwaExtensionProvider>();
                var callGraphAnalyzer  = solution.GetComponent <PerformanceCriticalCodeCallGraphMarksProvider>();
                var elementIdProvider  = solution.GetComponent <IElementIdProvider>();
                var usageChecker       = swa.UsageChecker;
                if (usageChecker == null)
                {
                    return;
                }
                var elementId = elementIdProvider.GetElementId(declaredElement);
                if (!elementId.HasValue)
                {
                    return;
                }

                if (callGraphExtension.IsMarkedByCallGraphRootMarksProvider(callGraphAnalyzer.Id, false, elementId.Value))
                {
                    consumer.ConsumeHighlighting(new UnityPerformanceContextHighlightInfo(node.GetDocumentRange()));
                }
            }
        }
示例#12
0
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView,
                                                     HighlightingsConsumer consumer)
        {
            var psiView = psiDocumentRangeView.View <FSharpLanguage>();
            var fsFile  = psiView.GetSelectedTreeNode <IFSharpFile>();

            if (fsFile == null)
            {
                return;
            }

            var document = psiDocumentRangeView.DocumentRangeFromMainDocument.Document;
            var token    = psiView.GetSelectedTreeNode <FSharpIdentifierToken>();

            if (token == null)
            {
                return;
            }

            // todo: type parameters: t<$caret$type> or t<'$caret$ttype>
            // todo: namespaces, use R# search?

            var offset = token.GetTreeStartOffset().Offset;
            var symbol = fsFile.GetSymbolDeclaration(offset) ?? fsFile.GetSymbolUse(offset);

            if (symbol == null)
            {
                return;
            }

            var sourceFile = fsFile.GetSourceFile();

            if (sourceFile == null)
            {
                return;
            }

            var checkResults =
                fsFile.CheckerService.TryGetStaleCheckResults(sourceFile)?.Value ??
                fsFile.GetParseAndCheckResults(true)?.Value.CheckResults;

            var symbolUsages = checkResults?.GetUsesOfSymbolInFile(symbol).RunAsTask();

            foreach (var symbolUse in symbolUsages ?? EmptyArray <FSharpSymbolUse> .Instance)
            {
                var treeOffset = document.GetTreeEndOffset(symbolUse.RangeAlternate);
                var usageToken = fsFile.FindTokenAt(treeOffset - 1) as FSharpIdentifierToken;
                if (usageToken == null)
                {
                    continue;
                }

                var tokenType = usageToken.GetTokenType();
                if ((tokenType == FSharpTokenType.GREATER || tokenType == FSharpTokenType.GREATER_RBRACK) &&
                    !(symbol is FSharpMemberOrFunctionOrValue mfv &&
                      mfv.CompiledName.Equals("op_GreaterThan", StringComparison.Ordinal)))
                {
                    continue; // found usage of generic symbol with specified type parameter
                }
                consumer.ConsumeHighlighting(HighlightingId, usageToken.GetDocumentRange());
            }
        }
示例#13
0
        private void HighlightDeclarationsInFile(IDeclaredElement declaredElement, IPsiView psiView, HighlightingsConsumer consumer)
        {
            // There are no IDeclarations for this declared element, try and find the associated string literal expression
            var asmdefNameDeclaredElement = declaredElement as AsmDefNameDeclaredElement;

            if (asmdefNameDeclaredElement == null)
            {
                return;
            }

            foreach (var psiSourceFile in psiView.SortedSourceFiles)
            {
                if (psiSourceFile != asmdefNameDeclaredElement.SourceFile)
                {
                    continue;
                }

                var primaryPsiFile = psiSourceFile.GetPrimaryPsiFile();
                var node           = primaryPsiFile?.FindNodeAt(TreeTextRange.FromLength(
                                                                    new TreeOffset(asmdefNameDeclaredElement.DeclarationOffset),
                                                                    asmdefNameDeclaredElement.ShortName.Length));
                var literalExpression = node?.GetContainingNode <IJavaScriptLiteralExpression>();
                if (literalExpression != null)
                {
                    HighlightFoundDeclaration(literalExpression, consumer);
                }
            }
        }
示例#14
0
 protected abstract void HighlightFoundDeclaration(TLiteralNode node, HighlightingsConsumer consumer);
示例#15
0
        protected override void HighlightFoundDeclaration(IJavaScriptLiteralExpression literalExpression, HighlightingsConsumer consumer)
        {
            var range = literalExpression.GetUnquotedDocumentRange();

            if (range.IsValid())
            {
                consumer.ConsumeHighlighting(HIGHLIGHTING_ID, range);
            }
        }
示例#16
0
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView, HighlightingsConsumer consumer)
        {
            if (myLiteralExpressionUnderCaret != null)
            {
                HighlightFoundDeclaration(myLiteralExpressionUnderCaret, consumer);
            }
            else
            {
                var psiView = psiDocumentRangeView.View <JsonLanguage>(PsiLanguageCategories.Dominant);
                HighlightDeclarationsInFile(myDeclaredElement, psiView, consumer);
            }

            HighlightReferencesInFile(myDeclaredElement, psiDocumentRangeView, consumer);
        }
        protected override void CollectHighlightings(IPsiDocumentRangeView psiDocumentRangeView, HighlightingsConsumer consumer)
        {
            var view = psiDocumentRangeView.View <CSharpLanguage>();
            var node = view.GetSelectedTreeNode <IFunctionDeclaration>();

            if (node == null)
            {
                return;
            }

            var solution      = psiDocumentRangeView.Solution;
            var settingsStore = psiDocumentRangeView.GetSettingsStore();

            if (settingsStore.GetValue((UnitySettings key) => key.PerformanceHighlightingMode) !=
                PerformanceHighlightingMode.CurrentMethod)
            {
                return;
            }

            var contextProvider = solution.GetComponent <PerformanceCriticalContextProvider>();
            var swea            = solution.GetComponent <SolutionAnalysisService>();
            var declaredElement = node.DeclaredElement;

            if (contextProvider.IsMarkedSweaDependent(declaredElement, swea))
            {
                consumer.ConsumeHighlighting(new UnityPerformanceContextHighlightInfo(node.GetDocumentRange()));
            }
        }