Giter Site home page Giter Site logo

Comments (8)

CyrusNajmabadi avatar CyrusNajmabadi commented on July 19, 2024

@AlexanderEgurtsovDX What changes are you trying to make in PostProcessChangesAsync? Thanks!

from roslyn.

AlexanderEgurtsovDX avatar AlexanderEgurtsovDX commented on July 19, 2024

@AlexanderEgurtsovDX What changes are you trying to make in PostProcessChangesAsync? Thanks!

@CyrusNajmabadi,
We are usually processing every changed document - getting annotated nodes and perform necessary processing, like adding necessary visibility modifiers, namespace references.

from roslyn.

CyrusNajmabadi avatar CyrusNajmabadi commented on July 19, 2024

Can you do that in the fixer itself instead of a post processing pass?

from roslyn.

AlexanderEgurtsovDX avatar AlexanderEgurtsovDX commented on July 19, 2024

Our entire logic is built on assumption that some operations are done in the post processing pass.

For example, every refactoring that adds type qualifier, also adds annotation to simplify this type(or add it's namespace part as namespace reference). There are at least 30+ such refactorings, so adding such logic inside them is not a good idea.

We can try to recreate the removed logic in our code - get all changed or added documents and post process them on our side. However, there are few disadvantages in this approach:

  • there can be unexpected side effects
  • we need to distinguish where to apply such logic(for example, VS 2019 and VS 2022 17.10 are working well) for some versions and that can also cause bugs

from roslyn.

CyrusNajmabadi avatar CyrusNajmabadi commented on July 19, 2024

The challenge here is that the prior approach was not scalable. every change would run N steps of 'cleanup', which of course would would then fork individual documents, which would then do things like causing generators to run.

THe new approach is non-extensible, and works by applying a single phase of cleanup to all changed documents at once, getting a new fork, then the entire next phase of cleanup to that fork, and so on.

This allowed cost of something like fix-all to drop from around 30 minutes on large solutions to a couple of minutes. While it was nice to allow arbitrary cleanup on a doc level, it just didn't scale, and effectively made it non-viable to do this sort of work.

--

We can try to recreate the removed logic in our code - get all changed or added documents and post process them on our side. However, there are few disadvantages in this approach:

My recommendation would be to keep the individual fixes the same. But have your compute operations function then do the final pass on them. Similarly, create your own FixAllProvider that produces an operation that does the cleanup on the entire operation as a postpass like you do today. Basically, allow the invidiaul fixes to stay the same, but wrap in a common piece of code that has the semantics you want.

from roslyn.

AlexanderEgurtsovDX avatar AlexanderEgurtsovDX commented on July 19, 2024

That's a significant breaking change and it's surprising to see it without any notifications, like deprecating the PostProcessChangesAsync first.

From my point of view, mentioned cleanup changes should be done in a separate method(new one), while still allowing the third-party extensions to apply it's own logic if required.

from roslyn.

CyrusNajmabadi avatar CyrusNajmabadi commented on July 19, 2024

Will work on getting a notification/deprecation announcement.

From my point of view, mentioned cleanup changes should be done in a separate method(new one), while still allowing the third-party extensions to apply it's own logic if required.

The issue here is that cleanup being document-based simply isn't tenable. It cannot scale, especially in a world with generators. Preferred route if custom cleanup does need to be done is to do something similar to what we did, and do all the work at once across documents. That way the cleanup can be done in parallel, and so that instead of number of forks scaling with the number of passes times the number of documents, it can scale simply with the number of passes.

from roslyn.

AlexanderEgurtsovDX avatar AlexanderEgurtsovDX commented on July 19, 2024

That is not the answer I was hoping for, but it's expected.

Thank you for sharing your thoughts on the issue and for your time!

from roslyn.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.