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

Commit 20a3c09

Browse files
committed
Add support for Arguments and NodeList.
Platform apis like Arguments and Nodelist need to be translated to their corresponding apis in lib.d.ts Upgrade closure to the newest released version.
1 parent 00bb20f commit 20a3c09

File tree

5 files changed

+79
-15
lines changed

5 files changed

+79
-15
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ dependencies {
2222
runtime 'args4j:args4j:2.0.26'
2323
runtime 'com.google.code.gson:gson:2.3.1'
2424

25-
compile 'com.google.javascript:closure-compiler:v20150609'
25+
compile 'com.google.javascript:closure-compiler:v20150901'
2626
compile 'com.google.guava:guava:18.0'
2727

2828
testCompile 'junit:junit:4.11'

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

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -480,18 +480,7 @@ private void walk(TypedVar symbol, boolean isDefault) {
480480
}
481481

482482
private void walkDefaultInterface(FunctionType ftype) {
483-
for (String propName : ftype.getOwnPropertyNames()) {
484-
if (propName.equals("prototype")) continue;
485-
JSType pType = ftype.getPropertyType(propName);
486-
// Here we assume the enum is exported and handled separately.
487-
if (pType.isEnumType()) continue;
488-
emit("var");
489-
emit(propName);
490-
emit(":");
491-
visitType(pType);
492-
emit(";");
493-
emitBreak();
494-
}
483+
visitNamespaceLikeType(ftype);
495484
}
496485

497486
private void visitTemplateTypes(ObjectType type) {
@@ -643,6 +632,20 @@ public Void caseTemplatizedType(TemplatizedType type) {
643632
emit("[]");
644633
return null;
645634
}
635+
// Arguments<?> and NodeList<?> in es3 externs are correspondinly
636+
// IArguments and NodeList interfaces (not-parametrized) in lib.d.ts.
637+
// New* are temporary work-arounds for upstream externs.
638+
// TODO(rado): upgrade closure compiler and remove them.
639+
if (type.getDisplayName().equals("Arguments") ||
640+
type.getDisplayName().equals("NewArguments")) {
641+
emit("IArguments");
642+
return null;
643+
}
644+
if (type.getDisplayName().equals("NodeList") ||
645+
type.getDisplayName().equals("NewNodeList")) {
646+
emit("NodeList");
647+
return null;
648+
}
646649
Iterator<JSType> it = type.getTemplateTypes().iterator();
647650
if (typeRegistry.getNativeType(OBJECT_TYPE).equals(referencedType)) {
648651
emit("{ [");
@@ -750,7 +753,18 @@ public Void caseProxyObjectType(ProxyObjectType type) {
750753
// behave like an object with bunch of props, but are not technically defined as
751754
// record types.
752755
private void visitNamespaceLikeType(ObjectType type) {
753-
756+
for (String propName : type.getOwnPropertyNames()) {
757+
if (propName.equals("prototype")) continue;
758+
JSType pType = type.getPropertyType(propName);
759+
// Here we assume the enum is exported and handled separately.
760+
if (pType.isEnumType()) continue;
761+
emit("var");
762+
emit(propName);
763+
emit(":");
764+
visitType(pType);
765+
emit(";");
766+
emitBreak();
767+
}
754768
}
755769

756770
private void visitRecordType(RecordType type) {

src/test/java/com/google/javascript/cl2dts/types_with_externs.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ declare module 'goog:typesWithExterns.A' {
1111
declare namespace ಠ_ಠ.cl2dts_internal.typesWithExterns {
1212
function elementMaybe ( ) : Element ;
1313
var a : { a : number } ;
14+
var b : IArguments ;
15+
type ArrayLike = NodeList | IArguments | { length : number } ;
16+
var c : NodeList | IArguments | { length : number } ;
17+
function id (x : NodeList | IArguments | { length : number } ) : NodeList | IArguments | { length : number } ;
1418
}
1519
declare module 'goog:typesWithExterns' {
1620
import alias = ಠ_ಠ.cl2dts_internal.typesWithExterns;

src/test/java/com/google/javascript/cl2dts/types_with_externs.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ goog.provide('typesWithExterns.A');
33
goog.provide('typesWithExterns.B');
44
goog.provide('typesWithExterns.C');
55

6+
67
/**
78
* @return {Element}
89
*/
@@ -43,3 +44,47 @@ typesWithExterns.C = function() {
4344
typesWithExterns.A.apply(this, arguments);
4445
};
4546
goog.inherits(typesWithExterns.C, typesWithExterns.A);
47+
48+
49+
// NewArguments and NewNodeList are copied from an upstream es3.js extern
50+
// TODO(rado): upgrade closure compiler and remove them when released.
51+
52+
/**
53+
* @constructor
54+
* @implements {IArrayLike<?>}
55+
*/
56+
function NewArguments() {}
57+
58+
/**
59+
* @type {number}
60+
*/
61+
NewArguments.prototype.length;
62+
63+
/**
64+
* @constructor
65+
* @implements {IArrayLike<?>}
66+
*/
67+
function NewNodeList() {}
68+
69+
/**
70+
* @type {number}
71+
*/
72+
NewNodeList.prototype.length;
73+
74+
75+
/** @type {NewArguments} */
76+
typesWithExterns.b = null;
77+
78+
/**
79+
* @typedef {NewNodeList|NewArguments|{length: number}}
80+
*/
81+
typesWithExterns.ArrayLike;
82+
83+
/** @type {typesWithExterns.ArrayLike} */
84+
typesWithExterns.c = null;
85+
86+
/**
87+
* @param {typesWithExterns.ArrayLike} x
88+
* @returns {typesWithExterns.ArrayLike}
89+
*/
90+
typesWithExterns.id = function(x) { return x; }
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
import {elementMaybe} from 'goog:typesWithExterns';
1+
import {elementMaybe, id} from 'goog:typesWithExterns';
22

33
var el: Element = elementMaybe();
4+
var els: ArrayLike<any> = id(document.getElementsByClassName('foo'));

0 commit comments

Comments
 (0)