Example #1
0
        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
            });
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }