Renaud Pawlak 2017-08-22 16:36:24 +02:00
parent 2e5e352fa0
commit 977b2de73e
4 changed files with 89 additions and 3 deletions

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}