DelegatedResolveVisitorNavigator CreateNavigator(CSharpAstResolver resolver) { var navigator = new DelegatedResolveVisitorNavigator(); navigator.Resolved += (node, res) => { Store(resolver, node, res); }; navigator.ProcessConversion += (expression, res, conversion, targetType) => { var info = (ResolveResultInfo)res.Tag; if (info == null) { info = new ResolveResultInfo(); res.Tag = info; } info.Resolver = resolver; info.ResolveResult = res; info.Conversion = conversion; info.ConversionTargetType = targetType; if (info.Conversion != null && info.ConversionTargetType != null && info.ResolveResult != null && (!(info.ResolveResult is ConversionResolveResult))) { info.ResolveResult = new ConversionResolveResult(info.ConversionTargetType, info.ResolveResult, info.Conversion); expression.RemoveAnnotations <ResolveResult>(); expression.AddAnnotation(info.ResolveResult); } }; return(navigator); }
void Store(CSharpAstResolver resolver, AstNode node, ResolveResult res) { var info = (ResolveResultInfo)res.Tag; if (info == null) { info = new ResolveResultInfo(); res.Tag = info; } info.Resolver = resolver; if (node != null) { node.AddAnnotation(res); node.AddAnnotation(info); info.Nodes.Add(node); } info.ResolveResult = res; //HACK: Reported NRefactory issue: https://github.com/icsharpcode/NRefactory/issues/367 //When AnonymousTypeCreateExpression Navigator methods not called on initializer statements if (node is AnonymousTypeCreateExpression) { var node2 = (AnonymousTypeCreateExpression)node; var res2 = res as InvocationResolveResult; if (res2 != null) { foreach (var res3 in res2.InitializerStatements) { if (res3.Tag != null) { continue; } AstNode node3 = null; if (res3 is OperatorResolveResult) { var opRes = (OperatorResolveResult)res3; node3 = opRes.Operands[0].GetFirstNode(); } Store(resolver, node3, res3); } } } }
public static void SetInfo(this ResolveResult res, ResolveResultInfo info) { res.Tag = info; }