void GetRawCallOverloads(ResolutionContext ctxt, IExpression callForeExpression, out AbstractType[] baseExpression, out TemplateInstanceExpression tix) { tix = null; if (callForeExpression is PostfixExpression_Access) { var pac = (PostfixExpression_Access)callForeExpression; tix = pac.AccessExpression as TemplateInstanceExpression; baseExpression = Evaluation.EvalPostfixAccessExpression(this, ctxt, pac, null, false, false); } else { // Explicitly don't resolve the methods' return types - it'll be done after filtering to e.g. resolve template types to the deduced one var optBackup = ctxt.CurrentContext.ContextDependentOptions; ctxt.CurrentContext.ContextDependentOptions |= ResolutionOptions.DontResolveBaseTypes; if (callForeExpression is TokenExpression) { baseExpression = ExpressionTypeEvaluation.GetResolvedConstructorOverloads((TokenExpression)callForeExpression, ctxt); } else { if (callForeExpression is TemplateInstanceExpression) { baseExpression = ExpressionTypeEvaluation.GetOverloads(tix = (TemplateInstanceExpression)callForeExpression, ctxt, null, false); } else if (callForeExpression is IdentifierExpression) { baseExpression = ExpressionTypeEvaluation.GetOverloads(callForeExpression as IdentifierExpression, ctxt, deduceParameters: false); } else { baseExpression = new[] { callForeExpression != null?AbstractType.Get(callForeExpression.Accept(this)) : null } }; } ctxt.CurrentContext.ContextDependentOptions = optBackup; } }
void GetRawCallOverloads(ResolutionContext ctxt, PostfixExpression_MethodCall call, out AbstractType[] baseExpression, out ISymbolValue baseValue, out TemplateInstanceExpression tix) { baseValue = null; tix = null; if (call.PostfixForeExpression is PostfixExpression_Access) { var pac = (PostfixExpression_Access)call.PostfixForeExpression; tix = pac.AccessExpression as TemplateInstanceExpression; var vs = EvalPostfixAccessExpression(this, ctxt, pac, null, false, false); baseExpression = TypeDeclarationResolver.Convert(vs); } else { // Explicitly don't resolve the methods' return types - it'll be done after filtering to e.g. resolve template types to the deduced one var optBackup = ctxt.CurrentContext.ContextDependentOptions; ctxt.CurrentContext.ContextDependentOptions |= ResolutionOptions.DontResolveBaseTypes; if (call.PostfixForeExpression is TokenExpression) { baseExpression = ExpressionTypeEvaluation.GetResolvedConstructorOverloads((TokenExpression)call.PostfixForeExpression, ctxt); } else { var fore = call.PostfixForeExpression; if (fore is TemplateInstanceExpression) { ImplicitlyExecute = false; tix = call.PostfixForeExpression as TemplateInstanceExpression; } else if (fore is IdentifierExpression) { ImplicitlyExecute = false; } if (call.PostfixForeExpression != null) { baseValue = call.PostfixForeExpression.Accept(this) as ISymbolValue; } if (baseValue is InternalOverloadValue) { baseExpression = ((InternalOverloadValue)baseValue).Overloads; } else if (baseValue != null) { baseExpression = new[] { baseValue.RepresentedType } } ; else { baseExpression = null; } } ctxt.CurrentContext.ContextDependentOptions = optBackup; } }