sublimelsp / LSP-typescript

TypeScript, JavaScript support for Sublime LSP plugin
MIT License
135 stars 11 forks source link

LSP-Typescript started running slowly on save #133

Closed onsi closed 2 years ago

onsi commented 2 years ago

hey there, I've been humming along on my javascript project and happily using lsp-typescript. I recently started noticing a slowdown (a few seconds, sometimes triggering lsp/ST's timeout) on document save (presumably while running the various on-save codeActions). I've tried going back to an earlier version of my project and that hasn't helped. I did restart my computer recently and that might be correlated but aside from that I can't think of any changes to my setup.

When I turn LSP's logging on I see the following repeated several times in the debug panel whenever I save:

::  -> LSP-typescript textDocument/didChange: {'textDocument': {'version': 6251, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'contentChanges': [{'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'text': '', 'rangeLength': 88}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'text': '', 'rangeLength': 74}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'text': '', 'rangeLength': 101}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'text': '', 'rangeLength': 87}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'text': '', 'rangeLength': 93}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'text': '', 'rangeLength': 91}, {'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'text': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n', 'rangeLength': 95}]}
:: --> LSP-typescript textDocument/codeAction(1143): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 15, 'character': 0}}, 'context': {'only': ['source.fixAll.ts', 'source.organizeImports.ts'], 'diagnostics': []}}
:: --> LSP-typescript typescript/inlayHints(1144): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}}
:: <<< LSP-typescript 1143: [{'kind': 'source.organizeImports.ts', 'edit': {'documentChanges': [{'textDocument': {'version': 6251, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'edits': [{'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'newText': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n'}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'newText': ''}]}]}, 'title': 'Organize imports'}]
:: <<< LSP-typescript 1144: {'inlayHints': []}
::  -> LSP-typescript textDocument/didChange: {'textDocument': {'version': 6265, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'contentChanges': [{'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'text': '', 'rangeLength': 88}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'text': '', 'rangeLength': 74}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'text': '', 'rangeLength': 101}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'text': '', 'rangeLength': 87}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'text': '', 'rangeLength': 93}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'text': '', 'rangeLength': 91}, {'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'text': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n', 'rangeLength': 95}]}
:: --> LSP-typescript textDocument/codeAction(1145): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 15, 'character': 0}}, 'context': {'only': ['source.fixAll.ts', 'source.organizeImports.ts'], 'diagnostics': []}}
:: --> LSP-typescript typescript/inlayHints(1146): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}}
:: <<< LSP-typescript 1145: [{'kind': 'source.organizeImports.ts', 'edit': {'documentChanges': [{'textDocument': {'version': 6265, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'edits': [{'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'newText': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n'}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'newText': ''}]}]}, 'title': 'Organize imports'}]
:: <<< LSP-typescript 1146: {'inlayHints': []}
::  -> LSP-typescript textDocument/didChange: {'textDocument': {'version': 6279, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'contentChanges': [{'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'text': '', 'rangeLength': 88}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'text': '', 'rangeLength': 74}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'text': '', 'rangeLength': 101}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'text': '', 'rangeLength': 87}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'text': '', 'rangeLength': 93}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'text': '', 'rangeLength': 91}, {'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'text': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n', 'rangeLength': 95}]}
:: --> LSP-typescript textDocument/codeAction(1147): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 15, 'character': 0}}, 'context': {'only': ['source.fixAll.ts', 'source.organizeImports.ts'], 'diagnostics': []}}
:: --> LSP-typescript typescript/inlayHints(1148): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}}
:: <<< LSP-typescript 1147: [{'kind': 'source.organizeImports.ts', 'edit': {'documentChanges': [{'textDocument': {'version': 6279, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'edits': [{'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'newText': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n'}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'newText': ''}]}]}, 'title': 'Organize imports'}]
:: <<< LSP-typescript 1148: {'inlayHints': []}
::  -> LSP-typescript textDocument/didChange: {'textDocument': {'version': 6293, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'contentChanges': [{'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'text': '', 'rangeLength': 88}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'text': '', 'rangeLength': 74}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'text': '', 'rangeLength': 101}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'text': '', 'rangeLength': 87}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'text': '', 'rangeLength': 93}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'text': '', 'rangeLength': 81}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'text': '', 'rangeLength': 83}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'text': '', 'rangeLength': 79}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'text': '', 'rangeLength': 91}, {'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'text': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n', 'rangeLength': 95}]}
:: --> LSP-typescript textDocument/codeAction(1149): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 15, 'character': 0}}, 'context': {'only': ['source.fixAll.ts', 'source.organizeImports.ts'], 'diagnostics': []}}
:: --> LSP-typescript typescript/inlayHints(1150): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}}
:: --> LSP-typescript textDocument/formatting(1151): {'textDocument': {'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'workDoneToken': 'wd1151', 'options': {'insertSpaces': False, 'insertFinalNewline': False, 'trimFinalNewlines': False, 'trimTrailingWhitespace': False, 'tabSize': 4}}
:: <<< LSP-typescript 1149: [{'kind': 'source.organizeImports.ts', 'edit': {'documentChanges': [{'textDocument': {'version': 6293, 'uri': 'file:///Users/onsi/code/PROJECT/js/pages/pages.js'}, 'edits': [{'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 1, 'character': 0}}, 'newText': 'export { default as AdditionalInsurancePage } from \'./cfp_pages/additional_insurance_page.js\';\nexport { default as ChildcareExpensesPage } from \'./cfp_pages/childcare_expenses_page.js\';\nexport { default as DebtSourcesPage } from \'./cfp_pages/debt_sources_page.js\';\nexport { default as FamilyMembersPage } from \'./cfp_pages/family_members_page.js\';\nexport { default as FoodExpensesPage } from \'./cfp_pages/food_expenses_page.js\';\nexport { default as HealthcareExpensesPage } from \'./cfp_pages/healthcare_expenses_page.js\';\nexport { default as HousingExpensesPage } from \'./cfp_pages/housing_expenses_page.js\';\nexport { default as IncomeSourcesPage } from \'./cfp_pages/income_sources_page.js\';\nexport { default as LiquidAssetsPage } from \'./cfp_pages/liquid_assets_page.js\';\nexport { default as OtherExpensesPage } from \'./cfp_pages/other_expenses_page.js\';\nexport { default as PlanDetailsPage } from \'./cfp_pages/plan_details_page.js\';\nexport { default as TransportationExpensesPage } from \'./cfp_pages/transportation_expenses_page.js\';\nexport { default as ExplorePage } from \'./explore_pages/explore_page.js\';\nexport { CloneHydratingRouteResolver, LayoutWrappingRouteResolver } from "./layout.js";\n'}, {'range': {'start': {'line': 1, 'character': 0}, 'end': {'line': 2, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 2, 'character': 0}, 'end': {'line': 3, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 3, 'character': 0}, 'end': {'line': 4, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 4, 'character': 0}, 'end': {'line': 5, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 5, 'character': 0}, 'end': {'line': 6, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 6, 'character': 0}, 'end': {'line': 7, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 7, 'character': 0}, 'end': {'line': 8, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 8, 'character': 0}, 'end': {'line': 9, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 9, 'character': 0}, 'end': {'line': 10, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 10, 'character': 0}, 'end': {'line': 11, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 11, 'character': 0}, 'end': {'line': 12, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 12, 'character': 0}, 'end': {'line': 13, 'character': 0}}, 'newText': ''}, {'range': {'start': {'line': 13, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'newText': ''}]}]}, 'title': 'Organize imports'}]
:: <<< LSP-typescript 1150: {'inlayHints': []}
:: <<< LSP-typescript 1151: []

this repeats maybe ~300 times based on the counter. On files that don't timeout (typically smaller files) I eventually get:

::  -> LSP-typescript textDocument/didSave: {'textDocument': {'uri': 'file:///Users/onsi/code/crosspurpose/muhasib/js/pages/pages.js'}}
:: <-  LSP-typescript textDocument/publishDiagnostics: {'diagnostics': [], 'uri': 'file:///Users/onsi/code/crosspurpose/muhasib/js/pages/pages.js'}
:: --> LSP-typescript textDocument/codeAction(1152): {'textDocument': {'uri': 'file:///Users/onsi/code/crosspurpose/muhasib/js/pages/pages.js'}, 'range': {'start': {'line': 14, 'character': 0}, 'end': {'line': 14, 'character': 0}}, 'context': {'diagnostics': []}}

Any thoughts what might be causing this looping behavior? Anything I can poke at to help debug things? Any caches/whatnot I should try to clear? Any version upgrades I can try (I'm not actually sure which version of node lsp-typescript is using, I don't actually have node installed separately on my machine).

Thanks.

onsi commented 2 years ago

AndI just noticed there's a troubleshoot server command. Here's the output:

# Troubleshooting: LSP-typescript
## Version
 - LSP: 1.16.1
 - Sublime Text: 4126
## Server Test Run
 - exit code: 0
 - output
## Server Configuration
 - command
```json
[
  "${node_bin}", 
  "${server_path}", 
  "--stdio"
]

Active view

Project / Workspace

LSP configuration

{
  "clients": {
    "gopls": {
      "command": [
        "gopls"
      ], 
      "enabled": true, 
      "initializationOptions": {
        "experimentalWorkspaceModule": false
      }, 
      "selector": "source.go"
    }, 
    "pyls": {
      "command": [
        "pyls"
      ], 
      "enabled": true, 
      "languageId": "python", 
      "scopes": [
        "source.python"
      ], 
      "settings": {
        "pyls": {
          "configurationSources": [
            "pycodestyle"
          ], 
          "env": {}, 
          "plugins": {
            "jedi": {
              "extra_paths": []
            }, 
            "jedi_completion": {
              "fuzzy": true
            }, 
            "mccabe": {
              "enabled": false
            }, 
            "pycodestyle": {
              "enabled": true, 
              "exclude": [], 
              "ignore": [
                "E501", 
                "E402"
              ]
            }, 
            "pydocstyle": {
              "enabled": false
            }, 
            "pyflakes": {
              "enabled": true
            }, 
            "pylint": {
              "enabled": false
            }, 
            "pyls_mypy": {
              "enabled": false, 
              "live_mode": true
            }, 
            "yapf": {
              "enabled": true
            }
          }
        }
      }, 
      "syntaxes": [
        "Packages/Python/Python.sublime-syntax"
      ]
    }
  }, 
  "log_debug": true, 
  "log_server": [
    "panel"
  ], 
  "lsp_code_actions_on_save": {
    "source.fixAll": true, 
    "source.organizeImports": true
  }, 
  "lsp_format_on_save": true
}

System PATH

rchl commented 2 years ago

I've known this problem. It's because Typescript returns a code action for "organize imports" even if nothing is actually gonna change. And LSP will keep applying the change as long it receives one, resulting in this loop that you are seeing.

Ideally TypeScript itself would be fixed to not return the suggestion in that case. Less ideally, there could be a work-around implemented in https://github.com/typescript-language-server/typescript-language-server.

rchl commented 2 years ago

There is an issue for it already: https://github.com/microsoft/TypeScript/issues/39823

onsi commented 2 years ago

ok thanks. so sounds like turning off organize imports should help. i'll try that.

onsi commented 2 years ago

I couldn't figure out how to turn off the organize imports code action per language, but I did disable source.organizeImports in my .sublime-project file and things are fast again.

For future reference if someone comes across this issue my .sublime-project file looks like:

{
    "folders":
    [
        {
            "path": "."
        },
    ],
    "settings": {
        "lsp_format_on_save": true,
        "lsp_code_actions_on_save": {
            "source.fixAll": true,
            "source.organizeImports": false,
        },    
      },    
}

If anyone knows how to globally turn off organizeImports just for typescript/javascript please share!

rchl commented 2 years ago
"source.organizeImports": true,
"source.organizeImports.ts": false,
rchl commented 2 years ago

BTW. The server also supports more specific variants of "organizeImports" that might be enough for your use case and not have this issue - https://github.com/sublimelsp/LSP-typescript#code-actions-on-save

(I guess I meant addMissingImports)