codemirror-rails 5.6 → 5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +30 -17
  4. data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +3 -1
  5. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +10 -0
  6. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +21 -3
  7. data/vendor/assets/javascripts/codemirror/addons/search/search.js +29 -14
  8. data/vendor/assets/javascripts/codemirror/keymaps/sublime.js +11 -3
  9. data/vendor/assets/javascripts/codemirror/modes/clike.js +15 -0
  10. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +14 -17
  11. data/vendor/assets/javascripts/codemirror/modes/css.js +66 -15
  12. data/vendor/assets/javascripts/codemirror/modes/elm.js +1 -1
  13. data/vendor/assets/javascripts/codemirror/modes/gfm.js +23 -17
  14. data/vendor/assets/javascripts/codemirror/modes/haxe.js +68 -80
  15. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +125 -96
  16. data/vendor/assets/javascripts/codemirror/modes/javascript.js +14 -5
  17. data/vendor/assets/javascripts/codemirror/modes/markdown.js +40 -29
  18. data/vendor/assets/javascripts/codemirror/modes/mscgen.js +169 -0
  19. data/vendor/assets/javascripts/codemirror/modes/oz.js +252 -0
  20. data/vendor/assets/javascripts/codemirror/modes/php.js +6 -3
  21. data/vendor/assets/javascripts/codemirror/modes/ruby.js +1 -1
  22. data/vendor/assets/javascripts/codemirror/modes/vhdl.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/modes/vue.js +69 -0
  24. data/vendor/assets/stylesheets/codemirror/themes/icecoder.css +1 -0
  25. metadata +6 -3
@@ -28,7 +28,8 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
28
28
  counterDescriptors = parserConfig.counterDescriptors || {},
29
29
  colorKeywords = parserConfig.colorKeywords || {},
30
30
  valueKeywords = parserConfig.valueKeywords || {},
31
- allowNested = parserConfig.allowNested;
31
+ allowNested = parserConfig.allowNested,
32
+ supportsAtComponent = parserConfig.supportsAtComponent === true;
32
33
 
33
34
  var type, override;
34
35
  function ret(style, tp) { type = tp; return style; }
@@ -122,13 +123,14 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
122
123
  this.prev = prev;
123
124
  }
124
125
 
125
- function pushContext(state, stream, type) {
126
- state.context = new Context(type, stream.indentation() + indentUnit, state.context);
126
+ function pushContext(state, stream, type, indent) {
127
+ state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);
127
128
  return type;
128
129
  }
129
130
 
130
131
  function popContext(state) {
131
- state.context = state.context.prev;
132
+ if (state.context.prev)
133
+ state.context = state.context.prev;
132
134
  return state.context.type;
133
135
  }
134
136
 
@@ -160,9 +162,13 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
160
162
  return pushContext(state, stream, "block");
161
163
  } else if (type == "}" && state.context.prev) {
162
164
  return popContext(state);
163
- } else if (/@(media|supports|(-moz-)?document)/.test(type)) {
165
+ } else if (supportsAtComponent && /@component/.test(type)) {
166
+ return pushContext(state, stream, "atComponentBlock");
167
+ } else if (/^@(-moz-)?document$/.test(type)) {
168
+ return pushContext(state, stream, "documentTypes");
169
+ } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) {
164
170
  return pushContext(state, stream, "atBlock");
165
- } else if (/@(font-face|counter-style)/.test(type)) {
171
+ } else if (/^@(font-face|counter-style)/.test(type)) {
166
172
  state.stateArg = type;
167
173
  return "restricted_atBlock_before";
168
174
  } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
@@ -255,17 +261,24 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
255
261
  return pass(type, stream, state);
256
262
  };
257
263
 
264
+ states.documentTypes = function(type, stream, state) {
265
+ if (type == "word" && documentTypes.hasOwnProperty(stream.current())) {
266
+ override = "tag";
267
+ return state.context.type;
268
+ } else {
269
+ return states.atBlock(type, stream, state);
270
+ }
271
+ };
272
+
258
273
  states.atBlock = function(type, stream, state) {
259
274
  if (type == "(") return pushContext(state, stream, "atBlock_parens");
260
- if (type == "}") return popAndPass(type, stream, state);
275
+ if (type == "}" || type == ";") return popAndPass(type, stream, state);
261
276
  if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
262
277
 
263
278
  if (type == "word") {
264
279
  var word = stream.current().toLowerCase();
265
280
  if (word == "only" || word == "not" || word == "and" || word == "or")
266
281
  override = "keyword";
267
- else if (documentTypes.hasOwnProperty(word))
268
- override = "tag";
269
282
  else if (mediaTypes.hasOwnProperty(word))
270
283
  override = "attribute";
271
284
  else if (mediaFeatures.hasOwnProperty(word))
@@ -286,6 +299,16 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
286
299
  return state.context.type;
287
300
  };
288
301
 
302
+ states.atComponentBlock = function(type, stream, state) {
303
+ if (type == "}")
304
+ return popAndPass(type, stream, state);
305
+ if (type == "{")
306
+ return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false);
307
+ if (type == "word")
308
+ override = "error";
309
+ return state.context.type;
310
+ };
311
+
289
312
  states.atBlock_parens = function(type, stream, state) {
290
313
  if (type == ")") return popContext(state);
291
314
  if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
@@ -364,12 +387,18 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
364
387
  var cx = state.context, ch = textAfter && textAfter.charAt(0);
365
388
  var indent = cx.indent;
366
389
  if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
367
- if (cx.prev &&
368
- (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "restricted_atBlock") ||
369
- ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
370
- ch == "{" && (cx.type == "at" || cx.type == "atBlock"))) {
371
- indent = cx.indent - indentUnit;
372
- cx = cx.prev;
390
+ if (cx.prev) {
391
+ if (ch == "}" && (cx.type == "block" || cx.type == "top" ||
392
+ cx.type == "interpolation" || cx.type == "restricted_atBlock")) {
393
+ // Resume indentation from parent context.
394
+ cx = cx.prev;
395
+ indent = cx.indent;
396
+ } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
397
+ ch == "{" && (cx.type == "at" || cx.type == "atBlock")) {
398
+ // Dedent relative to current context.
399
+ indent = Math.max(0, cx.indent - indentUnit);
400
+ cx = cx.prev;
401
+ }
373
402
  }
374
403
  return indent;
375
404
  },
@@ -769,4 +798,26 @@ CodeMirror.defineMode("css", function(config, parserConfig) {
769
798
  helperType: "less"
770
799
  });
771
800
 
801
+ CodeMirror.defineMIME("text/x-gss", {
802
+ documentTypes: documentTypes,
803
+ mediaTypes: mediaTypes,
804
+ mediaFeatures: mediaFeatures,
805
+ propertyKeywords: propertyKeywords,
806
+ nonStandardPropertyKeywords: nonStandardPropertyKeywords,
807
+ fontProperties: fontProperties,
808
+ counterDescriptors: counterDescriptors,
809
+ colorKeywords: colorKeywords,
810
+ valueKeywords: valueKeywords,
811
+ supportsAtComponent: true,
812
+ tokenHooks: {
813
+ "/": function(stream, state) {
814
+ if (!stream.eat("*")) return false;
815
+ state.tokenize = tokenCComment;
816
+ return tokenCComment(stream, state);
817
+ }
818
+ },
819
+ name: "css",
820
+ helperType: "gss"
821
+ });
822
+
772
823
  });
@@ -202,4 +202,4 @@
202
202
  });
203
203
 
204
204
  CodeMirror.defineMIME("text/x-elm", "elm");
