private bool IsPerformanceCriticalDeclaration(ITreeNode element)
        {
            if (!(element is ICSharpDeclaration declaration))
            {
                return(false);
            }

            var declaredElement = declaration.DeclaredElement;

            if (declaredElement == null)
            {
                return(false);
            }

            if (myProcessKind == DaemonProcessKind.GLOBAL_WARNINGS)
            {
                var id = myProvider.GetElementId(declaredElement);
                if (!id.HasValue)
                {
                    return(false);
                }

                return(myCallGraphSwaExtensionProvider.IsMarkedByCallGraphAnalyzer(
                           myPerformanceCriticalCodeCallGraphMarksProvider.Id,
                           true, id.Value));
            }

            return(PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(myAPI, declaration));
        }
Exemplo n.º 2
0
        public override LocalList <IDeclaredElement> GetMarkedFunctionsFrom(ITreeNode currentNode, IDeclaredElement containingFunction)
        {
            var result = new LocalList <IDeclaredElement>();

            if (currentNode is IMethodDeclaration methodDeclaration)
            {
                if (PerformanceCriticalCodeStageUtil.HasFrequentlyCalledMethodAttribute(methodDeclaration))
                {
                    result.Add(containingFunction);
                }
                else
                if (ourKnownHotMonoBehaviourMethods.Contains(methodDeclaration.DeclaredName))
                {
                    var containingTypeDeclaration = methodDeclaration.GetContainingTypeDeclaration()?.DeclaredElement;

                    if (myUnityApi.IsDescendantOfMonoBehaviour(containingTypeDeclaration))
                    {
                        result.Add(containingFunction);
                    }
                }
            }


            var coroutineOrInvoke = ExtractCoroutineOrInvokeRepeating(currentNode);

            if (coroutineOrInvoke != null)
            {
                result.Add(coroutineOrInvoke);
            }

            return(result);
        }
Exemplo n.º 3
0
        protected override void Analyze(IInvocationExpression expression, IDaemonProcess daemonProcess, DaemonProcessKind kind,
                                        IHighlightingConsumer consumer)
        {
            if (PerformanceCriticalCodeStageUtil.IsInvocationExpensive(expression))
            {
                CreateHiglighting(expression, consumer);
            }
            else if (kind == DaemonProcessKind.GLOBAL_WARNINGS)
            {
                var declaredElement = expression.Reference.Resolve().DeclaredElement;
                if (declaredElement == null)
                {
                    return;
                }

                var id = myProvider.GetElementId(declaredElement);
                if (!id.HasValue)
                {
                    return;
                }

                if (mySwaExtensionProvider.IsMarkedByCallGraphAnalyzer(myExpensiveCodeCallGraphAnalyzer.Id, true, id.Value))
                {
                    CreateHiglighting(expression, consumer);
                }
            }
        }
        public override LocalList <IDeclaredElement> GetRootMarksFromNode(ITreeNode currentNode,
                                                                          IDeclaredElement containingFunction)
        {
            var result            = new LocalList <IDeclaredElement>();
            var coroutineOrInvoke = ExtractCoroutineOrInvokeRepeating(currentNode);

            if (coroutineOrInvoke != null)
            {
                result.Add(coroutineOrInvoke);
            }

            // it means we are in functional type member like methodDeclaration
            if (containingFunction == null)
            {
                return(result);
            }

            var functionDeclaration = currentNode as IFunctionDeclaration;
            var hasComment          = UnityCallGraphUtil.HasAnalysisComment(functionDeclaration, MarkId, ReSharperControlConstruct.Kind.Restore);

            if (hasComment)
            {
                result.Add(functionDeclaration.DeclaredElement);
            }

            var declaration = currentNode as ITypeMemberDeclaration;
            var typeMember  = declaration?.DeclaredElement;

            if (PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(typeMember))
            {
                result.Add(typeMember);
            }

            return(result);
        }
        public override LocalList <IDeclaredElement> GetRootMarksFromNode(ITreeNode currentNode,
                                                                          IDeclaredElement containingFunction)
        {
            var result            = base.GetRootMarksFromNode(currentNode, containingFunction);
            var coroutineOrInvoke = ExtractCoroutineOrInvokeRepeating(currentNode);

            if (coroutineOrInvoke != null)
            {
                result.Add(coroutineOrInvoke);
            }

            // it means we are in functional type member like methodDeclaration
            if (containingFunction == null)
            {
                return(result);
            }

            var declaration = currentNode as ITypeMemberDeclaration;
            var typeMember  = declaration?.DeclaredElement;

            if (PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(typeMember))
            {
                result.Add(typeMember);
            }

            return(result);
        }
Exemplo n.º 6
0
 protected override void Analyze(IReferenceExpression referenceExpression, IDaemonProcess daemonProcess, DaemonProcessKind kind,
                                 IHighlightingConsumer consumer)
 {
     if (PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression))
     {
         consumer.AddHighlighting(new UnityPerformanceCameraMainWarning(referenceExpression));
     }
 }
 protected override void Analyze(IEqualityExpression equalityExpression,
                                 IHighlightingConsumer consumer, IReadOnlyCallGraphContext context)
 {
     if (PerformanceCriticalCodeStageUtil.IsNullComparisonWithUnityObject(equalityExpression, out var name))
     {
         consumer.AddHighlighting(new UnityPerformanceNullComparisonWarning(equalityExpression, name, equalityExpression.Reference.NotNull("eqaulityReference != null")));
     }
 }
 protected override void Analyze(IEqualityExpression equalityExpression, IDaemonProcess daemonProcess, DaemonProcessKind kind,
                                 IHighlightingConsumer consumer)
 {
     if (PerformanceCriticalCodeStageUtil.IsNullComparisonWithUnityObject(equalityExpression, out var name))
     {
         consumer.AddHighlighting(new UnityPerformanceNullComparisonWarning(equalityExpression, name, equalityExpression.Reference.NotNull("eqaulityReference != null")));
     }
 }
