@effect/language-service 0.47.1 → 0.47.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -1861,6 +1861,10 @@ var makeKeyBuilder = fn("KeyBuilder")(
1861
1861
  );
1862
1862
  var keyBuilderCache = /* @__PURE__ */ new Map();
1863
1863
  var getOrMakeKeyBuilder = fn("getOrMakeKeyBuilder")(function* (sourceFile) {
1864
+ while (keyBuilderCache.size > 5) {
1865
+ const oldest = keyBuilderCache.keys().next().value;
1866
+ if (oldest) keyBuilderCache.delete(oldest);
1867
+ }
1864
1868
  const keyBuilder = keyBuilderCache.get(sourceFile.fileName) || (yield* makeKeyBuilder(sourceFile));
1865
1869
  keyBuilderCache.set(sourceFile.fileName, keyBuilder);
1866
1870
  return keyBuilder;
@@ -2247,10 +2251,10 @@ var TypeCheckerUtils = Tag("TypeCheckerUtils");
2247
2251
  var nanoLayer2 = (fa) => pipe(
2248
2252
  service(TypeScriptApi),
2249
2253
  flatMap2(
2250
- (ts) => flatMap2(service(TypeCheckerApi), (typeChecker) => pipe(fa, provideService(TypeCheckerUtils, makeTypeCheckerUtils(ts, typeChecker))))
2254
+ (ts) => flatMap2(service(TypeCheckerApi), (typeChecker) => flatMap2(service(TypeScriptUtils), (typeScriptUtils) => pipe(fa, provideService(TypeCheckerUtils, makeTypeCheckerUtils(ts, typeChecker, typeScriptUtils)))))
2251
2255
  )
2252
2256
  );
2253
- function makeTypeCheckerUtils(ts, typeChecker) {
2257
+ function makeTypeCheckerUtils(ts, typeChecker, tsUtils) {
2254
2258
  function isUnion(type) {
2255
2259
  return !!(type.flags & ts.TypeFlags.Union);
2256
2260
  }
@@ -2490,6 +2494,74 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2490
2494
  expectedAndRealTypeCache.set(sourceFile, result);
2491
2495
  return result;
2492
2496
  };
2497
+ function typeToSimplifiedTypeNode(type, enclosingNode, flags) {
2498
+ const fallbackStandard = () => {
2499
+ const typeNode = typeChecker.typeToTypeNode(type, enclosingNode, flags);
2500
+ if (!typeNode) return void 0;
2501
+ return tsUtils.simplifyTypeNode(typeNode);
2502
+ };
2503
+ const members = unrollUnionMembers(type);
2504
+ if (members.length > 1) {
2505
+ const typeNodes = [];
2506
+ members.sort(deterministicTypeOrder);
2507
+ for (const member of members) {
2508
+ const memberNode = typeToSimplifiedTypeNode(member, enclosingNode, flags);
2509
+ if (!memberNode) return fallbackStandard();
2510
+ typeNodes.push(memberNode);
2511
+ }
2512
+ return tsUtils.simplifyTypeNode(ts.factory.createUnionTypeNode(typeNodes));
2513
+ }
2514
+ if (type.flags & ts.TypeFlags.Intersection) {
2515
+ const intersectionType = type;
2516
+ const typeNodes = [];
2517
+ for (const member of intersectionType.types) {
2518
+ const memberNode = typeToSimplifiedTypeNode(member, enclosingNode, flags);
2519
+ if (!memberNode) return fallbackStandard();
2520
+ typeNodes.push(memberNode);
2521
+ }
2522
+ return tsUtils.simplifyTypeNode(ts.factory.createIntersectionTypeNode(typeNodes));
2523
+ }
2524
+ if (type.flags & ts.TypeFlags.Object && type.objectFlags & ts.ObjectFlags.Reference) {
2525
+ const typeReference = type;
2526
+ const standard2 = fallbackStandard();
2527
+ if (!standard2) return void 0;
2528
+ if (!ts.isTypeReferenceNode(standard2)) return standard2;
2529
+ if (typeReference.target.typeParameters?.length !== typeReference.typeArguments?.length) return standard2;
2530
+ if (standard2.typeArguments?.length !== typeReference.typeArguments?.length) return standard2;
2531
+ const typeParametersCount = (typeReference.target.typeParameters || []).length;
2532
+ for (let i = typeParametersCount - 1; i >= 0; i--) {
2533
+ const typeParameter = typeReference.target.typeParameters[i];
2534
+ const typeArgument = typeReference.typeArguments[i];
2535
+ const defaultType = typeChecker.getDefaultFromTypeParameter(typeParameter);
2536
+ if (defaultType !== typeArgument || i === 0) {
2537
+ return tsUtils.simplifyTypeNode(ts.factory.updateTypeReferenceNode(
2538
+ standard2,
2539
+ standard2.typeName,
2540
+ ts.factory.createNodeArray((standard2.typeArguments || []).slice(0, Math.min(typeParametersCount, i + 1)))
2541
+ ));
2542
+ }
2543
+ }
2544
+ return standard2;
2545
+ }
2546
+ if (type.flags & ts.TypeFlags.Object) {
2547
+ const standard2 = fallbackStandard();
2548
+ if (!standard2) return void 0;
2549
+ if (!ts.isFunctionTypeNode(standard2)) return standard2;
2550
+ const signatures = typeChecker.getSignaturesOfType(type, ts.SignatureKind.Call);
2551
+ if (signatures.length !== 1) return standard2;
2552
+ const returnType = typeChecker.getReturnTypeOfSignature(signatures[0]);
2553
+ if (!returnType) return standard2;
2554
+ const returnTypeNode = typeToSimplifiedTypeNode(returnType, enclosingNode, flags);
2555
+ if (!returnTypeNode) return standard2;
2556
+ return tsUtils.simplifyTypeNode(ts.factory.updateFunctionTypeNode(
2557
+ standard2,
2558
+ standard2.typeParameters,
2559
+ standard2.parameters,
2560
+ returnTypeNode
2561
+ ));
2562
+ }
2563
+ return fallbackStandard();
2564
+ }
2493
2565
  return {
2494
2566
  isUnion,
2495
2567
  getTypeParameterAtPosition,
@@ -2498,7 +2570,8 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2498
2570
  appendToUniqueTypesMap,
2499
2571
  deterministicTypeOrder,
2500
2572
  getInferredReturnType,
2501
- expectedAndRealType
2573
+ expectedAndRealType,
2574
+ typeToSimplifiedTypeNode
2502
2575
  };
2503
2576
  }
2504
2577
 
@@ -6538,6 +6611,10 @@ var makeAutoImportProvider = fn("TypeScriptApi")(function* (fromSourceFile) {
6538
6611
  });
6539
6612
  var importProvidersCache = /* @__PURE__ */ new Map();
6540
6613
  var getOrMakeAutoImportProvider = fn("getOrMakeAutoImportProvider")(function* (sourceFile) {
6614
+ while (importProvidersCache.size > 5) {
6615
+ const oldest = importProvidersCache.keys().next().value;
6616
+ if (oldest) importProvidersCache.delete(oldest);
6617
+ }
6541
6618
  const autoImportProvider = importProvidersCache.get(sourceFile.fileName) || (yield* makeAutoImportProvider(sourceFile));
6542
6619
  importProvidersCache.set(sourceFile.fileName, autoImportProvider);
6543
6620
  return autoImportProvider;
@@ -13041,7 +13118,6 @@ var toggleReturnTypeAnnotation = createRefactor({
13041
13118
  apply: fn("toggleReturnTypeAnnotation.apply")(function* (sourceFile, textRange) {
13042
13119
  const ts = yield* service(TypeScriptApi);
13043
13120
  const tsUtils = yield* service(TypeScriptUtils);
13044
- const typeChecker = yield* service(TypeCheckerApi);
13045
13121
  const typeCheckerUtils = yield* service(TypeCheckerUtils);
13046
13122
  function addReturnTypeAnnotation(sourceFile2, changeTracker, declaration, typeNode) {
13047
13123
  const closeParen = ts.findChildOfKind(declaration, ts.SyntaxKind.CloseParenToken, sourceFile2);
@@ -13092,7 +13168,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13092
13168
  }
13093
13169
  const returnType = typeCheckerUtils.getInferredReturnType(node);
13094
13170
  if (!returnType) return yield* fail(new RefactorNotApplicableError());
13095
- const returnTypeNode = typeChecker.typeToTypeNode(
13171
+ const returnTypeNode = typeCheckerUtils.typeToSimplifiedTypeNode(
13096
13172
  returnType,
13097
13173
  node,
13098
13174
  ts.NodeBuilderFlags.NoTruncation
@@ -13103,9 +13179,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13103
13179
  description: "Toggle return type annotation",
13104
13180
  apply: pipe(
13105
13181
  service(ChangeTracker),
13106
- map5(
13107
- (changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, tsUtils.simplifyTypeNode(returnTypeNode))
13108
- )
13182
+ map5((changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, returnTypeNode))
13109
13183
  )
13110
13184
  };
13111
13185
  })
@@ -13119,6 +13193,7 @@ var toggleTypeAnnotation = createRefactor({
13119
13193
  const ts = yield* service(TypeScriptApi);
13120
13194
  const tsUtils = yield* service(TypeScriptUtils);
13121
13195
  const typeChecker = yield* service(TypeCheckerApi);
13196
+ const typeCheckerUtils = yield* service(TypeCheckerUtils);
13122
13197
  const maybeNode = pipe(
13123
13198
  tsUtils.getAncestorNodesInRange(sourceFile, textRange),
13124
13199
  filter((node2) => ts.isVariableDeclaration(node2) || ts.isPropertyDeclaration(node2)),
@@ -13140,13 +13215,13 @@ var toggleTypeAnnotation = createRefactor({
13140
13215
  }
13141
13216
  const initializer = node.initializer;
13142
13217
  const initializerType = typeChecker.getTypeAtLocation(initializer);
13143
- const initializerTypeNode = fromNullable(typeChecker.typeToTypeNode(
13218
+ const initializerTypeNode = fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13144
13219
  initializerType,
13145
13220
  node,
13146
13221
  ts.NodeBuilderFlags.NoTruncation
13147
13222
  )).pipe(
13148
13223
  orElse(
13149
- () => fromNullable(typeChecker.typeToTypeNode(
13224
+ () => fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13150
13225
  initializerType,
13151
13226
  void 0,
13152
13227
  ts.NodeBuilderFlags.NoTruncation
@@ -13158,7 +13233,7 @@ var toggleTypeAnnotation = createRefactor({
13158
13233
  changeTracker.insertNodeAt(
13159
13234
  sourceFile,
13160
13235
  node.name.end,
13161
- tsUtils.simplifyTypeNode(initializerTypeNode),
13236
+ initializerTypeNode,
13162
13237
  {
13163
13238
  prefix: ": "
13164
13239
  }
@@ -13878,6 +13953,10 @@ var init = (modules) => {
13878
13953
  const effectCodeFixesForFile = /* @__PURE__ */ new Map();
13879
13954
  const runDiagnosticsAndCacheCodeFixes = (fileName) => {
13880
13955
  const program = languageService.getProgram();
13956
+ while (effectCodeFixesForFile.size > 5) {
13957
+ const oldest = effectCodeFixesForFile.keys().next().value;
13958
+ if (oldest) effectCodeFixesForFile.delete(oldest);
13959
+ }
13881
13960
  if (languageServicePluginOptions.diagnostics && program) {
13882
13961
  effectCodeFixesForFile.delete(fileName);
13883
13962
  const sourceFile = program.getSourceFile(fileName);