There was a problem hiding this comment.
Implementation LGTM.
The improvements seem impressive. Well done.
Are you sure that the improvements aren't due to the change I have flagged as unrelated to the purpose of this PR?
For the record: the introduction of yet another style/naming scheme for working around the quirks of abstract classes is a bit unfortunate. We now have:
Sorry, something went wrong.
|
the introduction of yet another naming scheme (...) is a bit unfortunate I agree. Which of the other ones would you like me to switch to? |
Sorry, something went wrong.
|
I like this change a lot. I also like the ::Range better than the other conventions so far, so maybe the change others to use that. Long ago I started a write-up on a canonical naming scheme here but I gave up on rolling it out after the miserable performance I saw in the string concatenation library. |
Sorry, something went wrong.
|
I also prefer the ::Range scheme, let's use that from now on, and eventually migrate the other schemes. |
Sorry, something went wrong.
|
I've rebased to resolve conflicts with the autoformatting PR. Two further minor API-related questions are perhaps worth discussing:
|
Sorry, something went wrong.
|
I think we should keep the API as is:
|
Sorry, something went wrong.
It now uses a facade pattern similar to InvokeNode: the range of the class is defined by an abstract class DataFlow::SourceNode::Range, while the actual behaviour is defined by the (no longer abstract) SourceNode class itself.
Clients that want to add new source nodes need to extend DataFlow::SourceNode::Range, those that want to refine the behaviour of existing source nodes should extend DataFlow::SourceNode itself.
While this is technically a breaking API change, I think separating the two aspects in this way is cleaner and makes it easier to use, and improves performance (internal link) as well.