Analyze implicit indexer reference operations #2839
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.
Fixes #2828
The remaining issue was lack of support for
IImplicitIndexerReferenceOperation, which represents an implicit access to an indexer that usesSystem.Index. Implicit means that there is noSystem.Indexaccessor in IL, but the compiler supportsSystem.Indexaccess via an existing indexer (for example one that takes int) for types that satisfy certain criteria. See https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges#implicit-index-support for details.This operation only showed up in the CFG with a more recent version of the Roslyn APIs, so I updated to match the one used in dotnet/runtime. This resulted in a few changes to the generated code that required tweaking some of the test validation:
<PrivateImplementationDetails>.ThrowSwitchExpressionExceptionis emitted for an implicit unhandled case in switch expressions. I added an attribute to check that this is kept in a few of the tests.