Skip to content

Commit

Permalink
Allow jsdoc propagation for regex literals during .i.js generation.
Browse files Browse the repository at this point in the history
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130120918
  • Loading branch information
blickly committed Aug 12, 2016
1 parent 61b9aa0 commit 8030e16
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 15 deletions.
37 changes: 22 additions & 15 deletions src/com/google/javascript/jscomp/ConvertToTypedInterface.java
Expand Up @@ -118,6 +118,9 @@ private static JSDocInfo getJSDocForRhs(NodeTraversal t, Node rhs, JSDocInfo old
case VOID:
return getTypeJSDoc(oldJSDoc, "void");
case OBJECT:
if (rhs.isRegExp()) {
return getTypeJSDoc(oldJSDoc, new Node(Token.BANG, IR.string("RegExp")));
}
break;
case UNDETERMINED:
if (rhs.isName()) {
Expand All @@ -139,15 +142,11 @@ private static JSDocInfo getJSDocForName(Var decl, JSDocInfo oldJSDoc) {
}
switch (expr.getRoot().getToken()) {
case EQUALS:
if (decl.isDefaultParam()) {
expr = new JSTypeExpression(expr.getRoot().getFirstChild().cloneTree(), "<synthetic>");
} else {
expr = new JSTypeExpression(
new Node(Token.PIPE,
expr.getRoot().getFirstChild().cloneTree(),
IR.string("undefined")),
"<synthetic>");
Node typeRoot = expr.getRoot().getFirstChild().cloneTree();
if (!decl.isDefaultParam()) {
typeRoot = new Node(Token.PIPE, typeRoot, IR.string("undefined"));
}
expr = asTypeExpression(typeRoot);
break;
case ELLIPSIS:
{
Expand All @@ -156,7 +155,7 @@ private static JSDocInfo getJSDocForName(Var decl, JSDocInfo oldJSDoc) {
type.addChildToBack(array);
Node block = new Node(Token.BLOCK, expr.getRoot().getFirstChild().cloneTree());
array.addChildToBack(block);
expr = new JSTypeExpression(type, "<synthetic>");
expr = asTypeExpression(type);
break;
}
default:
Expand Down Expand Up @@ -503,25 +502,33 @@ private static JSDocInfo pullJsdocTypeFromAst(
JSType type = nameNode.getJSType();
if (type == null) {
compiler.report(JSError.make(nameNode, CONSTANT_WITHOUT_EXPLICIT_TYPE));
return getTypeJSDoc(oldJSDoc, new JSTypeExpression(new Node(Token.STAR), ""));
return getTypeJSDoc(oldJSDoc, new Node(Token.STAR));
} else {
return getTypeJSDoc(oldJSDoc, type.toNonNullAnnotationString());
}
}

private static JSDocInfo getAllTypeJSDoc() {
JSDocInfoBuilder builder = new JSDocInfoBuilder(false);
builder.recordType(new JSTypeExpression(new Node(Token.STAR), ""));
builder.recordType(asTypeExpression(new Node(Token.STAR)));
return builder.build();
}

private static JSTypeExpression asTypeExpression(Node typeAst) {
return new JSTypeExpression(typeAst, "<synthetic>");
}

private static JSDocInfo getTypeJSDoc(JSDocInfo oldJSDoc, String contents) {
return getTypeJSDoc(oldJSDoc, Node.newString(contents));
}

private static JSDocInfo getTypeJSDoc(JSDocInfo oldJSDoc, Node typeAst) {
return getTypeJSDoc(oldJSDoc, asTypeExpression(typeAst));
}

private static JSDocInfo getTypeJSDoc(JSDocInfo oldJSDoc, JSTypeExpression newType) {
JSDocInfoBuilder builder = JSDocInfoBuilder.copyFrom(oldJSDoc);
builder.recordType(newType);
return builder.build();
}

private static JSDocInfo getTypeJSDoc(JSDocInfo oldJSDoc, String contents) {
return getTypeJSDoc(oldJSDoc, new JSTypeExpression(Node.newString(contents), ""));
}
}
Expand Up @@ -49,6 +49,7 @@ public void testSimpleConstJsdocPropagation() {
test("/** @const */ var x = 'str';", "/** @const {string} */ var x;");
test("/** @const */ var x = null;", "/** @const {null} */ var x;");
test("/** @const */ var x = void 0;", "/** @const {void} */ var x;");
test("/** @const */ var x = /a/;", "/** @const {!RegExp} */ var x;");

test(
"/** @constructor */ function Foo() { /** @const */ this.x = 5; }",
Expand Down

0 comments on commit 8030e16

Please sign in to comment.