javascriptlint-commit Mailing List for JavaScript Lint
Status: Beta
                
                Brought to you by:
                
                    matthiasmiller
                    
                
            You can subscribe to this list here.
| 2008 | Jan | Feb | Mar (42) | Apr (15) | May (2) | Jun | Jul | Aug (33) | Sep (3) | Oct | Nov | Dec | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2009 | Jan | Feb | Mar (5) | Apr | May (2) | Jun | Jul | Aug (2) | Sep | Oct (43) | Nov (4) | Dec (1) | 
| 2010 | Jan | Feb | Mar | Apr (6) | May | Jun | Jul | Aug | Sep | Oct (1) | Nov | Dec | 
| 2011 | Jan | Feb | Mar | Apr (1) | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec (1) | 
| 2013 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep (20) | Oct (23) | Nov | Dec (1) | 
| 2014 | Jan (1) | Feb (2) | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct (4) | Nov | Dec | 
| 2016 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec (18) | 
| 2018 | Jan (7) | Feb | Mar | Apr | May | Jun (8) | Jul | Aug | Sep | Oct | Nov | Dec | 
| 
      
      
      From: <mat...@us...> - 2018-06-13 17:09:16
      
     | 
| Revision: 387
          http://sourceforge.net/p/javascriptlint/code/387
Author:   matthiasmiller
Date:     2018-06-13 17:09:14 +0000 (Wed, 13 Jun 2018)
Log Message:
-----------
Tweak warning message for unexpected_not_comparison
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-06-13 13:54:50 UTC (rev 386)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-13 17:09:14 UTC (rev 387)
@@ -108,7 +108,7 @@
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
     'duplicate_property': 'duplicate property in object initializer',
     'unexpected_not_in': 'the ! operator is unexpected; add clarifying parentheses',
-    'unexpected_not_comparison': 'the ! operator is unexpected; add clarifying parentheses or compare against !!',
+    'unexpected_not_comparison': 'the ! operator is unexpected; add clarifying parentheses or rewrite the comparison',
 }
 
 errors = {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-13 13:54:52
      
     | 
| Revision: 386
          http://sourceforge.net/p/javascriptlint/code/386
Author:   matthiasmiller
Date:     2018-06-13 13:54:50 +0000 (Wed, 13 Jun 2018)
Log Message:
-----------
Rename "unexpected_not_for_in" to "unexpected_not_in".
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/for_in_missing_identifier.js
    trunk/tests/warnings/unexpected_not_comparison.js
Added Paths:
-----------
    trunk/tests/warnings/unexpected_not_in.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-06-10 20:41:58 UTC (rev 385)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-13 13:54:50 UTC (rev 386)
@@ -107,7 +107,7 @@
     'e4x_deprecated': 'e4x is deprecated',
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
     'duplicate_property': 'duplicate property in object initializer',
-    'unexpected_not_for_in': 'the ! operator is unexpected; add clarifying parentheses',
+    'unexpected_not_in': 'the ! operator is unexpected; add clarifying parentheses',
     'unexpected_not_comparison': 'the ! operator is unexpected; add clarifying parentheses or compare against !!',
 }
 
@@ -692,7 +692,7 @@
     raise LintWarning(node)
 
 @lookfor((tok.UNARYOP, op.NOT))
-def unexpected_not_for_in(node):
+def unexpected_not_in(node):
     # Avoid for(!s in o)
     if node.parent and node.parent.kind == tok.IN:
         raise LintWarning(node)
Modified: trunk/tests/warnings/for_in_missing_identifier.js
===================================================================
--- trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 20:41:58 UTC (rev 385)
+++ trunk/tests/warnings/for_in_missing_identifier.js	2018-06-13 13:54:50 UTC (rev 386)
@@ -7,6 +7,6 @@
     for (var prop2 in o)
         o[prop2]++;
 
-    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:unexpected_not_for_in*/
+    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:unexpected_not_in*/
         o[prop]++;
 }
Modified: trunk/tests/warnings/unexpected_not_comparison.js
===================================================================
--- trunk/tests/warnings/unexpected_not_comparison.js	2018-06-10 20:41:58 UTC (rev 385)
+++ trunk/tests/warnings/unexpected_not_comparison.js	2018-06-13 13:54:50 UTC (rev 386)
@@ -18,10 +18,6 @@
         return false;
     }
 
-    if (!s in o) { /*warning:unexpected_not_for_in*/
-        return false;
-    }
-
     // Allow ! and !!
     if (!!i == b) {
         return false;
Added: trunk/tests/warnings/unexpected_not_in.js
===================================================================
--- trunk/tests/warnings/unexpected_not_in.js	                        (rev 0)
+++ trunk/tests/warnings/unexpected_not_in.js	2018-06-13 13:54:50 UTC (rev 386)
@@ -0,0 +1,18 @@
+function unexpected_not_in() {
+    var s, o;
+
+    if (!s in o) { /*warning:unexpected_not_in*/
+        return false;
+    }
+
+    if (!(s in o)) {
+        return false;
+    }
+
+    // Strange, but...if you really want to...
+    if ((!s) in o) {
+        return false;
+    }
+
+    return true;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 20:42:01
      
     | 
| Revision: 385
          http://sourceforge.net/p/javascriptlint/code/385
Author:   matthiasmiller
Date:     2018-06-10 20:41:58 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Respect escaping within regular expressions.
Modified Paths:
--------------
    trunk/jsengine/parser/__init__.py
    trunk/jsengine/tokenizer/__init__.py
    trunk/tests/warnings/misplaced_regex.js
Modified: trunk/jsengine/parser/__init__.py
===================================================================
--- trunk/jsengine/parser/__init__.py	2018-06-10 20:26:59 UTC (rev 384)
+++ trunk/jsengine/parser/__init__.py	2018-06-10 20:41:58 UTC (rev 385)
@@ -853,6 +853,15 @@
             self.assertEqual(error.offset, 5)
         else:
             self.assert_(False)
+        try:
+            # Do not allow after an escape sequence, either.
+            parsestring('re = /[\\\n');
+        except JSSyntaxError as error:
+            self.assertEqual(error.offset, 5)
+        else:
+            self.assert_(False)
+    def testRegExpBugReport(self):
+        parsestring('validity = /[^\[\]/]/g')
     def testUnterminatedComment(self):
         try:
             parsestring('/*')
Modified: trunk/jsengine/tokenizer/__init__.py
===================================================================
--- trunk/jsengine/tokenizer/__init__.py	2018-06-10 20:26:59 UTC (rev 384)
+++ trunk/jsengine/tokenizer/__init__.py	2018-06-10 20:41:58 UTC (rev 385)
@@ -215,10 +215,16 @@
                     return Token(tok.ERROR)
             elif c == _Char.ord('['):
                 while True:
+                    # Handle escaped characters, but don't allow line breaks after the escape.
                     c = stream.readchr()
+                    escaped = False
+                    if c == _Char.ord('\\'):
+                        c = stream.readchr()
+                        escaped = True
+
                     if c == _Char.ord('\n'):
                         return Token(tok.ERROR)
-                    elif c == _Char.ord(']'):
+                    elif c == _Char.ord(']') and not escaped:
                         break
             elif c == _Char.ord('\n'):
                 return Token(tok.ERROR)
Modified: trunk/tests/warnings/misplaced_regex.js
===================================================================
--- trunk/tests/warnings/misplaced_regex.js	2018-06-10 20:26:59 UTC (rev 384)
+++ trunk/tests/warnings/misplaced_regex.js	2018-06-10 20:41:58 UTC (rev 385)
@@ -21,6 +21,9 @@
     i += /\/\./; /*warning:misplaced_regex*/
     i = -/.*/; /*warning:misplaced_regex*/
 
+    /* legal usage */
+    var validity = /[^\[\]/]/g;
+
     /* legal usage: return */
     return /\/\./;
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 20:27:00
      
     | 
| Revision: 384
          http://sourceforge.net/p/javascriptlint/code/384
Author:   matthiasmiller
Date:     2018-06-10 20:26:59 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Fix the useless assignment warning.
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/useless_assign.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-06-10 20:17:00 UTC (rev 383)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-10 20:26:59 UTC (rev 384)
@@ -473,11 +473,14 @@
 
 @lookfor((tok.NAME, op.SETNAME))
 def useless_assign(node):
-    if node.parent.kind == tok.ASSIGN:
+    if node.parent.kind == tok.ASSIGN and node.parent.opcode not in (op.MUL, op.ADD, op.LSH,
+                                                                     op.RSH, op.URSH):
         assert node.node_index == 0
         value = node.parent.kids[1]
     elif node.parent.kind == tok.VAR:
         value = node.kids[0]
+    else:
+        value = None
     if value and value.kind == tok.NAME and node.atom == value.atom:
         raise LintWarning(node)
 
Modified: trunk/tests/warnings/useless_assign.js
===================================================================
--- trunk/tests/warnings/useless_assign.js	2018-06-10 20:17:00 UTC (rev 383)
+++ trunk/tests/warnings/useless_assign.js	2018-06-10 20:26:59 UTC (rev 384)
@@ -17,4 +17,19 @@
     for (; ; i = i) { /*warning:useless_assign*/
         i++;
     }
+
+    // These could conceivably be meaningful.
+    i *= i;
+    i += i;
+    i >>= i;
+    i <<= i;
+    i >>>= i;
+
+    // These make no sense.
+    i /= i; /*warning:useless_assign*/
+    i -= i; /*warning:useless_assign*/
+    i %= i; /*warning:useless_assign*/
+    i &= i; /*warning:useless_assign*/
+    i |= i; /*warning:useless_assign*/
+    i ^= i; /*warning:useless_assign*/
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 20:17:01
      
     | 
| Revision: 383
          http://sourceforge.net/p/javascriptlint/code/383
Author:   matthiasmiller
Date:     2018-06-10 20:17:00 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Fix traceback when dumping loops.
Modified Paths:
--------------
    trunk/javascriptlint/jsparse.py
Modified: trunk/javascriptlint/jsparse.py
===================================================================
--- trunk/javascriptlint/jsparse.py	2018-06-10 20:14:03 UTC (rev 382)
+++ trunk/javascriptlint/jsparse.py	2018-06-10 20:17:00 UTC (rev 383)
@@ -113,8 +113,9 @@
         print '     '*depth,
         print '%s, %s' % (repr(node.kind), repr(node.opcode))
         print '     '*depth,
-        print '%s - %s' % (node_positions.from_offset(node.start_offset),
-                           node_positions.from_offset(node.end_offset))
+        if node.kind != tok.RESERVED:
+            print '%s - %s' % (node_positions.from_offset(node.start_offset),
+                               node_positions.from_offset(node.end_offset))
         if hasattr(node, 'atom'):
             print '     '*depth,
             print 'atom: %s' % node.atom
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 20:14:05
      
     | 
| Revision: 382
          http://sourceforge.net/p/javascriptlint/code/382
Author:   matthiasmiller
Date:     2018-06-10 20:14:03 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Split into two separate warnings.
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/for_in_missing_identifier.js
Added Paths:
-----------
    trunk/tests/warnings/unexpected_not_comparison.js
Removed Paths:
-------------
    trunk/tests/warnings/unexpected_not.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-06-10 05:55:22 UTC (rev 381)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-10 20:14:03 UTC (rev 382)
@@ -107,7 +107,8 @@
     'e4x_deprecated': 'e4x is deprecated',
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
     'duplicate_property': 'duplicate property in object initializer',
-    'unexpected_not': 'the ! operator is unexpected; use clarifying parentheses'
+    'unexpected_not_for_in': 'the ! operator is unexpected; add clarifying parentheses',
+    'unexpected_not_comparison': 'the ! operator is unexpected; add clarifying parentheses or compare against !!',
 }
 
 errors = {
@@ -688,15 +689,34 @@
     raise LintWarning(node)
 
 @lookfor((tok.UNARYOP, op.NOT))
-def unexpected_not(node):
+def unexpected_not_for_in(node):
     # Avoid for(!s in o)
     if node.parent and node.parent.kind == tok.IN:
         raise LintWarning(node)
 
+@lookfor((tok.UNARYOP, op.NOT))
+def unexpected_not_comparison(node):
     # Avoid use in comparisons.
-    if node.parent and node.parent.kind in (tok.EQOP, tok.RELOP):
+    if node.parent and node.parent.kind == tok.RELOP:
         raise LintWarning(node)
 
+    if node.parent and node.parent.kind == tok.EQOP:
+        # Allow !!
+        kid, = node.kids
+        if kid.kind == tok.UNARYOP and kid.opcode == op.NOT:
+            return
+
+        # Allow when compared against !
+        for i, kid in enumerate(node.parent.kids):
+            if i == node.node_index:
+                continue
+            if kid.kind != tok.UNARYOP or kid.opcode != op.NOT:
+                break
+        else:
+            return
+
+        raise LintWarning(node)
+
 def _get_function_property_name(node):
     # Ignore function statements.
     if node.opcode in (None, op.CLOSURE):
Modified: trunk/tests/warnings/for_in_missing_identifier.js
===================================================================
--- trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 05:55:22 UTC (rev 381)
+++ trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 20:14:03 UTC (rev 382)
@@ -7,6 +7,6 @@
     for (var prop2 in o)
         o[prop2]++;
 
-    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:unexpected_not*/
+    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:unexpected_not_for_in*/
         o[prop]++;
 }
Deleted: trunk/tests/warnings/unexpected_not.js
===================================================================
--- trunk/tests/warnings/unexpected_not.js	2018-06-10 05:55:22 UTC (rev 381)
+++ trunk/tests/warnings/unexpected_not.js	2018-06-10 20:14:03 UTC (rev 382)
@@ -1,26 +0,0 @@
-function unexpected_not() {
-    var i, j;
-    var f, s, o;
-
-    if (!i == -1) { /*warning:unexpected_not*/
-        return false;
-    }
-
-    if (!f() < -1) { /*warning:unexpected_not*/
-        return false;
-    }
-
-    if (!i != -1) { /*warning:unexpected_not*/
-        return false;
-    }
-
-    if (i != -1 || !j == -1) { /*warning:unexpected_not*/
-        return false;
-    }
-
-    if (!s in o) { /*warning:unexpected_not*/
-        return false;
-    }
-
-    return true;
-}
Copied: trunk/tests/warnings/unexpected_not_comparison.js (from rev 381, trunk/tests/warnings/unexpected_not.js)
===================================================================
--- trunk/tests/warnings/unexpected_not_comparison.js	                        (rev 0)
+++ trunk/tests/warnings/unexpected_not_comparison.js	2018-06-10 20:14:03 UTC (rev 382)
@@ -0,0 +1,51 @@
+function unexpected_not_comparison() {
+    var i, j;
+    var b, f, s, o;
+
+    if (!i == -1) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+
+    if (!f() < -1) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+
+    if (!i != -1) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+
+    if (i != -1 || !j == -1) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+
+    if (!s in o) { /*warning:unexpected_not_for_in*/
+        return false;
+    }
+
+    // Allow ! and !!
+    if (!!i == b) {
+        return false;
+    }
+    if (b == !!i) {
+        return false;
+    }
+    if (b === !i) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+    if (!i === b) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+    if (!!b === !i) {
+        return false;
+    }
+    if (!i === !!b) {
+        return false;
+    }
+
+    // Do not allow !! for relative comparison
+    if (!!i <= b) { /*warning:unexpected_not_comparison*/
+        return false;
+    }
+
+    return true;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 05:55:24
      
     | 
| Revision: 381
          http://sourceforge.net/p/javascriptlint/code/381
Author:   matthiasmiller
Date:     2018-06-10 05:55:22 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Rename warning for clarity; add test.
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/for_in_missing_identifier.js
Added Paths:
-----------
    trunk/tests/warnings/unexpected_not.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-06-10 05:46:15 UTC (rev 380)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-10 05:55:22 UTC (rev 381)
@@ -107,7 +107,7 @@
     'e4x_deprecated': 'e4x is deprecated',
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
     'duplicate_property': 'duplicate property in object initializer',
-    'ambiguous_not': 'the ! operator is ambiguous; use clarifying parentheses'
+    'unexpected_not': 'the ! operator is unexpected; use clarifying parentheses'
 }
 
 errors = {
@@ -688,7 +688,7 @@
     raise LintWarning(node)
 
 @lookfor((tok.UNARYOP, op.NOT))
-def ambiguous_not(node):
+def unexpected_not(node):
     # Avoid for(!s in o)
     if node.parent and node.parent.kind == tok.IN:
         raise LintWarning(node)
Modified: trunk/tests/warnings/for_in_missing_identifier.js
===================================================================
--- trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 05:46:15 UTC (rev 380)
+++ trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 05:55:22 UTC (rev 381)
@@ -7,6 +7,6 @@
     for (var prop2 in o)
         o[prop2]++;
 
-    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:ambiguous_not*/
+    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:unexpected_not*/
         o[prop]++;
 }
Added: trunk/tests/warnings/unexpected_not.js
===================================================================
--- trunk/tests/warnings/unexpected_not.js	                        (rev 0)
+++ trunk/tests/warnings/unexpected_not.js	2018-06-10 05:55:22 UTC (rev 381)
@@ -0,0 +1,26 @@
+function unexpected_not() {
+    var i, j;
+    var f, s, o;
+
+    if (!i == -1) { /*warning:unexpected_not*/
+        return false;
+    }
+
+    if (!f() < -1) { /*warning:unexpected_not*/
+        return false;
+    }
+
+    if (!i != -1) { /*warning:unexpected_not*/
+        return false;
+    }
+
+    if (i != -1 || !j == -1) { /*warning:unexpected_not*/
+        return false;
+    }
+
+    if (!s in o) { /*warning:unexpected_not*/
+        return false;
+    }
+
+    return true;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-06-10 05:46:18
      
     | 
| Revision: 380
          http://sourceforge.net/p/javascriptlint/code/380
Author:   matthiasmiller
Date:     2018-06-10 05:46:15 +0000 (Sun, 10 Jun 2018)
Log Message:
-----------
Add a warning against invalid ! usage
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/for_in_missing_identifier.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2018-01-02 22:12:15 UTC (rev 379)
+++ trunk/javascriptlint/lintwarnings.py	2018-06-10 05:46:15 UTC (rev 380)
@@ -107,6 +107,7 @@
     'e4x_deprecated': 'e4x is deprecated',
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
     'duplicate_property': 'duplicate property in object initializer',
+    'ambiguous_not': 'the ! operator is ambiguous; use clarifying parentheses'
 }
 
 errors = {
@@ -686,6 +687,16 @@
         return # Allow as constructors
     raise LintWarning(node)
 
+@lookfor((tok.UNARYOP, op.NOT))
+def ambiguous_not(node):
+    # Avoid for(!s in o)
+    if node.parent and node.parent.kind == tok.IN:
+        raise LintWarning(node)
+
+    # Avoid use in comparisons.
+    if node.parent and node.parent.kind in (tok.EQOP, tok.RELOP):
+        raise LintWarning(node)
+
 def _get_function_property_name(node):
     # Ignore function statements.
     if node.opcode in (None, op.CLOSURE):
Modified: trunk/tests/warnings/for_in_missing_identifier.js
===================================================================
--- trunk/tests/warnings/for_in_missing_identifier.js	2018-01-02 22:12:15 UTC (rev 379)
+++ trunk/tests/warnings/for_in_missing_identifier.js	2018-06-10 05:46:15 UTC (rev 380)
@@ -7,6 +7,6 @@
     for (var prop2 in o)
         o[prop2]++;
 
-    for (!prop in o) /*warning:for_in_missing_identifier*/
+    for (!prop in o) /*warning:for_in_missing_identifier*/ /*warning:ambiguous_not*/
         o[prop]++;
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 22:12:16
      
     | 
| Revision: 379
          http://sourceforge.net/p/javascriptlint/code/379
Author:   matthiasmiller
Date:     2018-01-02 22:12:15 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Fix to r378.
Modified Paths:
--------------
    trunk/javascriptlint/jsl.py
Modified: trunk/javascriptlint/jsl.py
===================================================================
--- trunk/javascriptlint/jsl.py	2018-01-02 21:55:24 UTC (rev 378)
+++ trunk/javascriptlint/jsl.py	2018-01-02 22:12:15 UTC (rev 379)
@@ -77,9 +77,8 @@
     add = parser.add_option
     add("--conf", dest="conf", metavar="CONF",
         help="set the conf file")
-    if hotshot is not None:
-        add("--profile", dest="profile", action="store_true", default=False,
-            help="turn on hotshot profiling")
+    add("--profile", dest="profile", action="store_true", default=False,
+        help="turn on hotshot profiling" if hotshot is not None else optparse.SUPPRESS_HELP)
     add("--recurse", dest="recurse", action="store_true", default=False,
         help="recursively search directories on the command line")
     if os.name == 'nt':
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 21:55:27
      
     | 
| Revision: 378
          http://sourceforge.net/p/javascriptlint/code/378
Author:   matthiasmiller
Date:     2018-01-02 21:55:24 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Hide irrelevant command line options.
Modified Paths:
--------------
    trunk/javascriptlint/jsl.py
    trunk/setup.py
Modified: trunk/javascriptlint/jsl.py
===================================================================
--- trunk/javascriptlint/jsl.py	2018-01-02 21:42:44 UTC (rev 377)
+++ trunk/javascriptlint/jsl.py	2018-01-02 21:55:24 UTC (rev 378)
@@ -1,11 +1,17 @@
 #!/usr/bin/python
 # vim: ts=4 sw=4 expandtab
+try:
+    import hotshot
+    import hotshot.stats
+except ImportError:
+    hotshot = None
 import fnmatch
 import functools
+import optparse
 import os
 import sys
+import tempfile
 import unittest
-from optparse import OptionParser
 
 import conf
 import fs
@@ -56,9 +62,6 @@
     print "Developed by Matthias Miller (http://www.JavaScriptLint.com)"
 
 def _profile_enabled(func, *args, **kwargs):
-    import tempfile
-    import hotshot
-    import hotshot.stats
     handle, filename = tempfile.mkstemp()
     profile = hotshot.Profile(filename)
     profile.runcall(func, *args, **kwargs)
@@ -70,12 +73,13 @@
     func(*args, **kwargs)
 
 def _main():
-    parser = OptionParser(usage="%prog [options] [files]")
+    parser = optparse.OptionParser(usage="%prog [options] [files]")
     add = parser.add_option
     add("--conf", dest="conf", metavar="CONF",
         help="set the conf file")
-    add("--profile", dest="profile", action="store_true", default=False,
-        help="turn on hotshot profiling")
+    if hotshot is not None:
+        add("--profile", dest="profile", action="store_true", default=False,
+            help="turn on hotshot profiling")
     add("--recurse", dest="recurse", action="store_true", default=False,
         help="recursively search directories on the command line")
     if os.name == 'nt':
@@ -85,9 +89,9 @@
         add("--enable-wildcards", dest="wildcards", action="store_true",
             default=False, help="resolve wildcards in the command line")
     add("--dump", dest="dump", action="store_true", default=False,
-        help="dump this script")
+        help="dump this script" if not hasattr(sys, 'frozen') else optparse.SUPPRESS_HELP)
     add("--unittest", dest="unittest", action="store_true", default=False,
-        help="run the python unittests")
+        help="run the python unittests" if not hasattr(sys, 'frozen') else optparse.SUPPRESS_HELP)
     add("--quiet", dest="verbosity", action="store_const", const=0,
         help="minimal output")
     add("--verbose", dest="verbosity", action="store_const", const=2,
Modified: trunk/setup.py
===================================================================
--- trunk/setup.py	2018-01-02 21:42:44 UTC (rev 377)
+++ trunk/setup.py	2018-01-02 21:55:24 UTC (rev 378)
@@ -53,7 +53,8 @@
                         '_ssl',
                         '_hashlib',
                         'socket',
-                        'select'
+                        'select',
+                        'hotshot',
                     ],
                     'bundle_files': 1,
                     'optimize': 1, # requires 1 to preserve docstrings
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 21:42:45
      
     | 
| Revision: 377
          http://sourceforge.net/p/javascriptlint/code/377
Author:   matthiasmiller
Date:     2018-01-02 21:42:44 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Remove unnecessary files from the py2exe bundle.
Modified Paths:
--------------
    trunk/setup.py
Modified: trunk/setup.py
===================================================================
--- trunk/setup.py	2018-01-02 21:36:45 UTC (rev 376)
+++ trunk/setup.py	2018-01-02 21:42:44 UTC (rev 377)
@@ -47,9 +47,22 @@
             console = ['jsl'],
             options = {
                 'py2exe': {
-                    'excludes': ['resource'],
+                    'excludes': [
+                        'resource',
+                        'bz2',
+                        '_ssl',
+                        '_hashlib',
+                        'socket',
+                        'select'
+                    ],
                     'bundle_files': 1,
                     'optimize': 1, # requires 1 to preserve docstrings
+                    'dll_excludes': [
+                        'mswsock.dll',
+                        'powrprof.dll',
+                        'CRYPT32.dll'
+                    ]
+
                 }
             },
             zipfile = None
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 21:36:46
      
     | 
| Revision: 376
          http://sourceforge.net/p/javascriptlint/code/376
Author:   matthiasmiller
Date:     2018-01-02 21:36:45 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Fix exception when running with blank command line.
Modified Paths:
--------------
    trunk/javascriptlint/jsl.py
Modified: trunk/javascriptlint/jsl.py
===================================================================
--- trunk/javascriptlint/jsl.py	2018-01-02 21:26:49 UTC (rev 375)
+++ trunk/javascriptlint/jsl.py	2018-01-02 21:36:45 UTC (rev 376)
@@ -18,7 +18,7 @@
 
 _lint_results = {
     'warning': 0,
-    'errors': 0
+    'error': 0
 }
 
 def _dump(paths, encoding):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 21:26:52
      
     | 
| Revision: 375
          http://sourceforge.net/p/javascriptlint/code/375
Author:   matthiasmiller
Date:     2018-01-02 21:26:49 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Add a configuration setting for additional include directories.
Modified Paths:
--------------
    trunk/javascriptlint/conf.py
    trunk/javascriptlint/lint.py
    trunk/test.py
Added Paths:
-----------
    trunk/tests/path_resolution/include_dir.js
    trunk/tests/path_resolution/include_dir_a/
    trunk/tests/path_resolution/include_dir_a/import_helper.js
    trunk/tests/path_resolution/include_dir_b/
    trunk/tests/path_resolution/include_dir_b/import_helper.js
    trunk/tests/path_resolution/include_dir_b/import_helper_b.js
Modified: trunk/javascriptlint/conf.py
===================================================================
--- trunk/javascriptlint/conf.py	2018-01-02 21:20:15 UTC (rev 374)
+++ trunk/javascriptlint/conf.py	2018-01-02 21:26:49 UTC (rev 375)
@@ -188,6 +188,18 @@
         self._conf.loadfile(parm)
         self.value = parm
 
+class IncludeDirSetting(Setting):
+    wants_parm = True
+    wants_dir = True
+    def __init__(self):
+        self.value = []
+    def load(self, enabled, parm, dir):
+        if not dir:
+            raise ConfError('The %s setting is only valid in a configuration file.' % parm)
+
+        abs_dir = os.path.abspath(os.path.join(dir, parm))
+        self.value.append(abs_dir)
+
 class Conf:
     def __init__(self):
         recurse = BooleanSetting(False)
@@ -203,6 +215,7 @@
             'process': ProcessSetting(recurse),
             'default-version': JSVersionSetting(),
             'conf': ConfSetting(self),
+            'include-dir': IncludeDirSetting(),
             # SpiderMonkey warnings
             'no_return_value': BooleanSetting(True),
             'equal_as_assign': BooleanSetting(True),
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2018-01-02 21:20:15 UTC (rev 374)
+++ trunk/javascriptlint/lint.py	2018-01-02 21:26:49 UTC (rev 375)
@@ -283,12 +283,14 @@
             # The user can specify paths using backslashes (such as when
             # linting Windows scripts on a posix environment.
             import_path = import_path.replace('\\', os.sep)
-            import_path = os.path.join(os.path.dirname(path), import_path)
-            if os.path.isfile(import_path):
-                return lint_file(import_path, 'js', jsversion, encoding)
+            include_dirs = [os.path.dirname(path)] + conf['include-dir']
+            for include_dir in include_dirs:
+                abs_path = os.path.join(include_dir, import_path)
+                if os.path.isfile(abs_path):
+                    return lint_file(abs_path, 'js', jsversion, encoding)
 
             _report(offset, 'error', 'io_error', {
-                'error': 'The file could not be found: %s' % import_path
+                'error': 'The file could not be found in any include paths: %s' % import_path
             })
             return _Script()
 
Modified: trunk/test.py
===================================================================
--- trunk/test.py	2018-01-02 21:20:15 UTC (rev 374)
+++ trunk/test.py	2018-01-02 21:26:49 UTC (rev 375)
@@ -21,12 +21,12 @@
 class TestError(Exception):
     pass
 
-def _get_conf(script):
+def _get_conf(script, script_dir):
     regexp = re.compile(r"/\*conf:([^*]*)\*/")
     text = '\n'.join(regexp.findall(script))
     conf = javascriptlint.conf.Conf()
-    conf.loadtext(_DEFAULT_CONF)
-    conf.loadtext(text)
+    conf.loadtext(_DEFAULT_CONF, script_dir)
+    conf.loadtext(text, script_dir)
     return conf
 
 def _get_expected_warnings(script):
@@ -45,11 +45,14 @@
     return warnings
 
 def _testfile(path):
+    script_dir = os.path.dirname(path)
+    assert os.path.isabs(script_dir)
+
     # Parse the script and find the expected warnings.
     script = open(path).read()
     expected_warnings = _get_expected_warnings(script)
     unexpected_warnings = []
-    conf = _get_conf(script)
+    conf = _get_conf(script, script_dir)
 
     def lint_error(path, line, col, msg_type, errname, errdesc):
         warning = (line, msg_type, errname)
Added: trunk/tests/path_resolution/include_dir.js
===================================================================
--- trunk/tests/path_resolution/include_dir.js	                        (rev 0)
+++ trunk/tests/path_resolution/include_dir.js	2018-01-02 21:26:49 UTC (rev 375)
@@ -0,0 +1,5 @@
+/*conf:+include-dir include_dir_a*/
+
+/*jsl:import import_helper.js*/
+/*jsl:import import_helper_b.js*/ /*error:io_error*/
+import_helper();
Added: trunk/tests/path_resolution/include_dir_a/import_helper.js
===================================================================
--- trunk/tests/path_resolution/include_dir_a/import_helper.js	                        (rev 0)
+++ trunk/tests/path_resolution/include_dir_a/import_helper.js	2018-01-02 21:26:49 UTC (rev 375)
@@ -0,0 +1,2 @@
+function import_helper() {
+}
Added: trunk/tests/path_resolution/include_dir_b/import_helper.js
===================================================================
Added: trunk/tests/path_resolution/include_dir_b/import_helper_b.js
===================================================================
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 21:20:18
      
     | 
| Revision: 374
          http://sourceforge.net/p/javascriptlint/code/374
Author:   matthiasmiller
Date:     2018-01-02 21:20:15 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Improve error messages with invalid imports.
Modified Paths:
--------------
    trunk/javascriptlint/lint.py
Added Paths:
-----------
    trunk/tests/path_resolution/missing_import.html
    trunk/tests/path_resolution/missing_import.js
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2018-01-02 20:28:00 UTC (rev 373)
+++ trunk/javascriptlint/lint.py	2018-01-02 21:20:15 UTC (rev 374)
@@ -251,6 +251,7 @@
                     yield {
                         'type': 'external',
                         'jsversion': jsversion,
+                        'offset': tag['offset'],
                         'src': src,
                     }
         elif tag['type'] == 'end':
@@ -278,13 +279,19 @@
 
 def lint_files(paths, lint_error, encoding, conf=conf.Conf(), printpaths=True):
     def lint_file(path, kind, jsversion, encoding):
-        def import_script(import_path, jsversion):
+        def import_script(offset, import_path, jsversion):
             # The user can specify paths using backslashes (such as when
             # linting Windows scripts on a posix environment.
             import_path = import_path.replace('\\', os.sep)
             import_path = os.path.join(os.path.dirname(path), import_path)
-            return lint_file(import_path, 'js', jsversion, encoding)
+            if os.path.isfile(import_path):
+                return lint_file(import_path, 'js', jsversion, encoding)
 
+            _report(offset, 'error', 'io_error', {
+                'error': 'The file could not be found: %s' % import_path
+            })
+            return _Script()
+
         def report_lint(node, errname, offset=0, **errargs):
             assert errname in lintwarnings.warnings, errname
             if conf[errname]:
@@ -326,7 +333,7 @@
                     continue
 
                 if script['type'] == 'external':
-                    other = import_script(script['src'], script['jsversion'])
+                    other = import_script(script['offset'], script['src'], script['jsversion'])
                     lint_cache[normpath].importscript(other)
                 elif script['type'] == 'inline':
                     script_parts.append((script['offset'], script['jsversion'],
@@ -460,7 +467,7 @@
                 if not parms:
                     report(node, 'jsl_cc_not_understood')
                 else:
-                    import_paths.append(parms)
+                    import_paths.append((node.start_offset, parms))
             elif keyword == 'fallthru':
                 fallthrus.append(node)
             elif keyword == 'pass':
@@ -503,8 +510,8 @@
         report(fallthru, 'invalid_pass')
 
     # Process imports by copying global declarations into the universal scope.
-    for path in import_paths:
-        script_cache.importscript(import_callback(path, jsversion))
+    for offset, path in import_paths:
+        script_cache.importscript(import_callback(offset, path, jsversion))
 
     for name, node in declares:
         declare_scope = script_cache.scope.find_scope(node)
Added: trunk/tests/path_resolution/missing_import.html
===================================================================
--- trunk/tests/path_resolution/missing_import.html	                        (rev 0)
+++ trunk/tests/path_resolution/missing_import.html	2018-01-02 21:20:15 UTC (rev 374)
@@ -0,0 +1,10 @@
+<html>
+<head>
+    <script src="file_does_not_exist.js"></script> <!--/*error:io_error*/-->
+</head>
+<body>
+    <script>
+        /*jsl:import file_does_not_exist.js*/ /*error:io_error*/
+    </script>
+</body>
+</html>
Added: trunk/tests/path_resolution/missing_import.js
===================================================================
--- trunk/tests/path_resolution/missing_import.js	                        (rev 0)
+++ trunk/tests/path_resolution/missing_import.js	2018-01-02 21:20:15 UTC (rev 374)
@@ -0,0 +1 @@
+/*jsl:import file_does_not_exist.js*/ /*error:io_error*/
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2018-01-02 20:28:01
      
     | 
| Revision: 373
          http://sourceforge.net/p/javascriptlint/code/373
Author:   matthiasmiller
Date:     2018-01-02 20:28:00 +0000 (Tue, 02 Jan 2018)
Log Message:
-----------
Fix missing parameter in lint_files.
Modified Paths:
--------------
    trunk/javascriptlint/lint.py
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-30 22:51:46 UTC (rev 372)
+++ trunk/javascriptlint/lint.py	2018-01-02 20:28:00 UTC (rev 373)
@@ -311,7 +311,7 @@
         try:
             contents = fs.readfile(path, encoding)
         except IOError, error:
-            lint_error(normpath, 0, 0, 'io_error', unicode(error))
+            lint_error(normpath, 0, 0, 'error', 'io_error', unicode(error))
             return lint_cache[normpath]
         node_positions = jsparse.NodePositions(contents)
 
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-30 22:51:49
      
     | 
| Revision: 372
          http://sourceforge.net/p/javascriptlint/code/372
Author:   matthiasmiller
Date:     2016-12-30 22:51:46 +0000 (Fri, 30 Dec 2016)
Log Message:
-----------
Stop hiding the fact that ambiguous_else_stmt is on the statement line, not on the "else".
Modified Paths:
--------------
    trunk/test.py
    trunk/tests/warnings/ambiguous_else_stmt.js
Modified: trunk/test.py
===================================================================
--- trunk/test.py	2016-12-30 22:48:30 UTC (rev 371)
+++ trunk/test.py	2016-12-30 22:51:46 UTC (rev 372)
@@ -53,12 +53,6 @@
 
     def lint_error(path, line, col, msg_type, errname, errdesc):
         warning = (line, msg_type, errname)
-
-        # Bad hack to fix line numbers on ambiguous else statements
-        # TODO: Fix tests.
-        if errname == 'ambiguous_else_stmt' and not warning in expected_warnings:
-            warning = (line-1, msg_type, errname)
-
         if warning in expected_warnings:
             expected_warnings.remove(warning)
         else:
Modified: trunk/tests/warnings/ambiguous_else_stmt.js
===================================================================
--- trunk/tests/warnings/ambiguous_else_stmt.js	2016-12-30 22:48:30 UTC (rev 371)
+++ trunk/tests/warnings/ambiguous_else_stmt.js	2016-12-30 22:51:46 UTC (rev 372)
@@ -16,6 +16,6 @@
                 while (j) /*warning:ambiguous_nested_stmt*/
                     if (y) /*warning:ambiguous_nested_stmt*/
                         y--;
-        else /*warning:ambiguous_else_stmt*/
-            y++;
+        else
+            y++; /*warning:ambiguous_else_stmt*/
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-30 22:48:35
      
     | 
| Revision: 371
          http://sourceforge.net/p/javascriptlint/code/371
Author:   matthiasmiller
Date:     2016-12-30 22:48:30 +0000 (Fri, 30 Dec 2016)
Log Message:
-----------
Properly distinguish between errors and warnings.
Modified Paths:
--------------
    trunk/javascriptlint/jsl.py
    trunk/javascriptlint/lint.py
    trunk/test.py
    trunk/tests/conf/jscript_function_extensions-3.js
    trunk/tests/conf/jscript_function_extensions-4.js
    trunk/tests/control_comments/conf-version-2.js
    trunk/tests/control_comments/conf-version.js
    trunk/tests/errors/expected_tok.js
    trunk/tests/errors/syntax_error.js
    trunk/tests/html/e4x.html
Modified: trunk/javascriptlint/jsl.py
===================================================================
--- trunk/javascriptlint/jsl.py	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/javascriptlint/jsl.py	2016-12-30 22:48:30 UTC (rev 371)
@@ -17,7 +17,7 @@
 import version
 
 _lint_results = {
-    'warnings': 0,
+    'warning': 0,
     'errors': 0
 }
 
@@ -26,8 +26,9 @@
         script = fs.readfile(path, encoding)
         jsparse.dump_tree(script)
 
-def _lint_warning(conf_, path, line, col, errname, errdesc):
-    _lint_results['warnings'] = _lint_results['warnings'] + 1
+def _lint_warning(conf_, path, line, col, msg_type, errname, errdesc):
+    assert msg_type in ('warning', 'error')
+    _lint_results[msg_type] += 1
     print util.format_error(conf_['output-format'], path, line, col,
                                   errname, errdesc)
 
@@ -120,7 +121,7 @@
         try:
             conf_.loadfile(options.conf)
         except conf.ConfError, error:
-            _lint_warning(conf_, error.path, error.lineno, 0, 'conf_error',
+            _lint_warning(conf_, error.path, error.lineno, 0, 'error', 'conf_error',
                           unicode(error))
 
     profile_func = _profile_disabled
@@ -151,12 +152,12 @@
         profile_func(_lint, paths, conf_, options.printlisting, options.encoding)
 
     if options.printsummary:
-        print '\n%i error(s), %i warnings(s)' % (_lint_results['errors'],
-                                                 _lint_results['warnings'])
+        print '\n%i error(s), %i warnings(s)' % (_lint_results['error'],
+                                                 _lint_results['warning'])
 
-    if _lint_results['errors']:
+    if _lint_results['error']:
         sys.exit(3)
-    if _lint_results['warnings']:
+    if _lint_results['warning']:
         sys.exit(1)
     sys.exit(0)
 
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/javascriptlint/lint.py	2016-12-30 22:48:30 UTC (rev 371)
@@ -288,18 +288,18 @@
         def report_lint(node, errname, offset=0, **errargs):
             assert errname in lintwarnings.warnings, errname
             if conf[errname]:
-                _report(offset or node.start_offset, errname, errargs)
+                _report(offset or node.start_offset, 'warning', errname, errargs)
 
         def report_parse_error(offset, errname, errargs):
             assert errname in lintwarnings.errors, errname
-            _report(offset, errname, errargs)
+            _report(offset, 'error', errname, errargs)
 
-        def _report(offset, errname, errargs):
+        def _report(offset, msg_type, errname, errargs):
             errdesc = lintwarnings.format_error(errname, **errargs)
             if lint_cache[normpath].should_ignore(offset):
                 return
             pos = node_positions.from_offset(offset)
-            return lint_error(normpath, pos.line, pos.col, errname, errdesc)
+            return lint_error(normpath, pos.line, pos.col, msg_type, errname, errdesc)
 
         normpath = fs.normpath(path)
         if normpath in lint_cache:
Modified: trunk/test.py
===================================================================
--- trunk/test.py	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/test.py	2016-12-30 22:48:30 UTC (rev 371)
@@ -33,15 +33,15 @@
     "returns an array of tuples -- line, warning"
     warnings = []
 
-    regexp = re.compile(r"/\*warning:([^*]*)\*/")
+    regexp = re.compile(r"/\*(error|warning):([^*]*)\*/")
 
     lines = script.splitlines()
     for i in range(0, len(lines)):
-        for warning in regexp.findall(lines[i]):
+        for msg_type, warning in regexp.findall(lines[i]):
             # TODO: implement these
             unimpl_warnings = ('dup_option_explicit',)
             if not warning in unimpl_warnings:
-                warnings.append((i, warning))
+                warnings.append((i, msg_type, warning))
     return warnings
 
 def _testfile(path):
@@ -51,13 +51,13 @@
     unexpected_warnings = []
     conf = _get_conf(script)
 
-    def lint_error(path, line, col, errname, errdesc):
-        warning = (line, errname)
+    def lint_error(path, line, col, msg_type, errname, errdesc):
+        warning = (line, msg_type, errname)
 
         # Bad hack to fix line numbers on ambiguous else statements
         # TODO: Fix tests.
         if errname == 'ambiguous_else_stmt' and not warning in expected_warnings:
-            warning = (line-1, errname)
+            warning = (line-1, msg_type, errname)
 
         if warning in expected_warnings:
             expected_warnings.remove(warning)
@@ -69,11 +69,11 @@
     errors = []
     if expected_warnings:
         errors.append('Expected warnings:')
-        for line, warning in expected_warnings:
+        for line, msg_type, warning in expected_warnings:
             errors.append('\tline %i: %s' % (line+1, warning))
     if unexpected_warnings:
         errors.append('Unexpected warnings:')
-        for line, warning, errdesc in unexpected_warnings:
+        for line, msg_type, warning, errdesc in unexpected_warnings:
             errors.append('\tline %i: %s/%s' % (line+1, warning, errdesc))
     if errors:
         raise TestError('\n'.join(errors))
Modified: trunk/tests/conf/jscript_function_extensions-3.js
===================================================================
--- trunk/tests/conf/jscript_function_extensions-3.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/conf/jscript_function_extensions-3.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -23,5 +23,5 @@
     this.val = null;
 }
 
-function conf.jscript_function_extensions..ok(val) { /*warning:syntax_error*/
+function conf.jscript_function_extensions..ok(val) { /*error:syntax_error*/
 }
Modified: trunk/tests/conf/jscript_function_extensions-4.js
===================================================================
--- trunk/tests/conf/jscript_function_extensions-4.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/conf/jscript_function_extensions-4.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -1,4 +1,4 @@
 /*conf:+jscript_function_extensions*/
 
-function conf.jscript_function_extensions:onunload(val) { /*warning:syntax_error*/
+function conf.jscript_function_extensions:onunload(val) { /*error:syntax_error*/
 }
Modified: trunk/tests/control_comments/conf-version-2.js
===================================================================
--- trunk/tests/control_comments/conf-version-2.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/control_comments/conf-version-2.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -3,5 +3,5 @@
 
 /* Make sure that the control comment overrides the config file. */
 function default_version() {
-	yield true; /*warning:semi_before_stmnt*/
+	yield true; /*error:semi_before_stmnt*/
 }
Modified: trunk/tests/control_comments/conf-version.js
===================================================================
--- trunk/tests/control_comments/conf-version.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/control_comments/conf-version.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -1,5 +1,5 @@
 /*conf:+default-version text/javascript;version=1.7*/
 function default_version() {
     // TODO: Support js1.7
-	yield true; /*warning:semi_before_stmnt*/
+	yield true; /*error:semi_before_stmnt*/
 }
Modified: trunk/tests/errors/expected_tok.js
===================================================================
--- trunk/tests/errors/expected_tok.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/errors/expected_tok.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -1,4 +1,4 @@
 function expected_tok() {
-    return { a, }; /*warning:expected_tok*/
+    return { a, }; /*error:expected_tok*/
 }
 
Modified: trunk/tests/errors/syntax_error.js
===================================================================
--- trunk/tests/errors/syntax_error.js	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/errors/syntax_error.js	2016-12-30 22:48:30 UTC (rev 371)
@@ -1,4 +1,4 @@
 function syntax_error() {
-    &; /*warning:syntax_error*/
+    &; /*error:syntax_error*/
 }
 
Modified: trunk/tests/html/e4x.html
===================================================================
--- trunk/tests/html/e4x.html	2016-12-29 22:10:19 UTC (rev 370)
+++ trunk/tests/html/e4x.html	2016-12-30 22:48:30 UTC (rev 371)
@@ -7,19 +7,19 @@
     <script type="text/javascript">
 		// e4x is disabled by default, so HTML comments are single-line only.
 		var comment_a = <!--
-			? /*warning:syntax_error*/
+			? /*error:syntax_error*/
 		-->;
 	</script>
     <script type="text/javascript;e4x=1">/*warning:e4x_deprecated*/
 		// Explicitly enable e4x.
 		var comment_c = <!--
-			? /*warning:syntax_error*/
+			? /*error:syntax_error*/
 		-->;
     </script>
     <script type="text/javascript;version=1.6;e4x=0">
 		// e4x is always enabled in 1.6+
 		var comment_b = <!--
-			? /*warning:syntax_error*/
+			? /*error:syntax_error*/
 		-->;
 	</script>
 </head>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-29 22:10:21
      
     | 
| Revision: 370
          http://sourceforge.net/p/javascriptlint/code/370
Author:   matthiasmiller
Date:     2016-12-29 22:10:19 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Refactor property name functions into utility module.
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
Added Paths:
-----------
    trunk/jsengine/js_util.py
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2016-12-29 21:57:52 UTC (rev 369)
+++ trunk/javascriptlint/lintwarnings.py	2016-12-29 22:10:19 UTC (rev 370)
@@ -19,6 +19,7 @@
 
 import util
 
+from jsengine import js_util
 from jsengine.parser import kind as tok
 from jsengine.parser import op
 
@@ -636,44 +637,22 @@
     if not left.kind in (tok.VAR, tok.NAME):
         raise LintWarning(left)
 
-def _normalized_number(node):
-    assert node.kind == tok.NUMBER
-    if node.atom.startswith('0x'):
-        value = int(node.atom, 16)
-    else:
-        value = float(node.atom)
-        if value.is_integer():
-            value = int(value)
-    return str(value)
-
 @lookfor(tok.NUMBER)
 def ambiguous_numeric_prop(node):
-    normalized = _normalized_number(node)
+    normalized = js_util.numeric_property_str(node)
     if (node.node_index == 0 and node.parent.kind == tok.COLON) or \
             (node.node_index == 1 and node.parent.kind == tok.LB):
         if normalized != node.atom:
             raise LintWarning(node, normalized=normalized)
 
-def _object_property(node):
-    assert node.kind == tok.COLON
-
-    left, right = node.kids
-    while left.kind == tok.RP:
-        left, = left.kids
-    if left.kind == tok.NUMBER:
-        return _normalized_number(left)
-
-    assert left.kind in (tok.STRING, tok.NAME)
-    return left.atom
-
 @lookfor(tok.COLON)
 def duplicate_property(node):
     if not node.parent.kind == tok.RC:
         return
 
-    node_value = _object_property(node)
+    node_value = js_util.object_property_str(node)
     for sibling in node.parent.kids[:node.node_index]:
-        sibling_value = _object_property(sibling)
+        sibling_value = js_util.object_property_str(sibling)
         if node_value == sibling_value:
             raise LintWarning(node)
 
Added: trunk/jsengine/js_util.py
===================================================================
--- trunk/jsengine/js_util.py	                        (rev 0)
+++ trunk/jsengine/js_util.py	2016-12-29 22:10:19 UTC (rev 370)
@@ -0,0 +1,25 @@
+# vim: ts=4 sw=4 expandtab
+from parser import kind as tok
+
+def numeric_property_str(node):
+    assert node.kind == tok.NUMBER
+    if node.atom.startswith('0x'):
+        value = int(node.atom, 16)
+    else:
+        value = float(node.atom)
+        if value.is_integer():
+            value = int(value)
+    return str(value)
+
+def object_property_str(node):
+    assert node.kind == tok.COLON
+
+    left, right = node.kids
+    while left.kind == tok.RP:
+        left, = left.kids
+    if left.kind == tok.NUMBER:
+        return numeric_property_str(left)
+
+    assert left.kind in (tok.STRING, tok.NAME)
+    return left.atom
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-29 21:57:55
      
     | 
| Revision: 369
          http://sourceforge.net/p/javascriptlint/code/369
Author:   matthiasmiller
Date:     2016-12-29 21:57:52 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Improve error location for trailing comma error.
Modified Paths:
--------------
    trunk/javascriptlint/lint.py
    trunk/tests/warnings/trailing_comma_in_array.js
Added Paths:
-----------
    trunk/tests/warnings/trailing_comma.js
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-29 21:50:27 UTC (rev 368)
+++ trunk/javascriptlint/lint.py	2016-12-29 21:57:52 UTC (rev 369)
@@ -556,7 +556,8 @@
         except lintwarnings.LintWarning, warning:
             # TODO: This is ugly hardcoding to improve the error positioning of
             # "missing_semicolon" errors.
-            if visitor.warning in ('missing_semicolon', 'missing_semicolon_for_lambda'):
+            if visitor.warning in ('missing_semicolon', 'missing_semicolon_for_lambda',
+                                   'trailing_comma', 'trailing_comma_in_array'):
                 offset = warning.node.end_offset
             else:
                 offset = None
Added: trunk/tests/warnings/trailing_comma.js
===================================================================
--- trunk/tests/warnings/trailing_comma.js	                        (rev 0)
+++ trunk/tests/warnings/trailing_comma.js	2016-12-29 21:57:52 UTC (rev 369)
@@ -0,0 +1,7 @@
+function trailing_comma() {
+    var o = {
+        outer: {
+            inner: 1
+        }, /*warning:trailing_comma*/
+    };
+}
Modified: trunk/tests/warnings/trailing_comma_in_array.js
===================================================================
--- trunk/tests/warnings/trailing_comma_in_array.js	2016-12-29 21:50:27 UTC (rev 368)
+++ trunk/tests/warnings/trailing_comma_in_array.js	2016-12-29 21:57:52 UTC (rev 369)
@@ -13,4 +13,9 @@
         2,
         3, /*warning:trailing_comma_in_array*/
     ];
+    a = [
+        {
+            prop: 1
+        }, /*warning:trailing_comma_in_array*/
+    ];
 }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-29 21:50:29
      
     | 
| Revision: 368
          http://sourceforge.net/p/javascriptlint/code/368
Author:   matthiasmiller
Date:     2016-12-29 21:50:27 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Add warning against duplicate properties in object initializers
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
    trunk/tests/warnings/ambiguous_numeric_prop.js
Added Paths:
-----------
    trunk/tests/warnings/duplicate_property.js
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2016-12-29 21:46:51 UTC (rev 367)
+++ trunk/javascriptlint/lintwarnings.py	2016-12-29 21:50:27 UTC (rev 368)
@@ -105,6 +105,7 @@
     'trailing_whitespace': 'trailing whitespace',
     'e4x_deprecated': 'e4x is deprecated',
     'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
+    'duplicate_property': 'duplicate property in object initializer',
 }
 
 errors = {
@@ -635,20 +636,47 @@
     if not left.kind in (tok.VAR, tok.NAME):
         raise LintWarning(left)
 
-@lookfor(tok.NUMBER)
-def ambiguous_numeric_prop(node):
+def _normalized_number(node):
+    assert node.kind == tok.NUMBER
     if node.atom.startswith('0x'):
         value = int(node.atom, 16)
     else:
         value = float(node.atom)
         if value.is_integer():
             value = int(value)
+    return str(value)
 
+@lookfor(tok.NUMBER)
+def ambiguous_numeric_prop(node):
+    normalized = _normalized_number(node)
     if (node.node_index == 0 and node.parent.kind == tok.COLON) or \
             (node.node_index == 1 and node.parent.kind == tok.LB):
-        if str(value) != node.atom:
-            raise LintWarning(node, normalized=str(value))
+        if normalized != node.atom:
+            raise LintWarning(node, normalized=normalized)
 
+def _object_property(node):
+    assert node.kind == tok.COLON
+
+    left, right = node.kids
+    while left.kind == tok.RP:
+        left, = left.kids
+    if left.kind == tok.NUMBER:
+        return _normalized_number(left)
+
+    assert left.kind in (tok.STRING, tok.NAME)
+    return left.atom
+
+@lookfor(tok.COLON)
+def duplicate_property(node):
+    if not node.parent.kind == tok.RC:
+        return
+
+    node_value = _object_property(node)
+    for sibling in node.parent.kids[:node.node_index]:
+        sibling_value = _object_property(sibling)
+        if node_value == sibling_value:
+            raise LintWarning(node)
+
 @lookfor(tok.FUNCTION)
 def misplaced_function(node):
     # Ignore function statements.
Modified: trunk/tests/warnings/ambiguous_numeric_prop.js
===================================================================
--- trunk/tests/warnings/ambiguous_numeric_prop.js	2016-12-29 21:46:51 UTC (rev 367)
+++ trunk/tests/warnings/ambiguous_numeric_prop.js	2016-12-29 21:50:27 UTC (rev 368)
@@ -1,3 +1,4 @@
+/*conf:-duplicate_property*/
 function ambiguous_numeric_prop() {
     var a = {
         1: '',
Added: trunk/tests/warnings/duplicate_property.js
===================================================================
--- trunk/tests/warnings/duplicate_property.js	                        (rev 0)
+++ trunk/tests/warnings/duplicate_property.js	2016-12-29 21:50:27 UTC (rev 368)
@@ -0,0 +1,13 @@
+/*conf:-useless_quotes*/
+/*conf:-ambiguous_numeric_prop*/
+function duplicate_property() {
+    var o = {
+        a: '',
+        "a": '', /*warning:duplicate_property*/
+        2.00: '',
+        2: '', /*warning:duplicate_property*/
+        3.00: '',
+        '3': '', /*warning:duplicate_property*/
+        'other': ''
+    };
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-29 21:46:53
      
     | 
| Revision: 367
          http://sourceforge.net/p/javascriptlint/code/367
Author:   matthiasmiller
Date:     2016-12-29 21:46:51 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Add test for the "ambiguous_numeric_prop" warning.
Added Paths:
-----------
    trunk/tests/warnings/ambiguous_numeric_prop.js
Added: trunk/tests/warnings/ambiguous_numeric_prop.js
===================================================================
--- trunk/tests/warnings/ambiguous_numeric_prop.js	                        (rev 0)
+++ trunk/tests/warnings/ambiguous_numeric_prop.js	2016-12-29 21:46:51 UTC (rev 367)
@@ -0,0 +1,15 @@
+function ambiguous_numeric_prop() {
+    var a = {
+        1: '',
+        2.0: '', /*warning:ambiguous_numeric_prop*/
+        2.1: '',
+        2.2: '',
+        0x3: '' /*warning:ambiguous_numeric_prop*/
+    };
+
+    a[1] = '';
+    a[2.0] = ''; /*warning:ambiguous_numeric_prop*/
+    a[2.1] = '';
+    a[0x3] = ''; /*warning:ambiguous_numeric_prop*/
+}
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-29 21:35:43
      
     | 
| Revision: 366
          http://sourceforge.net/p/javascriptlint/code/366
Author:   matthiasmiller
Date:     2016-12-29 21:35:41 +0000 (Thu, 29 Dec 2016)
Log Message:
-----------
Warn about non-normalized numbers as object properties.
Modified Paths:
--------------
    trunk/javascriptlint/lintwarnings.py
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2016-12-23 23:55:18 UTC (rev 365)
+++ trunk/javascriptlint/lintwarnings.py	2016-12-29 21:35:41 UTC (rev 366)
@@ -104,6 +104,7 @@
     'function_name_mismatch': 'function name {fn_name} does not match property name {prop_name}',
     'trailing_whitespace': 'trailing whitespace',
     'e4x_deprecated': 'e4x is deprecated',
+    'ambiguous_numeric_prop': 'numeric property should be normalized; use {normalized}',
 }
 
 errors = {
@@ -634,6 +635,20 @@
     if not left.kind in (tok.VAR, tok.NAME):
         raise LintWarning(left)
 
+@lookfor(tok.NUMBER)
+def ambiguous_numeric_prop(node):
+    if node.atom.startswith('0x'):
+        value = int(node.atom, 16)
+    else:
+        value = float(node.atom)
+        if value.is_integer():
+            value = int(value)
+
+    if (node.node_index == 0 and node.parent.kind == tok.COLON) or \
+            (node.node_index == 1 and node.parent.kind == tok.LB):
+        if str(value) != node.atom:
+            raise LintWarning(node, normalized=str(value))
+
 @lookfor(tok.FUNCTION)
 def misplaced_function(node):
     # Ignore function statements.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-23 23:55:20
      
     | 
| Revision: 365
          http://sourceforge.net/p/javascriptlint/code/365
Author:   matthiasmiller
Date:     2016-12-23 23:55:18 +0000 (Fri, 23 Dec 2016)
Log Message:
-----------
Use exceptions instead of a callback for parse errors.
Modified Paths:
--------------
    trunk/javascriptlint/jsparse.py
    trunk/javascriptlint/lint.py
    trunk/jsengine/parser/__init__.py
Modified: trunk/javascriptlint/jsparse.py
===================================================================
--- trunk/javascriptlint/jsparse.py	2016-12-23 23:46:55 UTC (rev 364)
+++ trunk/javascriptlint/jsparse.py	2016-12-23 23:55:18 UTC (rev 365)
@@ -4,6 +4,7 @@
 import re
 import unittest
 
+from jsengine import JSSyntaxError
 import jsengine.parser
 from jsengine.parser import kind as tok
 from jsengine.parser import op
@@ -51,15 +52,14 @@
         # this one was within a string or a regexp.
         pos = match.start()+1
 
-def parse(script, jsversion, error_callback, start_offset=0):
+def parse(script, jsversion, start_offset=0):
     """ All node positions will be relative to start_offset. This allows
         scripts to be embedded in a file (for example, HTML).
     """
     assert not start_offset is None
     jsversion = jsversion or JSVersion.default()
     assert isvalidversion(jsversion), jsversion
-    return jsengine.parser.parse(script, jsversion.version,
-                                 error_callback, start_offset)
+    return jsengine.parser.parse(script, jsversion.version, start_offset)
 
 def filtercomments(possible_comments, root_node):
     comment_ignore_ranges = NodeRanges()
@@ -126,15 +126,18 @@
             _dump_node(node, node_positions, depth+1)
 
 def dump_tree(script):
-    def error_callback(line, col, msg, msg_args):
-        print '(%i, %i): %s', (line, col, msg)
-    node = parse(script, None, error_callback)
     node_positions = NodePositions(script)
+    try:
+        node = parse(script, None)
+    except JSSyntaxError, error:
+        pos = node_positions.from_offset(error.offset)
+        print 'Line %i, Column %i: %s' % (pos.line+1, pos.col+1, error.msg)
+        return
     _dump_node(node, node_positions)
 
 class TestComments(unittest.TestCase):
     def _test(self, script, expected_comments):
-        root = parse(script, None, lambda line, col, msg: None)
+        root = parse(script, None)
         comments = findcomments(script, root)
         encountered_comments = [node.atom for node in comments]
         self.assertEquals(encountered_comments, list(expected_comments))
@@ -239,19 +242,18 @@
 class TestLineOffset(unittest.TestCase):
     def testErrorPos(self):
         def geterror(script, start_offset):
-            errors = []
-            def onerror(offset, msg, msg_args):
-                errors.append((offset, msg, msg_args))
-            parse(script, None, onerror, start_offset)
-            self.assertEquals(len(errors), 1)
-            return errors[0]
+            try:
+                parse(script, None, start_offset)
+            except JSSyntaxError, error:
+                return (error.offset, error.msg, error.msg_args)
+            assert False
         self.assertEquals(geterror(' ?', 0), (1, 'syntax_error', {}))
         self.assertEquals(geterror('\n ?', 0), (2, 'syntax_error', {}))
         self.assertEquals(geterror(' ?', 2), (3, 'syntax_error', {}))
         self.assertEquals(geterror('\n ?', 2), (4, 'syntax_error', {}))
     def testNodePos(self):
         def getnodepos(script, start_offset):
-            root = parse(script, None, None, start_offset)
+            root = parse(script, None, start_offset)
             self.assertEquals(root.kind, tok.LC)
             var, = root.kids
             self.assertEquals(var.kind, tok.VAR)
@@ -264,7 +266,7 @@
         self.assertEquals(getnodepos('\n\n var x;', 7), 10)
     def testComments(self):
         def testcomment(comment, startpos, expected_offset):
-            root = parse(comment, None, None, startpos)
+            root = parse(comment, None, startpos)
             comment, = findcomments(comment, root, startpos)
             self.assertEquals(comment.start_offset, expected_offset)
         for comment in ('/*comment*/', '//comment'):
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-23 23:46:55 UTC (rev 364)
+++ trunk/javascriptlint/lint.py	2016-12-23 23:55:18 UTC (rev 365)
@@ -351,9 +351,6 @@
 
 def _lint_script_part(script_offset, jsversion, script, script_cache, conf,
                       report_parse_error, report_lint, import_callback):
-    def parse_error(offset, msg, msg_args):
-        parse_errors.append((offset, msg, msg_args))
-
     def report(node, errname, offset=0, **errargs):
         if errname == 'empty_statement' and node.kind == tok.LC:
             for pass_ in passes:
@@ -387,7 +384,6 @@
 
         report_lint(node, errname, offset, **errargs)
 
-    parse_errors = []
     declares = []
     unused_identifiers = []
     import_paths = []
@@ -421,11 +417,11 @@
         report_lint(None, 'e4x_deprecated',
                     jsversionnode.start_offset if jsversionnode else script_offset)
 
-    root = jsparse.parse(script, jsversion, parse_error, script_offset)
-    if not root:
+    try:
+        root = jsparse.parse(script, jsversion, script_offset)
+    except jsparse.JSSyntaxError, error:
         # Report errors and quit.
-        for offset, msg, msg_args in parse_errors:
-            report_parse_error(offset, msg, msg_args)
+        report_parse_error(error.offset, error.msg, error.msg_args)
         return
 
     comments = jsparse.filtercomments(possible_comments, root)
@@ -487,10 +483,6 @@
     if start_ignore:
         report(start_ignore, 'mismatch_ctrl_comments')
 
-    # Wait to report parse errors until loading jsl:ignore directives.
-    for offset, msg in parse_errors:
-        report_parse_error(offset, msg)
-
     # Find all visitors and convert them into "onpush" callbacks that call "report"
     visitors = {
         'push': lintwarnings.make_visitors(conf)
Modified: trunk/jsengine/parser/__init__.py
===================================================================
--- trunk/jsengine/parser/__init__.py	2016-12-23 23:46:55 UTC (rev 364)
+++ trunk/jsengine/parser/__init__.py	2016-12-23 23:55:18 UTC (rev 365)
@@ -814,7 +814,9 @@
     nodes = _sourceelements(t, tok.EOF)
     lc_end_offset = t.expect(tok.EOF).end_offset
     lc_start_offset = nodes[-1].start_offset if nodes else lc_end_offset
-    return ParseNode(kind.LC, None, lc_start_offset, lc_end_offset, None, nodes)
+    root = ParseNode(kind.LC, None, lc_start_offset, lc_end_offset, None, nodes)
+    _validate(root)
+    return root
 
 def is_valid_version(version):
     return version in _VERSIONS
@@ -825,16 +827,10 @@
             assert kid.parent is node
             _validate(kid, depth+1)
 
-def parse(script, jsversion, error_callback, start_offset):
+def parse(script, jsversion, start_offset):
     # TODO: respect version
     assert is_valid_version(jsversion)
-    try:
-        root = parsestring(script, start_offset)
-    except JSSyntaxError as error:
-        error_callback(error.offset, error.msg, error.msg_args)
-        return None
-    _validate(root)
-    return root
+    return parsestring(script, start_offset)
 
 def is_compilable_unit(script, jsversion):
     # TODO: respect version
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-23 23:46:57
      
     | 
| Revision: 364
          http://sourceforge.net/p/javascriptlint/code/364
Author:   matthiasmiller
Date:     2016-12-23 23:46:55 +0000 (Fri, 23 Dec 2016)
Log Message:
-----------
e4x_deprecated should be a warning, not an error.
Modified Paths:
--------------
    trunk/javascriptlint/jsparse.py
    trunk/javascriptlint/lint.py
    trunk/javascriptlint/lintwarnings.py
Modified: trunk/javascriptlint/jsparse.py
===================================================================
--- trunk/javascriptlint/jsparse.py	2016-12-23 23:38:49 UTC (rev 363)
+++ trunk/javascriptlint/jsparse.py	2016-12-23 23:46:55 UTC (rev 364)
@@ -58,8 +58,6 @@
     assert not start_offset is None
     jsversion = jsversion or JSVersion.default()
     assert isvalidversion(jsversion), jsversion
-    if jsversion.e4x:
-        error_callback(start_offset, 'e4x_deprecated', {})
     return jsengine.parser.parse(script, jsversion.version,
                                  error_callback, start_offset)
 
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-23 23:38:49 UTC (rev 363)
+++ trunk/javascriptlint/lint.py	2016-12-23 23:46:55 UTC (rev 364)
@@ -417,6 +417,10 @@
                     version=jsversion.version)
         return
 
+    if jsversion.e4x:
+        report_lint(None, 'e4x_deprecated',
+                    jsversionnode.start_offset if jsversionnode else script_offset)
+
     root = jsparse.parse(script, jsversion, parse_error, script_offset)
     if not root:
         # Report errors and quit.
Modified: trunk/javascriptlint/lintwarnings.py
===================================================================
--- trunk/javascriptlint/lintwarnings.py	2016-12-23 23:38:49 UTC (rev 363)
+++ trunk/javascriptlint/lintwarnings.py	2016-12-23 23:46:55 UTC (rev 364)
@@ -103,10 +103,10 @@
     'function_name_missing': 'anonymous function should be named to match property name {name}',
     'function_name_mismatch': 'function name {fn_name} does not match property name {prop_name}',
     'trailing_whitespace': 'trailing whitespace',
+    'e4x_deprecated': 'e4x is deprecated',
 }
 
 errors = {
-    'e4x_deprecated': 'e4x is deprecated',
     'semi_before_stmnt': 'missing semicolon before statement',
     'syntax_error': 'syntax error',
     'expected_tok': 'expected token: {token}',
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 | 
| 
      
      
      From: <mat...@us...> - 2016-12-23 23:38:51
      
     | 
| Revision: 363
          http://sourceforge.net/p/javascriptlint/code/363
Author:   matthiasmiller
Date:     2016-12-23 23:38:49 +0000 (Fri, 23 Dec 2016)
Log Message:
-----------
Remove obsolete checks.
Modified Paths:
--------------
    trunk/javascriptlint/lint.py
Modified: trunk/javascriptlint/lint.py
===================================================================
--- trunk/javascriptlint/lint.py	2016-12-23 23:35:40 UTC (rev 362)
+++ trunk/javascriptlint/lint.py	2016-12-23 23:38:49 UTC (rev 363)
@@ -352,9 +352,7 @@
 def _lint_script_part(script_offset, jsversion, script, script_cache, conf,
                       report_parse_error, report_lint, import_callback):
     def parse_error(offset, msg, msg_args):
-        if not msg in ('anon_no_return_value', 'no_return_value',
-                       'redeclared_var', 'var_hides_arg'):
-            parse_errors.append((offset, msg, msg_args))
+        parse_errors.append((offset, msg, msg_args))
 
     def report(node, errname, offset=0, **errargs):
         if errname == 'empty_statement' and node.kind == tok.LC:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |