@effect/language-service 0.47.2 → 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
@@ -2251,10 +2251,10 @@ var TypeCheckerUtils = Tag("TypeCheckerUtils");
2251
2251
  var nanoLayer2 = (fa) => pipe(
2252
2252
  service(TypeScriptApi),
2253
2253
  flatMap2(
2254
- (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)))))
2255
2255
  )
2256
2256
  );
2257
- function makeTypeCheckerUtils(ts, typeChecker) {
2257
+ function makeTypeCheckerUtils(ts, typeChecker, tsUtils) {
2258
2258
  function isUnion(type) {
2259
2259
  return !!(type.flags & ts.TypeFlags.Union);
2260
2260
  }
@@ -2494,6 +2494,74 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2494
2494
  expectedAndRealTypeCache.set(sourceFile, result);
2495
2495
  return result;
2496
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
+ }
2497
2565
  return {
2498
2566
  isUnion,
2499
2567
  getTypeParameterAtPosition,
@@ -2502,7 +2570,8 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2502
2570
  appendToUniqueTypesMap,
2503
2571
  deterministicTypeOrder,
2504
2572
  getInferredReturnType,
2505
- expectedAndRealType
2573
+ expectedAndRealType,
2574
+ typeToSimplifiedTypeNode
2506
2575
  };
2507
2576
  }
2508
2577
 
@@ -13049,7 +13118,6 @@ var toggleReturnTypeAnnotation = createRefactor({
13049
13118
  apply: fn("toggleReturnTypeAnnotation.apply")(function* (sourceFile, textRange) {
13050
13119
  const ts = yield* service(TypeScriptApi);
13051
13120
  const tsUtils = yield* service(TypeScriptUtils);
13052
- const typeChecker = yield* service(TypeCheckerApi);
13053
13121
  const typeCheckerUtils = yield* service(TypeCheckerUtils);
13054
13122
  function addReturnTypeAnnotation(sourceFile2, changeTracker, declaration, typeNode) {
13055
13123
  const closeParen = ts.findChildOfKind(declaration, ts.SyntaxKind.CloseParenToken, sourceFile2);
@@ -13100,7 +13168,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13100
13168
  }
13101
13169
  const returnType = typeCheckerUtils.getInferredReturnType(node);
13102
13170
  if (!returnType) return yield* fail(new RefactorNotApplicableError());
13103
- const returnTypeNode = typeChecker.typeToTypeNode(
13171
+ const returnTypeNode = typeCheckerUtils.typeToSimplifiedTypeNode(
13104
13172
  returnType,
13105
13173
  node,
13106
13174
  ts.NodeBuilderFlags.NoTruncation
@@ -13111,9 +13179,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13111
13179
  description: "Toggle return type annotation",
13112
13180
  apply: pipe(
13113
13181
  service(ChangeTracker),
13114
- map5(
13115
- (changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, tsUtils.simplifyTypeNode(returnTypeNode))
13116
- )
13182
+ map5((changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, returnTypeNode))
13117
13183
  )
13118
13184
  };
13119
13185
  })
@@ -13127,6 +13193,7 @@ var toggleTypeAnnotation = createRefactor({
13127
13193
  const ts = yield* service(TypeScriptApi);
13128
13194
  const tsUtils = yield* service(TypeScriptUtils);
13129
13195
  const typeChecker = yield* service(TypeCheckerApi);
13196
+ const typeCheckerUtils = yield* service(TypeCheckerUtils);
13130
13197
  const maybeNode = pipe(
13131
13198
  tsUtils.getAncestorNodesInRange(sourceFile, textRange),
13132
13199
  filter((node2) => ts.isVariableDeclaration(node2) || ts.isPropertyDeclaration(node2)),
@@ -13148,13 +13215,13 @@ var toggleTypeAnnotation = createRefactor({
13148
13215
  }
13149
13216
  const initializer = node.initializer;
13150
13217
  const initializerType = typeChecker.getTypeAtLocation(initializer);
13151
- const initializerTypeNode = fromNullable(typeChecker.typeToTypeNode(
13218
+ const initializerTypeNode = fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13152
13219
  initializerType,
13153
13220
  node,
13154
13221
  ts.NodeBuilderFlags.NoTruncation
13155
13222
  )).pipe(
13156
13223
  orElse(
13157
- () => fromNullable(typeChecker.typeToTypeNode(
13224
+ () => fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13158
13225
  initializerType,
13159
13226
  void 0,
13160
13227
  ts.NodeBuilderFlags.NoTruncation
@@ -13166,7 +13233,7 @@ var toggleTypeAnnotation = createRefactor({
13166
13233
  changeTracker.insertNodeAt(
13167
13234
  sourceFile,
13168
13235
  node.name.end,
13169
- tsUtils.simplifyTypeNode(initializerTypeNode),
13236
+ initializerTypeNode,
13170
13237
  {
13171
13238
  prefix: ": "
13172
13239
  }