205
- })();
205
+ });
@@ -11,6 +11,8 @@
11
11
  })(function(CodeMirror) {
12
12
  "use strict";
13
13
 
14
+ var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i
15
+
14
16
  CodeMirror.defineMode("gfm", function(config, modeConfig) {
15
17
  var codeDepth = 0;
16
18
  function blankLine(state) {
@@ -37,7 +39,7 @@ CodeMirror.defineMode("gfm", function(config, modeConfig) {
37
39
 
38
40
  // Hack to prevent formatting override inside code blocks (block and inline)
39
41
  if (state.codeBlock) {
40
- if (stream.match(/^```/)) {
42
+ if (stream.match(/^```+/)) {
41
43
  state.codeBlock = false;
42
44
  return null;
43
45
  }
@@ -47,7 +49,7 @@ CodeMirror.defineMode("gfm", function(config, modeConfig) {
47
49
  if (stream.sol()) {
48
50
  state.code = false;
49
51
  }
50
- if (stream.sol() && stream.match(/^```/)) {
52
+ if (stream.sol() && stream.match(/^```+/)) {
51
53
  stream.skipToEnd();
52
54
  state.codeBlock = true;
53
55
  return null;
@@ -78,25 +80,29 @@ CodeMirror.defineMode("gfm", function(config, modeConfig) {
78
80
  }
79
81
  if (stream.sol() || state.ateSpace) {
80
82
  state.ateSpace = false;
81
- if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {
82
- // User/Project@SHA
83
- // User@SHA
84
- // SHA
85
- state.combineTokens = true;
86
- return "link";
87
- } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {
88
- // User/Project#Num
89
- // User#Num
90
- // #Num
91
- state.combineTokens = true;
92
- return "link";
83
+ if (modeConfig.gitHubSpice !== false) {
84
+ if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) {
85
+ // User/Project@SHA
86
+ // User@SHA
87
+ // SHA
88
+ state.combineTokens = true;
89
+ return "link";
90
+ } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) {
91
+ // User/Project#Num
92
+ // User#Num
93
+ // #Num
94
+ state.combineTokens = true;
95
+ return "link";
96
+ }
93
97
  }
94
98
  }
95
- if (stream.match(/^((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i) &&
96
- stream.string.slice(stream.start - 2, stream.start) != "](") {
99
+ if (stream.match(urlRE) &&
100
+ stream.string.slice(stream.start - 2, stream.start) != "](" &&
101
+ (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) {
97
102
  // URLs
98
103
  // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls
99
104
  // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine
105
+ // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL
100
106
  state.combineTokens = true;
101
107
  return "link";
102
108
  }
@@ -109,7 +115,7 @@ CodeMirror.defineMode("gfm", function(config, modeConfig) {
109
115
  var markdownConfig = {
110
116
  underscoresBreakWords: false,
111
117
  taskLists: true,
112
- fencedCodeBlocks: true,
118
+ fencedCodeBlocks: '```',
113
119
  strikethrough: true
114
120
  };
115
121
  for (var attr in modeConfig) {
@@ -16,23 +16,21 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
16
16
 
17
17
  // Tokenizer
18
18
 
19
- var keywords = function(){
20
- function kw(type) {return {type: type, style: "keyword"};}
21
- var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
22
- var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"};
19
+ function kw(type) {return {type: type, style: "keyword"};}
20
+ var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
21
+ var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"};
23
22
  var type = kw("typedef");
24
- return {
25
- "if": A, "while": A, "else": B, "do": B, "try": B,
26
- "return": C, "break": C, "continue": C, "new": C, "throw": C,
27
- "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"),
23
+ var keywords = {
24
+ "if": A, "while": A, "else": B, "do": B, "try": B,
25
+ "return": C, "break": C, "continue": C, "new": C, "throw": C,
26
+ "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"),
28
27
  "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"),
29
- "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"),
30
- "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
31
- "in": operator, "never": kw("property_access"), "trace":kw("trace"),
28
+ "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"),
29
+ "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
30
+ "in": operator, "never": kw("property_access"), "trace":kw("trace"),
32
31
  "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type,
33
- "true": atom, "false": atom, "null": atom
34
- };
35
- }();
32
+ "true": atom, "false": atom, "null": atom
33
+ };
36
34
 
37
35
  var isOperatorChar = /[+\-*&%=<>!?|]/;
38
36
 
@@ -41,14 +39,13 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
41
39
  return f(stream, state);
42
40
  }
43
41
 
44
- function nextUntilUnescaped(stream, end) {
42
+ function toUnescaped(stream, end) {
45
43
  var escaped = false, next;
46
44
  while ((next = stream.next()) != null) {
47
45
  if (next == end && !escaped)
48
- return false;
46
+ return true;
49
47
  escaped = !escaped && next == "\\";
50
48
  }
51
- return escaped;
52
49
  }
53
50
 
54
51
  // Used as scratch variables to communicate multiple values without
@@ -61,70 +58,58 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
61
58
 
62
59
  function haxeTokenBase(stream, state) {
63
60
  var ch = stream.next();
64
- if (ch == '"' || ch == "'")
61
+ if (ch == '"' || ch == "'") {
65
62
  return chain(stream, state, haxeTokenString(ch));
66
- else if (/[\[\]{}\(\),;\:\.]/.test(ch))
63
+ } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
67
64
  return ret(ch);
68
- else if (ch == "0" && stream.eat(/x/i)) {
65
+ } else if (ch == "0" && stream.eat(/x/i)) {
69
66
  stream.eatWhile(/[\da-f]/i);
70
67
  return ret("number", "number");
71
- }
72
- else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
73
- stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
68
+ } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
69
+ stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/);
74
70
  return ret("number", "number");
75
- }
76
- else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) {
77
- nextUntilUnescaped(stream, "/");
71
+ } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) {
72
+ toUnescaped(stream, "/");
78
73
  stream.eatWhile(/[gimsu]/);
79
74
  return ret("regexp", "string-2");
80
- }
81
- else if (ch == "/") {
75
+ } else if (ch == "/") {
82
76
  if (stream.eat("*")) {
83
77
  return chain(stream, state, haxeTokenComment);
84
- }
85
- else if (stream.eat("/")) {
78
+ } else if (stream.eat("/")) {
86
79
  stream.skipToEnd();
87
80
  return ret("comment", "comment");
88
- }
89
- else {
81
+ } else {
90
82
  stream.eatWhile(isOperatorChar);
91
83
  return ret("operator", null, stream.current());
92
84
  }
93
- }
94
- else if (ch == "#") {
85
+ } else if (ch == "#") {
95
86
  stream.skipToEnd();
96
87
  return ret("conditional", "meta");
97
- }
98
- else if (ch == "@") {
88
+ } else if (ch == "@") {
99
89
  stream.eat(/:/);
100
90
  stream.eatWhile(/[\w_]/);
101
91
  return ret ("metadata", "meta");
102
- }
103
- else if (isOperatorChar.test(ch)) {
92
+ } else if (isOperatorChar.test(ch)) {
104
93
  stream.eatWhile(isOperatorChar);
105
94
  return ret("operator", null, stream.current());
106
- }
107
- else {
108
- var word;
109
- if(/[A-Z]/.test(ch))
110
- {
111
- stream.eatWhile(/[\w_<>]/);
112
- word = stream.current();
113
- return ret("type", "variable-3", word);
114
- }
115
- else
116
- {
95
+ } else {
96
+ var word;
97
+ if(/[A-Z]/.test(ch)) {
98
+ stream.eatWhile(/[\w_<>]/);
99
+ word = stream.current();
100
+ return ret("type", "variable-3", word);
101
+ } else {
117
102
  stream.eatWhile(/[\w_]/);
118
103
  var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
119
104
  return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
120
105
  ret("variable", "variable", word);
121
- }
106
+ }
122
107
  }
123
108
  }
124
109
 
125
110
  function haxeTokenString(quote) {
126
111
  return function(stream, state) {
127
- if (!nextUntilUnescaped(stream, quote))
112
+ if (toUnescaped(stream, quote))
128
113
  state.tokenize = haxeTokenBase;
129
114
  return ret("string", "string");
130
115
  };
@@ -176,27 +161,25 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
176
161
  cc.pop()();
177
162
  if (cx.marked) return cx.marked;
178
163
  if (type == "variable" && inScope(state, content)) return "variable-2";
179
- if (type == "variable" && imported(state, content)) return "variable-3";
164
+ if (type == "variable" && imported(state, content)) return "variable-3";
180
165
  return style;
181
166
  }
182
167
  }
183
168
  }
184
169
 
185
- function imported(state, typename)
186
- {
187
- if (/[a-z]/.test(typename.charAt(0)))
188
- return false;
189
- var len = state.importedtypes.length;
190
- for (var i = 0; i<len; i++)
191
- if(state.importedtypes[i]==typename) return true;
170
+ function imported(state, typename) {
171
+ if (/[a-z]/.test(typename.charAt(0)))
172
+ return false;
173
+ var len = state.importedtypes.length;
174
+ for (var i = 0; i<len; i++)
175
+ if(state.importedtypes[i]==typename) return true;
192
176
  }
193
177
 
194
-
195
178
  function registerimport(importname) {
196
- var state = cx.state;
197
- for (var t = state.importedtypes; t; t = t.next)
198
- if(t.name == importname) return;
199
- state.importedtypes = { name: importname, next: state.importedtypes };
179
+ var state = cx.state;
180
+ for (var t = state.importedtypes; t; t = t.next)
181
+ if(t.name == importname) return;
182
+ state.importedtypes = { name: importname, next: state.importedtypes };
200
183
  }
201
184
  // Combinator utils
202
185
 
@@ -229,6 +212,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
229
212
  cx.state.localVars = cx.state.context.vars;
230
213
  cx.state.context = cx.state.context.prev;
231
214
  }
215
+ popcontext.lex = true;
232
216
  function pushlex(type, info) {
233
217
  var result = function() {
234
218
  var state = cx.state;
@@ -252,7 +236,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
252
236
  if (type == wanted) return cont();
253
237
  else if (wanted == ";") return pass();
254
238
  else return cont(f);
255
- };
239
+ }
256
240
  return f;
257
241
  }
258
242
 
@@ -266,25 +250,26 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
266
250
  if (type == "attribute") return cont(maybeattribute);
267
251
  if (type == "function") return cont(functiondef);
268
252
  if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
269
- poplex, statement, poplex);
253
+ poplex, statement, poplex);
270
254
  if (type == "variable") return cont(pushlex("stat"), maybelabel);
271
255
  if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
272
- block, poplex, poplex);
256
+ block, poplex, poplex);
273
257
  if (type == "case") return cont(expression, expect(":"));
274
258
  if (type == "default") return cont(expect(":"));
275
259
  if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
276
- statement, poplex, popcontext);
260
+ statement, poplex, popcontext);
277
261
  if (type == "import") return cont(importdef, expect(";"));
