JetBrains / JetBrains/ExternalAnnotations

IENumerable<T>.All() and List<T>.All() methods incorrectly assumed to be pure

Open
#184 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Kotlin
Stars
84
Forks
46
Avg merge
6h 55m
Merged PRs (30d)
1

Description

The sample program below generates a pair of incorrect warnings on the All() method calls. In both cases it is assuming the invocation is a pure method and the line of code is actually a no-op; but the collection is modified.
```using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
BlameStackoverflowForThis();
}

static void BlameStackoverflowForThis()
{
//https://stackoverflow.com/a/6233655/85661
//the abuse of All() seen below is from the above answer

List testList = new List { new TestObject(), new TestObject(), new TestObject() };
IEnumerable testEnum = testList;

//ReSharper warning: Return value of pure method is not used
//but text is changed from null to "foo"
testEnum.All(c => { c.text = "foo"; return true; });

//ReSharper warning: Return value of pure method is not used
//but text is changed from "foo" to "bar"
//in this case testList.ForEach(c => { c.text = "bar"; }); is a
//clean way to do it, but IEnumerable doesn't have a Foreach() method
testList.All(c => { c.text = "bar"; return true; });

}
}

public class TestObject
{
public string text { get; set; }
}
}

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.