Exemplo n.º 1
0
        public static CSharpMember GetSemanticMember(this ParseTreeNode parseTreeNode, Compilation comp, SourceFile sourceFile)
        {
            Contract.Requires(parseTreeNode != null);
            Contract.Requires(comp != null);
            Contract.Requires(sourceFile != null);
            Contract.Ensures(Contract.Result <CSharpMember>() == null ||
                             Contract.Result <CSharpMember>().IsMethod ||
                             Contract.Result <CSharpMember>().IsConstructor ||
                             Contract.Result <CSharpMember>().IsProperty ||
                             Contract.Result <CSharpMember>().IsIndexer);

            // The CSharp model can throw internal exceptions at unexpected moments, so we filter them here:
            try
            {
                CSharpMember semanticMember;
                if (parseTreeNode.IsAnyMember())
                {
                    semanticMember = comp.GetMemberFromMemberDeclaration(parseTreeNode);
                    if (semanticMember == null)
                    {
                        return(null);
                    }
                    goto Success;
                }
                //Can we get our expression tree?
                var expressionTree = comp.FindExpressionTree(sourceFile, parseTreeNode);
                if (expressionTree == null)
                {
                    return(null);
                }

                //Can we get our expression?
                var expression = expressionTree.FindLeafExpression(parseTreeNode);
                if (expression == null)
                {
                    return(null);
                }

                //Can we get our semanticMember?
                semanticMember = expression.FindExpressionExplicitMember();


                if (semanticMember == null)
                {
                    MEMGRPExpression memgrpExpr = expression as MEMGRPExpression;
                    if (memgrpExpr != null)
                    {
                        var foo = memgrpExpr.OwningCall;
                        if (foo != null)
                        {
                            semanticMember = foo.mwi;
                        }
                        if (semanticMember == null && memgrpExpr.mps != null && memgrpExpr.mps.Text == "$Item$")
                        {
                            if (memgrpExpr.Object != null && memgrpExpr.Object.Type != null)
                            {
                                var type = memgrpExpr.Object.Type;
                                if (type.Members == null)
                                {
                                    goto TryNext;
                                }

                                // find indexer member
                                for (int i = 0; i < type.Members.Count; i++)
                                {
                                    var mem = type.Members[i];
                                    if (mem == null)
                                    {
                                        continue;
                                    }
                                    if (mem.IsIndexer)
                                    {
                                        semanticMember = mem;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                TryNext :;
                Success :
                //Is our semanticMember a method?
                if (semanticMember == null || !(semanticMember.IsMethod || semanticMember.IsConstructor || semanticMember.IsProperty || semanticMember.IsIndexer))
                {
                    return(null);
                }

                //Unistantiate
                semanticMember = semanticMember.Uninstantiate();

                return(semanticMember);
            }
            catch (ArgumentException)
            {
                return(null);
            }
        }