Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit a325f55

Browse files
teppeismprobst
authored andcommitted
Fix NamedNodeMap that is not templatized in TypeScript
1 parent 6f1f948 commit a325f55

4 files changed

Lines changed: 26 additions & 19 deletions

File tree

src/main/java/com/google/javascript/clutz/DeclarationGenerator.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2259,30 +2259,20 @@ private Void emitTemplatizedType(TemplatizedType type, boolean inImplementsExten
22592259
return null;
22602260
}
22612261

2262-
switch (type.getDisplayName()) {
2263-
// Arguments<?> and NodeList<?> in es3 externs are correspondingly
2264-
// IArguments and NodeList interfaces (not-parametrized) in lib.d.ts.
2265-
case "Arguments":
2266-
emit("IArguments");
2267-
return null;
2268-
case "NodeList":
2269-
emit("NodeList");
2270-
return null;
2271-
case "MessageEvent":
2272-
emit("MessageEvent");
2273-
return null;
2274-
default:
2275-
break;
2262+
final String displayName = type.getDisplayName();
2263+
if (PlatformSymbols.NOT_TEMPLATIZED_IN_TYPESCRIPT.contains(displayName)) {
2264+
emit(PlatformSymbols.CLOSURE_TO_TYPESCRIPT.getOrDefault(displayName, displayName));
2265+
return null;
22762266
}
22772267

2278-
String maybeGlobalName = maybeRenameGlobalType(type.getDisplayName());
2268+
String maybeGlobalName = maybeRenameGlobalType(displayName);
22792269
templateTypeName = maybeGlobalName == null ? templateTypeName : maybeGlobalName;
22802270

22812271
if (type.getTemplateTypes().isEmpty()) {
22822272
// In Closure, subtypes of `TemplatizedType`s that do not take type arguments are still
22832273
// represented by templatized types.
22842274
emit(templateTypeName);
2285-
typesUsed.add(type.getDisplayName());
2275+
typesUsed.add(displayName);
22862276
return null;
22872277
}
22882278
Iterator<JSType> it = type.getTemplateTypes().iterator();
@@ -2293,7 +2283,7 @@ private Void emitTemplatizedType(TemplatizedType type, boolean inImplementsExten
22932283
return null;
22942284
}
22952285
emit(templateTypeName);
2296-
typesUsed.add(type.getDisplayName());
2286+
typesUsed.add(displayName);
22972287
emitGenericTypeArguments(it);
22982288
return null;
22992289
}

src/main/java/com/google/javascript/clutz/PlatformSymbols.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ public class PlatformSymbols {
3232
.put("IIterableResult", "IteratorResult")
3333
.build();
3434

35+
/** Closure symbols that are templatized in Closure but not in TypeScript. */
36+
public static final ImmutableSet<String> NOT_TEMPLATIZED_IN_TYPESCRIPT =
37+
new ImmutableSet.Builder<String>()
38+
.add("Arguments")
39+
.add("NodeList")
40+
.add("MessageEvent")
41+
.add("NamedNodeMap")
42+
.build();
43+
3544
/**
3645
* List of global platform symbols that are redirected through an alias in closure.lib.d.ts. This
3746
* allows the following pattern to work:

src/test/java/com/google/javascript/clutz/types_externs_with_platform.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ declare namespace ಠ_ಠ.clutz.typesWithExterns {
1111
let a : { a : number } ;
1212
let b : IArguments ;
1313
let c : NodeList ;
14+
let d : MessageEvent ;
15+
let e : NamedNodeMap ;
1416
function elementMaybe ( ) : GlobalElement | null ;
1517
let myScope : ಠ_ಠ.clutz.namespace.Foo ;
1618
function topLevelFunction ( ...a : any [] ) : any ;

src/test/java/com/google/javascript/clutz/types_externs_with_platform.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,18 @@ typesWithExterns.C = function() {
4545
};
4646
goog.inherits(typesWithExterns.C, typesWithExterns.A);
4747

48-
/** @type {!Arguments} */
48+
/** @type {!Arguments<*>} */
4949
typesWithExterns.b;
5050

51-
/** @type {!NodeList} */
51+
/** @type {!NodeList<*>} */
5252
typesWithExterns.c;
5353

54+
/** @type {!MessageEvent<*>} */
55+
typesWithExterns.d;
56+
57+
/** @type {!NamedNodeMap<*>} */
58+
typesWithExterns.e;
59+
5460
/** @typedef {IArrayLike} */
5561
typesWithExterns.ArrayLike;
5662

0 commit comments

Comments
 (0)