Skip to content

Commit

Permalink
Update the ASTValidator to properly validate keynames of class members.
Browse files Browse the repository at this point in the history
Also remove invalid special case from validateTemplateLit

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=173929370
  • Loading branch information
concavelenz authored and brad4d committed Oct 31, 2017
1 parent 514ebff commit 81bcf43
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 12 deletions.
26 changes: 14 additions & 12 deletions src/com/google/javascript/jscomp/AstValidator.java
Expand Up @@ -475,12 +475,8 @@ private void validateTemplateLit(Node n) {
if (!n.hasChildren()) { if (!n.hasChildren()) {
return; return;
} }
int i = 0; for (Node child = n.getFirstChild(); child != null; child = child.getNext()) {
for (Node child = n.getFirstChild(); child != null; child = child.getNext(), i++) { if (child.isString()) {
// If the first child is not a STRING, this is a tagged template.
if (i == 0 && !child.isString()) {
validateExpression(child);
} else if (child.isString()) {
validateString(child); validateString(child);
} else { } else {
validateTemplateLitSub(child); validateTemplateLitSub(child);
Expand Down Expand Up @@ -604,6 +600,7 @@ private void validateClassMember(Node n, boolean isAmbient) {
case MEMBER_FUNCTION_DEF: case MEMBER_FUNCTION_DEF:
case GETTER_DEF: case GETTER_DEF:
case SETTER_DEF: case SETTER_DEF:
validateObjectLiteralKeyName(n);
validateChildCount(n); validateChildCount(n);
Node function = n.getFirstChild(); Node function = n.getFirstChild();
if (isAmbient) { if (isAmbient) {
Expand Down Expand Up @@ -667,23 +664,28 @@ private void validateLabelName(Node n) {
} }


private void validateNonEmptyString(Node n) { private void validateNonEmptyString(Node n) {
validateNonNullString(n); if (validateNonNullString(n) && n.getString().isEmpty()) {
if (n.getString().isEmpty()) {
violation("Expected non-empty string.", n); violation("Expected non-empty string.", n);
} }
} }


private void validateEmptyString(Node n) { private void validateEmptyString(Node n) {
validateNonNullString(n); if (validateNonNullString(n) && !n.getString().isEmpty()) {
if (!n.getString().isEmpty()) {
violation("Expected empty string.", n); violation("Expected empty string.", n);
} }
} }


private void validateNonNullString(Node n) { private boolean validateNonNullString(Node n) {
if (n.getString() == null) { try {
if (n.getString() == null) {
violation("Expected non-null string.", n);
return false;
}
} catch (Exception e) {
violation("Expected non-null string.", n); violation("Expected non-null string.", n);
return false;
} }
return true;
} }


private void validateName(Node n) { private void validateName(Node n) {
Expand Down
29 changes: 29 additions & 0 deletions test/com/google/javascript/jscomp/AstValidatorTest.java
Expand Up @@ -59,6 +59,35 @@ protected void setUp() throws Exception {
disableLineNumberCheck(); disableLineNumberCheck();
} }


public void testClass() {
valid(lines(
"class C {",
" get m1() {return 1}",
" set m1(a) {}",
" m2(a) {}",
" ['m2']() {}",
" [m2]() {}",
"}"));

Node c = new Node(Token.CLASS, IR.name("C"), IR.empty());
Node members = new Node(Token.CLASS_MEMBERS);
c.addChildToBack(members);
expectValid(c, Check.STATEMENT);
Node method1 = new Node(
Token.MEMBER_FUNCTION_DEF, IR.function(IR.name(""), IR.paramList(), IR.block()));
members.addChildToBack(method1);
expectInvalid(c, Check.STATEMENT);

members.detachChildren();

// Invalid empty string
Node method2 = Node.newString(Token.MEMBER_FUNCTION_DEF, "");
method2.addChildToBack(IR.function(IR.name(""), IR.paramList(), IR.block()));
members.addChildToBack(method2);

expectInvalid(c, Check.STATEMENT);
}

public void testForIn() { public void testForIn() {
valid("for(var a in b);"); valid("for(var a in b);");
valid("for(a in b);"); valid("for(a in b);");
Expand Down

0 comments on commit 81bcf43

Please sign in to comment.