278
262
  if (type == "typedef") return cont(typedef);
279
263
  return pass(pushlex("stat"), expression, expect(";"), poplex);
280
264
  }
281
265
  function expression(type) {
282
266
  if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
267
+ if (type == "type" ) return cont(maybeoperator);
283
268
  if (type == "function") return cont(functiondef);
284
269
  if (type == "keyword c") return cont(maybeexpression);
285
270
  if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator);
286
271
  if (type == "operator") return cont(expression);
287
- if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
272
+ if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator);
288
273
  if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
289
274
  return cont();
290
275
  }
@@ -318,14 +303,14 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
318
303
  }
319
304
 
320
305
  function importdef (type, value) {
321
- if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
322
- else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef);
306
+ if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
307
+ else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef);
323
308
  }
324
309
 
325
310
  function typedef (type, value)
326
311
  {
327
- if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
328
- else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); }
312
+ if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); }
313
+ else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); }
329
314
  }
330
315
 
331
316
  function maybelabel(type) {
@@ -363,16 +348,19 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
363
348
  if (type == ",") return cont(vardef1);
364
349
  }
365
350
  function forspec1(type, value) {
366
- if (type == "variable") {
367
- register(value);
368
- }
369
- return cont(pushlex(")"), pushcontext, forin, expression, poplex, statement, popcontext);
351
+ if (type == "variable") {
352
+ register(value);
353
+ return cont(forin, expression)
354
+ } else {
355
+ return pass()
356
+ }
370
357
  }
371
358
  function forin(_type, value) {
372
359
  if (value == "in") return cont();
373
360
  }
374
361
  function functiondef(type, value) {
375
- if (type == "variable") {register(value); return cont(functiondef);}
362
+ //function names starting with upper-case letters are recognised as types, so cludging them together here.
363
+ if (type == "variable" || type == "type") {register(value); return cont(functiondef);}
376
364
  if (value == "new") return cont(functiondef);
377
365
  if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext);
378
366
  }
@@ -395,7 +383,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
395
383
 
396
384
  return {
397
385
  startState: function(basecolumn) {
398
- var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"];
386
+ var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"];
399
387
  return {
400
388
  tokenize: haxeTokenBase,
401
389
  reAllowed: true,
@@ -403,7 +391,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
403
391
  cc: [],
404
392
  lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false),
405
393
  localVars: parserConfig.localVars,
406
- importedtypes: defaulttypes,
394
+ importedtypes: defaulttypes,
407
395
  context: parserConfig.localVars && {vars: parserConfig.localVars},
408
396
  indented: 0
409
397
  };