Skip to content

Commit 3302c3c

Browse files
Bug fix for JS semicolon detection (codecombat#5101)
1 parent bb8eeca commit 3302c3c

12 files changed

+42
-38
lines changed

app/lib/aether/languages/java.coffee

-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ parserHolder = {}
44
module.exports = class Java extends Language
55
name: 'Java'
66
id: 'java'
7-
parserID: 'cashew'
87

98
constructor: ->
109
super arguments...
11-
parserHolder.cashew ?= self?.aetherCashew ? require 'cashew-js'
1210
@runtimeGlobals = ___JavaRuntime: parserHolder.cashew.___JavaRuntime, _Object: parserHolder.cashew._Object, Integer: parserHolder.cashew.Integer, Double: parserHolder.cashew.Double, _NotInitialized: parserHolder.cashew._NotInitialized, _ArrayList: parserHolder.cashew._ArrayList
1311

1412

app/lib/aether/languages/javascript.coffee

+18-17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
_ = window?._ ? self?._ ? global?._ ? require 'lodash' # rely on lodash existing, since it busts CodeCombat to browserify it--TODO
22

3-
# jshintHolder = {}
3+
jshintHolder = {}
44
escodegen = require 'escodegen'
55

66
Language = require './language'
@@ -16,7 +16,8 @@ module.exports = class JavaScript extends Language
1616

1717
constructor: ->
1818
super arguments...
19-
# jshintHolder.jshint ?= (self?.aetherJSHint ? require('jshint')).JSHINT
19+
{ JSHINT } = require('jshint')
20+
jshintHolder.jshint ?= JSHINT
2021

2122
# Return true if we can very quickly identify a syntax error.
2223
obviouslyCannotTranspile: (rawCode) ->
@@ -58,21 +59,21 @@ module.exports = class JavaScript extends Language
5859
# return lintProblems unless jshintHolder.jshint
5960
wrappedCode = @wrap rawCode, aether
6061

61-
# # Run it through JSHint first, because that doesn't rely on Esprima
62-
# # See also how ACE does it: https://github.com/ajaxorg/ace/blob/master/lib/ace/mode/javascript_worker.js
63-
# # TODO: make JSHint stop providing these globals somehow; the below doesn't work
64-
# jshintOptions = browser: false, couch: false, devel: false, dojo: false, jquery: false, mootools: false, node: false, nonstandard: false, phantom: false, prototypejs: false, rhino: false, worker: false, wsh: false, yui: false
65-
# jshintGlobals = _.zipObject jshintGlobals, (false for g in aether.allGlobals) # JSHint expects {key: writable} globals
66-
# # Doesn't work; can't find a way to skip warnings from JSHint programmatic options instead of in code comments.
67-
# #for problemID, problem of @originalOptions.problems when problem.level is 'ignore' and /jshint/.test problemID
68-
# # console.log 'gotta ignore', problem, '-' + problemID.replace('jshint_', '')
69-
# # jshintOptions['-' + problemID.replace('jshint_', '')] = true
70-
# try
71-
# jshintSuccess = jshintHolder.jshint(wrappedCode, jshintOptions, jshintGlobals)
72-
# catch e
73-
# console.warn "JSHint died with error", e #, "on code\n", wrappedCode
74-
# for error in jshintHolder.jshint.errors
75-
# lintProblems.push aether.createUserCodeProblem type: 'transpile', reporter: 'jshint', error: error, code: wrappedCode, codePrefix: @wrappedCodePrefix
62+
# Run it through JSHint first, because that doesn't rely on Esprima
63+
# See also how ACE does it: https://github.com/ajaxorg/ace/blob/master/lib/ace/mode/javascript_worker.js
64+
# TODO: make JSHint stop providing these globals somehow; the below doesn't work
65+
jshintOptions = browser: false, couch: false, devel: false, dojo: false, jquery: false, mootools: false, node: false, nonstandard: false, phantom: false, prototypejs: false, rhino: false, worker: false, wsh: false, yui: false
66+
jshintGlobals = _.zipObject jshintGlobals, (false for g in aether.allGlobals) # JSHint expects {key: writable} globals
67+
# Doesn't work; can't find a way to skip warnings from JSHint programmatic options instead of in code comments.
68+
#for problemID, problem of @originalOptions.problems when problem.level is 'ignore' and /jshint/.test problemID
69+
# console.log 'gotta ignore', problem, '-' + problemID.replace('jshint_', '')
70+
# jshintOptions['-' + problemID.replace('jshint_', '')] = true
71+
try
72+
jshintSuccess = jshintHolder.jshint(wrappedCode, jshintOptions, jshintGlobals)
73+
catch e
74+
console.warn "JSHint died with error", e #, "on code\n", wrappedCode
75+
for error in jshintHolder.jshint.errors
76+
lintProblems.push aether.createUserCodeProblem type: 'transpile', reporter: 'jshint', error: error, code: wrappedCode, codePrefix: @wrappedCodePrefix
7677

7778
# Check for stray semi-colon on 1st line of if statement
7879
# E.g. "if (parsely);"

app/views/editor/level/LevelEditView.coffee

+3-8
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,10 @@ loadAetherLanguage = require("lib/loadAetherLanguage");
4242
require 'vendor/scripts/coffeescript' # this is tenuous, since the LevelSession and LevelComponent models are what compile the code
4343
require 'lib/setupTreema'
4444

45-
# Make sure that all of our Aethers are loaded, so that if we try to preview the level, it will work.
46-
# require 'bower_components/aether/build/javascript'
47-
# require 'bower_components/aether/build/python'
48-
# require 'bower_components/aether/build/coffeescript'
49-
# require 'bower_components/aether/build/lua'
50-
# require 'bower_components/aether/build/java'
51-
# require 'bower_components/aether/build/html'
45+
# Make sure that all of our languages are loaded, so that if we try to preview the level, it will work.
46+
require 'bower_components/aether/build/html'
5247
Promise.all(
53-
["javascript", "python", "coffeescript", "lua", "java"].map(
48+
["javascript", "python", "coffeescript", "lua"].map(
5449
loadAetherLanguage
5550
)
5651
)

app/views/ladder/SimulateTabView.coffee

+1-6
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,8 @@ module.exports = class SimulateTabView extends CocoView
1616
@simulatorsLeaderboardData = new SimulatorsLeaderboardData(me)
1717
@simulatorsLeaderboardDataRes = @supermodel.addModelResource(@simulatorsLeaderboardData, 'top_simulators', {cache: false})
1818
@simulatorsLeaderboardDataRes.load()
19-
# require 'bower_components/aether/build/javascript'
20-
# require 'bower_components/aether/build/python'
21-
# require 'bower_components/aether/build/coffeescript'
22-
# require 'bower_components/aether/build/lua'
23-
# require 'bower_components/aether/build/java'
2419
Promise.all(
25-
["javascript", "python", "coffeescript", "lua", "java"].map(
20+
["javascript", "python", "coffeescript", "lua"].map(
2621
loadAetherLanguage
2722
)
2823
)

package.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
"body-parser": "^1.15.2",
7171
"bootstrap": "^3.3.7",
7272
"bootstrap-sass": "3.3.7",
73-
"cashew-js": "^0.4.3",
7473
"chalk": "^1.1.3",
7574
"cheerio": "^0.22.0",
7675
"chunk-splitting-plugin": "^2.4.0",
@@ -96,15 +95,15 @@
9695
"geoip-lite": "^1.1.6",
9796
"graceful-fs": "~2.0.1",
9897
"gridfs-stream": "~1.1.1",
99-
"htmlparser2": "^3.9.1",
10098
"html-webpack-plugin": "^2.30.1",
99+
"htmlparser2": "^3.9.1",
101100
"intercom-client": "^2.8.8",
102101
"jade": "^1.11.0",
103102
"jade-loader": "codecombat/pug-loader#fix-errors",
104103
"jquery": "~2.1.0",
105104
"jquery-mousewheel": "~3.1.9",
106105
"jquery.browser": "~0.0.6",
107-
"jshint": "^2.9.4",
106+
"jshint": "~2.3.0",
108107
"json-loader": "^0.5.4",
109108
"jsondiffpatch": "^0.2.3",
110109
"lodash": "^2.4.2",
File renamed without changes.
File renamed without changes.
File renamed without changes.

spec/aether/javascript_spec.coffee

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Aether = require '../aether'
2+
3+
describe "Linting Test Suite", ->
4+
describe "Default linting", ->
5+
aether = new Aether()
6+
it "Should warn about missing semicolons", ->
7+
code = "var bandersnatch = 'frumious'"
8+
warnings = aether.lint(code).warnings
9+
expect(warnings.length).toEqual 1
10+
expect(warnings?[0].message).toEqual 'Missing semicolon.'
11+
12+
describe "Custom lint levels", ->
13+
it "Should allow ignoring of warnings", ->
14+
options = problems: {jshint_W033: {level: 'ignore'}}
15+
aether = new Aether options
16+
code = "var bandersnatch = 'frumious'"
17+
warnings = aether.lint(code).warnings
18+
expect(warnings.length).toEqual 0
File renamed without changes.

test/app/aether.js

-1
This file was deleted.

webpack.base.config.js

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ module.exports = (env) => {
3030
]),
3131
lodash: 'lodash', // For worker_world
3232
aether: './bower_components/aether/build/aether.js', // For worker_world
33-
// aether: './public/javascripts/aether.js',
3433
// esper: './bower_components/esper.js/esper.js',
3534
// vendor: './app/vendor.js'
3635
},

0 commit comments

Comments
 (0)