Jump to: navigation, search

Difference between revisions of "Orion/ESLint"

(Rules)
(Rules)
Line 264: Line 264:
 
|-
 
|-
  
!| no-eval
+
!| <del>[https://bugs.eclipse.org/bugs/show_bug.cgi?id=429702 no-eval]</del>
 
| Ignore
 
| Ignore
| -
+
| 6.0
| '''eval' should not be called.''
+
| '''eval' function calls are discouraged.''
 
| &nbsp;
 
| &nbsp;
 
|-
 
|-

Revision as of 14:43, 5 March 2014

Orion 5.0 moved to ESLint as the validator that ships with Orion. This page captures ongoing issues.

Rules

The following table describes all of the rules currently available in Orion and ones that we plan to add in the future.

Rules that are currently available are struck out.

Rule Default Severity Available Since Problem Message Details
block-scoped-var Error - '{variable}' is already defined.
  • Occurs when a function-scoped variable is treated as if it was block scoped.
  • ESLint calls this error '{variable} used outside of binding context.'
brace-style Ignore -    
camelcase Ignore -    
complexity Ignore -    
consistent-this Ignore -    
curly Warning - Statement body should be inside '{ }' braces. (Orion)  
dot-notation Warning - {a} is better written in dot notation.  
eqeqeq Warning 5.0
  • Expected '===' and saw '=='.
  • Expected '!==' and saw '!='.
 
guard-for-in Ignore - The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.  
max-depth Ignore -   Enforces max depth of nested blocks within a function.
max-len Ignore - Line is too long. Enforces a maximum line length.
max-params Ignore -    
max-statements Ignore -    
missing-doc Ignore 5.0 "Missing documentation for function '{name}.'" Flags missing documentation nodes on function declarations and function expressions when they appear as object properties
missing-doc-items Ignore -   Flags missing documentation for parameters, returns, throws, etc on function declarations and function expressions when they appear as object properties
missing-nls Ignore -   Flags String literals that are not properly NLS'd
new-cap Warning - A constructor name should start with an uppercase letter.  
new-parens Error - Missing '()' invoking a constructor. Flags new Whatever
no-alert Ignore - '{alert, confirm, prompt}' is not defined.  
no-bitwise Warning - Unexpected use of '{operator}'. JSLint disallows bitwise ops by default.
no-caller Ignore -   Flags references to arguments.callee and arguments.caller.
no-catch-shadow Warning - '{a}' is already defined.
  • Flags a catch clause's variable that shadows a variable declared in an outer scope. (In IE8 this [weblog.bocoup.com/the-catch-with-try-catch/ causes the outer variable to be overwritten]).
no-comma-dangle Warning - Unexpected comma. Flags trailing commas in object literals and array declarations.
no-cond-assign Ignore -   Flags assignment in an if/while/do..while/for condition.
no-console Ignore -    
no-control-regex Ignore -   Flags control characters (U+0000–U+001F and U+007F) within the source argument to the RegExp constructor.
no-debugger Warning 6.0 'debugger' statement use is discouraged.  
no-delete-var Warning - Expected '.' and instead saw ';'. Flags an attempt to delete a local variable.
no-div-regex Warning - A regular expression literal can be confused with '/='. Flags a regex literal starting with /=
no-dupe-keys Error 6.0 Duplicate object key '{key}'. Flags object literals that contain the same key more than once.
no-else-return Warning -   Flags an else appearing after an if that contains a return.
no-empty-class Warning - Empty class. Flags an empty character class [] within a regular expression.
no-empty-label Warning - Label '{a}' is not allowed on this statement. Flags a labeled statement that is not a switch, for, or while.
no-empty Warning -   Flags an empty block like if (something) { }.
no-eq-null Error - Use '===' to compare with 'null'.  
no-eval Ignore 6.0 'eval' function calls are discouraged.  
no-ex-assign Warning - Do not assign to the exception parameter.  
no-extra-semi Warning 5.0 Unnecessary semicolon.  
no-fallthrough Warning -   Flags a fallthrough case within a switch statement, unless it is explicitly commented.
no-floating-decimal Warning - A {leading, trailing} decimal point can be confused with a dot: '{n}'. Flags numeric literals that have a leading or trailing decimal point.
no-func-assign Warning -   Flags assignment to a variable that's already bound to a FunctionExpression.
no-global-strict Warning -   Flags "use strict" applied to the entire Program.
no-implied-eval Ignore - Implied eval is evil. Pass a function instead of a string. Flags calls to the string-argument form of setTimeout and setInterval, which implicitly perform eval.
no-iterator Error - Reserved name '__iterator__'. Flags use of __iterator__ as an identifier name or property key.
no-label-var Error - '{label}' is already defined. Flags labels that collide with an identifier.
no-loop-func Error - Don't make functions within a loop.  
no-mixed-requires Ignore -   Flags Node.js require()s that mix different types of requires (core, module, file, computed).
no-mixed-returns Error -   Flags functions that return more than one kind of item, for example returning String and Object
no-multi-str Warning -   Flags use of ES5 multiline string literals.
no-native-reassign Warning -
  • Read only.
  • Bad assignment. (if assigning to undefined)
Flags an attempt to reassign a native object like Math, Array, undefined, etc.
no-negated-in-lhs Warning -  
  • Flags a unary ! operator applied to the LHS of an in statement, which negates the LHS, not the in.
  • Eg. (!"key" in {key: 1}) (which always evaluates to false), will be flagged.
no-new-array Warning - Use the array literal notation []. Flags new Array().
no-new-func Warning - The Function constructor is eval. Flags new Function().
no-new-object Warning - Use the object literal notation {}. Flags new Object().
no-new-wrappers Warning - Do not use {String, Number, Boolean, Math, JSON} as a constructor. Flags new applied to any of those.
no-new Error - Do not use 'new' for side effects. Flags uses of new operator in an expression that is not assigned to anything.
no-obj-calls Warning - Math is not a function..
  • Flags attempts to call object properties of the global object (Math, JSON) as a function, like Math().
no-octal-escape Warning - Bad escapement. Flags octal escapes in strings, for example var x = "Copyright \251";
no-octal Warning - Don't use extra leading zeros '{n}'. Flags number literals that begin with leading 0s, which indicate a (probably accidental) octal literal.
no-plusplus Warning -
  • Unexpected use of '++'
  • Unexpected use of '--'
 
no-proto Error -
  • Reserved name '__proto__' should not be assigned."
  • 'Reserved name '__proto__' should not be used as a key."
 
no-redeclare Warning 5.0 '{a}' is already defined. Usually results from having two for loops in the same function that share a loop variable declaration like var i=....
no-return-assign Warning -  
  • Prevents assignment in a return statement.
  • Unsupported by JSLint, although JSLint does require parens around a return-assignment, eg: return (x = 2);
no-script-url Warning -  
  • Flags string literals beginning with javascript:. (Script URLs are a form of eval.)
no-self-compare Error -   Flags comparisons where the left- and right-hand sides are the same.
no-shadow Warning -   Flags variables that have the same name as a variable declared in an outer scope.
no-spaced-func
no-sync Ignore - Unexpected sync method: '{a}'.
  • Flags Node.js's synchronous I/O methods.
  • The stupid option is supported only in newer versions of JSLint (not Orion's).
no-ternary Ignore -   Flags any use of the ternary operator cond ? thenExpr : elseExpr
no-undef-init Warning - It is not necessary to initialize '{variable}' to 'undefined'.  
no-unused-params Error - "Parameter '{param}' is not used." Flags parameters in function declarations / expressions if they are not being used
no-undef Error 5.0 '{variable}' is not defined.
  • Flags references to a global variable that is not listed in a /*global*/ or /*globals*/ block.
  • Predefined environments (eg. node, browser) can be set in the /*jslint */ block.
no-underscore-dangle Ignore - Dangling '_'  
no-unreachable Error - Unreachable '{statement}' after '{control flow statement}'. Flags statements that occur after a return, throw, etc.
no-unused-expressions Warning - Expected an assignment or function call and instead saw an expression. Flags expressions that appear in a statement context and don't cause side effects.
no-unused-vars Warning 5.0 Function declares unused variable '{a}'.  
no-use-before-define Warning 5.0 '{a}' was used before it was defined.  
no-with Warning - Expected an identifier and instead saw 'with'. Treated as fatal parse error in JSLint.
no-wrap-func Ignore - Do not wrap function literals in parens unless they are to be immediately invoked. Flags a parenthesized function literal that is not immediately invoked, eg. (function fun(){})
object-prototype-external Warning -   Flags calls to methods of Object.prototype that rely on the prototype chain. For example this code should be flagged:
  1. foo.hasOwnProperty("bar")

Example (1) is unsafe, as foo may have a property named hasOwnProperty, or have been constructed via Object.create(null).

As for this:

  1. Object.hasOwnProperty.call(foo, "bar")

Example (2) technically relies on the prototype chain as well: the hasOwnProperty method is defined on Object.prototype, not Object. Object inherits the methods of Object.prototype through its prototype chain. However (2) is unlikely to fail, as sane JavaScript programs will not modify the global objects' prototypes. If we choose to flag (2), it should only be for style.

one-var Warning - Too many var statements. Allows only 1 var statement per function.
quote-props Warning -   Requires object literal keys to be quoted with " or '.
quotes Ignore -   Flags any use of single or double quote marks, depending on setting.
radix Warning - Missing radix parameter. Affects parseInt().
regex-spaces Warning - Spaces are hard to count. Use {n}.  
semi Warning 5.0 Missing semicolon.  
strict 'Ignore -   Flags any code that lacks the "use strict" pragma.
unnecessary-strict Warning -   Flags "use strict" on a function when the entire Program is already in strict mode.
use-isnan Warning - Use the isNaN function to compare with NaN.  
wrap-iife Ignore -
  • Wrap the entire immediate function invocation in parens.
  • Move the invocation into the parens that contain the function.
Flags missing parens on immediately-invoked functions, eg. function(){ console.log('hi'); }();
wrap-regex Warning - Wrap the /regexp/ literal in parens to disambiguate the slash operator.  

Tests

  • Every rule needs extensive unit tests
  • Unit tests should use Mocha

Currently the tests are run from Node.js. They do not run in the browser (yet).

Test requirements

First install Node.js. Then open a console and install Mocha globally:

$ npm install mocha -g

Then from your Orion client repository, run these commands to install eslint's dependencies:

$ cd bundles/org.eclipse.orion.client.javascript/web/eslint/
$ npm install

Running the tests

From the bundles/org.eclipse.orion.client.javascript/web/eslint/ directory, simply run npm test:

$ npm test

> eslint@0.2.0-dev test c:\Users\mamacdon\code\orion\client\bundles\org.eclipse.orion.client.javascript\web\eslint
> bash scripts/test.sh


  ......................................................................
  ...............

  85 passing (106ms)

To run only a subset of the tests, launch mocha from the command line, passing the test file:

$ mocha tests/lib/rules/semi.js

  ............

  12 passing (17ms)

You can also pass an entire directory:

$ mocha tests/lib/rules

  ......................................................................
  ..........

  80 passing (104ms)

To run only some tests from a file, use the --grep option:

$ mocha tests/lib/rules/semi.js --grep VariableDeclaration

  .

  1 passing (5ms)

See Mocha usage options for more.

User interface

  • Should we have a UI for configuring what rules are active? bug 424268.
  • Should we try to support .eslintrc? This would be an ideal project-scope setting.
  • Should we try to honor equivalent JSLint/JSHint flags when possible? For example /*jslint eqeqeq:false */ could disable the eqeqeq rule on a per-file basis.
    • This would give compatibility with Orion codebase which uses these flags.
    • OTOH, eslint now has its own syntax for this: /*eslint ..*/, which we should perhaps use instead.

i18n

We need to support i18n. Pre-req is bug 422278 (orion.edit.validator support for i18n).