From 27235820d5d5c703d2c4eff0341a248351160974 Mon Sep 17 00:00:00 2001 From: "Ahmad K. Bawaneh" Date: Wed, 25 Oct 2023 19:16:54 +0300 Subject: [PATCH] Correctly emit protected constructors (#92) if a class has a private constructors and all other constructors are ignored, we should be emitting a protected constructor. currently we dont since we dont filter for private constructors. this commit should fix that (cherry picked from commit 017556cd0dc6e38ca7a231cd8aa455a0dd861509) --- .../tsdefs/impl/builders/TsElement.java | 17 +++------ ...TypeWithPrivateAndIgnoredConstructors.java | 37 +++++++++++++++++++ .../src/test/resources/types/test.ts | 17 ++++++++- 3 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 jsinterop-ts-defs-test/src/test/java/com/vertispan/tsdefs/tests/constructors/JsTypeWithPrivateAndIgnoredConstructors.java diff --git a/jsinterop-ts-defs-impl/src/main/java/com/vertispan/tsdefs/impl/builders/TsElement.java b/jsinterop-ts-defs-impl/src/main/java/com/vertispan/tsdefs/impl/builders/TsElement.java index 5cec5b4..948c2b6 100644 --- a/jsinterop-ts-defs-impl/src/main/java/com/vertispan/tsdefs/impl/builders/TsElement.java +++ b/jsinterop-ts-defs-impl/src/main/java/com/vertispan/tsdefs/impl/builders/TsElement.java @@ -749,18 +749,11 @@ public Optional getClassValueFromAnnotation( public boolean requiresProtectedConstructor() { if (isJsType()) { - List constructors = - element.getEnclosedElements().stream() - .map(enclosedElement -> TsElement.of(enclosedElement, env)) - .filter(TsElement::isConstructor) - .collect(Collectors.toList()); - boolean allIgnored = - !constructors.isEmpty() && constructors.stream().allMatch(TsElement::isIgnored); - - if (allIgnored) { - return true; - } - + return element.getEnclosedElements().stream() + .map(enclosedElement -> TsElement.of(enclosedElement, env)) + .filter(TsElement::isConstructor) + .filter(tsElement -> !tsElement.isPrivate()) + .allMatch(TsElement::isIgnored); } else { Optional jsConstructor = element.getEnclosedElements().stream() diff --git a/jsinterop-ts-defs-test/src/test/java/com/vertispan/tsdefs/tests/constructors/JsTypeWithPrivateAndIgnoredConstructors.java b/jsinterop-ts-defs-test/src/test/java/com/vertispan/tsdefs/tests/constructors/JsTypeWithPrivateAndIgnoredConstructors.java new file mode 100644 index 0000000..e905f96 --- /dev/null +++ b/jsinterop-ts-defs-test/src/test/java/com/vertispan/tsdefs/tests/constructors/JsTypeWithPrivateAndIgnoredConstructors.java @@ -0,0 +1,37 @@ +/* + * Copyright © 2023 Vertispan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.vertispan.tsdefs.tests.constructors; + +import jsinterop.annotations.JsIgnore; +import jsinterop.annotations.JsType; + +@JsType +public class JsTypeWithPrivateAndIgnoredConstructors { + + public String property1; + public String property2; + + private JsTypeWithPrivateAndIgnoredConstructors(String property) { + this.property1 = property; + this.property2 = property; + } + + @JsIgnore + public JsTypeWithPrivateAndIgnoredConstructors(String property1, String property2) { + this.property1 = property1; + this.property2 = property2; + } +} diff --git a/jsinterop-ts-defs-test/src/test/resources/types/test.ts b/jsinterop-ts-defs-test/src/test/resources/types/test.ts index 0c914b5..95339f5 100644 --- a/jsinterop-ts-defs-test/src/test/resources/types/test.ts +++ b/jsinterop-ts-defs-test/src/test/resources/types/test.ts @@ -112,7 +112,7 @@ import UnionTypeApi = com.vertispan.tsdefs.tests.tsunion.UnionTypeApi; import JsTypeGrandChild = com.vertispan.tsdefs.tests.inheritance.JsTypeGrandChild; import JsTypeGrandChild2 = com.vertispan.tsdefs.tests.inheritance.JsTypeGrandChild2; - +import JsTypeWithPrivateAndIgnoredConstructors = com.vertispan.tsdefs.tests.constructors.JsTypeWithPrivateAndIgnoredConstructors; // ---------- Properties tests ------------------------- const jsTypeWithProperties = new JsTypeWithProperties(); @@ -1012,4 +1012,17 @@ class ImplementsUnionTypeApiUndefined implements UnionTypeApi { arraysFunction(param1: Array>, param2: Array>): number | Array>> | undefined | null { return undefined; } -} \ No newline at end of file +} + +// @ts-expect-error +const jsTypeWithPrivateAndIgnoredConstructors= new JsTypeWithPrivateAndIgnoredConstructors(); +// @ts-expect-error +const jsTypeWithPrivateAndIgnoredConstructors= new JsTypeWithPrivateAndIgnoredConstructors("property"); +// @ts-expect-error +const jsTypeWithPrivateAndIgnoredConstructors= new JsTypeWithPrivateAndIgnoredConstructors("property1", "property2"); + +class ExtendsFromJsTypeWithPrivateAndIgnoredConstructors extends JsTypeWithPrivateAndIgnoredConstructors { + constructor() { + super(); + } +}