diff --git a/src/com/google/javascript/jscomp/AstValidator.java b/src/com/google/javascript/jscomp/AstValidator.java index f8da8eab317..8ca66edd759 100644 --- a/src/com/google/javascript/jscomp/AstValidator.java +++ b/src/com/google/javascript/jscomp/AstValidator.java @@ -475,12 +475,8 @@ private void validateTemplateLit(Node n) { if (!n.hasChildren()) { return; } - int i = 0; - for (Node child = n.getFirstChild(); child != null; child = child.getNext(), i++) { - // If the first child is not a STRING, this is a tagged template. - if (i == 0 && !child.isString()) { - validateExpression(child); - } else if (child.isString()) { + for (Node child = n.getFirstChild(); child != null; child = child.getNext()) { + if (child.isString()) { validateString(child); } else { validateTemplateLitSub(child); @@ -604,6 +600,7 @@ private void validateClassMember(Node n, boolean isAmbient) { case MEMBER_FUNCTION_DEF: case GETTER_DEF: case SETTER_DEF: + validateObjectLiteralKeyName(n); validateChildCount(n); Node function = n.getFirstChild(); if (isAmbient) { @@ -667,23 +664,28 @@ private void validateLabelName(Node n) { } private void validateNonEmptyString(Node n) { - validateNonNullString(n); - if (n.getString().isEmpty()) { + if (validateNonNullString(n) && n.getString().isEmpty()) { violation("Expected non-empty string.", n); } } private void validateEmptyString(Node n) { - validateNonNullString(n); - if (!n.getString().isEmpty()) { + if (validateNonNullString(n) && !n.getString().isEmpty()) { violation("Expected empty string.", n); } } - private void validateNonNullString(Node n) { - if (n.getString() == null) { + private boolean validateNonNullString(Node n) { + try { + if (n.getString() == null) { + violation("Expected non-null string.", n); + return false; + } + } catch (Exception e) { violation("Expected non-null string.", n); + return false; } + return true; } private void validateName(Node n) { diff --git a/test/com/google/javascript/jscomp/AstValidatorTest.java b/test/com/google/javascript/jscomp/AstValidatorTest.java index c4b545ccb29..2e30a645cbd 100644 --- a/test/com/google/javascript/jscomp/AstValidatorTest.java +++ b/test/com/google/javascript/jscomp/AstValidatorTest.java @@ -59,6 +59,35 @@ protected void setUp() throws Exception { 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() { valid("for(var a in b);"); valid("for(a in b);");