@effect/language-service 0.47.2 → 0.48.0

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
@@ -1225,7 +1225,7 @@ function parseKeyPatterns(patterns) {
1225
1225
  if (!isObject(entry)) continue;
1226
1226
  result.push({
1227
1227
  target: hasProperty(entry, "target") && isString(entry.target) && ["service", "error", "custom"].includes(entry.target.toLowerCase()) ? entry.target.toLowerCase() : "service",
1228
- pattern: hasProperty(entry, "pattern") && isString(entry.pattern) && ["package-identifier", "default"].includes(entry.pattern.toLowerCase()) ? entry.pattern.toLowerCase() : "default",
1228
+ pattern: hasProperty(entry, "pattern") && isString(entry.pattern) && ["package-identifier", "default", "default-hashed"].includes(entry.pattern.toLowerCase()) ? entry.pattern.toLowerCase() : "default",
1229
1229
  skipLeadingPath: hasProperty(entry, "skipLeadingPath") && isArray(entry.skipLeadingPath) && entry.skipLeadingPath.every(isString) ? entry.skipLeadingPath : ["src/"]
1230
1230
  });
1231
1231
  }
@@ -1811,71 +1811,6 @@ function makeTypeScriptUtils(ts) {
1811
1811
  };
1812
1812
  }
1813
1813
 
1814
- // src/core/KeyBuilder.ts
1815
- var makeKeyBuilder = fn("KeyBuilder")(
1816
- function* (sourceFile) {
1817
- const ts = yield* service(TypeScriptApi);
1818
- const tsUtils = yield* service(TypeScriptUtils);
1819
- const program = yield* service(TypeScriptProgram);
1820
- const options = yield* service(LanguageServicePluginOptions);
1821
- const packageInfo = tsUtils.resolveModuleWithPackageInfoFromSourceFile(program, sourceFile);
1822
- function createString2(classNameText, kind) {
1823
- if (!packageInfo) return;
1824
- for (const keyPattern of options.keyPatterns) {
1825
- if (keyPattern.target !== kind) continue;
1826
- const lastIndex = sourceFile.fileName.lastIndexOf("/");
1827
- let onlyFileName = lastIndex === -1 ? "" : sourceFile.fileName.slice(lastIndex + 1);
1828
- const lastExtensionIndex = onlyFileName.lastIndexOf(".");
1829
- if (lastExtensionIndex !== -1) onlyFileName = onlyFileName.slice(0, lastExtensionIndex);
1830
- if (onlyFileName.toLowerCase().endsWith("/index")) onlyFileName = onlyFileName.slice(0, -6);
1831
- if (onlyFileName.startsWith("/")) onlyFileName = onlyFileName.slice(1);
1832
- let subDirectory = getDirectoryPath(ts, sourceFile.fileName);
1833
- if (!subDirectory.startsWith(packageInfo.packageDirectory)) continue;
1834
- subDirectory = subDirectory.slice(packageInfo.packageDirectory.length);
1835
- if (!subDirectory.endsWith("/")) subDirectory = subDirectory + "/";
1836
- if (subDirectory.startsWith("/")) subDirectory = subDirectory.slice(1);
1837
- for (const prefix of keyPattern.skipLeadingPath) {
1838
- if (subDirectory.startsWith(prefix)) {
1839
- subDirectory = subDirectory.slice(prefix.length);
1840
- break;
1841
- }
1842
- }
1843
- let parts = [packageInfo.name, subDirectory, onlyFileName].concat(
1844
- onlyFileName.toLowerCase() === classNameText.toLowerCase() ? [] : [classNameText]
1845
- );
1846
- if (keyPattern.pattern === "package-identifier") {
1847
- parts = [packageInfo.name, onlyFileName].concat(
1848
- onlyFileName.toLowerCase() === classNameText.toLowerCase() ? [] : [classNameText]
1849
- );
1850
- }
1851
- parts = parts.map((part) => part.startsWith("/") ? part.slice(1) : part).map(
1852
- (part) => part.endsWith("/") ? part.slice(0, -1) : part
1853
- );
1854
- return parts.filter((_) => String(_).trim().length > 0).join("/");
1855
- }
1856
- }
1857
- return {
1858
- createString: createString2
1859
- };
1860
- }
1861
- );
1862
- var keyBuilderCache = /* @__PURE__ */ new Map();
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
- }
1868
- const keyBuilder = keyBuilderCache.get(sourceFile.fileName) || (yield* makeKeyBuilder(sourceFile));
1869
- keyBuilderCache.set(sourceFile.fileName, keyBuilder);
1870
- return keyBuilder;
1871
- });
1872
- function createString(sourceFile, identifier, kind) {
1873
- return map5(
1874
- getOrMakeKeyBuilder(sourceFile),
1875
- (identifierBuilder) => identifierBuilder.createString(identifier, kind)
1876
- );
1877
- }
1878
-
1879
1814
  // src/core/LSP.ts
