diff --git a/openrewrite/package-lock.json b/openrewrite/package-lock.json index dddd3b62..1f757b2e 100644 --- a/openrewrite/package-lock.json +++ b/openrewrite/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openrewrite/rewrite", - "version": "0.18.4", + "version": "0.18.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@openrewrite/rewrite", - "version": "0.18.4", + "version": "0.18.9", "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.1.0", @@ -19,6 +19,7 @@ "uuid": "^10.0.0" }, "devDependencies": { + "@openrewrite/rewrite-remote": "~0.3.0", "@types/diff": "^5.2.2", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", @@ -1090,12 +1091,14 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/dry-uninstall/-/dry-uninstall-0.3.0.tgz", "integrity": "sha512-b8h94RVpETWkVV59x62NsY++79bM7Si6Dxq7a4iVxRcJU3ZJJ4vaiC7wUZwM8WDK0ySRL+i+T/1SMAzbJLejYA==", + "dev": true, "license": "MIT" }, "node_modules/@openrewrite/rewrite-remote": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@openrewrite/rewrite-remote/-/rewrite-remote-0.4.0.tgz", - "integrity": "sha512-cFVkQD1yRCNiVHOJKPs1xcX9W/SZk0oMJDDfSSbxy3F3q2h5ar+8E5HObYzUw6XLN+RGP1RRNzDmmlxHxMLVrQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@openrewrite/rewrite-remote/-/rewrite-remote-0.3.10.tgz", + "integrity": "sha512-i/yVLFLG2WN03wJPxxW2TWUZ3BxFI8J62G/q6I+1c0mtrRKpNJ8D0kPhwpH4fvGL3Q8OBHEROHVAoTfMXs2mkw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.1.0", @@ -1534,6 +1537,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" @@ -1844,6 +1848,7 @@ "version": "0.1.30", "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.30.tgz", "integrity": "sha512-OaAjvEQuQ9tJsKG4oHO9nV1UHTwb2Qc2+fadB0VeVtD0Z9wiG1XPGLJ4W3aLhAoQSYTaLROFRbd5X20Dkzf7MQ==", + "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -2083,6 +2088,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, "license": "MIT" }, "node_modules/filelist": { @@ -3348,6 +3354,7 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, "license": "MIT" }, "node_modules/node-int64": { diff --git a/openrewrite/package.json b/openrewrite/package.json index 3a51dacb..017f941b 100644 --- a/openrewrite/package.json +++ b/openrewrite/package.json @@ -44,6 +44,7 @@ "@types/diff": "^5.2.2", "@types/jest": "^29.5.13", "@types/uuid": "^10.0.0", + "@openrewrite/rewrite-remote" : "~0.3.0", "jest": "^29.7.0", "ts-jest": "^29.2.5", "ts-node": "^10.9.2" diff --git a/openrewrite/src/java/remote/receiver.ts b/openrewrite/src/java/remote/receiver.ts index db0d17d9..132b5019 100644 --- a/openrewrite/src/java/remote/receiver.ts +++ b/openrewrite/src/java/remote/receiver.ts @@ -1,9 +1,9 @@ import * as extensions from "./remote_extensions"; import {Checksum, Cursor, FileAttributes, ListUtils, Tree} from '../../core'; import {DetailsReceiver, Receiver, ReceiverContext, ReceiverFactory, ValueType} from '@openrewrite/rewrite-remote'; -import {JavaVisitor} from '../visitor'; +import {JavaVisitor} from '..'; import {J, Comment, Expression, JavaSourceFile, JavaType, JContainer, JLeftPadded, JRightPadded, Loop, MethodCall, NameTree, Space, Statement, TextComment, TypedTree, TypeTree, AnnotatedType, Annotation, ArrayAccess, ArrayType, Assert, Assignment, AssignmentOperation, Binary, Block, Break, Case, ClassDeclaration, CompilationUnit, Continue, DoWhileLoop, Empty, EnumValue, EnumValueSet, FieldAccess, ForEachLoop, ForLoop, ParenthesizedTypeTree, Identifier, If, Import, InstanceOf, IntersectionType, Label, Lambda, Literal, MemberReference, MethodDeclaration, MethodInvocation, Modifier, MultiCatch, NewArray, ArrayDimension, NewClass, NullableType, Package, ParameterizedType, Parentheses, ControlParentheses, Primitive, Return, Switch, SwitchExpression, Synchronized, Ternary, Throw, Try, TypeCast, TypeParameter, TypeParameters, Unary, VariableDeclarations, WhileLoop, Wildcard, Yield, Unknown} from '../tree'; -import * as Java from "../tree"; +import * as Java from "../../java/tree"; export class JavaReceiver implements Receiver { public fork(ctx: ReceiverContext): ReceiverContext { diff --git a/openrewrite/src/java/remote/sender.ts b/openrewrite/src/java/remote/sender.ts index 05e2641c..a8880dbf 100644 --- a/openrewrite/src/java/remote/sender.ts +++ b/openrewrite/src/java/remote/sender.ts @@ -1,9 +1,9 @@ import * as extensions from "./remote_extensions"; import {Cursor, ListUtils, Tree} from '../../core'; import {Sender, SenderContext, ValueType} from '@openrewrite/rewrite-remote'; -import {JavaVisitor} from '../visitor'; +import {JavaVisitor} from '..'; import {J, Comment, Expression, JavaSourceFile, JavaType, JContainer, JLeftPadded, JRightPadded, Loop, MethodCall, NameTree, Space, Statement, TextComment, TypedTree, TypeTree, AnnotatedType, Annotation, ArrayAccess, ArrayType, Assert, Assignment, AssignmentOperation, Binary, Block, Break, Case, ClassDeclaration, CompilationUnit, Continue, DoWhileLoop, Empty, EnumValue, EnumValueSet, FieldAccess, ForEachLoop, ForLoop, ParenthesizedTypeTree, Identifier, If, Import, InstanceOf, IntersectionType, Label, Lambda, Literal, MemberReference, MethodDeclaration, MethodInvocation, Modifier, MultiCatch, NewArray, ArrayDimension, NewClass, NullableType, Package, ParameterizedType, Parentheses, ControlParentheses, Primitive, Return, Switch, SwitchExpression, Synchronized, Ternary, Throw, Try, TypeCast, TypeParameter, TypeParameters, Unary, VariableDeclarations, WhileLoop, Wildcard, Yield, Unknown} from '../tree'; -import * as Java from "../tree"; +import * as Java from "../../java/tree"; export class JavaSender implements Sender { public send(after: J, before: J | null, ctx: SenderContext): void { diff --git a/openrewrite/src/javascript/parser.ts b/openrewrite/src/javascript/parser.ts index dd055b46..167ba70d 100644 --- a/openrewrite/src/javascript/parser.ts +++ b/openrewrite/src/javascript/parser.ts @@ -246,7 +246,7 @@ export class JavaScriptParserVisitor { ); } - private mapModifiers(node: ts.VariableDeclarationList | ts.VariableStatement | ts.ClassDeclaration | ts.PropertyDeclaration | ts.FunctionDeclaration | ts.ParameterDeclaration) { + private mapModifiers(node: ts.VariableDeclarationList | ts.VariableStatement | ts.ClassDeclaration | ts.PropertyDeclaration | ts.FunctionDeclaration | ts.ParameterDeclaration | ts.MethodDeclaration) { if (ts.isVariableStatement(node)) { return [new J.Modifier( randomId(), @@ -260,7 +260,7 @@ export class JavaScriptParserVisitor { return node.modifiers ? node.modifiers?.filter(ts.isModifier).map(this.mapModifier) : []; } else if (ts.isPropertyDeclaration(node)) { return []; // FIXME - } else if (ts.isFunctionDeclaration(node) || ts.isParameter(node)) { + } else if (ts.isFunctionDeclaration(node) || ts.isParameter(node) || ts.isMethodDeclaration(node)) { return node.modifiers ? node.modifiers?.filter(ts.isModifier).map(this.mapModifier) : []; } else if (ts.isVariableDeclarationList(node)) { let modifier: string | undefined; @@ -570,7 +570,19 @@ export class JavaScriptParserVisitor { } visitTypeParameter(node: ts.TypeParameterDeclaration) { - return this.visitUnknown(node); + if (node.constraint || (node.modifiers && node.modifiers.length) || node.default) { + return this.visitUnknown(node); + } + + return new J.TypeParameter( + randomId(), + this.prefix(node), + Markers.EMPTY, + [], + [], + this.visit(node.name), + null + ); } visitParameter(node: ts.ParameterDeclaration) { @@ -665,7 +677,26 @@ export class JavaScriptParserVisitor { } visitMethodDeclaration(node: ts.MethodDeclaration) { - return this.visitUnknown(node); + return new J.MethodDeclaration( + randomId(), + this.prefix(node), + Markers.EMPTY, + this.mapDecorators(node), + this.mapModifiers(node), + node.typeParameters + ? new J.TypeParameters(randomId(), this.suffix(node.name), Markers.EMPTY, [], node.typeParameters.map(tp => this.rightPadded(this.visit(tp), this.suffix(tp)))) + : null, + node.type ? new JS.TypeInfo(randomId(), this.prefix(node.getChildAt(node.getChildren().indexOf(node.type) - 1)), Markers.EMPTY, this.visit(node.type)): null, + new J.MethodDeclaration.IdentifierWithAnnotations( + node.name ? this.visit(node.name) : this.mapIdentifier(node, ""), + [] + ), + this.mapCommaSeparatedList(this.getParameterListNodes(node)), + null, + node.body ? this.convert(node.body) : null, + null, + this.mapMethodType(node) + ); } visitClassStaticBlockDeclaration(node: ts.ClassStaticBlockDeclaration) { @@ -1487,7 +1518,7 @@ export class JavaScriptParserVisitor { ); } - private getParameterListNodes(node: ts.FunctionDeclaration) { + private getParameterListNodes(node: ts.FunctionDeclaration | ts.MethodDeclaration) { const children = node.getChildren(this.sourceFile); for (let i = 0; i < children.length; i++) { if (children[i].kind == ts.SyntaxKind.OpenParenToken) { @@ -2011,7 +2042,7 @@ export class JavaScriptParserVisitor { return args; } - private mapDecorators(node: ts.ClassDeclaration | ts.FunctionDeclaration): J.Annotation[] { + private mapDecorators(node: ts.ClassDeclaration | ts.FunctionDeclaration | ts.MethodDeclaration): J.Annotation[] { return node.modifiers?.filter(ts.isDecorator)?.map(this.convert) ?? []; } diff --git a/openrewrite/src/javascript/remote/receiver.ts b/openrewrite/src/javascript/remote/receiver.ts index 8497d697..f8091a23 100644 --- a/openrewrite/src/javascript/remote/receiver.ts +++ b/openrewrite/src/javascript/remote/receiver.ts @@ -2,7 +2,7 @@ import * as extensions from "./remote_extensions"; import {Checksum, Cursor, FileAttributes, ListUtils, Tree} from '../../core'; import {DetailsReceiver, Receiver, ReceiverContext, ReceiverFactory, ValueType} from '@openrewrite/rewrite-remote'; import {JavaScriptVisitor} from '..'; -import {JS, JsLeftPadded, JsRightPadded, JsContainer, JsSpace, CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield} from '../tree'; +import {JS, JsLeftPadded, JsRightPadded, JsContainer, JsSpace, CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield, TypeInfo} from '../tree'; import {Expression, J, JContainer, JLeftPadded, JRightPadded, NameTree, Space, Statement, TypeTree, TypedTree} from "../../java"; import * as Java from "../../java/tree"; @@ -292,6 +292,14 @@ class Visitor extends JavaScriptVisitor { return _yield; } + public visitTypeInfo(typeInfo: TypeInfo, ctx: ReceiverContext): J { + typeInfo = typeInfo.withId(ctx.receiveValue(typeInfo.id, ValueType.UUID)!); + typeInfo = typeInfo.withPrefix(ctx.receiveNode(typeInfo.prefix, receiveSpace)!); + typeInfo = typeInfo.withMarkers(ctx.receiveNode(typeInfo.markers, ctx.receiveMarkers)!); + typeInfo = typeInfo.withTypeIdentifier(ctx.receiveNode(typeInfo.typeIdentifier, ctx.receiveTree)!); + return typeInfo; + } + public visitAnnotatedType(annotatedType: Java.AnnotatedType, ctx: ReceiverContext): J { annotatedType = annotatedType.withId(ctx.receiveValue(annotatedType.id, ValueType.UUID)!); annotatedType = annotatedType.withPrefix(ctx.receiveNode(annotatedType.prefix, receiveSpace)!); @@ -1253,6 +1261,15 @@ class Factory implements ReceiverFactory { ); } + if (type === "org.openrewrite.javascript.tree.JS$TypeInfo") { + return new TypeInfo( + ctx.receiveValue(null, ValueType.UUID)!, + ctx.receiveNode(null, receiveSpace)!, + ctx.receiveNode(null, ctx.receiveMarkers)!, + ctx.receiveNode(null, ctx.receiveTree)! + ); + } + if (type === "org.openrewrite.java.tree.J$AnnotatedType") { return new Java.AnnotatedType( ctx.receiveValue(null, ValueType.UUID)!, diff --git a/openrewrite/src/javascript/remote/sender.ts b/openrewrite/src/javascript/remote/sender.ts index 055105cc..a0531501 100644 --- a/openrewrite/src/javascript/remote/sender.ts +++ b/openrewrite/src/javascript/remote/sender.ts @@ -2,7 +2,7 @@ import * as extensions from "./remote_extensions"; import {Cursor, ListUtils, Tree} from '../../core'; import {Sender, SenderContext, ValueType} from '@openrewrite/rewrite-remote'; import {JavaScriptVisitor} from '..'; -import {JS, JsLeftPadded, JsRightPadded, JsContainer, JsSpace, CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield} from '../tree'; +import {JS, JsLeftPadded, JsRightPadded, JsContainer, JsSpace, CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield, TypeInfo} from '../tree'; import {Expression, J, JContainer, JLeftPadded, JRightPadded, Space, Statement} from "../../java"; import * as Java from "../../java/tree"; @@ -287,6 +287,14 @@ class Visitor extends JavaScriptVisitor { return _yield; } + public visitTypeInfo(typeInfo: TypeInfo, ctx: SenderContext): J { + ctx.sendValue(typeInfo, v => v.id, ValueType.UUID); + ctx.sendNode(typeInfo, v => v.prefix, Visitor.sendSpace); + ctx.sendNode(typeInfo, v => v.markers, ctx.sendMarkers); + ctx.sendNode(typeInfo, v => v.typeIdentifier, ctx.sendTree); + return typeInfo; + } + public visitAnnotatedType(annotatedType: Java.AnnotatedType, ctx: SenderContext): J { ctx.sendValue(annotatedType, v => v.id, ValueType.UUID); ctx.sendNode(annotatedType, v => v.prefix, Visitor.sendSpace); diff --git a/openrewrite/src/javascript/tree/support_types.ts b/openrewrite/src/javascript/tree/support_types.ts index b2f0090d..15410180 100644 --- a/openrewrite/src/javascript/tree/support_types.ts +++ b/openrewrite/src/javascript/tree/support_types.ts @@ -212,6 +212,7 @@ export namespace JsSpace { UNION_PREFIX, VOID_PREFIX, YIELD_PREFIX, + TYPE_INFO_PREFIX, } } export namespace JsLeftPadded { diff --git a/openrewrite/src/javascript/tree/tree.ts b/openrewrite/src/javascript/tree/tree.ts index f39bd3ab..b58408d6 100644 --- a/openrewrite/src/javascript/tree/tree.ts +++ b/openrewrite/src/javascript/tree/tree.ts @@ -2345,3 +2345,67 @@ export class Yield extends JSMixin(Object) implements Expression { } } + +@LstType("org.openrewrite.javascript.tree.JS$TypeInfo") +export class TypeInfo extends JSMixin(Object) implements Expression, TypeTree { + public constructor(id: UUID, prefix: Space, markers: Markers, typeIdentifier: TypeTree) { + super(); + this._id = id; + this._prefix = prefix; + this._markers = markers; + this._typeIdentifier = typeIdentifier; + } + + private readonly _id: UUID; + + public get id(): UUID { + return this._id; + } + + public withId(id: UUID): TypeInfo { + return id === this._id ? this : new TypeInfo(id, this._prefix, this._markers, this._typeIdentifier); + } + + private readonly _prefix: Space; + + public get prefix(): Space { + return this._prefix; + } + + public withPrefix(prefix: Space): TypeInfo { + return prefix === this._prefix ? this : new TypeInfo(this._id, prefix, this._markers, this._typeIdentifier); + } + + private readonly _markers: Markers; + + public get markers(): Markers { + return this._markers; + } + + public withMarkers(markers: Markers): TypeInfo { + return markers === this._markers ? this : new TypeInfo(this._id, this._prefix, markers, this._typeIdentifier); + } + + private readonly _typeIdentifier: TypeTree; + + public get typeIdentifier(): TypeTree { + return this._typeIdentifier; + } + + public withTypeIdentifier(typeIdentifier: TypeTree): TypeInfo { + return typeIdentifier === this._typeIdentifier ? this : new TypeInfo(this._id, this._prefix, this._markers, typeIdentifier); + } + + public acceptJavaScript

(v: JavaScriptVisitor

, p: P): J | null { + return v.visitTypeInfo(this, p); + } + + public get type(): JavaType | null { + return extensions.getJavaType(this); + } + + public withType(type: JavaType): TypeInfo { + return extensions.withJavaType(this, type); + } + +} diff --git a/openrewrite/src/javascript/visitor.ts b/openrewrite/src/javascript/visitor.ts index 9d3eafae..9798e03b 100644 --- a/openrewrite/src/javascript/visitor.ts +++ b/openrewrite/src/javascript/visitor.ts @@ -1,7 +1,7 @@ import * as extensions from "./extensions"; import {ListUtils, SourceFile, Tree, TreeVisitor} from "../core"; import {JS, isJavaScript, JsLeftPadded, JsRightPadded, JsContainer, JsSpace} from "./tree"; -import {CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield} from "./tree"; +import {CompilationUnit, Alias, ArrowFunction, Await, DefaultType, Delete, Export, ExpressionStatement, FunctionType, JsImport, JsBinary, ObjectBindingDeclarations, PropertyAssignment, ScopedVariableDeclarations, StatementExpression, TemplateExpression, Tuple, TypeDeclaration, TypeOf, TypeOperator, Unary, Union, Void, Yield, TypeInfo} from "./tree"; import {Expression, J, JContainer, JLeftPadded, JRightPadded, Space, Statement} from "../java/tree"; import {JavaVisitor} from "../java"; import * as Java from "../java/tree"; @@ -382,6 +382,19 @@ export class JavaScriptVisitor

extends JavaVisitor

{ return _yield; } + public visitTypeInfo(typeInfo: TypeInfo, p: P): J | null { + typeInfo = typeInfo.withPrefix(this.visitJsSpace(typeInfo.prefix, JsSpace.Location.TYPE_INFO_PREFIX, p)!); + let tempExpression = this.visitExpression(typeInfo, p) as Expression; + if (!(tempExpression instanceof TypeInfo)) + { + return tempExpression; + } + typeInfo = tempExpression as TypeInfo; + typeInfo = typeInfo.withMarkers(this.visitMarkers(typeInfo.markers, p)); + typeInfo = typeInfo.withTypeIdentifier(this.visitAndCast(typeInfo.typeIdentifier, p)!); + return typeInfo; + } + public visitJsLeftPadded(left: JLeftPadded | null, loc: JsLeftPadded.Location, p: P): JLeftPadded { return extensions.visitJsLeftPadded(this, left, loc, p); } diff --git a/openrewrite/test/javascript/parser/method.test.ts b/openrewrite/test/javascript/parser/method.test.ts new file mode 100644 index 00000000..ac9debb9 --- /dev/null +++ b/openrewrite/test/javascript/parser/method.test.ts @@ -0,0 +1,138 @@ +import {connect, disconnect, rewriteRun, rewriteRunWithOptions, typeScript} from '../testHarness'; + +describe('method mapping', () => { + beforeAll(() => connect()); + afterAll(() => disconnect()); + + test('simple', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test() { + // hello world comment + } + } + `) + ); + }); + + + test('single parameter', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input) { + // hello world comment + } + } + `) + ); + }); + + test('single typed parameter', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: string) { + // hello world comment + } + } + `) + ); + }); + + test('single typed parameter with initializer', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input /*asda*/: string = /*8asdas */ "hello world" ) { + // hello world comment + } + } + `) + ); + }); + + test('single parameter with initializer', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input = 1) { + // hello world comment + } + } + `) + ); + }); + + test('multi parameters', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: string, a = 1, test: number) { + // hello world comment + } + } + `) + ); + }); + + test('parameter with trailing comma', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: string , ) { + // hello world comment + } + } + `) + ); + }); + + test('type parameters', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: T , ) { + // hello world comment + } + } + `) + ); + }); + + test.skip('type parameters with bounds', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: T , ) { + // hello world comment + } + } + `) + ); + }); + + test('return type', () => { + rewriteRun( + //language=typescript + typeScript(` + class Handler { + test(input: string , ) /*1*/ : /*asda*/ string { + // hello world comment + return input; + } + } + `) + ); + }); +}); diff --git a/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptReceiver.java b/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptReceiver.java index c310d8af..06b63a72 100644 --- a/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptReceiver.java +++ b/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptReceiver.java @@ -364,6 +364,15 @@ public JS.Yield visitYield(JS.Yield yield, ReceiverContext ctx) { return yield; } + @Override + public JS.TypeInfo visitTypeInfo(JS.TypeInfo typeInfo, ReceiverContext ctx) { + typeInfo = typeInfo.withId(ctx.receiveNonNullValue(typeInfo.getId(), UUID.class)); + typeInfo = typeInfo.withPrefix(ctx.receiveNonNullNode(typeInfo.getPrefix(), JavaScriptReceiver::receiveSpace)); + typeInfo = typeInfo.withMarkers(ctx.receiveNonNullNode(typeInfo.getMarkers(), ctx::receiveMarkers)); + typeInfo = typeInfo.withTypeIdentifier(ctx.receiveNonNullNode(typeInfo.getTypeIdentifier(), ctx::receiveTree)); + return typeInfo; + } + @Override public J.AnnotatedType visitAnnotatedType(J.AnnotatedType annotatedType, ReceiverContext ctx) { annotatedType = annotatedType.withId(ctx.receiveNonNullValue(annotatedType.getId(), UUID.class)); @@ -1355,6 +1364,15 @@ public T create(Class type, ReceiverContext ctx) { ); } + if (type == JS.TypeInfo.class) { + return (T) new JS.TypeInfo( + ctx.receiveNonNullValue(null, UUID.class), + ctx.receiveNonNullNode(null, JavaScriptReceiver::receiveSpace), + ctx.receiveNonNullNode(null, ctx::receiveMarkers), + ctx.receiveNonNullNode(null, ctx::receiveTree) + ); + } + if (type == J.AnnotatedType.class) { return (T) new J.AnnotatedType( ctx.receiveNonNullValue(null, UUID.class), diff --git a/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptSender.java b/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptSender.java index 6e619826..2c588d30 100644 --- a/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptSender.java +++ b/rewrite-javascript-remote/src/main/java/org/openrewrite/javascript/remote/JavaScriptSender.java @@ -347,6 +347,15 @@ public JS.Yield visitYield(JS.Yield yield, SenderContext ctx) { return yield; } + @Override + public JS.TypeInfo visitTypeInfo(JS.TypeInfo typeInfo, SenderContext ctx) { + ctx.sendValue(typeInfo, JS.TypeInfo::getId); + ctx.sendNode(typeInfo, JS.TypeInfo::getPrefix, JavaScriptSender::sendSpace); + ctx.sendNode(typeInfo, JS.TypeInfo::getMarkers, ctx::sendMarkers); + ctx.sendNode(typeInfo, JS.TypeInfo::getTypeIdentifier, ctx::sendTree); + return typeInfo; + } + @Override public J.AnnotatedType visitAnnotatedType(J.AnnotatedType annotatedType, SenderContext ctx) { ctx.sendValue(annotatedType, J.AnnotatedType::getId); diff --git a/rewrite-javascript/src/main/java/org/openrewrite/javascript/JavaScriptVisitor.java b/rewrite-javascript/src/main/java/org/openrewrite/javascript/JavaScriptVisitor.java index b4f027f2..a643060e 100644 --- a/rewrite-javascript/src/main/java/org/openrewrite/javascript/JavaScriptVisitor.java +++ b/rewrite-javascript/src/main/java/org/openrewrite/javascript/JavaScriptVisitor.java @@ -579,4 +579,18 @@ public J visitYield(JS.Yield yield, P p) { y = y.withExpression(visitAndCast(y.getExpression(), p)); return y; } + + public J visitTypeInfo(JS.TypeInfo typeInfo, P p) { + JS.TypeInfo ti = typeInfo; + ti = ti.withPrefix(visitSpace(ti.getPrefix(), JsSpace.Location.YIELD_PREFIX, p)); + ti = ti.withMarkers(visitMarkers(ti.getMarkers(), p)); + Expression temp = (Expression) visitExpression(ti, p); + if (!(temp instanceof JS.TypeInfo)) { + return temp; + } else { + ti = (JS.TypeInfo) temp; + } + ti = ti.withTypeIdentifier(visitAndCast(ti.getTypeIdentifier(), p)); + return ti; + } } diff --git a/rewrite-javascript/src/main/java/org/openrewrite/javascript/internal/JavaScriptPrinter.java b/rewrite-javascript/src/main/java/org/openrewrite/javascript/internal/JavaScriptPrinter.java index 8895b8bb..206cb619 100644 --- a/rewrite-javascript/src/main/java/org/openrewrite/javascript/internal/JavaScriptPrinter.java +++ b/rewrite-javascript/src/main/java/org/openrewrite/javascript/internal/JavaScriptPrinter.java @@ -424,6 +424,19 @@ public J visitYield(JS.Yield yield, PrintOutputCapture

p) { return yield; } + @Override + public J visitTypeInfo(JS.TypeInfo typeInfo, PrintOutputCapture

p) { + beforeSyntax(typeInfo, JsSpace.Location.TYPE_INFO_PREFIX, p); + + p.append(":"); + + visit(typeInfo.getTypeIdentifier(), p); + + afterSyntax(typeInfo, p); + + return typeInfo; + } + private class JavaScriptJavaPrinter extends JavaPrinter

{ @Override diff --git a/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JS.java b/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JS.java index 4c17b4e3..86811110 100644 --- a/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JS.java +++ b/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JS.java @@ -2107,4 +2107,42 @@ public CoordinateBuilder.Expression getCoordinates() { return new CoordinateBuilder.Expression(this); } } + + @Getter + @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) + @EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true) + @RequiredArgsConstructor + @With + final class TypeInfo implements JS, Expression, TypeTree { + + @EqualsAndHashCode.Include + UUID id; + + Space prefix; + + Markers markers; + + TypeTree typeIdentifier; + + @Override + public

J acceptJavaScript(JavaScriptVisitor

v, P p) { + return v.visitTypeInfo(this, p); + } + + @Override + public @Nullable JavaType getType() { + return typeIdentifier.getType(); + } + + @Override + @SuppressWarnings("unchecked") + public TypeInfo withType(@Nullable JavaType type) { + return typeIdentifier.getType() == type ? this : new TypeInfo(id, prefix, markers, typeIdentifier.withType(type)); + } + + @Override + public CoordinateBuilder.Expression getCoordinates() { + return new CoordinateBuilder.Expression(this); + } + } } diff --git a/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JsSpace.java b/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JsSpace.java index 17143779..65f2586a 100644 --- a/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JsSpace.java +++ b/rewrite-javascript/src/main/java/org/openrewrite/javascript/tree/JsSpace.java @@ -71,5 +71,7 @@ public enum Location { VARIABLE_DECLARATION_PREFIX, VOID_PREFIX, YIELD_PREFIX, + TYPE_INFO_PREFIX, + TYPE_REFERENCE_PREFIX, } }