mirror of
https://github.com/cincheo/jsweet.git
synced 2025-12-15 15:29:22 +00:00
fix #346 (workaround)
see https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
This commit is contained in:
parent
2e5e352fa0
commit
977b2de73e
@ -540,8 +540,9 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
||||
}
|
||||
|
||||
if (symbol != null) {
|
||||
// @ represents a common root in case there is no common root package
|
||||
// => pathToImportedClass cannot be null because of the common @ root
|
||||
// '@' represents a common root in case there is no common root
|
||||
// package => pathToImportedClass cannot be null because of the
|
||||
// common '@' root
|
||||
String pathToImportedClass = Util.getRelativePath(
|
||||
"@/" + compilationUnit.packge.toString().replace('.', '/'),
|
||||
"@/" + importedClass.toString().replace('.', '/'));
|
||||
@ -2470,6 +2471,12 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
||||
protected void printInstanceInitialization(JCClassDecl clazz, MethodSymbol method) {
|
||||
if (method == null || method.isConstructor()) {
|
||||
getScope().hasDeclaredConstructor = true;
|
||||
// this workaround will not work on all browsers (see
|
||||
// https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work)
|
||||
if (context.types.isAssignable(clazz.sym.type, context.symtab.throwableType)) {
|
||||
printIndent().print("(<any>Object).setPrototypeOf(this, " + getClassName(clazz.sym) + ".prototype);")
|
||||
.println();
|
||||
}
|
||||
if (getScope().innerClassNotStatic && !getScope().enumWrapperClassScope) {
|
||||
printIndent().print("this." + PARENT_CLASS_FIELD_NAME + " = " + PARENT_CLASS_FIELD_NAME + ";")
|
||||
.println();
|
||||
|
||||
@ -787,7 +787,7 @@ public class Java2TypeScriptAdapter extends PrinterAdapter {
|
||||
case "getMessage":
|
||||
if (targetType instanceof TypeElement) {
|
||||
if (types().isAssignable(targetType.asType(), util().getType(Throwable.class))) {
|
||||
print(invocationElement.getTargetExpression()).print(".message");
|
||||
printTarget(invocationElement.getTargetExpression()).print(".message");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@ import org.jsweet.transpiler.ModuleKind;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import source.throwable.ExtendedThrowables;
|
||||
import source.throwable.InvalidTryCatchTest;
|
||||
import source.throwable.MultipleTryCatchTest;
|
||||
import source.throwable.Throwables;
|
||||
@ -75,4 +76,11 @@ public class ThrowableTests extends AbstractTest {
|
||||
}, getSourceFile(Throwables.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExtendedThrowables() {
|
||||
eval((handler, result) -> {
|
||||
handler.assertNoProblems();
|
||||
}, getSourceFile(ExtendedThrowables.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* JSweet - http://www.jsweet.org
|
||||
* Copyright (C) 2015 CINCHEO SAS <renaud.pawlak@cincheo.fr>
|
||||
*
|
||||
* 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 source.throwable;
|
||||
|
||||
public class ExtendedThrowables {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
try {
|
||||
m2();
|
||||
} catch (MyThrowable4 t) {
|
||||
assert t instanceof MyThrowable4;
|
||||
assert t.getMessage().equals("message");
|
||||
assert t.getMsg2().equals("message");
|
||||
}
|
||||
try {
|
||||
if (true) {
|
||||
throw new MyError(true);
|
||||
}
|
||||
} catch (MyError ex) {
|
||||
assert ex.isValid();
|
||||
}
|
||||
}
|
||||
|
||||
static void m2() {
|
||||
throw new MyThrowable4("message");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
class MyThrowable4 extends RuntimeException {
|
||||
|
||||
public MyThrowable4(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public String getMsg2() {
|
||||
return getMessage();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
class MyError extends def.js.Error {
|
||||
|
||||
private final boolean valid;
|
||||
|
||||
public MyError(boolean valid) {
|
||||
this.valid = valid;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return valid;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user