public override void ProcessBeforeInterior(ITreeNode element, IHighlightingConsumer consumer)
        {
            var node = element as ICSharpTreeNode;

            if (node == null)
            {
                return;
            }

            var usageChecker = mySwa.UsageChecker;

            if (usageChecker == null)
            {
                return;
            }

            if (node is IFunctionDeclaration functionDeclaration)
            {
                var declaredElement = functionDeclaration.DeclaredElement;
                if (myLineMarkerEnabled && IsMarked(usageChecker, myPerformanceAnalyzerId, declaredElement))
                {
                    HighlightHotMethod(functionDeclaration, consumer);
                }
            }


            if (IsMarked(usageChecker, myPerformanceAnalyzerId,
                         node.GetContainingFunctionLikeDeclarationOrClosure()?.DeclaredElement))
            {
                var higlighting = PerformanceCriticalCodeStageUtil.CreateHiglighting(node);
                if (higlighting != null)
                {
                    consumer.AddHighlighting(higlighting);
                }
                else
                {
                    if (node is IInvocationExpression expression)
                    {
                        if (IsMarked(usageChecker, myExpensiveAnalyzerId,
                                     expression.Reference?.Resolve().DeclaredElement))
                        {
                            consumer.AddHighlighting(new PerformanceInvocationHighlighting(expression,
                                                                                           (expression.InvokedExpression as IReferenceExpression)?.Reference));
                        }
                    }
                }

                base.ProcessBeforeInterior(node, consumer);
            }
        }
Beispiel #2
0
        public override LocalList <IDeclaredElement> GetMarkedFunctionsFrom(ITreeNode currentNode, IDeclaredElement containingFunction)
        {
            var result = new LocalList <IDeclaredElement>();

            switch (currentNode)
            {
            case IInvocationExpression invocationExpression when PerformanceCriticalCodeStageUtil.IsInvocationExpensive(invocationExpression):
            case IReferenceExpression referenceExpression when PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression):
            case IEqualityExpression equalityExpressionParam when PerformanceCriticalCodeStageUtil.IsNullComparisonWithUnityObject(equalityExpressionParam, out _):
                result.Add(containingFunction);

                break;
            }

            return(result);
        }
Beispiel #3
0
            private void AnalyzeInvocationExpression(IInvocationExpression invocationExpressionParam, HotMethodAnalyzerContext context)
            {
                var reference = (invocationExpressionParam.InvokedExpression as IReferenceExpression)?.Reference;

                if (reference == null)
                {
                    return;
                }

                var declaredElement = reference.Resolve().DeclaredElement as IMethod;

                var containingType = declaredElement?.GetContainingType();

                if (containingType == null)
                {
                    return;
                }

                if (PerformanceCriticalCodeStageUtil.IsInvocationExpensive(invocationExpressionParam))
                {
                    context.MarkCurrentAsCostly();
                    myConsumer.AddHighlighting(new PerformanceInvocationHighlighting(invocationExpressionParam, reference));
                }
            }