[c#] not requiring exact match for extension methods #5248
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
In #5245, we resolved an extension method only if there was exactly one potential match, which deviates from the referenced source documentation, which states the resolution should target the first match found. However, it's not clear the order in which matches should be considered -- or, at least, I couldn't find it. Based on experimentation, it seems to prioritise the compile-time type, as can be seen in the tests involving
MyConcrete
andMyAbstract
. To this end, I relaxedtryResolveExtensionMethodInvocation
to always pick the 1st match.In doing so, also uncovered a bug in which two methods can share the same
methodFullName
. We should disambiguate e.g.DoStuff(List<string>)
fromDoStuff<T>(List<T>)
. Included an ignored test, since it's not handled here. Once these are disambiguated, we can potentially start sorting the potential matches, based on their type signatures.AST-wise, given how extension methods are
static
methods and we were already encodingx.Foo()
asFoo(x)
, it seems like no further changes are required.