Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ts 5.5 #1545

Merged
merged 11 commits into from
Jun 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ npm install --save-dev ts-morph
Or if you're using Deno:

```
deno add @ts-morph/ts-morph
deno add ts-morph@jsr:@ts-morph/ts-morph
```

## Documentation Progress
Expand Down
6 changes: 3 additions & 3 deletions dprint.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
"dist-deno"
],
"plugins": [
"https://plugins.dprint.dev/typescript-0.88.6.wasm",
"https://plugins.dprint.dev/json-0.19.1.wasm",
"https://plugins.dprint.dev/markdown-0.16.3.wasm"
"https://plugins.dprint.dev/typescript-0.91.1.wasm",
"https://plugins.dprint.dev/json-0.19.3.wasm",
"https://plugins.dprint.dev/markdown-0.17.1.wasm"
]
}
1,086 changes: 354 additions & 732 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
"packages/ts-morph"
],
"devDependencies": {
"dprint": "^0.43.2",
"every-ts": "^2.0.0"
"dprint": "^0.46.3"
}
}
16 changes: 8 additions & 8 deletions packages/bootstrap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@
},
"devDependencies": {
"@rollup/plugin-typescript": "^11.1.6",
"@types/chai": "^4.3.12",
"@types/mocha": "^10.0.6",
"@types/node": "^20.11.25",
"@types/chai": "^4.3.16",
"@types/mocha": "^10.0.7",
"@types/node": "^20.14.8",
"chai": "^4.3.10",
"cross-env": "^7.0.3",
"mocha": "^10.3.0",
"rimraf": "^5.0.5",
"rollup": "=4.12.1",
"mocha": "^10.4.0",
"rimraf": "^5.0.7",
"rollup": "=4.18.0",
"ts-node": "^10.9.2",
"tslib": "^2.6.2",
"typescript": "~5.4.2"
"tslib": "^2.6.3",
"typescript": "~5.5.2"
},
"publishConfig": {
"access": "public"
Expand Down
2,338 changes: 933 additions & 1,405 deletions packages/common/lib/typescript.d.ts

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions packages/common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,23 @@
},
"dependencies": {
"fast-glob": "^3.3.2",
"minimatch": "^9.0.3",
"minimatch": "^9.0.4",
"mkdirp": "^3.0.1",
"path-browserify": "^1.0.1"
},
"devDependencies": {
"@rollup/plugin-typescript": "^11.1.6",
"@types/chai": "^4.3.12",
"@types/mocha": "^10.0.6",
"@types/node": "^20.11.25",
"@types/chai": "^4.3.16",
"@types/mocha": "^10.0.7",
"@types/node": "^20.14.8",
"chai": "^4.3.10",
"cross-env": "^7.0.3",
"mocha": "^10.3.0",
"rimraf": "^5.0.5",
"rollup": "=4.12.1",
"mocha": "^10.4.0",
"rimraf": "^5.0.7",
"rollup": "=4.18.0",
"ts-node": "^10.9.2",
"tslib": "^2.6.2",
"typescript": "5.4.2"
"tslib": "^2.6.3",
"typescript": "5.5.2"
},
"publishConfig": {
"access": "public"
Expand Down
4 changes: 0 additions & 4 deletions packages/common/scripts/bundleLocalTs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,4 @@ nodeWithTypeArgs.insertProperty(0, {
name: "_nodeWithTypeArgumentsBrand",
type: "any",
});
for (const qualifiedName of tsFile.getDescendantsOfKind(tsMorph.ts.SyntaxKind.QualifiedName)) {
if (qualifiedName.getLeft().getText() === "ts")
qualifiedName.replaceWithText(qualifiedName.getText().replace(/^ts\./, ""));
}
tsFile.saveSync();
322 changes: 176 additions & 146 deletions packages/common/src/data/libFiles.ts

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions packages/scripts/utils/Memoize.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
/** Decorator for memoizing the result of a method. */
export function Memoize(target: (...args: any[]) => void) {
if (target instanceof Function) {
if (target instanceof Function)
return getNewFunction(target);
} else {
else
throw new Error("Not implemented.");
}
}

const weakMap = new WeakMap<object, Map<string, unknown>>();
Expand Down
2 changes: 1 addition & 1 deletion packages/ts-morph/breaking-changes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Breaking Changes
# Breaking Changes

View [CHANGELOG.md](CHANGELOG.md) for more detail on releases. This file is only a high level overview of breaking changes.

Expand Down
4 changes: 3 additions & 1 deletion packages/ts-morph/lib/ts-morph.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9525,6 +9525,8 @@ export declare class EmitOutput {
private constructor();
/** TypeScript compiler emit result. */
get compilerObject(): ts.EmitOutput;
/** Gets the diagnostics. */
getDiagnostics(): Diagnostic<ts.Diagnostic>[];
/** Gets if the emit was skipped. */
getEmitSkipped(): boolean;
/** Gets the output files. */
Expand Down Expand Up @@ -10071,7 +10073,7 @@ export declare class Type<TType extends ts.Type = ts.Type> {
* Gets the object flags.
* @remarks Returns 0 for a non-object type.
*/
getObjectFlags(): 0 | ObjectFlags.Class | ObjectFlags.Interface | ObjectFlags.Reference | ObjectFlags.Tuple | ObjectFlags.Anonymous | ObjectFlags.Mapped | ObjectFlags.Instantiated | ObjectFlags.ObjectLiteral | ObjectFlags.EvolvingArray | ObjectFlags.ObjectLiteralPatternWithComputedProperties | ObjectFlags.ReverseMapped | ObjectFlags.JsxAttributes | ObjectFlags.JSLiteral | ObjectFlags.FreshLiteral | ObjectFlags.ArrayLiteral | ObjectFlags.ClassOrInterface | ObjectFlags.ContainsSpread | ObjectFlags.ObjectRestType | ObjectFlags.InstantiationExpressionType;
getObjectFlags(): 0 | ObjectFlags.Class | ObjectFlags.Interface | ObjectFlags.Reference | ObjectFlags.Tuple | ObjectFlags.Anonymous | ObjectFlags.Mapped | ObjectFlags.Instantiated | ObjectFlags.ObjectLiteral | ObjectFlags.EvolvingArray | ObjectFlags.ObjectLiteralPatternWithComputedProperties | ObjectFlags.ReverseMapped | ObjectFlags.JsxAttributes | ObjectFlags.JSLiteral | ObjectFlags.FreshLiteral | ObjectFlags.ArrayLiteral | ObjectFlags.ClassOrInterface | ObjectFlags.ContainsSpread | ObjectFlags.ObjectRestType | ObjectFlags.InstantiationExpressionType | ObjectFlags.SingleSignatureType;
}

export declare class TypeParameter extends Type<ts.TypeParameter> {
Expand Down
16 changes: 8 additions & 8 deletions packages/ts-morph/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,19 @@
},
"devDependencies": {
"@rollup/plugin-typescript": "^11.1.6",
"@types/chai": "^4.3.12",
"@types/diff": "^5.0.9",
"@types/mocha": "^10.0.6",
"@types/node": "^20.11.25",
"@types/chai": "^4.3.16",
"@types/diff": "^5.2.1",
"@types/mocha": "^10.0.7",
"@types/node": "^20.14.8",
"chai": "^4.3.10",
"conditional-type-checks": "^1.0.6",
"cross-env": "^7.0.3",
"diff": "^5.2.0",
"mocha": "10.3.0",
"rimraf": "^5.0.5",
"rollup": "=4.12.1",
"mocha": "10.4.0",
"rimraf": "^5.0.7",
"rollup": "=4.18.0",
"ts-node": "10.9.2",
"typescript": "~5.3.2"
"typescript": "~5.5.2"
},
"standard-version": {
"tagPrefix": "",
Expand Down
2 changes: 1 addition & 1 deletion packages/ts-morph/readme.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# ts-morph
# ts-morph

[![npm version](https://badge.fury.io/js/ts-morph.svg)](https://badge.fury.io/js/ts-morph)
[![CI](https://github.com/dsherret/ts-morph/workflows/CI/badge.svg)](https://github.com/dsherret/ts-morph/actions?query=workflow%3ACI)
Expand Down
4 changes: 2 additions & 2 deletions packages/ts-morph/scripts/buildDeno.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ fileSystem.writeFileSync(
fileSystem.writeFileSync(
`${destPath}/readme.md`,
`
# ts_morph
# ts-morph

To use:

Expand All @@ -59,7 +59,7 @@ import { Project } from "ts-morph";
Or use \`@ts-morph/bootstrap\`:

\`\`\`
deno add @ts-morph/ts-morph
deno add @ts-morph/bootstrap
\`\`\`

\`\`\`ts
Expand Down
2 changes: 1 addition & 1 deletion packages/ts-morph/scripts/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Scripts
# Scripts

This folder contains the code that verifies, manipulates, and generates code for ts-morph.
20 changes: 9 additions & 11 deletions packages/ts-morph/src/compiler/ast/common/Node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { Expression } from "../expression";
import { KindToNodeMappings } from "../kindToNodeMappings.generated";
import { SourceFile } from "../module";
import { Statement, StatementedNode } from "../statement";
import { ExtendedParser, hasParsedTokens } from "../utils";
import { ExtendedParser } from "../utils";
import { SyntaxList } from "./SyntaxList";
import { TextRange } from "./TextRange";
import { ForEachDescendantTraversalControl, TransformTraversalControl } from "./TraversalControl";
Expand Down Expand Up @@ -133,10 +133,6 @@ export class Node<NodeType extends ts.Node = ts.Node> {
if (parent != null)
parent._wrappedChildCount--;

const parentSyntaxList = this._getParentSyntaxListIfWrapped();
if (parentSyntaxList != null)
parentSyntaxList._wrappedChildCount--;

this.#storeTextForForgetting();
this._context.compilerFactory.removeNodeFromCache(this);
this._clearInternals();
Expand All @@ -156,7 +152,9 @@ export class Node<NodeType extends ts.Node = ts.Node> {
* @internal
*/
_hasWrappedChildren() {
return this._wrappedChildCount > 0;
// always consider syntax lists as having warpped children because tracking
// them is more work than it's worth
return this._wrappedChildCount > 0 || this.#compilerNode?.kind === SyntaxKind.SyntaxList;
}

/**
Expand Down Expand Up @@ -1290,7 +1288,7 @@ export class Node<NodeType extends ts.Node = ts.Node> {
*/
_getParentSyntaxListIfWrapped(): SyntaxList | undefined {
const parent = this.getParent();
if (parent == null || !hasParsedTokens(parent.compilerNode))
if (parent == null || !ExtendedParser.hasParsedTokens(parent.compilerNode))
return undefined;
return this.getParentSyntaxList();
}
Expand Down Expand Up @@ -1926,15 +1924,15 @@ export class Node<NodeType extends ts.Node = ts.Node> {
* Gets the compiler children of the node.
* @internal
*/
_getCompilerChildren(): ts.Node[] {
_getCompilerChildren(): readonly ts.Node[] {
return ExtendedParser.getCompilerChildren(this.compilerNode, this._sourceFile.compilerNode);
}

/**
* Gets the compiler children of the node using .forEachChild
* @internal
*/
_getCompilerForEachChildren(): ts.Node[] {
_getCompilerForEachChildren(): readonly ts.Node[] {
return ExtendedParser.getCompilerForEachChildren(this.compilerNode, this._sourceFile.compilerNode);
}

Expand All @@ -1943,15 +1941,15 @@ export class Node<NodeType extends ts.Node = ts.Node> {
* @internal
*/
_getCompilerChildrenFast() {
return hasParsedTokens(this.compilerNode) ? this._getCompilerChildren() : this._getCompilerForEachChildren();
return ExtendedParser.hasParsedTokens(this.compilerNode) ? this._getCompilerChildren() : this._getCompilerForEachChildren();
}

/**
* Gets the compiler children of the specified kind.
* @internal
*/
_getCompilerChildrenOfKind(kind: SyntaxKind) {
const children: ts.Node[] = useParseTreeSearchForKind(this, kind) ? this._getCompilerForEachChildren() : this._getCompilerChildren();
const children: readonly ts.Node[] = useParseTreeSearchForKind(this, kind) ? this._getCompilerForEachChildren() : this._getCompilerChildren();
return children.filter(c => c.kind === kind);
}

Expand Down
33 changes: 19 additions & 14 deletions packages/ts-morph/src/compiler/ast/utils/ExtendedParser.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { SyntaxKind, ts } from "@ts-morph/common";
import { CommentNodeParser, ContainerNodes } from "./CommentNodeParser";
import { hasParsedTokens } from "./hasParsedTokens";

const forEachChildSaver = new WeakMap<ts.Node, ts.Node[]>();
const getChildrenSaver = new WeakMap<ts.Node, ts.Node[]>();
const getChildrenSaver = new WeakMap<ts.Node, readonly ts.Node[]>();

/**
* Parser that parses around nodes for comments.
Expand All @@ -14,8 +13,13 @@ export class ExtendedParser {
return CommentNodeParser.getOrParseChildren(container, sourceFile);
}

static hasParsedTokens(node: ts.Node) {
// if this is true, it means the compiler has previously parsed the tokens
return getChildrenSaver.has(node) || node.kind == SyntaxKind.SyntaxList;
}

static getCompilerChildrenFast(node: ts.Node, sourceFile: ts.SourceFile) {
if (hasParsedTokens(node))
if (ExtendedParser.hasParsedTokens(node))
return ExtendedParser.getCompilerChildren(node, sourceFile);

return ExtendedParser.getCompilerForEachChildren(node, sourceFile);
Expand Down Expand Up @@ -43,20 +47,21 @@ export class ExtendedParser {
}
}

static getCompilerChildren(node: ts.Node, sourceFile: ts.SourceFile) {
if (isStatementMemberOrPropertyHoldingSyntaxList()) {
let result = getChildrenSaver.get(node);
if (result == null) {
static getCompilerChildren(node: ts.Node, sourceFile: ts.SourceFile): readonly ts.Node[] {
let result = getChildrenSaver.get(node);
if (result == null) {
if (isStatementMemberOrPropertyHoldingSyntaxList()) {
// @code-fence-allow(getChildren): This merges in comment nodes.
result = [...node.getChildren(sourceFile)]; // make a copy; do not modify the compiler api's array
mergeInComments(result, CommentNodeParser.getOrParseChildren(node as ts.SyntaxList, sourceFile));
getChildrenSaver.set(node, result);
const newArray = [...node.getChildren(sourceFile)]; // make a copy; do not modify the compiler api's array
mergeInComments(newArray, CommentNodeParser.getOrParseChildren(node as ts.SyntaxList, sourceFile));
result = newArray;
} else {
// @code-fence-allow(getChildren): No need to merge in comment nodes.
result = node.getChildren(sourceFile);
}
return result;
getChildrenSaver.set(node, result);
}

// @code-fence-allow(getChildren): No need to merge in comment nodes.
return node.getChildren(sourceFile);
return result;

function isStatementMemberOrPropertyHoldingSyntaxList() {
if (node.kind !== ts.SyntaxKind.SyntaxList)
Expand Down
6 changes: 0 additions & 6 deletions packages/ts-morph/src/compiler/ast/utils/hasParsedTokens.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/ts-morph/src/compiler/ast/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from "./CommentNodeParser";
export * from "./ExtendedParser";
export * from "./hasParsedTokens";
export * from "./isComment";
2 changes: 1 addition & 1 deletion packages/ts-morph/src/compiler/tools/LanguageService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ export class LanguageService {
function getCompilerEmitOutput(): ts.EmitOutput {
const program = compilerObject.getProgram();
if (program == null || program.getSourceFile(filePath) == null)
return { emitSkipped: true, outputFiles: [] };
return { emitSkipped: true, outputFiles: [], diagnostics: [] };
return compilerObject.getEmitOutput(filePath, emitOnlyDtsFiles);
}
}
Expand Down
6 changes: 6 additions & 0 deletions packages/ts-morph/src/compiler/tools/results/EmitOutput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ export class EmitOutput {
return this.#compilerObject;
}

/** Gets the diagnostics. */
@Memoize
getDiagnostics() {
return this.compilerObject.diagnostics.map(d => this.#context.compilerFactory.getDiagnostic(d));
}

/**
* Gets if the emit was skipped.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export class ChangeChildOrderParentHandler implements NodeHandler {
this.#compilerFactory.replaceCompilerNode(currentNode, newNode);
}

#getChildrenInNewOrder(children: ts.Node[]) {
#getChildrenInNewOrder(children: readonly ts.Node[]) {
const result = [...children];
const movingNode = result.splice(this.#oldIndex, 1)[0];
result.splice(this.#newIndex, 0, movingNode);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ArrayUtils, SyntaxKind, ts } from "@ts-morph/common";
import { Node, SourceFile } from "../../compiler";
import { ExtendedParser, hasParsedTokens } from "../../compiler/ast/utils";
import { ExtendedParser } from "../../compiler/ast/utils";
import { CompilerFactory } from "../../factories";
import { AdvancedIterator } from "../../utils";
import { NodeHandler } from "./NodeHandler";
Expand Down Expand Up @@ -36,7 +36,7 @@ export class NodeHandlerHelper {
];
}

getCompilerChildren(currentNode: Node, newNode: ts.Node, newSourceFile: ts.SourceFile): [ts.Node[], ts.Node[]] {
getCompilerChildren(currentNode: Node, newNode: ts.Node, newSourceFile: ts.SourceFile): [readonly ts.Node[], readonly ts.Node[]] {
const currentCompilerNode = currentNode.compilerNode;
const currentSourceFile = currentNode._sourceFile.compilerNode;

Expand All @@ -49,10 +49,10 @@ export class NodeHandlerHelper {
/**
* Gets the children of the node according to whether the tokens have previously been parsed.
*/
getChildrenFast(currentNode: Node, newNode: ts.Node, newSourceFile: ts.SourceFile): [ts.Node[], ts.Node[]] {
getChildrenFast(currentNode: Node, newNode: ts.Node, newSourceFile: ts.SourceFile): [readonly ts.Node[], readonly ts.Node[]] {
const currentCompilerNode = currentNode.compilerNode;
const currentSourceFile = currentNode._sourceFile.compilerNode;
if (hasParsedTokens(currentCompilerNode)) {
if (ExtendedParser.hasParsedTokens(currentCompilerNode)) {
return [
ExtendedParser.getCompilerChildren(currentCompilerNode, currentSourceFile),
ExtendedParser.getCompilerChildren(newNode, newSourceFile),
Expand Down
Loading