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); } }
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); }
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)); } }