Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(language-service): [Ivy] create compiler only when program changes #39231

Closed
wants to merge 1 commit into from

Conversation

kyliau
Copy link
Contributor

@kyliau kyliau commented Oct 12, 2020

This commit fixes a bug in which a new Ivy Compiler is created every time
language service receives a new request. This is not needed if the
ts.Program has not changed.

A new class CompilerFactory is created to manage Compiler lifecycle and
keep track of template changes so that it knows when to override them.
With this change, we no longer need the method getModifiedResourceFile()
on the adapter. Instead, we call overrideComponentTemplate on the
template type checker.

This commit also changes the incremental build strategy from
PatchedIncrementalBuildStrategy to TrackedIncrementalBuildStrategy.

PR Checklist

Please check if your PR fulfills the following requirements:

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • angular.io application / infrastructure changes
  • Other... Please describe:

What is the current behavior?

Issue Number: N/A

What is the new behavior?

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

@google-cla google-cla bot added the cla: yes label Oct 12, 2020
@kyliau kyliau added area: language-service Issues related to Angular's VS Code language service design complexity: major and removed cla: yes labels Oct 12, 2020
@ngbot ngbot bot modified the milestone: needsTriage Oct 12, 2020
@google-cla google-cla bot added the cla: yes label Oct 12, 2020
@kyliau kyliau added target: major This PR is targeted for the next major release and removed cla: yes design complexity: major labels Oct 12, 2020
@google-cla google-cla bot added the cla: yes label Oct 12, 2020
Copy link
Member

@ayazhafiz ayazhafiz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Much nicer API 🎉

packages/language-service/ivy/compiler_factory.ts Outdated Show resolved Hide resolved
});

function getLastKnownProgram(ngLS: LanguageService): ts.Program {
const program = ngLS['compilerFactory']['lastKnownProgram'];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it's needed for testing, maybe we should mark compilerFactory with /** @internal */ instead of accessing the private property?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think marking it as @internal only affects the .d.ts emit, and it's actually discouraged (they removed it from TS documentation). Is this commonly used in other Angular packages?

packages/language-service/ivy/compiler_factory.ts Outdated Show resolved Hide resolved
packages/language-service/ivy/compiler_factory.ts Outdated Show resolved Hide resolved
This commit fixes a bug in which a new Ivy Compiler is created every time
language service receives a new request. This is not needed if the
`ts.Program` has not changed.

A new class `CompilerFactory` is created to manage Compiler lifecycle and
keep track of template changes so that it knows when to override them.
With this change, we no longer need the method `getModifiedResourceFile()`
on the adapter. Instead, we call `overrideComponentTemplate` on the
template type checker.

This commit also changes the incremental build strategy from
`PatchedIncrementalBuildStrategy` to `TrackedIncrementalBuildStrategy`.
@kyliau kyliau added the action: merge The PR is ready for merge by the caretaker label Oct 14, 2020
@atscott atscott closed this in 8f1317f Oct 14, 2020
@kyliau kyliau deleted the ivy-ls-next-program branch October 14, 2020 22:15
@angular-automatic-lock-bot
Copy link

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

@angular-automatic-lock-bot angular-automatic-lock-bot bot locked and limited conversation to collaborators Nov 14, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
action: merge The PR is ready for merge by the caretaker area: language-service Issues related to Angular's VS Code language service cla: yes target: major This PR is targeted for the next major release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants