public CodeMetricResult Calculate(SyntaxNode node) { var loc = _locCal.Calculate(node); var cc = _ccCal.Calculate(node); var halsteadAnalyzer = new HalsteadAnalyzer(); var halsteadMetrics = halsteadAnalyzer.Calculate(node); var mi = MaintainabilityIndexCalculator.CalculateMaintainablityIndex(cc, loc, halsteadMetrics); return(new CodeMetricResult { LineOfCode = loc, CyclomaticComplexity = cc, MaintainabilityIndex = mi }); }
private void visitMethod <T>(BaseMethodDeclarationSyntax node, VisitNode <T> visitor) where T : CSharpSyntaxNode { MainDeclaration.Instance.RoslynWatch.Start( ); var symbol = MainDeclaration.Instance.Model.GetDeclaredSymbol(node); MainDeclaration.Instance.RoslynWatch.Stop( ); HalsteadAnalyzer halsteadAnalyzer = new HalsteadAnalyzer(); var halstedMetrics = halsteadAnalyzer.Calculate(node); var limNode = SymbolBuilder.BuildDispatch <Method, IMethodSymbol>(symbol); limNode.TotalOperands = halstedMetrics.TotalOperands; limNode.TotalOperators = halstedMetrics.TotalOperators; limNode.DistinctOperands = halstedMetrics.DistinctOperands; limNode.DistinctOperators = halstedMetrics.DistinctOperators; if (symbol.OverriddenMethod != null) { if (symbol.OverriddenMethod.IsInMetadata( )) { MainDeclaration.Instance .OverrideRelations.AddOverride( ( Method )symbol.OverriddenMethod.ConvertToLimNode( ), limNode ); } else { SyntaxNode dummyNode; var asd = symbol.OverriddenMethod.GetDefinition(out dummyNode); if (asd != null && asd.Kind == symbol.OverriddenMethod.Kind) { var overriddenMethodSymbol = ( Method )asd.ConvertToLimNode( ); MainDeclaration.Instance .OverrideRelations.AddOverride( overriddenMethodSymbol, limNode ); } } } if (symbol.ContainingType.TypeKind == TypeKind.Interface) { Commons.Common.ChangeRealizationLevel(limNode); } if (symbol.PartialImplementationPart != null) { Commons.Common.ChangeRealizationLevel(limNode); var method = symbol.PartialImplementationPart.IsGenericMethod ? SymbolBuilder.BuildDispatch <MethodGeneric, IMethodSymbol>(symbol.PartialImplementationPart) : SymbolBuilder.BuildDispatch <Method, IMethodSymbol>(symbol.PartialImplementationPart); method.NumberOfBranches = 0; limNode.setDeclares(method.Id); Commons.Common.FillFromMethodStack(MainDeclaration.Instance.MethodStack.Pop( )); } if (node.Kind( ) == SyntaxKind.ConstructorDeclaration) { var init = (( ConstructorDeclarationSyntax )node).Initializer; if (init != null) { MainDeclaration.Instance.RoslynWatch.Start( ); var calleeSymbol = MainDeclaration.Instance.Model.GetSymbolInfo(init).Symbol; MainDeclaration.Instance.RoslynWatch.Stop( ); if (calleeSymbol != null) { SyntaxNode calledCtor; calleeSymbol.GetDefinition(out calledCtor); EdgeBuilder.CreateMethodCallEdge(symbol, calleeSymbol); if (calledCtor != null && calledCtor.Kind( ) == SyntaxKind.ConstructorDeclaration) { // if the called constructor doesn't exist in the code e.x.: default constructor _crossEdgeFiller.ConstructorCallFiller(( ConstructorDeclarationSyntax )calledCtor, init); } } } } MainDeclaration.Instance.LimOrigin.addCompIdCsharpIdLimIdToMap(MainDeclaration.Instance.Component.Id, _map[node], limNode.Id); node.CreateCommentNode(symbol); visitor(node as T); if (MainDeclaration.Instance.MethodStack.Count > 0) { Commons.Common.SetMetrics(node); } limNode.SetCLOC(node); }
public override void VisitAccessorDeclaration(AccessorDeclarationSyntax node) { MainDeclaration.Instance.RoslynWatch.Start( ); var symbol = MainDeclaration.Instance.Model.GetDeclaredSymbol(node); MainDeclaration.Instance.RoslynWatch.Stop( ); HalsteadAnalyzer halsteadAnalyzer = new HalsteadAnalyzer( ); var halstedMetrics = halsteadAnalyzer.Calculate(node); var nodeParent = node.GetParent <BasePropertyDeclarationSyntax>( ); _isAutoProperty = nodeParent.Kind( ) == SyntaxKind.PropertyDeclaration && IsAutoProperty(nodeParent as PropertyDeclarationSyntax, symbol.AssociatedSymbol as IPropertySymbol); var limNode = SymbolBuilder.BuildDispatch <Method, IMethodSymbol>(symbol); limNode.TotalOperands = halstedMetrics.TotalOperands; limNode.TotalOperators = halstedMetrics.TotalOperators; limNode.DistinctOperands = halstedMetrics.DistinctOperands; limNode.DistinctOperators = halstedMetrics.DistinctOperators; if (symbol.OverriddenMethod != null) { if (symbol.OverriddenMethod.IsInMetadata( )) { MainDeclaration.Instance .OverrideRelations.AddOverride( ( Method )symbol.OverriddenMethod.ConvertToLimNode( ), limNode ); } else { SyntaxNode dummyNode; var overriddenMethodDefinition = symbol.OverriddenMethod.GetDefinition(out dummyNode); if (overriddenMethodDefinition != null && overriddenMethodDefinition.Kind == symbol.OverriddenMethod.Kind) { var overriddenMethodSymbol = ( Method )overriddenMethodDefinition.ConvertToLimNode( ); MainDeclaration.Instance .OverrideRelations.AddOverride( overriddenMethodSymbol, limNode ); } } } limNode.SetCLOC(node); limNode.SetCLOC(node.Parent.Parent); if (_isAutoProperty) { CreateAttributeWithAccessEdge(nodeParent, symbol.AssociatedSymbol, limNode); } MainDeclaration.Instance.LimOrigin.addCompIdCsharpIdLimIdToMap(MainDeclaration.Instance.Component.Id, _map[node], limNode.Id); node.CreateCommentNode(symbol); node.Parent.Parent.CreateCommentNode(symbol); base.VisitAccessorDeclaration(node); if (MainDeclaration.Instance.MethodStack.Count > 0) { Commons.Common.SetMetrics(node); } }