Exemplo n.º 9
0
 protected override void Analyze(IReferenceExpression referenceExpression,
                                 IHighlightingConsumer consumer, IReadOnlyCallGraphContext context)
 {
     if (PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression))
     {
         consumer.AddHighlighting(new UnityPerformanceCameraMainWarning(referenceExpression));
     }
 }
Exemplo n.º 10
0
        protected override void Analyze(IInvocationExpression expression, IHighlightingConsumer consumer, IReadOnlyCallGraphContext context)
        {
            var callee = CallGraphUtil.GetCallee(expression);

            if (PerformanceCriticalCodeStageUtil.IsInvokedElementExpensive(callee as IMethod) || myContextProvider.IsMarkedStage(callee, context))
            {
                CreateHighlighting(expression, consumer);
            }
        }
Exemplo n.º 11
0
        public bool IsAvailable(IUserDataHolder cache)
        {
            var methodDeclaration = myMethodDeclaration;

            if (methodDeclaration == null)
            {
                return(false);
            }

            var declaredElement = methodDeclaration.DeclaredElement;

            return(declaredElement != null && methodDeclaration.IsValid() &&
                   !PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(methodDeclaration));
        }
Exemplo n.º 12
0
 public override void ProcessBeforeInterior(ITreeNode element)
 {
     switch (element)
     {
     case IInvocationExpression invocationExpression when
         PerformanceCriticalCodeStageUtil.IsInvocationExpensive(invocationExpression):
     case IReferenceExpression referenceExpression when
         PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression):
     {
         ProcessingIsFinished = true;
         break;
     }
     }
 }
        public static bool IsAvailable([CanBeNull] IMethodDeclaration methodDeclaration)
        {
            if (methodDeclaration == null)
            {
                return(false);
            }

            methodDeclaration.GetPsiServices().Locks.AssertReadAccessAllowed();

            var declaredElement = methodDeclaration.DeclaredElement;

            return(declaredElement != null && methodDeclaration.IsValid() &&
                   !PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(methodDeclaration));
        }
        public bool IsAvailable(IUserDataHolder cache)
        {
            var identifier        = myDataProvider.GetSelectedElement <ITreeNode>() as ICSharpIdentifier;
            var methodDeclaration = MethodDeclarationNavigator.GetByNameIdentifier(identifier);

            if (methodDeclaration == null)
            {
                return(false);
            }

            var declaredElement = methodDeclaration.DeclaredElement;

            return(declaredElement != null && methodDeclaration.IsValid() &&
                   !PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(methodDeclaration));
        }
        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 IAttributesOwner attributesOwner when PerformanceCriticalCodeStageUtil.HasPerformanceSensitiveAttribute(attributesOwner):
                result.Add(containingFunction);

                break;
            }

            return(result);
        }
Exemplo n.º 16
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 _):
            case IFunctionDeclaration functionDeclaration when PerformanceCriticalCodeStageUtil.HasPerformanceSensitiveAttribute(functionDeclaration):
                result.Add(containingFunction);

                break;
            }

            return(result);
        }
 public void ProcessBeforeInterior(ITreeNode element)
 {
     switch (element)
     {
     case IInvocationExpression invocationExpression when
         PerformanceCriticalCodeStageUtil.IsInvocationExpensive(invocationExpression):
     case IReferenceExpression referenceExpression when
         PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression):
     case IAttributesOwnerDeclaration attributesOwnerDeclaration when
         attributesOwnerDeclaration.DeclaredElement is IAttributesOwner attributesOwner &&
         PerformanceCriticalCodeStageUtil.HasPerformanceSensitiveAttribute(attributesOwner):
     {
         IsExpensiveCodeFound = true;
         break;
     }
     }
 }
        public override LocalList <IDeclaredElement> GetMarkedFunctionsFrom(ITreeNode currentNode, IDeclaredElement containingFunction)
        {
            var result = new LocalList <IDeclaredElement>();

            if (PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(myUnityApi, currentNode))
            {
                result.Add(containingFunction);
            }

            var coroutineOrInvoke = ExtractCoroutineOrInvokeRepeating(currentNode);

            if (coroutineOrInvoke != null)
            {
                result.Add(coroutineOrInvoke);
            }

            return(result);
        }
Exemplo n.º 19
0
 public void ProcessBeforeInterior(ITreeNode element)
 {
     IsPerformanceCriticalCodeFound =
         PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(element);
 }
Exemplo n.º 20
0
 protected override bool IsMarkedFast(IDeclaredElement declaredElement) =>
 PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(declaredElement);
 protected override bool IsMarkedFast(IDeclaredElement declaredElement) =>
 PerformanceCriticalCodeStageUtil.IsInvokedElementExpensive(declaredElement as IMethod);
Exemplo n.º 22
0
 public override void ProcessBeforeInterior(ITreeNode element)
 {
     ProcessingIsFinished = PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(element);
 }