// Copyright (c) AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software // without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons // to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or // substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. using System; using System.Collections.Generic; using System.Linq; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem.Implementation; namespace ICSharpCode.NRefactory.CSharp.Resolver { /// /// Represents the result of a method invocation. /// public class InvocationResolveResult : MemberResolveResult { public readonly OverloadResolutionErrors OverloadResolutionErrors; public readonly IList TypeArguments; public readonly IList Arguments; /// /// Gets whether this invocation is calling an extension method using extension method syntax. /// public readonly bool IsExtensionMethodInvocation; /// /// Gets whether a params-Array is being used in its expanded form. /// public readonly bool IsExpandedForm; /// /// Gets whether this is a lifted operator invocation. /// public readonly bool IsLiftedOperatorInvocation; readonly IList argumentToParameterMap; public InvocationResolveResult(ResolveResult targetResult, OverloadResolution or, ITypeResolveContext context) : base( or.IsExtensionMethodInvocation ? null : targetResult, or.BestCandidate, GetReturnType(or, context)) { this.OverloadResolutionErrors = or.BestCandidateErrors; this.TypeArguments = or.InferredTypeArguments; this.argumentToParameterMap = or.GetArgumentToParameterMap(); this.Arguments = or.GetArgumentsWithConversions(); this.IsExtensionMethodInvocation = or.IsExtensionMethodInvocation; this.IsExpandedForm = or.BestCandidateIsExpandedForm; this.IsLiftedOperatorInvocation = or.BestCandidate is OverloadResolution.ILiftedOperator; } public InvocationResolveResult( ResolveResult targetResult, IParameterizedMember member, IType returnType, IList arguments, OverloadResolutionErrors overloadResolutionErrors = OverloadResolutionErrors.None, IList typeArguments = null, bool isExtensionMethodInvocation = false, bool isExpandedForm = false, bool isLiftedOperatorInvocation = false, IList argumentToParameterMap = null) : base(targetResult, member, returnType) { this.OverloadResolutionErrors = overloadResolutionErrors; this.TypeArguments = typeArguments ?? EmptyList.Instance; this.Arguments = arguments ?? EmptyList.Instance; this.IsExtensionMethodInvocation = isExtensionMethodInvocation; this.IsExpandedForm = isExpandedForm; this.IsLiftedOperatorInvocation = isLiftedOperatorInvocation; this.argumentToParameterMap = argumentToParameterMap; } static IType GetReturnType(OverloadResolution or, ITypeResolveContext context) { if (context == null) throw new ArgumentNullException("context"); IType returnType; if (or.BestCandidate.EntityType == EntityType.Constructor) returnType = or.BestCandidate.DeclaringType; else returnType = or.BestCandidate.ReturnType.Resolve(context); var typeArguments = or.InferredTypeArguments; if (typeArguments.Count > 0) return returnType.AcceptVisitor(new MethodTypeParameterSubstitution(typeArguments)); else return returnType; } public override bool IsError { get { return this.OverloadResolutionErrors != OverloadResolutionErrors.None; } } /// /// Gets an array that maps argument indices to parameter indices. /// For arguments that could not be mapped to any parameter, the value will be -1. /// /// parameterIndex = ArgumentToParameterMap[argumentIndex] /// public IList GetArgumentToParameterMap() { return argumentToParameterMap; } public new IParameterizedMember Member { get { return (IParameterizedMember)base.Member; } } public override IEnumerable GetChildResults() { return base.GetChildResults().Concat(this.Arguments); } } }