From 31a67afa75e379b5944c27b0a95a33a8a99e6e60 Mon Sep 17 00:00:00 2001 From: 0x706b Date: Mon, 24 Jan 2022 18:25:42 -0500 Subject: [PATCH 1/3] feat: remove __etsTrace for quickinfo --- package-lock.json | 4 ++-- src/services/services.ts | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a0f51b16e9833..69e8e148ff7ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@effect-ts/typescript-extension", + "name": "typescript", "version": "4.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@effect-ts/typescript-extension", + "name": "typescript", "version": "4.6.0", "license": "Apache-2.0", "bin": { diff --git a/src/services/services.ts b/src/services/services.ts index 56e72c6aadd3d..fda99fd4dc83b 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1663,6 +1663,50 @@ namespace ts { if (!symbol || typeChecker.isUnknownSymbol(symbol)) { const type = shouldGetType(sourceFile, nodeForQuickInfo, position) ? typeChecker.getTypeAtLocation(nodeForQuickInfo) : undefined; + // BEGIN: ___etsTrace removal + let callSignatures: readonly Signature[]; + if(type && (callSignatures = type.getCallSignatures()).length > 0) { + const resolvedSignature = callSignatures[0]; + const declaration = resolvedSignature.declaration; + if(declaration && isFunctionDeclaration(declaration)) { + const lastParam = declaration.parameters[declaration.parameters.length - 1]; + if(lastParam && isIdentifier(lastParam.name) && lastParam.name.escapedText.toString() === "___etsTrace") { + const untracedDeclaration = factory.createFunctionDeclaration( + declaration.decorators, + declaration.modifiers, + declaration.asteriskToken, + declaration.name, + declaration.typeParameters, + declaration.parameters.slice(0, declaration.parameters.length - 1), + declaration.type, + undefined + ); + setParent(untracedDeclaration, declaration.parent); + untracedDeclaration.jsDoc = declaration.jsDoc; + const untracedSignature = typeChecker.createSignature( + untracedDeclaration, + resolvedSignature.typeParameters, + resolvedSignature.thisParameter, + resolvedSignature.parameters.slice(0, resolvedSignature.parameters.length - 1), + resolvedSignature.getReturnType(), + resolvedSignature.resolvedTypePredicate, + resolvedSignature.minArgumentCount - 1, + resolvedSignature.flags + ); + const symbol = typeChecker.createSymbol(SymbolFlags.Function, untracedDeclaration.name?.escapedText || "" as __String); + const newType = typeChecker.createAnonymousType(symbol, new Map(), [untracedSignature], [], []); + return { + kind: ScriptElementKind.unknown, + kindModifiers: ScriptElementKindModifier.none, + textSpan: createTextSpanFromNode(nodeForQuickInfo, sourceFile), + displayParts: typeChecker.runWithCancellationToken(cancellationToken, typeChecker => typeToDisplayParts(typeChecker, newType, getContainerNode(nodeForQuickInfo))), + documentation: type.symbol ? type.symbol.getDocumentationComment(typeChecker) : undefined, + tags: type.symbol ? type.symbol.getJsDocTags(typeChecker) : undefined + }; + } + } + } + // END: ___etsTrace removal return type && { kind: ScriptElementKind.unknown, kindModifiers: ScriptElementKindModifier.none, From 3430f690bfe5a96ca560987e1ba873c907e07e84 Mon Sep 17 00:00:00 2001 From: 0x706b Date: Mon, 24 Jan 2022 18:29:38 -0500 Subject: [PATCH 2/3] feat: allow overloaded fluent signatures --- src/compiler/checker.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3a0ce8f6c57a0..f1b69877930aa 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -42776,22 +42776,21 @@ namespace ts { function getEtsFluentSymbol(name: string, dataFirst: FunctionDeclaration) { const type = getTypeOfNode(dataFirst); const signatures = getSignaturesOfType(type, SignatureKind.Call); - const method = etsThisifySignature(signatures[0]); + const methods = signatures.map(etsThisifySignature); const symbol = createSymbol(SymbolFlags.Function, name as __String); symbol.declarations = [dataFirst]; symbol.valueDeclaration = dataFirst; symbol.parent = dataFirst.symbol.parent; - const final = createAnonymousType(symbol, emptySymbols, [method], [], []); + const final = createAnonymousType(symbol, emptySymbols, methods, [], []); return createSymbolWithType(symbol, final); } function getEtsStaticSymbol(name: string, dataFirst: FunctionDeclaration) { const signatures = getSignaturesOfType(getTypeOfNode(dataFirst), SignatureKind.Call); - const call = signatures[0]; - const method = cloneSignature(call); + const methods = signatures.map(cloneSignature); const symbol = createSymbol(SymbolFlags.Function, name as __String); symbol.declarations = [dataFirst]; symbol.parent = dataFirst.symbol.parent; - const final = createAnonymousType(symbol, emptySymbols, [method], [], []); + const final = createAnonymousType(symbol, emptySymbols, methods, [], []); return createSymbolWithType(symbol, final); } function etsInitTypeChecker() { From 7db766d06db78355b24436f8aa966e4b5f36e2f1 Mon Sep 17 00:00:00 2001 From: 0x706b Date: Mon, 24 Jan 2022 18:54:25 -0500 Subject: [PATCH 3/3] fix: improve fluent static constant goToDefinition --- effect/src/index.ts | 12 ++++++------ src/services/goToDefinition.ts | 24 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/effect/src/index.ts b/effect/src/index.ts index aa96af82c06b7..2ad565fa5aa4a 100644 --- a/effect/src/index.ts +++ b/effect/src/index.ts @@ -2,12 +2,12 @@ import { Effect } from "./prelude.js"; import { Maybe } from "./prelude.js"; export const isPositive = (n: number) => - n > 0 ? Maybe.just("positive") : Maybe.nothing() + n > 0 ? Maybe.just("positive") : Maybe.nothing(); export const isPositiveEff = (n: number) => - n > 0 ? Effect("positive") : Effect.fail("negative") + n > 0 ? Effect("positive") : Effect.fail("negative"); -export const resultEither = isPositive(0).match(() => "nope", () => "yeah") +export const resultEither = isPositive(0).match(() => "nope", () => "yeah"); export const prog = Effect.do .bind("a", () => Effect(0)) @@ -15,10 +15,10 @@ export const prog = Effect.do .bind("c", () => Effect(2)) .bind("d", () => Effect(4) + Effect(5)) .map(({ a, b, c, d: { tuple: [e, f] } }) => `result: ${a + b + c} ${e} ${f}`) - .flatMap((s) => Effect(console.log(s))) + .flatMap((s) => Effect(console.log(s))); -export const result = prog | Effect.fail("error") +export const result = prog | Effect.fail("error"); prog.unsafeRunPromise() -export const xxx = pipe(0, n => n + 1, n => `hello: ${n}`) \ No newline at end of file +export const xxx = pipe(0, n => n + 1, n => `hello: ${n}`) diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index a7fdff1a8db21..1635184a9c193 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -49,12 +49,28 @@ namespace ts.GoToDefinition { const staticSymbol = typeChecker.getStaticExtension(type, name); if(staticSymbol && !isCallExpression(parent.parent)) { const declaration = staticSymbol.patched.valueDeclaration!; + let start: number; + let length: number; + if(declaration.original && isNamedDeclaration(declaration.original)) { + start = declaration.original.name.getStart(); + length = declaration.original.getWidth(); + } + else if(isNamedDeclaration(declaration)) { + start = declaration.name.getStart(); + length = declaration.getWidth(); + } + else { + start = declaration.getStart(); + length = declaration.getWidth(); + } + + if(start === -1 || length === -1) { + return undefined; + } + return [{ fileName: staticSymbol.definition.fileName, - textSpan: { - start: declaration.pos + 1, - length: declaration.end - declaration.pos - }, + textSpan: { start, length }, kind: SymbolDisplay.getSymbolKind(typeChecker, staticSymbol.patched, node), name: typeChecker.symbolToString(staticSymbol.patched), containerKind: undefined!,