1880
1815
  var RefactorNotApplicableError = class {
1881
1816
  _tag = "@effect/language-service/RefactorNotApplicableError";
@@ -2207,6 +2142,72 @@ var getEffectLspPatchSourceFileMetadata = (sourceFile) => {
2207
2142
  return sourceFile["@effect-lsp-patch/metadata"];
2208
2143
  };
2209
2144
 
2145
+ // src/core/KeyBuilder.ts
2146
+ var makeKeyBuilder = fn("KeyBuilder")(
2147
+ function* (sourceFile) {
2148
+ const ts = yield* service(TypeScriptApi);
2149
+ const tsUtils = yield* service(TypeScriptUtils);
2150
+ const program = yield* service(TypeScriptProgram);
2151
+ const options = yield* service(LanguageServicePluginOptions);
2152
+ const packageInfo = tsUtils.resolveModuleWithPackageInfoFromSourceFile(program, sourceFile);
2153
+ function createString2(classNameText, kind) {
2154
+ if (!packageInfo) return;
2155
+ for (const keyPattern of options.keyPatterns) {
2156
+ if (keyPattern.target !== kind) continue;
2157
+ const lastIndex = sourceFile.fileName.lastIndexOf("/");
2158
+ let onlyFileName = lastIndex === -1 ? "" : sourceFile.fileName.slice(lastIndex + 1);
2159
+ const lastExtensionIndex = onlyFileName.lastIndexOf(".");
2160
+ if (lastExtensionIndex !== -1) onlyFileName = onlyFileName.slice(0, lastExtensionIndex);
2161
+ if (onlyFileName.toLowerCase().endsWith("/index")) onlyFileName = onlyFileName.slice(0, -6);
2162
+ if (onlyFileName.startsWith("/")) onlyFileName = onlyFileName.slice(1);
2163
+ let subDirectory = getDirectoryPath(ts, sourceFile.fileName);
2164
+ if (!subDirectory.startsWith(packageInfo.packageDirectory)) continue;
2165
+ subDirectory = subDirectory.slice(packageInfo.packageDirectory.length);
2166
+ if (!subDirectory.endsWith("/")) subDirectory = subDirectory + "/";
2167
+ if (subDirectory.startsWith("/")) subDirectory = subDirectory.slice(1);
2168
+ for (const prefix of keyPattern.skipLeadingPath) {
2169
+ if (subDirectory.startsWith(prefix)) {
2170
+ subDirectory = subDirectory.slice(prefix.length);
2171
+ break;
2172
+ }
2173
+ }
2174
+ let parts = [packageInfo.name, subDirectory, onlyFileName].concat(
2175
+ onlyFileName.toLowerCase() === classNameText.toLowerCase() ? [] : [classNameText]
2176
+ );
2177
+ if (keyPattern.pattern === "package-identifier") {
2178
+ parts = [packageInfo.name, onlyFileName].concat(
2179
+ onlyFileName.toLowerCase() === classNameText.toLowerCase() ? [] : [classNameText]
2180
+ );
2181
+ }
2182
+ parts = parts.map((part) => part.startsWith("/") ? part.slice(1) : part).map(
2183
+ (part) => part.endsWith("/") ? part.slice(0, -1) : part
2184
+ );
2185
+ const fullKey = parts.filter((_) => String(_).trim().length > 0).join("/");
2186
+ return keyPattern.pattern === "default-hashed" ? cyrb53(fullKey) : fullKey;
2187
+ }
2188
+ }
2189
+ return {
2190
+ createString: createString2
2191
+ };
2192
+ }
2193
+ );
2194
+ var keyBuilderCache = /* @__PURE__ */ new Map();
2195
+ var getOrMakeKeyBuilder = fn("getOrMakeKeyBuilder")(function* (sourceFile) {
2196
+ while (keyBuilderCache.size > 5) {
2197
+ const oldest = keyBuilderCache.keys().next().value;
2198
+ if (oldest) keyBuilderCache.delete(oldest);
2199
+ }
2200
+ const keyBuilder = keyBuilderCache.get(sourceFile.fileName) || (yield* makeKeyBuilder(sourceFile));
2201
+ keyBuilderCache.set(sourceFile.fileName, keyBuilder);
2202
+ return keyBuilder;
2203
+ });
2204
+ function createString(sourceFile, identifier, kind) {
2205
+ return map5(
2206
+ getOrMakeKeyBuilder(sourceFile),
2207
+ (identifierBuilder) => identifierBuilder.createString(identifier, kind)
2208
+ );
2209
+ }
2210
+
2210
2211
  // src/completions/contextSelfInClasses.ts
2211
2212
  var contextSelfInClasses = createCompletion({
2212
2213
  name: "contextSelfInClasses",
@@ -2251,10 +2252,10 @@ var TypeCheckerUtils = Tag("TypeCheckerUtils");
2251
2252
  var nanoLayer2 = (fa) => pipe(
2252
2253
  service(TypeScriptApi),
2253
2254
  flatMap2(
2254
- (ts) => flatMap2(service(TypeCheckerApi), (typeChecker) => pipe(fa, provideService(TypeCheckerUtils, makeTypeCheckerUtils(ts, typeChecker))))
2255
+ (ts) => flatMap2(service(TypeCheckerApi), (typeChecker) => flatMap2(service(TypeScriptUtils), (typeScriptUtils) => pipe(fa, provideService(TypeCheckerUtils, makeTypeCheckerUtils(ts, typeChecker, typeScriptUtils)))))
2255
2256
  )
2256
2257
  );
2257
- function makeTypeCheckerUtils(ts, typeChecker) {
2258
+ function makeTypeCheckerUtils(ts, typeChecker, tsUtils) {
2258
2259
  function isUnion(type) {
2259
2260
  return !!(type.flags & ts.TypeFlags.Union);
2260
2261
  }
@@ -2494,6 +2495,78 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2494
2495
  expectedAndRealTypeCache.set(sourceFile, result);
2495
2496
  return result;
2496
2497
  };
2498
+ function typeToSimplifiedTypeNode(type, enclosingNode, flags) {
2499
+ return typeToSimplifiedTypeNodeWorker(type, enclosingNode, flags, 0);
2500
+ }
2501
+ function typeToSimplifiedTypeNodeWorker(type, enclosingNode, flags, depth) {
2502
+ const fallbackStandard = () => {
2503
+ const typeNode = typeChecker.typeToTypeNode(type, enclosingNode, flags);
2504
+ if (!typeNode) return void 0;
2505
+ return tsUtils.simplifyTypeNode(typeNode);
2506
+ };
2507
+ if (depth > 20) return fallbackStandard();
2508
+ const members = unrollUnionMembers(type);
2509
+ if (members.length > 1 && !(type.flags & ts.TypeFlags.Boolean)) {
2510
+ const typeNodes = [];
2511
+ members.sort(deterministicTypeOrder);
2512
+ for (const member of members) {
2513
+ const memberNode = typeToSimplifiedTypeNodeWorker(member, enclosingNode, flags, depth + 1);
2514
+ if (!memberNode) return fallbackStandard();
2515
+ typeNodes.push(memberNode);
2516
+ }
2517
+ return tsUtils.simplifyTypeNode(ts.factory.createUnionTypeNode(typeNodes));
2518
+ }
2519
+ if (type.flags & ts.TypeFlags.Intersection) {
2520
+ const intersectionType = type;
2521
+ const typeNodes = [];
2522
+ for (const member of intersectionType.types) {
2523
+ const memberNode = typeToSimplifiedTypeNodeWorker(member, enclosingNode, flags, depth + 1);
2524
+ if (!memberNode) return fallbackStandard();
2525
+ typeNodes.push(memberNode);
2526
+ }
2527
+ return tsUtils.simplifyTypeNode(ts.factory.createIntersectionTypeNode(typeNodes));
2528
+ }
2529
+ if (type.flags & ts.TypeFlags.Object && type.objectFlags & ts.ObjectFlags.Reference) {
2530
+ const typeReference = type;
2531
+ const standard2 = fallbackStandard();
2532
+ if (!standard2) return void 0;
2533
+ if (!ts.isTypeReferenceNode(standard2)) return standard2;
2534
+ if (typeReference.target.typeParameters?.length !== typeReference.typeArguments?.length) return standard2;
2535
+ if (standard2.typeArguments?.length !== typeReference.typeArguments?.length) return standard2;
2536
+ const typeParametersCount = (typeReference.target.typeParameters || []).length;
2537
+ for (let i = typeParametersCount - 1; i >= 0; i--) {
2538
+ const typeParameter = typeReference.target.typeParameters[i];
2539
+ const typeArgument = typeReference.typeArguments[i];
2540
+ const defaultType = typeChecker.getDefaultFromTypeParameter(typeParameter);
2541
+ if (defaultType !== typeArgument || i === 0) {
2542
+ return tsUtils.simplifyTypeNode(ts.factory.updateTypeReferenceNode(
2543
+ standard2,
2544
+ standard2.typeName,
2545
+ ts.factory.createNodeArray((standard2.typeArguments || []).slice(0, Math.min(typeParametersCount, i + 1)))
2546
+ ));
2547
+ }
2548
+ }
2549
+ return standard2;
2550
+ }
2551
+ if (type.flags & ts.TypeFlags.Object) {
2552
+ const standard2 = fallbackStandard();
2553
+ if (!standard2) return void 0;
2554
+ if (!ts.isFunctionTypeNode(standard2)) return standard2;
2555
+ const signatures = typeChecker.getSignaturesOfType(type, ts.SignatureKind.Call);
2556
+ if (signatures.length !== 1) return standard2;
2557
+ const returnType = typeChecker.getReturnTypeOfSignature(signatures[0]);
2558
+ if (!returnType) return standard2;
2559
+ const returnTypeNode = typeToSimplifiedTypeNodeWorker(returnType, enclosingNode, flags, depth + 1);
2560
+ if (!returnTypeNode) return standard2;
2561
+ return tsUtils.simplifyTypeNode(ts.factory.updateFunctionTypeNode(
2562
+ standard2,
2563
+ standard2.typeParameters,
2564
+ standard2.parameters,
2565
+ returnTypeNode
2566
+ ));
2567
+ }
2568
+ return fallbackStandard();
2569
+ }
2497
2570
  return {
2498
2571
  isUnion,
2499
2572
  getTypeParameterAtPosition,
@@ -2502,7 +2575,8 @@ function makeTypeCheckerUtils(ts, typeChecker) {
2502
2575
  appendToUniqueTypesMap,
2503
2576
  deterministicTypeOrder,
2504
2577
  getInferredReturnType,
2505
- expectedAndRealType
2578
+ expectedAndRealType,
2579
+ typeToSimplifiedTypeNode
2506
2580
  };
2507
2581
  }
2508
2582
 
@@ -5700,7 +5774,7 @@ var tryCatchInEffectGen = createDiagnostic({
5700
5774
  while (nodeToVisit.length > 0) {
5701
5775
  const node = nodeToVisit.shift();
5702
5776
  ts.forEachChild(node, appendNodeToVisit);
5703
- if (ts.isTryStatement(node)) {
5777
+ if (ts.isTryStatement(node) && node.catchClause) {
5704
5778
  const generatorOrRegularFunction = ts.findAncestor(
5705
5779
  node,
5706
5780
  (_) => ts.isFunctionExpression(_) || ts.isFunctionDeclaration(_) || ts.isMethodDeclaration(_) || ts.isArrowFunction(_) || ts.isGetAccessor(_) || ts.isFunctionLike(_)
@@ -12360,11 +12434,8 @@ var layerMagic = createRefactor({
12360
12434
  (node) => node
12361
12435
  );
12362
12436
  const adjustedNode = (node) => {
12363
- if (ts.isIdentifier(node) && ts.isVariableDeclaration(node.parent) && node.parent.initializer) {
12364
- return adjustedNode(node.parent.initializer);
12365
- }
12366
- if (ts.isIdentifier(node) && ts.isPropertyDeclaration(node.parent) && node.parent.initializer) {
12367
- return adjustedNode(node.parent.initializer);
12437
+ if (node.parent && (ts.isVariableDeclaration(node.parent) || ts.isPropertyDeclaration(node.parent)) && ts.isIdentifier(node) && node.parent.initializer && node.parent.name === node) {
12438
+ return node.parent.initializer;
12368
12439
  }
12369
12440
  return node;
12370
12441
  };
@@ -13049,7 +13120,6 @@ var toggleReturnTypeAnnotation = createRefactor({
13049
13120
  apply: fn("toggleReturnTypeAnnotation.apply")(function* (sourceFile, textRange) {
13050
13121
  const ts = yield* service(TypeScriptApi);
13051
13122
  const tsUtils = yield* service(TypeScriptUtils);
13052
- const typeChecker = yield* service(TypeCheckerApi);
13053
13123
  const typeCheckerUtils = yield* service(TypeCheckerUtils);
13054
13124
  function addReturnTypeAnnotation(sourceFile2, changeTracker, declaration, typeNode) {
13055
13125
  const closeParen = ts.findChildOfKind(declaration, ts.SyntaxKind.CloseParenToken, sourceFile2);
@@ -13100,7 +13170,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13100
13170
  }
13101
13171
  const returnType = typeCheckerUtils.getInferredReturnType(node);
13102
13172
  if (!returnType) return yield* fail(new RefactorNotApplicableError());
13103
- const returnTypeNode = typeChecker.typeToTypeNode(
13173
+ const returnTypeNode = typeCheckerUtils.typeToSimplifiedTypeNode(
13104
13174
  returnType,
13105
13175
  node,
13106
13176
  ts.NodeBuilderFlags.NoTruncation
@@ -13111,9 +13181,7 @@ var toggleReturnTypeAnnotation = createRefactor({
13111
13181
  description: "Toggle return type annotation",
13112
13182
  apply: pipe(
13113
13183
  service(ChangeTracker),
13114
- map5(
13115
- (changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, tsUtils.simplifyTypeNode(returnTypeNode))
13116
- )
13184
+ map5((changeTracker) => addReturnTypeAnnotation(sourceFile, changeTracker, node, returnTypeNode))
13117
13185
  )
13118
13186
  };
13119
13187
  })
@@ -13127,6 +13195,7 @@ var toggleTypeAnnotation = createRefactor({
13127
13195
  const ts = yield* service(TypeScriptApi);
13128
13196
  const tsUtils = yield* service(TypeScriptUtils);
13129
13197
  const typeChecker = yield* service(TypeCheckerApi);
13198
+ const typeCheckerUtils = yield* service(TypeCheckerUtils);
13130
13199
  const maybeNode = pipe(
13131
13200
  tsUtils.getAncestorNodesInRange(sourceFile, textRange),
13132
13201
  filter((node2) => ts.isVariableDeclaration(node2) || ts.isPropertyDeclaration(node2)),
@@ -13148,13 +13217,13 @@ var toggleTypeAnnotation = createRefactor({
13148
13217
  }
13149
13218
  const initializer = node.initializer;
13150
13219
  const initializerType = typeChecker.getTypeAtLocation(initializer);
13151
- const initializerTypeNode = fromNullable(typeChecker.typeToTypeNode(
13220
+ const initializerTypeNode = fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13152
13221
  initializerType,
13153
13222
  node,
13154
13223
  ts.NodeBuilderFlags.NoTruncation
13155
13224
  )).pipe(
13156
13225
  orElse(
13157
- () => fromNullable(typeChecker.typeToTypeNode(
13226
+ () => fromNullable(typeCheckerUtils.typeToSimplifiedTypeNode(
13158
13227
  initializerType,
13159
13228
  void 0,
13160
13229
  ts.NodeBuilderFlags.NoTruncation
@@ -13166,7 +13235,7 @@ var toggleTypeAnnotation = createRefactor({
13166
13235
  changeTracker.insertNodeAt(
13167
13236
  sourceFile,
13168
13237
  node.name.end,
13169
- tsUtils.simplifyTypeNode(initializerTypeNode),
13238
+ initializerTypeNode,
13170
13239
  {
13171
13240
  prefix: ": "
13172
13241
  }