コード例 #1
0
ファイル: LLOC.cs プロジェクト: smartshark/OpenStaticAnalyzer
 public override void VisitIdentifierName(IdentifierNameSyntax node)
 {
     if (entryNode is AnonymousFunctionExpressionSyntax && embeddedNode is AnonymousFunctionExpressionSyntax)
     {
         return;
     }
     if (_weComeFromMethod && _weInAnonymousMethod)
     {
         return;
     }
     if (node.IsParent <AnonymousObjectCreationExpressionSyntax>())
     {
         return;
     }
     InsertLLOCMap(node.GetLocation());
     base.VisitIdentifierName(node);
 }
コード例 #2
0
        /// <summary>
        ///     In this section it'll be create:
        ///     - MethodCall edge from identifier
        ///     - AttributeAccess edge from identifier
        ///     - Uses edge from identifier
        ///     These edges add to the acutal method from the MethodStack
        /// </summary>
        /// <param name="node"></param>
        public override void VisitIdentifierName(IdentifierNameSyntax node)
        {
            if (MainDeclaration.Instance.MethodStack.Count <= 0)
            {
                return;
            }
            if (node.IsParent <ParameterSyntax>( ))
            {
                return;
            }
            if (node.Identifier.Text != Constants.VAR && node.Identifier.Text != Constants.DYNAMIC)
            {
                MainDeclaration.Instance.RoslynWatch.Start( );
                var symbol = MainDeclaration.Instance.Model.GetSymbolInfo(node).Symbol;
                MainDeclaration.Instance.RoslynWatch.Stop( );
                if (symbol != null)
                {
                    switch (symbol.Kind)
                    {
                    case SymbolKind.Method:
                        if (!symbol.IsInMetadata( ) &&
                            (node.IsParent <InvocationExpressionSyntax, AssignmentExpressionSyntax>( ) ||
                             node.IsParent <InvocationExpressionSyntax, ArgumentSyntax>( )))
                        {
                            SyntaxNode dec;
                            var        methodDef = symbol.GetDefinition(out dec);
                            _crossEdgeFiller.DeclarationFiller(( CSharpSyntaxNode )dec, node);
                            if (methodDef != null && methodDef.Kind == symbol.Kind)
                            {
                                MainDeclaration.Instance.UsesStack.Peek( )
                                .Add(methodDef.ContainingType.GetLimType( ).Id);
                            }
                        }
                        break;

                    case SymbolKind.Field:
                        EdgeBuilder.CreateAttributeAccessEdge(node, symbol);
                        break;

                    case SymbolKind.Local:
                    case SymbolKind.Parameter:
                        if (node.IsParent <ParameterListSyntax>( ))
                        {
                            return;
                        }
                        if (node.Identifier.Text == Constants.VALUE)
                        {
                            return;
                        }
                        if (!symbol.IsInMetadata( ))
                        {
                            MainDeclaration.Instance.RoslynWatch.Start( );
                            var iConversaitonOpOverLoad = MainDeclaration.Instance.Model.GetConversion(node);
                            MainDeclaration.Instance.RoslynWatch.Stop( );
                            if (iConversaitonOpOverLoad.MethodSymbol != null)
                            {
                                if (iConversaitonOpOverLoad.MethodSymbol.IsInMetadata( ))
                                {
                                    EdgeBuilder.CreateMethodCallEdge(symbol.ContainingSymbol,
                                                                     iConversaitonOpOverLoad.MethodSymbol,
                                                                     MainDeclaration.Instance.LimFactory.setFiltered);
                                }
                                else
                                {
                                    SyntaxNode _tmp;
                                    var        calledSymbol = iConversaitonOpOverLoad.MethodSymbol.GetDefinition(
                                        out _tmp, true);
                                    EdgeBuilder.CreateMethodCallEdge(symbol.ContainingSymbol, calledSymbol);
                                }
                            }
                            var declaration = symbol.DeclaringSyntaxReferences[0].GetSyntax( );
                            _crossEdgeFiller.DeclarationFiller(( CSharpSyntaxNode )declaration, node);
                        }
                        break;

                    case SymbolKind.NamedType:
                        EdgeBuilder.CreateUsesEdge(node, symbol, _crossEdgeFiller);
                        break;

                    case SymbolKind.Property:
                        var parent    = node.GetParent <AnonymousObjectMemberDeclaratorSyntax>( );
                        var needToRun = true;
                        if (parent != null)
                        {
                            needToRun =
                                parent.Expression.IsEquivalentTo(node.GetParent <ExpressionStatementSyntax>( ));
                        }

                        if (needToRun)
                        {
                            EdgeBuilder.CreateMethodCallFromProperty(node, symbol, _crossEdgeFiller);
                        }
                        break;

                    default:
                        break;
                    }
                }
                EdgeBuilder.CreateMethodCallEdgeFromIdentifier(node, _crossEdgeFiller);
            }

            base.VisitIdentifierName(node);
        }