diff --git a/mode/erlang/erlang.js b/mode/erlang/erlang.js index 79e0434d1fcc0213a84f7fd4cba668b5364f1b82..f6e304c93a6518043c3ba409b93db4938a515fab 100644 --- a/mode/erlang/erlang.js +++ b/mode/erlang/erlang.js @@ -11,18 +11,10 @@ CodeMirror.defineMIME("text/x-erlang", "erlang"); CodeMirror.defineMode("erlang", function(cmCfg) { - function rval(state,stream,type) { + function rval(state,_stream,type) { // distinguish between "." as terminator and record field operator - if (type == "record") { - state.context = "record"; - }else{ - state.context = false; - } + state.in_record = (type == "record"); - // remember last significant bit on last line for indenting - if (type != "whitespace" && type != "comment") { - state.lastToken = stream.current(); - } // erlang -> CodeMirror tag switch (type) { case "atom": return "atom"; @@ -133,6 +125,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) { } function tokenize(stream, state) { + // in multi-line string + if (state.in_string) { + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); + } + + // in multi-line atom + if (state.in_atom) { + state.in_atom = (!singleQuote(stream)); + return rval(state,stream,"atom"); + } + + // whitespace if (stream.eatSpace()) { return rval(state,stream,"whitespace"); } @@ -183,20 +188,14 @@ CodeMirror.defineMode("erlang", function(cmCfg) { // quoted atom if (ch == '\'') { - if (singleQuote(stream)) { - return rval(state,stream,"atom"); - }else{ - return rval(state,stream,"error"); - } + state.in_atom = (!singleQuote(stream)); + return rval(state,stream,"atom"); } // string if (ch == '"') { - if (doubleQuote(stream)) { - return rval(state,stream,"string"); - }else{ - return rval(state,stream,"error"); - } + state.in_string = (!doubleQuote(stream)); + return rval(state,stream,"string"); } // variable @@ -282,7 +281,7 @@ CodeMirror.defineMode("erlang", function(cmCfg) { // separators if (greedy(stream,sepRE,separatorWords)) { // distinguish between "." as terminator and record field operator - if (state.context == false) { + if (!state.in_record) { pushToken(state,stream); } return rval(state,stream,"separator"); @@ -359,15 +358,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) { var token = (peekToken(state)).token; var wordAfter = takewhile(textAfter,/[^a-z]/); - if (isMember(token,openParenWords)) { - return (peekToken(state)).column+token.length; - }else if (token == "." || token == ""){ + if (state.in_string || state.in_atom) { return 0; + }else if (token == "." || token == "") { + return 0; + }else if (isMember(token,openParenWords)) { + return (peekToken(state)).column+token.length; }else if (token == "->") { if (wordAfter == "end") { return peekToken(state,2).column; }else if (peekToken(state,2).token == "fun") { return peekToken(state,2).column+indent; + }else if (peekToken(state,2).token == ".") { + return indent; }else{ return (peekToken(state)).indent+indent; } @@ -445,8 +448,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) { startState: function() { return {tokenStack: [], - context: false, - lastToken: null}; + in_record: false, + in_string: false, + in_atom: false}; }, token: diff --git a/mode/erlang/index.html b/mode/erlang/index.html index fd21521c88b43ab50071b1b92b3d8efb69028cc9..5bb81f669a060a0d39ece1ad6f77f2a0b48c4268 100644 --- a/mode/erlang/index.html +++ b/mode/erlang/index.html @@ -32,7 +32,7 @@ rec_info(demo) -> record_info(fields,demo). demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}). - + expand_recs(M,List) when is_list(List) -> [expand_recs(M,L)||L<-List]; expand_recs(M,Tup) when is_tuple(Tup) ->