sublimelsp / LSP-typescript

TypeScript, JavaScript support for Sublime LSP plugin

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LSP-Typescript started running slowly on save

onsi opened this issue · comments

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.

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"
]
  • shell command
"/Users/onsi/Library/Caches/Sublime Text/Package Storage/lsp_utils/node-runtime/16.2.0/node/bin/node" "/Users/onsi/Library/Caches/Sublime Text/Package Storage/LSP-typescript/16.2.0/typescript-language-server/node_modules/typescript-language-server/lib/cli.js" --stdio
  • selector
source.js, source.jsx, source.ts, source.tsx
  • priority_selector
source.js, source.jsx, source.ts, source.tsx
  • init_options
{
  "logVerbosity": "off", 
  "maxTsServerMemory": 0, 
  "npmLocation": "", 
  "plugins": [], 
  "preferences": {
    "allowIncompleteCompletions": true, 
    "allowRenameOfImportPath": true, 
    "allowTextChangesInNewFiles": true, 
    "displayPartsForJSDoc": true, 
    "generateReturnInDocTemplate": true, 
    "includeAutomaticOptionalChainCompletions": true, 
    "includeCompletionsForImportStatements": true, 
    "includeCompletionsForModuleExports": true, 
    "includeCompletionsWithClassMemberSnippets": true, 
    "includeCompletionsWithInsertText": true, 
    "includeCompletionsWithSnippetText": true, 
    "jsxAttributeCompletionStyle": "auto"
  }
}
  • settings
{
  "diagnostics": {
    "ignoredCodes": []
  }, 
  "javascript": {
    "format": {
      "insertSpaceAfterCommaDelimiter": true, 
      "insertSpaceAfterConstructor": false, 
      "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true, 
      "insertSpaceAfterKeywordsInControlFlowStatements": true, 
      "insertSpaceAfterOpeningAndBeforeClosingEmptyBraces": false, 
      "insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": false, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": true, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false, 
      "insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": false, 
      "insertSpaceAfterSemicolonInForStatements": true, 
      "insertSpaceAfterTypeAssertion": false, 
      "insertSpaceBeforeAndAfterBinaryOperators": true, 
      "insertSpaceBeforeFunctionParenthesis": false, 
      "insertSpaceBeforeTypeAnnotation": false, 
      "placeOpenBraceOnNewLineForControlBlocks": false, 
      "placeOpenBraceOnNewLineForFunctions": false, 
      "semicolons": "ignore", 
      "trimTrailingWhitespace": true
    }, 
    "inlayHints": {
      "includeInlayEnumMemberValueHints": false, 
      "includeInlayFunctionLikeReturnTypeHints": false, 
      "includeInlayFunctionParameterTypeHints": false, 
      "includeInlayParameterNameHints": "none", 
      "includeInlayParameterNameHintsWhenArgumentMatchesName": false, 
      "includeInlayPropertyDeclarationTypeHints": false, 
      "includeInlayVariableTypeHints": false
    }
  }, 
  "typescript": {
    "format": {
      "insertSpaceAfterCommaDelimiter": true, 
      "insertSpaceAfterConstructor": false, 
      "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true, 
      "insertSpaceAfterKeywordsInControlFlowStatements": true, 
      "insertSpaceAfterOpeningAndBeforeClosingEmptyBraces": false, 
      "insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": false, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": true, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": false, 
      "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false, 
      "insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": false, 
      "insertSpaceAfterSemicolonInForStatements": true, 
      "insertSpaceAfterTypeAssertion": false, 
      "insertSpaceBeforeAndAfterBinaryOperators": true, 
      "insertSpaceBeforeFunctionParenthesis": false, 
      "insertSpaceBeforeTypeAnnotation": false, 
      "placeOpenBraceOnNewLineForControlBlocks": false, 
      "placeOpenBraceOnNewLineForFunctions": false, 
      "semicolons": "ignore", 
      "trimTrailingWhitespace": true
    }, 
    "inlayHints": {
      "includeInlayEnumMemberValueHints": false, 
      "includeInlayFunctionLikeReturnTypeHints": false, 
      "includeInlayFunctionParameterTypeHints": false, 
      "includeInlayParameterNameHints": "none", 
      "includeInlayParameterNameHintsWhenArgumentMatchesName": false, 
      "includeInlayPropertyDeclarationTypeHints": false, 
      "includeInlayVariableTypeHints": false
    }
  }
}
  • env
{
  "PATH": "/Users/onsi/Library/Caches/Sublime Text/Package Storage/lsp_utils/node-runtime/16.2.0/node/bin:/Users/onsi/Library/Caches/Sublime Text/Package Storage/lsp_utils/node-runtime/16.2.0/node/bin:"
}

Active view

  • File name
/Users/onsi/code/crosspurpose/muhasib/js/pages/pages.js
  • Settings
{
  "auto_complete_selector": "meta.tag, source - comment - string.quoted.double.block - string.quoted.single.block - string.unquoted.heredoc", 
  "lsp_active": true, 
  "syntax": "Packages/JavaScript/JavaScript.sublime-syntax"
}
  • base scope
source.js

Project / Workspace

  • folders
[
  "/Users/onsi/code/crosspurpose/muhasib"
]
  • is project: False

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

  • /usr/local/bin
  • /usr/bin
  • /bin
  • /usr/sbin
  • /sbin
  • /Library/Apple/usr/bin
  • /opt/homebrew/bin
  • /opt/homebrew/sbin
  • /opt/homebrew/Caskroom/miniforge/base/bin
  • /Users/onsi/.local/share/gem/ruby/3.0.0/bin
  • /opt/homebrew/opt/ruby/bin
  • /opt/homebrew/lib/ruby/gems/3.0.0/bin
  • /opt/anaconda3/bin
  • /Users/onsi/bin

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.

There is an issue for it already: microsoft/TypeScript#39823

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

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!

"source.organizeImports": true,
"source.organizeImports.ts": false,

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)