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)); }
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); }
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); }
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"))); } }
protected override void Analyze(IReferenceExpression referenceExpression, IHighlightingConsumer consumer, IReadOnlyCallGraphContext context) { if (PerformanceCriticalCodeStageUtil.IsCameraMainUsage(referenceExpression)) { consumer.AddHighlighting(new UnityPerformanceCameraMainWarning(referenceExpression)); } }
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); } }
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)); }
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); }
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); }
public void ProcessBeforeInterior(ITreeNode element) { IsPerformanceCriticalCodeFound = PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(element); }
protected override bool IsMarkedFast(IDeclaredElement declaredElement) => PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(declaredElement);
protected override bool IsMarkedFast(IDeclaredElement declaredElement) => PerformanceCriticalCodeStageUtil.IsInvokedElementExpensive(declaredElement as IMethod);
public override void ProcessBeforeInterior(ITreeNode element) { ProcessingIsFinished = PerformanceCriticalCodeStageUtil.IsPerformanceCriticalRootMethod(element); }