The logic around ``ProjectNode`` and ``FileNode`` are identical, maybe we could have an extractor merge the two.