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