Skip to content
Snippets Groups Projects
Commit b8a38503 authored by mats cronqvist's avatar mats cronqvist Committed by Marijn Haverbeke
Browse files

erlang mode bug fixes

parent 3f5c8432
No related branches found
No related tags found
No related merge requests found
...@@ -11,18 +11,10 @@ CodeMirror.defineMIME("text/x-erlang", "erlang"); ...@@ -11,18 +11,10 @@ CodeMirror.defineMIME("text/x-erlang", "erlang");
CodeMirror.defineMode("erlang", function(cmCfg) { CodeMirror.defineMode("erlang", function(cmCfg) {
function rval(state,stream,type) { function rval(state,_stream,type) {
// distinguish between "." as terminator and record field operator // distinguish between "." as terminator and record field operator
if (type == "record") { state.in_record = (type == "record");
state.context = "record";
}else{
state.context = false;
}
// remember last significant bit on last line for indenting
if (type != "whitespace" && type != "comment") {
state.lastToken = stream.current();
}
// erlang -> CodeMirror tag // erlang -> CodeMirror tag
switch (type) { switch (type) {
case "atom": return "atom"; case "atom": return "atom";
...@@ -133,6 +125,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) { ...@@ -133,6 +125,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
} }
function tokenize(stream, state) { 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()) { if (stream.eatSpace()) {
return rval(state,stream,"whitespace"); return rval(state,stream,"whitespace");
} }
...@@ -183,20 +188,14 @@ CodeMirror.defineMode("erlang", function(cmCfg) { ...@@ -183,20 +188,14 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
// quoted atom // quoted atom
if (ch == '\'') { if (ch == '\'') {
if (singleQuote(stream)) { state.in_atom = (!singleQuote(stream));
return rval(state,stream,"atom"); return rval(state,stream,"atom");
}else{
return rval(state,stream,"error");
}
} }
// string // string
if (ch == '"') { if (ch == '"') {
if (doubleQuote(stream)) { state.in_string = (!doubleQuote(stream));
return rval(state,stream,"string"); return rval(state,stream,"string");
}else{
return rval(state,stream,"error");
}
} }
// variable // variable
...@@ -282,7 +281,7 @@ CodeMirror.defineMode("erlang", function(cmCfg) { ...@@ -282,7 +281,7 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
// separators // separators
if (greedy(stream,sepRE,separatorWords)) { if (greedy(stream,sepRE,separatorWords)) {
// distinguish between "." as terminator and record field operator // distinguish between "." as terminator and record field operator
if (state.context == false) { if (!state.in_record) {
pushToken(state,stream); pushToken(state,stream);
} }
return rval(state,stream,"separator"); return rval(state,stream,"separator");
...@@ -359,15 +358,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) { ...@@ -359,15 +358,19 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
var token = (peekToken(state)).token; var token = (peekToken(state)).token;
var wordAfter = takewhile(textAfter,/[^a-z]/); var wordAfter = takewhile(textAfter,/[^a-z]/);
if (isMember(token,openParenWords)) { if (state.in_string || state.in_atom) {
return (peekToken(state)).column+token.length;
}else if (token == "." || token == ""){
return 0; return 0;
}else if (token == "." || token == "") {
return 0;
}else if (isMember(token,openParenWords)) {
return (peekToken(state)).column+token.length;
}else if (token == "->") { }else if (token == "->") {
if (wordAfter == "end") { if (wordAfter == "end") {
return peekToken(state,2).column; return peekToken(state,2).column;
}else if (peekToken(state,2).token == "fun") { }else if (peekToken(state,2).token == "fun") {
return peekToken(state,2).column+indent; return peekToken(state,2).column+indent;
}else if (peekToken(state,2).token == ".") {
return indent;
}else{ }else{
return (peekToken(state)).indent+indent; return (peekToken(state)).indent+indent;
} }
...@@ -445,8 +448,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) { ...@@ -445,8 +448,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
startState: startState:
function() { function() {
return {tokenStack: [], return {tokenStack: [],
context: false, in_record: false,
lastToken: null}; in_string: false,
in_atom: false};
}, },
token: token:
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
rec_info(demo) -> record_info(fields,demo). rec_info(demo) -> record_info(fields,demo).
demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}). demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}).
expand_recs(M,List) when is_list(List) -> expand_recs(M,List) when is_list(List) ->
[expand_recs(M,L)||L<-List]; [expand_recs(M,L)||L<-List];
expand_recs(M,Tup) when is_tuple(Tup) -> expand_recs(M,Tup) when is_tuple(Tup) ->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment