jslint_on_rails 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.markdown +24 -0
- data/Gemfile.lock +22 -0
- data/README.markdown +33 -20
- data/Rakefile +3 -4
- data/lib/jslint/lint.rb +1 -0
- data/lib/jslint/railtie.rb +21 -0
- data/lib/jslint/utils.rb +3 -3
- data/lib/jslint/vendor/jslint.js +425 -256
- data/lib/jslint.rb +4 -0
- data/lib/jslint_on_rails.rb +1 -0
- data/spec/lint_spec.rb +9 -0
- data/spec/railtie_spec.rb +31 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/utils_spec.rb +2 -2
- metadata +11 -3
data/lib/jslint/vendor/jslint.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
// jslint.js
|
2
|
-
// 2010-
|
2
|
+
// 2010-11-27
|
3
3
|
|
4
4
|
/*
|
5
5
|
Copyright (c) 2002 Douglas Crockford (www.JSLint.com)
|
@@ -33,7 +33,7 @@ SOFTWARE.
|
|
33
33
|
The first parameter is either a string or an array of strings. If it is a
|
34
34
|
string, it will be split on '\n' or '\r'. If it is an array of strings, it
|
35
35
|
is assumed that each string represents one line. The source can be a
|
36
|
-
JavaScript text, or HTML text, or a
|
36
|
+
JavaScript text, or HTML text, or a JSON text, or a CSS text.
|
37
37
|
|
38
38
|
The second parameter is an optional object of options which control the
|
39
39
|
operation of JSLINT. Most of the options are booleans: They are all are
|
@@ -144,110 +144,115 @@ SOFTWARE.
|
|
144
144
|
evil: true, nomen: false, onevar: false, regexp: false, strict: true
|
145
145
|
*/
|
146
146
|
|
147
|
-
/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%",
|
148
|
-
"(begin)", "(breakage)", "(context)", "(error)", "(global)",
|
149
|
-
"(identifier)", "(last)", "(line)", "(loopage)", "(name)", "(onevar)",
|
150
|
-
"(params)", "(scope)", "(verb)", "*", "+", "++", "-",
|
151
|
-
"<", "<=", "==", "===", ">", ">=", ADSAFE,
|
152
|
-
Array, Boolean, COM, CScript, Canvas, CustomAnimation,
|
153
|
-
Enumerator, Error, EvalError, FadeAnimation, Flash,
|
154
|
-
Function, HotKey, Image, JSON, LN10, LN2, LOG10E,
|
155
|
-
MIN_VALUE, Math, MenuItem, MoveAnimation,
|
156
|
-
Object, Option, PI, POSITIVE_INFINITY, Point,
|
157
|
-
|
158
|
-
SQRT2, ScrollBar, String, Style, SyntaxError,
|
159
|
-
|
160
|
-
XMLHttpRequest, "\\", a, abbr, acronym,
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
"background-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
"border-
|
170
|
-
"border-
|
171
|
-
"border-
|
172
|
-
"border-style", "border-
|
173
|
-
"border-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
147
|
+
/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%",
|
148
|
+
"(begin)", "(breakage)", "(context)", "(error)", "(global)",
|
149
|
+
"(identifier)", "(last)", "(line)", "(loopage)", "(name)", "(onevar)",
|
150
|
+
"(params)", "(scope)", "(statement)", "(verb)", "*", "+", "++", "-",
|
151
|
+
"--", "\/", "<", "<=", "==", "===", ">", ">=", ADSAFE,
|
152
|
+
ActiveXObject, Array, Boolean, COM, CScript, Canvas, CustomAnimation,
|
153
|
+
Date, Debug, E, Enumerator, Error, EvalError, FadeAnimation, Flash,
|
154
|
+
FormField, Frame, Function, HotKey, Image, JSON, LN10, LN2, LOG10E,
|
155
|
+
LOG2E, MAX_VALUE, MIN_VALUE, Math, MenuItem, MoveAnimation,
|
156
|
+
NEGATIVE_INFINITY, Number, Object, Option, PI, POSITIVE_INFINITY, Point,
|
157
|
+
RangeError, Rectangle, ReferenceError, RegExp, ResizeAnimation,
|
158
|
+
RotateAnimation, SQRT1_2, SQRT2, ScrollBar, String, Style, SyntaxError,
|
159
|
+
System, Text, TextArea, Timer, TypeError, URIError, URL, VBArray,
|
160
|
+
WScript, Web, Window, XMLDOM, XMLHttpRequest, "\\", a, abbr, acronym,
|
161
|
+
activeborder, activecaption, addEventListener, address, adsafe, alert,
|
162
|
+
aliceblue, all, animator, antiquewhite, appleScript, applet, apply,
|
163
|
+
approved, appworkspace, aqua, aquamarine, area, arguments, arity,
|
164
|
+
article, aside, audio, autocomplete, azure, b, background,
|
165
|
+
"background-attachment", "background-color", "background-image",
|
166
|
+
"background-position", "background-repeat", base, bdo, beep, beige, big,
|
167
|
+
bisque, bitwise, black, blanchedalmond, block, blockquote, blue,
|
168
|
+
blueviolet, blur, body, border, "border-bottom", "border-bottom-color",
|
169
|
+
"border-bottom-style", "border-bottom-width", "border-collapse",
|
170
|
+
"border-color", "border-left", "border-left-color", "border-left-style",
|
171
|
+
"border-left-width", "border-right", "border-right-color",
|
172
|
+
"border-right-style", "border-right-width", "border-spacing",
|
173
|
+
"border-style", "border-top", "border-top-color", "border-top-style",
|
174
|
+
"border-top-width", "border-width", bottom, br, braille, brown, browser,
|
175
|
+
burlywood, button, buttonface, buttonhighlight, buttonshadow,
|
176
|
+
buttontext, bytesToUIString, c, cadetblue, call, callee, caller, canvas,
|
177
|
+
cap, caption, "caption-side", captiontext, cases, center, charAt,
|
178
|
+
charCodeAt, character, chartreuse, chocolate, chooseColor, chooseFile,
|
179
|
+
chooseFolder, cite, clear, clearInterval, clearTimeout, clip, close,
|
180
|
+
closeWidget, closed, closure, cm, code, col, colgroup, color, command,
|
181
|
+
comment, condition, confirm, console, constructor, content,
|
182
|
+
convertPathToHFS, convertPathToPlatform, coral, cornflowerblue,
|
183
|
+
cornsilk, "counter-increment", "counter-reset", create, crimson, css,
|
184
|
+
cursor, cyan, d, darkblue, darkcyan, darkgoldenrod, darkgray, darkgreen,
|
185
|
+
darkkhaki, darkmagenta, darkolivegreen, darkorange, darkorchid, darkred,
|
186
|
+
darksalmon, darkseagreen, darkslateblue, darkslategray, darkturquoise,
|
187
|
+
darkviolet, data, datalist, dd, debug, decodeURI, decodeURIComponent,
|
188
|
+
deeppink, deepskyblue, defaultStatus, defineClass, del, deserialize,
|
189
|
+
details, devel, dfn, dialog, dimension, dimgray, dir, direction,
|
190
|
+
display, div, dl, document, dodgerblue, dt, edition, else, em, embed,
|
191
|
+
embossed, empty, "empty-cells", encodeURI, encodeURIComponent,
|
192
|
+
entityify, eqeqeq, errors, es5, escape, eval, event, evidence, evil, ex,
|
193
|
+
exception, exec, exps, fieldset, figure, filesystem, firebrick, first,
|
194
|
+
float, floor, floralwhite, focus, focusWidget, font, "font-family",
|
195
|
+
"font-size", "font-size-adjust", "font-stretch", "font-style",
|
196
|
+
"font-variant", "font-weight", footer, forestgreen, forin, form,
|
197
|
+
fragment, frame, frames, frameset, from, fromCharCode, fuchsia, fud,
|
198
|
+
funct, function, functions, g, gainsboro, gc, getComputedStyle,
|
199
|
+
ghostwhite, global, globals, gold, goldenrod, gray, graytext, green,
|
200
|
+
greenyellow, h1, h2, h3, h4, h5, h6, handheld, hasOwnProperty, head,
|
201
|
+
header, height, help, hgroup, highlight, highlighttext, history,
|
202
|
+
honeydew, hotpink, hr, "hta:application", html, i, iTunes, id,
|
203
|
+
identifier, iframe, img, immed, implieds, in, inactiveborder,
|
204
|
+
inactivecaption, inactivecaptiontext, include, indent, indexOf,
|
205
|
+
indianred, indigo, infobackground, infotext, init, input, ins, isAlpha,
|
206
|
+
isApplicationRunning, isDigit, isFinite, isNaN, ivory, join, jslint,
|
207
|
+
json, kbd, keygen, khaki, konfabulatorVersion, label, labelled, lang,
|
208
|
+
last, lavender, lavenderblush, lawngreen, laxbreak, lbp, led, left,
|
209
|
+
legend, lemonchiffon, length, "letter-spacing", li, lib, lightblue,
|
210
|
+
lightcoral, lightcyan, lightgoldenrodyellow, lightgreen, lightpink,
|
211
|
+
lightsalmon, lightseagreen, lightskyblue, lightslategray,
|
212
|
+
lightsteelblue, lightyellow, lime, limegreen, line, "line-height",
|
213
|
+
linen, link, "list-style", "list-style-image", "list-style-position",
|
214
|
+
"list-style-type", load, loadClass, location, log, m, magenta, map,
|
215
|
+
margin, "margin-bottom", "margin-left", "margin-right", "margin-top",
|
216
|
+
mark, "marker-offset", maroon, match, "max-height", "max-width", maxerr,
|
217
|
+
maxlen, md5, mediumaquamarine, mediumblue, mediumorchid, mediumpurple,
|
218
|
+
mediumseagreen, mediumslateblue, mediumspringgreen, mediumturquoise,
|
219
|
+
mediumvioletred, member, menu, menutext, message, meta, meter,
|
220
|
+
midnightblue, "min-height", "min-width", mintcream, mistyrose, mm,
|
221
|
+
moccasin, moveBy, moveTo, name, nav, navajowhite, navigator, navy, new,
|
222
|
+
newcap, noframes, nomen, noscript, nud, object, ol, oldlace, olive,
|
223
|
+
olivedrab, on, onbeforeunload, onblur, onerror, onevar, onfocus, onload,
|
224
|
+
onresize, onunload, opacity, open, openURL, opener, opera, optgroup,
|
225
|
+
option, orange, orangered, orchid, outer, outline, "outline-color",
|
226
|
+
"outline-style", "outline-width", output, overflow, "overflow-x",
|
227
|
+
"overflow-y", p, padding, "padding-bottom", "padding-left",
|
228
|
+
"padding-right", "padding-top", "page-break-after", "page-break-before",
|
229
|
+
palegoldenrod, palegreen, paleturquoise, palevioletred, papayawhip,
|
230
|
+
param, parent, parseFloat, parseInt, passfail, pc, peachpuff, peru,
|
231
|
+
pink, play, plum, plusplus, pop, popupMenu, position, powderblue, pre,
|
232
|
+
predef, preferenceGroups, preferences, print, progress, projection,
|
233
|
+
prompt, prototype, pt, purple, push, px, q, quit, quotes, random, range,
|
234
|
+
raw, reach, readFile, readUrl, reason, red, regexp, reloadWidget,
|
235
|
+
removeEventListener, replace, report, reserved, resizeBy, resizeTo,
|
236
|
+
resolvePath, resumeUpdates, rhino, right, rosybrown, royalblue, rp, rt,
|
237
|
+
ruby, runCommand, runCommandInBg, saddlebrown, safe, salmon, samp,
|
238
|
+
sandybrown, saveAs, savePreferences, screen, script, scroll, scrollBy,
|
239
|
+
scrollTo, scrollbar, seagreen, seal, search, seashell, section, select,
|
240
|
+
serialize, setInterval, setTimeout, shift, showWidgetPreferences,
|
241
|
+
sienna, silver, skyblue, slateblue, slategray, sleep, slice, small,
|
242
|
+
snow, sort, source, span, spawn, speak, speech, split, springgreen, src,
|
243
|
+
stack, status, steelblue, strict, strong, style, styleproperty, sub,
|
244
|
+
substr, sup, supplant, suppressUpdates, sync, system, table,
|
245
|
+
"table-layout", tan, tbody, td, teal, tellWidget, test, "text-align",
|
246
|
+
"text-decoration", "text-indent", "text-shadow", "text-transform",
|
247
|
+
textarea, tfoot, th, thead, thistle, threeddarkshadow, threedface,
|
248
|
+
threedhighlight, threedlightshadow, threedshadow, time, title,
|
249
|
+
toLowerCase, toString, toUpperCase, toint32, token, tomato, top, tr, tt,
|
250
|
+
tty, turquoise, tv, type, u, ul, undef, unescape, "unicode-bidi",
|
251
|
+
unused, unwatch, updateNow, urls, value, valueOf, var, version,
|
252
|
+
"vertical-align", video, violet, visibility, watch, wheat, white,
|
253
|
+
"white-space", whitesmoke, widget, width, window, windowframe, windows,
|
254
|
+
windowtext, "word-spacing", "word-wrap", yahooCheckLogin, yahooLogin,
|
255
|
+
yahooLogout, yellow, yellowgreen, "z-index"
|
251
256
|
*/
|
252
257
|
|
253
258
|
// We build the application inside a function so that we produce only a single
|
@@ -263,12 +268,6 @@ var JSLINT = (function () {
|
|
263
268
|
anonname, // The guessed name for anonymous functions.
|
264
269
|
approved, // ADsafe approved urls.
|
265
270
|
|
266
|
-
atrule = {
|
267
|
-
media : true,
|
268
|
-
'font-face': true,
|
269
|
-
page : true
|
270
|
-
},
|
271
|
-
|
272
271
|
// These are operators that should not be used with the ! operator.
|
273
272
|
|
274
273
|
bang = {
|
@@ -534,7 +533,36 @@ var JSLINT = (function () {
|
|
534
533
|
"white" : true,
|
535
534
|
"whitesmoke" : true,
|
536
535
|
"yellow" : true,
|
537
|
-
"yellowgreen" : true
|
536
|
+
"yellowgreen" : true,
|
537
|
+
|
538
|
+
"activeborder" : true,
|
539
|
+
"activecaption" : true,
|
540
|
+
"appworkspace" : true,
|
541
|
+
"background" : true,
|
542
|
+
"buttonface" : true,
|
543
|
+
"buttonhighlight" : true,
|
544
|
+
"buttonshadow" : true,
|
545
|
+
"buttontext" : true,
|
546
|
+
"captiontext" : true,
|
547
|
+
"graytext" : true,
|
548
|
+
"highlight" : true,
|
549
|
+
"highlighttext" : true,
|
550
|
+
"inactiveborder" : true,
|
551
|
+
"inactivecaption" : true,
|
552
|
+
"inactivecaptiontext" : true,
|
553
|
+
"infobackground" : true,
|
554
|
+
"infotext" : true,
|
555
|
+
"menu" : true,
|
556
|
+
"menutext" : true,
|
557
|
+
"scrollbar" : true,
|
558
|
+
"threeddarkshadow" : true,
|
559
|
+
"threedface" : true,
|
560
|
+
"threedhighlight" : true,
|
561
|
+
"threedlightshadow" : true,
|
562
|
+
"threedshadow" : true,
|
563
|
+
"window" : true,
|
564
|
+
"windowframe" : true,
|
565
|
+
"windowtext" : true
|
538
566
|
},
|
539
567
|
|
540
568
|
cssBorderStyle,
|
@@ -552,6 +580,7 @@ var JSLINT = (function () {
|
|
552
580
|
'px': true
|
553
581
|
},
|
554
582
|
|
583
|
+
cssMedia,
|
555
584
|
cssOverflow,
|
556
585
|
|
557
586
|
devel = {
|
@@ -638,8 +667,10 @@ var JSLINT = (function () {
|
|
638
667
|
head: {parent: ' html '},
|
639
668
|
header: {},
|
640
669
|
hgroup: {},
|
641
|
-
html: {parent: '*'},
|
642
670
|
hr: {empty: true},
|
671
|
+
'hta:application':
|
672
|
+
{empty: true, parent: ' head '},
|
673
|
+
html: {parent: '*'},
|
643
674
|
i: {},
|
644
675
|
iframe: {},
|
645
676
|
img: {empty: true},
|
@@ -737,17 +768,6 @@ var JSLINT = (function () {
|
|
737
768
|
},
|
738
769
|
|
739
770
|
scope, // The current scope
|
740
|
-
|
741
|
-
windows = {
|
742
|
-
ActiveXObject: false,
|
743
|
-
CScript : false,
|
744
|
-
Debug : false,
|
745
|
-
Enumerator : false,
|
746
|
-
System : false,
|
747
|
-
VBArray : false,
|
748
|
-
WScript : false
|
749
|
-
},
|
750
|
-
|
751
771
|
src,
|
752
772
|
stack,
|
753
773
|
|
@@ -790,13 +810,13 @@ var JSLINT = (function () {
|
|
790
810
|
LN10 : true,
|
791
811
|
LOG2E : true,
|
792
812
|
LOG10E : true,
|
793
|
-
PI : true,
|
794
|
-
SQRT1_2 : true,
|
795
|
-
SQRT2 : true,
|
796
813
|
MAX_VALUE : true,
|
797
814
|
MIN_VALUE : true,
|
798
815
|
NEGATIVE_INFINITY : true,
|
799
|
-
|
816
|
+
PI : true,
|
817
|
+
POSITIVE_INFINITY : true,
|
818
|
+
SQRT1_2 : true,
|
819
|
+
SQRT2 : true
|
800
820
|
},
|
801
821
|
|
802
822
|
strict_mode,
|
@@ -886,6 +906,16 @@ var JSLINT = (function () {
|
|
886
906
|
yahooLogout : true
|
887
907
|
},
|
888
908
|
|
909
|
+
windows = {
|
910
|
+
ActiveXObject: false,
|
911
|
+
CScript : false,
|
912
|
+
Debug : false,
|
913
|
+
Enumerator : false,
|
914
|
+
System : false,
|
915
|
+
VBArray : false,
|
916
|
+
WScript : false
|
917
|
+
},
|
918
|
+
|
889
919
|
// xmode is used to adapt to the exceptions in html parsing.
|
890
920
|
// It can have these states:
|
891
921
|
// false .js script file
|
@@ -899,15 +929,16 @@ var JSLINT = (function () {
|
|
899
929
|
xmode,
|
900
930
|
xquote,
|
901
931
|
|
932
|
+
// Regular expressions. Some of these are ridiculously long.
|
933
|
+
|
902
934
|
// unsafe comment or string
|
903
|
-
ax = /@cc|<\/?|script|\]
|
935
|
+
ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i,
|
904
936
|
// unsafe characters that are silently deleted by one or more browsers
|
905
937
|
cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,
|
906
938
|
// token
|
907
|
-
tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jslint|members?|global)?|=|\/)?|\*[\/=]?|\+
|
939
|
+
tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jslint|members?|global)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/,
|
908
940
|
// html token
|
909
|
-
|
910
|
-
hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-]*|[0-9]+|--)/,
|
941
|
+
hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-:]*|[0-9]+|--)/,
|
911
942
|
// characters in strings that need escapement
|
912
943
|
nx = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/,
|
913
944
|
nxg = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
@@ -961,10 +992,10 @@ var JSLINT = (function () {
|
|
961
992
|
}
|
962
993
|
|
963
994
|
String.prototype.entityify = function () {
|
964
|
-
return this
|
965
|
-
replace(/&/g, '&')
|
966
|
-
replace(/</g, '<')
|
967
|
-
replace(/>/g, '>');
|
995
|
+
return this
|
996
|
+
.replace(/&/g, '&')
|
997
|
+
.replace(/</g, '<')
|
998
|
+
.replace(/>/g, '>');
|
968
999
|
};
|
969
1000
|
|
970
1001
|
String.prototype.isAlpha = function () {
|
@@ -1128,7 +1159,7 @@ var JSLINT = (function () {
|
|
1128
1159
|
|
1129
1160
|
function it(type, value) {
|
1130
1161
|
var i, t;
|
1131
|
-
if (type === '(color)') {
|
1162
|
+
if (type === '(color)' || type === '(range)') {
|
1132
1163
|
t = {type: type};
|
1133
1164
|
} else if (type === '(punctuator)' ||
|
1134
1165
|
(type === '(identifier)' && is_own(syntax, value))) {
|
@@ -1172,10 +1203,10 @@ var JSLINT = (function () {
|
|
1172
1203
|
return {
|
1173
1204
|
init: function (source) {
|
1174
1205
|
if (typeof source === 'string') {
|
1175
|
-
lines = source
|
1176
|
-
replace(/\r\n/g, '\n')
|
1177
|
-
replace(/\r/g, '\n')
|
1178
|
-
split('\n');
|
1206
|
+
lines = source
|
1207
|
+
.replace(/\r\n/g, '\n')
|
1208
|
+
.replace(/\r/g, '\n')
|
1209
|
+
.split('\n');
|
1179
1210
|
} else {
|
1180
1211
|
lines = source;
|
1181
1212
|
}
|
@@ -1608,6 +1639,9 @@ var JSLINT = (function () {
|
|
1608
1639
|
if (option.regexp) {
|
1609
1640
|
warningAt("Insecure '{a}'.",
|
1610
1641
|
line, from + l, c);
|
1642
|
+
} else if (s.charAt(l) === ']') {
|
1643
|
+
errorAt("Unescaped '{a}'.",
|
1644
|
+
line, from + l, '^');
|
1611
1645
|
}
|
1612
1646
|
}
|
1613
1647
|
q = false;
|
@@ -1790,7 +1824,7 @@ klass: do {
|
|
1790
1824
|
line, character + l);
|
1791
1825
|
}
|
1792
1826
|
character += i;
|
1793
|
-
if (s
|
1827
|
+
if (s.charAt(i + 2) !== '>') {
|
1794
1828
|
errorAt("Expected -->.", line, character);
|
1795
1829
|
}
|
1796
1830
|
character += 3;
|
@@ -2123,6 +2157,14 @@ loop: for (;;) {
|
|
2123
2157
|
}
|
2124
2158
|
}
|
2125
2159
|
|
2160
|
+
function nobreak(left, right) {
|
2161
|
+
left = left || token;
|
2162
|
+
right = right || nexttoken;
|
2163
|
+
if (left.character !== right.from || left.line !== right.line) {
|
2164
|
+
warning("Unexpected space before '{a}'.", right, right.value);
|
2165
|
+
}
|
2166
|
+
}
|
2167
|
+
|
2126
2168
|
function nospace(left, right) {
|
2127
2169
|
left = left || token;
|
2128
2170
|
right = right || nexttoken;
|
@@ -2275,13 +2317,8 @@ loop: for (;;) {
|
|
2275
2317
|
|
2276
2318
|
function reservevar(s, v) {
|
2277
2319
|
return reserve(s, function () {
|
2278
|
-
if (
|
2279
|
-
|
2280
|
-
if (strict_mode && funct['(global)']) {
|
2281
|
-
warning("Strict violation.", this);
|
2282
|
-
} else if (option.safe) {
|
2283
|
-
warning("ADsafe violation.", this);
|
2284
|
-
}
|
2320
|
+
if (typeof v === 'function') {
|
2321
|
+
v(this);
|
2285
2322
|
}
|
2286
2323
|
return this;
|
2287
2324
|
});
|
@@ -2336,7 +2373,7 @@ loop: for (;;) {
|
|
2336
2373
|
function isPoorRelation(node) {
|
2337
2374
|
return node &&
|
2338
2375
|
((node.type === '(number)' && +node.value === 0) ||
|
2339
|
-
(node.type === '(string)' && node.value === '
|
2376
|
+
(node.type === '(string)' && node.value === '') ||
|
2340
2377
|
node.type === 'true' ||
|
2341
2378
|
node.type === 'false' ||
|
2342
2379
|
node.type === 'undefined' ||
|
@@ -2351,7 +2388,9 @@ loop: for (;;) {
|
|
2351
2388
|
that.left = left;
|
2352
2389
|
if (predefined[left.value] === false &&
|
2353
2390
|
scope[left.value]['(global)'] === true) {
|
2354
|
-
warning(
|
2391
|
+
warning("Read only.", left);
|
2392
|
+
} else if (left['function']) {
|
2393
|
+
warning("'{a}' is a function.", left, left.value);
|
2355
2394
|
}
|
2356
2395
|
if (option.safe) {
|
2357
2396
|
l = left;
|
@@ -2386,6 +2425,7 @@ loop: for (;;) {
|
|
2386
2425
|
}, 20);
|
2387
2426
|
}
|
2388
2427
|
|
2428
|
+
|
2389
2429
|
function bitwise(s, f, p) {
|
2390
2430
|
var x = symbol(s, p);
|
2391
2431
|
reserveName(x);
|
@@ -2400,6 +2440,7 @@ loop: for (;;) {
|
|
2400
2440
|
return x;
|
2401
2441
|
}
|
2402
2442
|
|
2443
|
+
|
2403
2444
|
function bitwiseassignop(s) {
|
2404
2445
|
symbol(s, 20).exps = true;
|
2405
2446
|
return infix(s, function (left, that) {
|
@@ -2450,7 +2491,7 @@ loop: for (;;) {
|
|
2450
2491
|
} else if (token.reserved && !option.es5) {
|
2451
2492
|
warning("Expected an identifier and instead saw '{a}' (a reserved word).",
|
2452
2493
|
token, token.id);
|
2453
|
-
}
|
2494
|
+
}
|
2454
2495
|
return token.value;
|
2455
2496
|
}
|
2456
2497
|
}
|
@@ -2469,6 +2510,7 @@ loop: for (;;) {
|
|
2469
2510
|
}
|
2470
2511
|
}
|
2471
2512
|
|
2513
|
+
|
2472
2514
|
function reachable(s) {
|
2473
2515
|
var i = 0, t;
|
2474
2516
|
if (nexttoken.id !== ';' || noreach) {
|
@@ -2541,7 +2583,7 @@ loop: for (;;) {
|
|
2541
2583
|
warning("Do not use 'new' for side effects.");
|
2542
2584
|
}
|
2543
2585
|
if (nexttoken.id !== ';') {
|
2544
|
-
if (!(nexttoken.id == '}' && option.lastsemic)) {
|
2586
|
+
if (!(nexttoken.id == '}' && option.lastsemic && nexttoken.line == token.line)) {
|
2545
2587
|
warningAt("Missing semicolon.", token.line,
|
2546
2588
|
token.from + token.value.length);
|
2547
2589
|
}
|
@@ -2565,6 +2607,8 @@ loop: for (;;) {
|
|
2565
2607
|
advance();
|
2566
2608
|
advance(';');
|
2567
2609
|
strict_mode = true;
|
2610
|
+
option.newcap = true;
|
2611
|
+
option.undef = true;
|
2568
2612
|
return true;
|
2569
2613
|
} else {
|
2570
2614
|
return false;
|
@@ -2678,17 +2722,13 @@ loop: for (;;) {
|
|
2678
2722
|
funct['(verb)'] = null;
|
2679
2723
|
scope = s;
|
2680
2724
|
inblock = b;
|
2725
|
+
if (f && (!a || a.length === 0)) {
|
2726
|
+
warning("Empty block.");
|
2727
|
+
}
|
2681
2728
|
return a;
|
2682
2729
|
}
|
2683
2730
|
|
2684
2731
|
|
2685
|
-
// An identity function, used by string and number tokens.
|
2686
|
-
|
2687
|
-
function idValue() {
|
2688
|
-
return this;
|
2689
|
-
}
|
2690
|
-
|
2691
|
-
|
2692
2732
|
function countMember(m) {
|
2693
2733
|
if (membersOnly && typeof membersOnly[m] !== 'boolean') {
|
2694
2734
|
warning("Unexpected /*member '{a}'.", token, m);
|
@@ -2714,6 +2754,7 @@ loop: for (;;) {
|
|
2714
2754
|
}
|
2715
2755
|
}
|
2716
2756
|
|
2757
|
+
|
2717
2758
|
// CSS parsing.
|
2718
2759
|
|
2719
2760
|
|
@@ -2724,6 +2765,7 @@ loop: for (;;) {
|
|
2724
2765
|
}
|
2725
2766
|
}
|
2726
2767
|
|
2768
|
+
|
2727
2769
|
function cssNumber() {
|
2728
2770
|
if (nexttoken.id === '-') {
|
2729
2771
|
advance('-');
|
@@ -2736,6 +2778,7 @@ loop: for (;;) {
|
|
2736
2778
|
}
|
2737
2779
|
}
|
2738
2780
|
|
2781
|
+
|
2739
2782
|
function cssString() {
|
2740
2783
|
if (nexttoken.type === '(string)') {
|
2741
2784
|
advance();
|
@@ -2743,6 +2786,7 @@ loop: for (;;) {
|
|
2743
2786
|
}
|
2744
2787
|
}
|
2745
2788
|
|
2789
|
+
|
2746
2790
|
function cssColor() {
|
2747
2791
|
var i, number, value;
|
2748
2792
|
if (nexttoken.identifier) {
|
@@ -2801,6 +2845,7 @@ loop: for (;;) {
|
|
2801
2845
|
return false;
|
2802
2846
|
}
|
2803
2847
|
|
2848
|
+
|
2804
2849
|
function cssLength() {
|
2805
2850
|
if (nexttoken.id === '-') {
|
2806
2851
|
advance('-');
|
@@ -2822,6 +2867,7 @@ loop: for (;;) {
|
|
2822
2867
|
return false;
|
2823
2868
|
}
|
2824
2869
|
|
2870
|
+
|
2825
2871
|
function cssLineHeight() {
|
2826
2872
|
if (nexttoken.id === '-') {
|
2827
2873
|
advance('-');
|
@@ -2839,6 +2885,7 @@ loop: for (;;) {
|
|
2839
2885
|
return false;
|
2840
2886
|
}
|
2841
2887
|
|
2888
|
+
|
2842
2889
|
function cssWidth() {
|
2843
2890
|
if (nexttoken.identifier) {
|
2844
2891
|
switch (nexttoken.value) {
|
@@ -2853,6 +2900,7 @@ loop: for (;;) {
|
|
2853
2900
|
}
|
2854
2901
|
}
|
2855
2902
|
|
2903
|
+
|
2856
2904
|
function cssMargin() {
|
2857
2905
|
if (nexttoken.identifier) {
|
2858
2906
|
if (nexttoken.value === 'auto') {
|
@@ -2879,6 +2927,7 @@ loop: for (;;) {
|
|
2879
2927
|
return false;
|
2880
2928
|
}
|
2881
2929
|
|
2930
|
+
|
2882
2931
|
function cssCommaList() {
|
2883
2932
|
while (nexttoken.id !== ';') {
|
2884
2933
|
if (!cssName() && !cssString()) {
|
@@ -2892,12 +2941,11 @@ loop: for (;;) {
|
|
2892
2941
|
}
|
2893
2942
|
}
|
2894
2943
|
|
2944
|
+
|
2895
2945
|
function cssCounter() {
|
2896
2946
|
if (nexttoken.identifier && nexttoken.value === 'counter') {
|
2897
2947
|
advance();
|
2898
2948
|
advance('(');
|
2899
|
-
if (!nexttoken.identifier) {
|
2900
|
-
}
|
2901
2949
|
advance();
|
2902
2950
|
if (nexttoken.id === ',') {
|
2903
2951
|
comma();
|
@@ -2959,6 +3007,7 @@ loop: for (;;) {
|
|
2959
3007
|
return false;
|
2960
3008
|
}
|
2961
3009
|
|
3010
|
+
|
2962
3011
|
function cssUrl() {
|
2963
3012
|
var c, url;
|
2964
3013
|
if (nexttoken.identifier && nexttoken.value === 'url') {
|
@@ -2988,6 +3037,7 @@ loop: for (;;) {
|
|
2988
3037
|
return false;
|
2989
3038
|
}
|
2990
3039
|
|
3040
|
+
|
2991
3041
|
cssAny = [cssUrl, function () {
|
2992
3042
|
for (;;) {
|
2993
3043
|
if (nexttoken.identifier) {
|
@@ -3013,15 +3063,29 @@ loop: for (;;) {
|
|
3013
3063
|
}
|
3014
3064
|
}];
|
3015
3065
|
|
3066
|
+
|
3016
3067
|
cssBorderStyle = [
|
3017
|
-
'none', '
|
3018
|
-
'inset', 'outset'
|
3068
|
+
'none', 'dashed', 'dotted', 'double', 'groove',
|
3069
|
+
'hidden', 'inset', 'outset', 'ridge', 'solid'
|
3019
3070
|
];
|
3020
3071
|
|
3021
3072
|
cssBreak = [
|
3022
3073
|
'auto', 'always', 'avoid', 'left', 'right'
|
3023
3074
|
];
|
3024
3075
|
|
3076
|
+
cssMedia = {
|
3077
|
+
'all': true,
|
3078
|
+
'braille': true,
|
3079
|
+
'embossed': true,
|
3080
|
+
'handheld': true,
|
3081
|
+
'print': true,
|
3082
|
+
'projection': true,
|
3083
|
+
'screen': true,
|
3084
|
+
'speech': true,
|
3085
|
+
'tty': true,
|
3086
|
+
'tv': true
|
3087
|
+
};
|
3088
|
+
|
3025
3089
|
cssOverflow = [
|
3026
3090
|
'auto', 'hidden', 'scroll', 'visible'
|
3027
3091
|
];
|
@@ -3238,6 +3302,7 @@ loop: for (;;) {
|
|
3238
3302
|
}
|
3239
3303
|
}
|
3240
3304
|
|
3305
|
+
|
3241
3306
|
function styleValue(v) {
|
3242
3307
|
var i = 0,
|
3243
3308
|
n,
|
@@ -3373,7 +3438,8 @@ loop: for (;;) {
|
|
3373
3438
|
|
3374
3439
|
function styleSelector() {
|
3375
3440
|
if (nexttoken.identifier) {
|
3376
|
-
if (!is_own(htmltag,
|
3441
|
+
if (!is_own(htmltag, option.cap ?
|
3442
|
+
nexttoken.value.toLowerCase() : nexttoken.value)) {
|
3377
3443
|
warning("Expected a tagName, and instead saw {a}.",
|
3378
3444
|
nexttoken, nexttoken.value);
|
3379
3445
|
}
|
@@ -3401,6 +3467,7 @@ loop: for (;;) {
|
|
3401
3467
|
case 'first-of-type':
|
3402
3468
|
case 'focus':
|
3403
3469
|
case 'hover':
|
3470
|
+
case 'last-child':
|
3404
3471
|
case 'last-of-type':
|
3405
3472
|
case 'link':
|
3406
3473
|
case 'only-of-type':
|
@@ -3489,18 +3556,9 @@ loop: for (;;) {
|
|
3489
3556
|
}
|
3490
3557
|
|
3491
3558
|
function stylePattern() {
|
3492
|
-
var name;
|
3493
3559
|
if (nexttoken.id === '{') {
|
3494
3560
|
warning("Expected a style pattern, and instead saw '{a}'.", nexttoken,
|
3495
3561
|
nexttoken.id);
|
3496
|
-
} else if (nexttoken.id === '@') {
|
3497
|
-
advance('@');
|
3498
|
-
name = nexttoken.value;
|
3499
|
-
if (nexttoken.identifier && atrule[name] === true) {
|
3500
|
-
advance();
|
3501
|
-
return name;
|
3502
|
-
}
|
3503
|
-
warning("Expected an at-rule, and instead saw @{a}.", nexttoken, name);
|
3504
3562
|
}
|
3505
3563
|
for (;;) {
|
3506
3564
|
styleSelector();
|
@@ -3514,23 +3572,7 @@ loop: for (;;) {
|
|
3514
3572
|
}
|
3515
3573
|
}
|
3516
3574
|
|
3517
|
-
function
|
3518
|
-
var i;
|
3519
|
-
while (nexttoken.id === '@') {
|
3520
|
-
i = peek();
|
3521
|
-
if (i.identifier && i.value === 'import') {
|
3522
|
-
advance('@');
|
3523
|
-
advance();
|
3524
|
-
if (!cssUrl()) {
|
3525
|
-
warning("Expected '{a}' and instead saw '{b}'.", nexttoken,
|
3526
|
-
'url', nexttoken.value);
|
3527
|
-
advance();
|
3528
|
-
}
|
3529
|
-
advance(';');
|
3530
|
-
} else {
|
3531
|
-
break;
|
3532
|
-
}
|
3533
|
-
}
|
3575
|
+
function stylelist() {
|
3534
3576
|
while (nexttoken.id !== '</' && nexttoken.id !== '(end)') {
|
3535
3577
|
stylePattern();
|
3536
3578
|
xmode = 'styleproperty';
|
@@ -3545,6 +3587,50 @@ loop: for (;;) {
|
|
3545
3587
|
}
|
3546
3588
|
}
|
3547
3589
|
|
3590
|
+
function styles() {
|
3591
|
+
var i;
|
3592
|
+
while (nexttoken.id === '@') {
|
3593
|
+
i = peek();
|
3594
|
+
advance('@');
|
3595
|
+
if (nexttoken.identifier) {
|
3596
|
+
switch (nexttoken.value) {
|
3597
|
+
case 'import':
|
3598
|
+
advance();
|
3599
|
+
if (!cssUrl()) {
|
3600
|
+
warning("Expected '{a}' and instead saw '{b}'.",
|
3601
|
+
nexttoken, 'url', nexttoken.value);
|
3602
|
+
advance();
|
3603
|
+
}
|
3604
|
+
advance(';');
|
3605
|
+
break;
|
3606
|
+
case 'media':
|
3607
|
+
advance();
|
3608
|
+
for (;;) {
|
3609
|
+
if (!nexttoken.identifier || cssMedia[nexttoken.value] === true) {
|
3610
|
+
error("Expected a CSS media type, and instead saw '{a}'.", nexttoken, nexttoken.id);
|
3611
|
+
}
|
3612
|
+
advance();
|
3613
|
+
if (nexttoken.id !== ',') {
|
3614
|
+
break;
|
3615
|
+
}
|
3616
|
+
advance(',');
|
3617
|
+
}
|
3618
|
+
advance('{');
|
3619
|
+
stylelist();
|
3620
|
+
advance('}');
|
3621
|
+
break;
|
3622
|
+
default:
|
3623
|
+
warning("Expected an at-rule, and instead saw @{a}.",
|
3624
|
+
nexttoken, nexttoken.value);
|
3625
|
+
}
|
3626
|
+
} else {
|
3627
|
+
warning("Expected an at-rule, and instead saw '{a}'.",
|
3628
|
+
nexttoken, nexttoken.value);
|
3629
|
+
}
|
3630
|
+
}
|
3631
|
+
stylelist();
|
3632
|
+
}
|
3633
|
+
|
3548
3634
|
|
3549
3635
|
// HTML parsing.
|
3550
3636
|
|
@@ -3928,13 +4014,13 @@ loop: for (;;) {
|
|
3928
4014
|
break;
|
3929
4015
|
}
|
3930
4016
|
if (nexttoken.value.indexOf('--') >= 0) {
|
3931
|
-
|
4017
|
+
error("Unexpected --.");
|
3932
4018
|
}
|
3933
4019
|
if (nexttoken.value.indexOf('<') >= 0) {
|
3934
|
-
|
4020
|
+
error("Unexpected <.");
|
3935
4021
|
}
|
3936
4022
|
if (nexttoken.value.indexOf('>') >= 0) {
|
3937
|
-
|
4023
|
+
error("Unexpected >.");
|
3938
4024
|
}
|
3939
4025
|
}
|
3940
4026
|
xmode = 'outer';
|
@@ -3963,8 +4049,12 @@ loop: for (;;) {
|
|
3963
4049
|
|
3964
4050
|
// Build the syntax table by declaring the syntactic elements of the language.
|
3965
4051
|
|
3966
|
-
type('(number)',
|
3967
|
-
|
4052
|
+
type('(number)', function () {
|
4053
|
+
return this;
|
4054
|
+
});
|
4055
|
+
type('(string)', function () {
|
4056
|
+
return this;
|
4057
|
+
});
|
3968
4058
|
|
3969
4059
|
syntax['(identifier)'] = {
|
3970
4060
|
type: '(identifier)',
|
@@ -3975,6 +4065,9 @@ loop: for (;;) {
|
|
3975
4065
|
s = scope[v],
|
3976
4066
|
f;
|
3977
4067
|
if (typeof s === 'function') {
|
4068
|
+
|
4069
|
+
// Protection against accidental inheritance.
|
4070
|
+
|
3978
4071
|
s = undefined;
|
3979
4072
|
} else if (typeof s === 'boolean') {
|
3980
4073
|
f = funct;
|
@@ -3994,6 +4087,13 @@ loop: for (;;) {
|
|
3994
4087
|
case 'unused':
|
3995
4088
|
funct[v] = 'var';
|
3996
4089
|
break;
|
4090
|
+
case 'unction':
|
4091
|
+
funct[v] = 'function';
|
4092
|
+
this['function'] = true;
|
4093
|
+
break;
|
4094
|
+
case 'function':
|
4095
|
+
this['function'] = true;
|
4096
|
+
break;
|
3997
4097
|
case 'label':
|
3998
4098
|
warning("'{a}' is a statement label.", token, v);
|
3999
4099
|
break;
|
@@ -4003,7 +4103,7 @@ loop: for (;;) {
|
|
4003
4103
|
// then we have an undefined variable.
|
4004
4104
|
|
4005
4105
|
} else if (funct['(global)']) {
|
4006
|
-
if (option.undef && predefined[v] !== 'boolean') {
|
4106
|
+
if (option.undef && typeof predefined[v] !== 'boolean') {
|
4007
4107
|
warning("'{a}' is not defined.", token, v);
|
4008
4108
|
}
|
4009
4109
|
note_implied(token);
|
@@ -4045,6 +4145,11 @@ loop: for (;;) {
|
|
4045
4145
|
} else {
|
4046
4146
|
switch (s[v]) {
|
4047
4147
|
case 'function':
|
4148
|
+
case 'unction':
|
4149
|
+
this['function'] = true;
|
4150
|
+
s[v] = 'closure';
|
4151
|
+
funct[v] = s['(global)'] ? 'global' : 'outer';
|
4152
|
+
break;
|
4048
4153
|
case 'var':
|
4049
4154
|
case 'unused':
|
4050
4155
|
s[v] = 'closure';
|
@@ -4064,7 +4169,7 @@ loop: for (;;) {
|
|
4064
4169
|
},
|
4065
4170
|
led: function () {
|
4066
4171
|
error("Expected an operator and instead saw '{a}'.",
|
4067
|
-
|
4172
|
+
nexttoken, nexttoken.value);
|
4068
4173
|
}
|
4069
4174
|
};
|
4070
4175
|
|
@@ -4098,13 +4203,30 @@ loop: for (;;) {
|
|
4098
4203
|
reserve('catch');
|
4099
4204
|
reserve('default').reach = true;
|
4100
4205
|
reserve('finally');
|
4101
|
-
reservevar('arguments')
|
4102
|
-
|
4206
|
+
reservevar('arguments', function (x) {
|
4207
|
+
if (strict_mode && funct['(global)']) {
|
4208
|
+
warning("Strict violation.", x);
|
4209
|
+
} else if (option.safe) {
|
4210
|
+
warning("ADsafe violation.", x);
|
4211
|
+
}
|
4212
|
+
});
|
4213
|
+
reservevar('eval', function (x) {
|
4214
|
+
if (option.safe) {
|
4215
|
+
warning("ADsafe violation.", x);
|
4216
|
+
}
|
4217
|
+
});
|
4103
4218
|
reservevar('false');
|
4104
4219
|
reservevar('Infinity');
|
4105
4220
|
reservevar('NaN');
|
4106
4221
|
reservevar('null');
|
4107
|
-
reservevar('this')
|
4222
|
+
reservevar('this', function (x) {
|
4223
|
+
if (strict_mode && ((funct['(statement)'] &&
|
4224
|
+
funct['(name)'].charAt(0) > 'Z') || funct['(global)'])) {
|
4225
|
+
warning("Strict violation.", x);
|
4226
|
+
} else if (option.safe) {
|
4227
|
+
warning("ADsafe violation.", x);
|
4228
|
+
}
|
4229
|
+
});
|
4108
4230
|
reservevar('true');
|
4109
4231
|
reservevar('undefined');
|
4110
4232
|
assignop('=', 'assign', 20);
|
@@ -4205,8 +4327,32 @@ loop: for (;;) {
|
|
4205
4327
|
return that;
|
4206
4328
|
}, 130);
|
4207
4329
|
prefix('+', 'num');
|
4330
|
+
prefix('+++', function () {
|
4331
|
+
warning("Confusing pluses.");
|
4332
|
+
this.right = parse(150);
|
4333
|
+
this.arity = 'unary';
|
4334
|
+
return this;
|
4335
|
+
});
|
4336
|
+
infix('+++', function (left) {
|
4337
|
+
warning("Confusing pluses.");
|
4338
|
+
this.left = left;
|
4339
|
+
this.right = parse(130);
|
4340
|
+
return this;
|
4341
|
+
}, 130);
|
4208
4342
|
infix('-', 'sub', 130);
|
4209
4343
|
prefix('-', 'neg');
|
4344
|
+
prefix('---', function () {
|
4345
|
+
warning("Confusing minuses.");
|
4346
|
+
this.right = parse(150);
|
4347
|
+
this.arity = 'unary';
|
4348
|
+
return this;
|
4349
|
+
});
|
4350
|
+
infix('---', function (left) {
|
4351
|
+
warning("Confusing minuses.");
|
4352
|
+
this.left = left;
|
4353
|
+
this.right = parse(130);
|
4354
|
+
return this;
|
4355
|
+
}, 130);
|
4210
4356
|
infix('*', 'mult', 140);
|
4211
4357
|
infix('/', 'div', 140);
|
4212
4358
|
infix('%', 'mod', 140);
|
@@ -4221,8 +4367,7 @@ loop: for (;;) {
|
|
4221
4367
|
prefix('delete', function () {
|
4222
4368
|
var p = parse(0);
|
4223
4369
|
if (!p || (p.id !== '.' && p.id !== '[')) {
|
4224
|
-
warning("
|
4225
|
-
nexttoken, '.', nexttoken.value);
|
4370
|
+
warning("Variables should not be deleted.");
|
4226
4371
|
}
|
4227
4372
|
this.first = p;
|
4228
4373
|
return this;
|
@@ -4325,13 +4470,17 @@ loop: for (;;) {
|
|
4325
4470
|
|
4326
4471
|
infix('.', function (left, that) {
|
4327
4472
|
adjacent(prevtoken, token);
|
4473
|
+
nobreak();
|
4328
4474
|
var m = identifier();
|
4329
4475
|
if (typeof m === 'string') {
|
4330
4476
|
countMember(m);
|
4331
4477
|
}
|
4332
4478
|
that.left = left;
|
4333
4479
|
that.right = m;
|
4334
|
-
if (
|
4480
|
+
if (left && left.value === 'arguments' &&
|
4481
|
+
(m === 'callee' || m === 'caller')) {
|
4482
|
+
warning("Avoid arguments.{a}.", left, m);
|
4483
|
+
} else if (!option.evil && left && left.value === 'document' &&
|
4335
4484
|
(m === 'write' || m === 'writeln')) {
|
4336
4485
|
warning("document.write can be a form of eval.", left);
|
4337
4486
|
} else if (option.adsafe) {
|
@@ -4387,8 +4536,15 @@ loop: for (;;) {
|
|
4387
4536
|
}, 160, true);
|
4388
4537
|
|
4389
4538
|
infix('(', function (left, that) {
|
4390
|
-
|
4539
|
+
if (prevtoken.id !== '}' && prevtoken.id !== ')') {
|
4540
|
+
nobreak(prevtoken, token);
|
4541
|
+
}
|
4391
4542
|
nospace();
|
4543
|
+
if (option.immed && !left.immed && left.id === 'function') {
|
4544
|
+
warning("Wrap an immediate function invocation in parentheses " +
|
4545
|
+
"to assist the reader in understanding that the expression " +
|
4546
|
+
"is the result of a function, and not the function itself.");
|
4547
|
+
}
|
4392
4548
|
var n = 0,
|
4393
4549
|
p = [];
|
4394
4550
|
if (left) {
|
@@ -4423,10 +4579,6 @@ loop: for (;;) {
|
|
4423
4579
|
}
|
4424
4580
|
}
|
4425
4581
|
advance(')');
|
4426
|
-
if (option.immed && left.id === 'function' && nexttoken.id !== ')') {
|
4427
|
-
warning("Wrap the entire immediate function invocation in parens.",
|
4428
|
-
that);
|
4429
|
-
}
|
4430
4582
|
nospace(prevtoken, token);
|
4431
4583
|
if (typeof left === 'object') {
|
4432
4584
|
if (left.value === 'parseInt' && n === 1) {
|
@@ -4455,6 +4607,9 @@ loop: for (;;) {
|
|
4455
4607
|
|
4456
4608
|
prefix('(', function () {
|
4457
4609
|
nospace();
|
4610
|
+
if (nexttoken.id === 'function') {
|
4611
|
+
nexttoken.immed = true;
|
4612
|
+
}
|
4458
4613
|
var v = parse(0);
|
4459
4614
|
advance(')', this);
|
4460
4615
|
nospace(prevtoken, token);
|
@@ -4472,6 +4627,7 @@ loop: for (;;) {
|
|
4472
4627
|
});
|
4473
4628
|
|
4474
4629
|
infix('[', function (left, that) {
|
4630
|
+
nobreak(prevtoken, token);
|
4475
4631
|
nospace();
|
4476
4632
|
var e = parse(0), s;
|
4477
4633
|
if (e && e.type === '(string)') {
|
@@ -4542,22 +4698,28 @@ loop: for (;;) {
|
|
4542
4698
|
advance(']', this);
|
4543
4699
|
return this;
|
4544
4700
|
}, 160);
|
4545
|
-
|
4546
|
-
|
4701
|
+
|
4702
|
+
|
4547
4703
|
function property_name() {
|
4548
|
-
var
|
4549
|
-
if (!
|
4704
|
+
var id = optionalidentifier(true);
|
4705
|
+
if (!id) {
|
4550
4706
|
if (nexttoken.id === '(string)') {
|
4551
|
-
|
4707
|
+
id = nexttoken.value;
|
4708
|
+
if (option.adsafe &&
|
4709
|
+
(id.charAt(0) === '_' ||
|
4710
|
+
id.charAt(id.length - 1) === '_')) {
|
4711
|
+
warning("Unexpected {a} in '{b}'.", token,
|
4712
|
+
"dangling '_'", id);
|
4713
|
+
}
|
4552
4714
|
advance();
|
4553
4715
|
} else if (nexttoken.id === '(number)') {
|
4554
|
-
|
4716
|
+
id = nexttoken.value.toString();
|
4555
4717
|
advance();
|
4556
4718
|
}
|
4557
4719
|
}
|
4558
|
-
return
|
4720
|
+
return id;
|
4559
4721
|
}
|
4560
|
-
|
4722
|
+
|
4561
4723
|
|
4562
4724
|
function functionparams() {
|
4563
4725
|
var i, t = nexttoken, p = [];
|
@@ -4581,18 +4743,19 @@ loop: for (;;) {
|
|
4581
4743
|
}
|
4582
4744
|
}
|
4583
4745
|
}
|
4584
|
-
|
4585
4746
|
|
4586
|
-
|
4747
|
+
|
4748
|
+
function doFunction(i, statement) {
|
4587
4749
|
var f, s = scope;
|
4588
4750
|
scope = Object.create(s);
|
4589
4751
|
funct = {
|
4590
|
-
'(name)'
|
4591
|
-
'(line)'
|
4592
|
-
'(context)'
|
4593
|
-
'(breakage)': 0,
|
4594
|
-
'(loopage)'
|
4595
|
-
'(scope)'
|
4752
|
+
'(name)' : i || '"' + anonname + '"',
|
4753
|
+
'(line)' : nexttoken.line,
|
4754
|
+
'(context)' : funct,
|
4755
|
+
'(breakage)' : 0,
|
4756
|
+
'(loopage)' : 0,
|
4757
|
+
'(scope)' : scope,
|
4758
|
+
'(statement)': statement
|
4596
4759
|
};
|
4597
4760
|
f = funct;
|
4598
4761
|
token.funct = funct;
|
@@ -4609,7 +4772,7 @@ loop: for (;;) {
|
|
4609
4772
|
return f;
|
4610
4773
|
}
|
4611
4774
|
|
4612
|
-
|
4775
|
+
|
4613
4776
|
(function (x) {
|
4614
4777
|
x.nud = function () {
|
4615
4778
|
var b, f, i, j, p, seen = {}, t;
|
@@ -4637,7 +4800,7 @@ loop: for (;;) {
|
|
4637
4800
|
error("Missing property name.");
|
4638
4801
|
}
|
4639
4802
|
t = nexttoken;
|
4640
|
-
adjacent(token, nexttoken);
|
4803
|
+
adjacent(token, nexttoken);
|
4641
4804
|
f = doFunction(i);
|
4642
4805
|
if (funct['(loopage)']) {
|
4643
4806
|
warning("Don't make functions within a loop.", t);
|
@@ -4646,7 +4809,7 @@ loop: for (;;) {
|
|
4646
4809
|
if (p) {
|
4647
4810
|
warning("Unexpected parameter '{a}' in get {b} function.", t, p[0], i);
|
4648
4811
|
}
|
4649
|
-
adjacent(token, nexttoken);
|
4812
|
+
adjacent(token, nexttoken);
|
4650
4813
|
advance(',');
|
4651
4814
|
indentation();
|
4652
4815
|
advance('set');
|
@@ -4655,7 +4818,7 @@ loop: for (;;) {
|
|
4655
4818
|
error("Expected {a} and instead saw {b}.", token, i, j);
|
4656
4819
|
}
|
4657
4820
|
t = nexttoken;
|
4658
|
-
adjacent(token, nexttoken);
|
4821
|
+
adjacent(token, nexttoken);
|
4659
4822
|
f = doFunction(i);
|
4660
4823
|
p = f['(params)'];
|
4661
4824
|
if (!p || p.length !== 1 || p[0] !== 'value') {
|
@@ -4699,7 +4862,7 @@ loop: for (;;) {
|
|
4699
4862
|
}(delim('{')));
|
4700
4863
|
|
4701
4864
|
|
4702
|
-
function varstatement(prefix) {
|
4865
|
+
var varstatement = function varstatement(prefix) {
|
4703
4866
|
|
4704
4867
|
// JavaScript does not have block scope. It only has function scope. So,
|
4705
4868
|
// declaring a variable in a block can have unexpected consequences.
|
@@ -4744,7 +4907,7 @@ loop: for (;;) {
|
|
4744
4907
|
comma();
|
4745
4908
|
}
|
4746
4909
|
return this;
|
4747
|
-
}
|
4910
|
+
};
|
4748
4911
|
|
4749
4912
|
|
4750
4913
|
stmt('var', varstatement).exps = true;
|
@@ -4758,8 +4921,8 @@ loop: for (;;) {
|
|
4758
4921
|
}
|
4759
4922
|
var i = identifier();
|
4760
4923
|
adjacent(token, nexttoken);
|
4761
|
-
addlabel(i, '
|
4762
|
-
doFunction(i);
|
4924
|
+
addlabel(i, 'unction');
|
4925
|
+
doFunction(i, true);
|
4763
4926
|
if (nexttoken.id === '(' && nexttoken.line === token.line) {
|
4764
4927
|
error(
|
4765
4928
|
"Function statements are not invocable. Wrap the whole function invocation in parens.");
|
@@ -5276,27 +5439,30 @@ loop: for (;;) {
|
|
5276
5439
|
o.safe = true;
|
5277
5440
|
}
|
5278
5441
|
if (o.safe) {
|
5279
|
-
o.browser =
|
5280
|
-
o.css =
|
5281
|
-
o.debug =
|
5282
|
-
o.devel =
|
5283
|
-
o.
|
5284
|
-
o.
|
5285
|
-
o.
|
5286
|
-
o.
|
5287
|
-
o.
|
5288
|
-
o.
|
5289
|
-
o.safe = true;
|
5290
|
-
o.windows = false;
|
5291
|
-
o.strict = true;
|
5292
|
-
o.sub = false;
|
5293
|
-
o.undef = true;
|
5442
|
+
o.browser =
|
5443
|
+
o.css =
|
5444
|
+
o.debug =
|
5445
|
+
o.devel =
|
5446
|
+
o.evil =
|
5447
|
+
o.forin =
|
5448
|
+
o.on =
|
5449
|
+
o.rhino =
|
5450
|
+
o.windows =
|
5451
|
+
o.sub =
|
5294
5452
|
o.widget = false;
|
5295
|
-
|
5296
|
-
|
5297
|
-
|
5453
|
+
|
5454
|
+
o.eqeqeq =
|
5455
|
+
o.nomen =
|
5456
|
+
o.safe =
|
5457
|
+
o.strict =
|
5458
|
+
o.undef = true;
|
5459
|
+
|
5460
|
+
predefined.Date =
|
5461
|
+
predefined['eval'] =
|
5462
|
+
predefined.Function =
|
5298
5463
|
predefined.Object = null;
|
5299
|
-
|
5464
|
+
|
5465
|
+
predefined.ADSAFE =
|
5300
5466
|
predefined.lib = false;
|
5301
5467
|
}
|
5302
5468
|
option = o;
|
@@ -5375,12 +5541,12 @@ loop: for (;;) {
|
|
5375
5541
|
if (token.id !== '@' || !nexttoken.identifier ||
|
5376
5542
|
nexttoken.value !== 'charset' || token.line !== 1 ||
|
5377
5543
|
token.from !== 1) {
|
5378
|
-
error(
|
5544
|
+
error("A css file should begin with @charset 'UTF-8';");
|
5379
5545
|
}
|
5380
5546
|
advance();
|
5381
5547
|
if (nexttoken.type !== '(string)' &&
|
5382
5548
|
nexttoken.value !== 'UTF-8') {
|
5383
|
-
error(
|
5549
|
+
error("A css file should begin with @charset 'UTF-8';");
|
5384
5550
|
}
|
5385
5551
|
advance();
|
5386
5552
|
advance(';');
|
@@ -5467,6 +5633,9 @@ loop: for (;;) {
|
|
5467
5633
|
for (n in f) {
|
5468
5634
|
if (is_own(f, n) && n.charAt(0) !== '(') {
|
5469
5635
|
v = f[n];
|
5636
|
+
if (v === 'unction') {
|
5637
|
+
v = 'unused';
|
5638
|
+
}
|
5470
5639
|
if (is_array(fu[v])) {
|
5471
5640
|
fu[v].push(n);
|
5472
5641
|
if (v === 'unused') {
|
@@ -5636,7 +5805,7 @@ loop: for (;;) {
|
|
5636
5805
|
};
|
5637
5806
|
itself.jslint = itself;
|
5638
5807
|
|
5639
|
-
itself.edition = '2010-
|
5808
|
+
itself.edition = '2010-11-27';
|
5640
5809
|
|
5641
5810
|
return itself;
|
5642
5811
|
|