File otp_src_19.0-lib-tools-emacs.patch of Package erlang

diff -Ndurp otp_src_19.0/lib/tools/doc/src/notes.xml otp_src_19.0-lib-tools-emacs/lib/tools/doc/src/notes.xml
--- otp_src_19.0/lib/tools/doc/src/notes.xml	2016-06-21 16:12:42.000000000 +0300
+++ otp_src_19.0-lib-tools-emacs/lib/tools/doc/src/notes.xml	2016-06-23 12:58:24.830917982 +0300
@@ -666,7 +666,7 @@
           <p>
 	    Add test_indentation target to lib/tools/emacs/Makefile</p>
           <p>
-	    Automatically indent test.erl.orig, save to test.erl, and
+	    Automatically indent test.erl.original, save to test.erl, and
 	    compare to test.erl.intended. Thanks to Magnus Henoch.</p>
           <p>
 	    Own Id: OTP-10226</p>
diff -Ndurp otp_src_19.0/lib/tools/emacs/Makefile otp_src_19.0-lib-tools-emacs/lib/tools/emacs/Makefile
--- otp_src_19.0/lib/tools/emacs/Makefile	2016-06-21 16:12:42.000000000 +0300
+++ otp_src_19.0-lib-tools-emacs/lib/tools/emacs/Makefile	2016-06-23 12:58:24.830917982 +0300
@@ -52,7 +52,7 @@ EL_FILES = $(EMACS_FILES:%=%.el)
 
 ELC_FILES = $(EMACS_FILES:%=%.elc) 
 
-TEST_FILES = test.erl.indented test.erl.orig
+TEST_FILES = test.erl.indented test.erl.original
 
 # ----------------------------------------------------
 # Targets
@@ -94,7 +94,7 @@ test_indentation:
 	@rm -f test.erl
 	@rm -f test_indent.el
 	@echo '(load "erlang-start")' >> test_indent.el
-	@echo '(find-file "test.erl.orig")' >> test_indent.el
+	@echo '(find-file "test.erl.original")' >> test_indent.el
 	@echo "(require 'cl)    ; required with Emacs < 23 for ignore-errors" >> test_indent.el
 	@echo '(erlang-mode)' >> test_indent.el
 	@echo '(toggle-debug-on-error)' >> test_indent.el
diff -Ndurp otp_src_19.0/lib/tools/emacs/test.erl.orig otp_src_19.0-lib-tools-emacs/lib/tools/emacs/test.erl.orig
--- otp_src_19.0/lib/tools/emacs/test.erl.orig	2016-06-21 16:12:42.000000000 +0300
+++ otp_src_19.0-lib-tools-emacs/lib/tools/emacs/test.erl.orig	1970-01-01 03:00:00.000000000 +0300
@@ -1,784 +0,0 @@
-%% -*- erlang -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%%     http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-
-%%%-------------------------------------------------------------------
-%%% File    : test.erl
-%%% Author  : Dan Gudmundsson <dan.gudmundsson@ericsson.com>
-%%% Description :   Test emacs mode indention and font-locking
-%%%                 this file is intentionally not indented.
-%%%                 Copy the file and indent it and you should end up with test.erl.indented
-%%% Created :  6 Oct 2009 by Dan Gudmundsson <dan.gudmundsson@ericsson.com>
-%%%-------------------------------------------------------------------
-
-%% Start off with syntax highlighting you have to verify this by looking here 
-%% and see that the code looks alright
-
--module(test).
--compile(export_all).
-
-%% Used to cause an "Unbalanced parentheses" error.
-foo(M) ->
-M#{a :=<<"a">>
-,b:=1}.
-foo() ->
-#{a =><<"a">>
-,b=>1}.
-
-%% Module attributes should be highlighted
-
--export([t/1]).
--record(record1, {a, 
- b, 
- c
-}).
--record(record2, {
-  a,
-  b
- }).
-	  
--record(record3, {a = 8#42423 bor
-    8#4234,
-  b = 8#5432 
-		  bor 2#1010101
-  c = 123 +
-234,
-		  d}).
-
--record(record4, {
- a = 8#42423 bor
-   8#4234,
- b = 8#5432 
-    bor 2#1010101
- c = 123 +
-     234,
- d}).
-
--record(record5, { a = 1 :: integer()
-, b = foobar :: atom()
-}).
-
--define(MACRO_1, macro).
--define(MACRO_2(_), macro).
-
--spec t(integer()) -> any().
-
--type ann() :: Var :: integer(). 
--type ann2() :: Var :: 
-   'return' 
- | 'return_white_spaces' 
-  | 'return_comments'
-  | 'text' | ann(). 
--type paren() :: 
-  (ann2()). 
--type t1() :: atom(). 
--type t2() :: [t1()]. 
--type t3(Atom) :: integer(Atom). 
--type t4() :: t3(foobar). 
--type t5() :: {t1(), t3(foo)}. 
--type t6() :: 1 | 2 | 3 | 
-	'foo' | 'bar'. 
--type t7() :: []. 
--type t71() :: [_]. 
--type t8() :: {any(),none(),pid(),port(),
-	       reference(),float()}. 
--type t9() :: [1|2|3|foo|bar] | 
-    list(a | b | c) | t71(). 
--type t10() :: {1|2|3|foo|t9()} | {}. 
--type t11() :: 1..2. 
--type t13() :: maybe_improper_list(integer(), t11()). 
--type t14() :: [erl_scan:foo() | 
-        %% Should be highlighted
-	term() |
-	bool() |
-	byte() |
-	char() |
-	non_neg_integer() | nonempty_list() |
-	pos_integer() |
-	neg_integer() |
-	number() |
-	list() |
-	nonempty_improper_list() | nonempty_maybe_improper_list() |
-	maybe_improper_list() | string() | iolist() | byte() |
-	module() |
-	mfa() 	|
-	node() 	|
-	timeout() |
-	no_return() |
-	%% Should not be highlighted
-	nonempty_() | nonlist() | 
- erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)].
-
-
--type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>,
-		<<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>|
-<<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>|
-<<_:34>>|<<_:34>>|<<_:34>>]. 
--type t16() :: fun(). 
--type t17() :: fun((...) -> paren()). 
--type t18() :: fun(() -> t17() | t16()). 
--type t19() :: fun((t18()) -> t16()) |
-  fun((nonempty_maybe_improper_list('integer', any())|
-      1|2|3|a|b|<<_:3,_:_*14>>|integer()) ->
-nonempty_maybe_improper_list('integer', any())|
-1|2|3|a|b|<<_:3,_:_*14>>|integer()). 
--type t20() :: [t19(), ...]. 
--type t21() :: tuple(). 
--type t21(A) :: A. 
--type t22() :: t21(integer()). 
--type t23() :: #rec1{}. 
--type t24() :: #rec2{a :: t23(), b :: [atom()]}. 
--type t25() :: #rec3{f123 :: [t24() | 
-1|2|3|4|a|b|c|d| 
-nonempty_maybe_improper_list(integer, any())]}. 
--type t26() :: #rec4{ a :: integer()
-, b :: any()
-}.
--type t27() :: { integer()
-, atom()
-}.
--type t99() ::
-{t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(),
-t15(),t20(),t21(), t22(),t25()}. 
--spec t1(FooBar :: t99()) -> t99();
-(t2()) -> t2();
-	(t4()) -> t4() when is_subtype(t4(), t24);
-(t23()) -> t23() when is_subtype(t23(), atom()),
-                      is_subtype(t23(), t14());
-(t24()) -> t24() when is_subtype(t24(), atom()),
-                      is_subtype(t24(), t14()),
-	   is_subtype(t24(), t4()).
-
--spec over(I :: integer()) -> R1 :: foo:typen();
-  (A :: atom()) -> R2 :: foo:atomen();
- (T :: tuple()) -> R3 :: bar:typen().
-
--spec mod:t2() -> any(). 
-
--spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} 
-  | {'del_member', name(), pid()},
-     #state{}) -> {'noreply', #state{}}.
-
--spec handle_cast(Cast :: 
-   {'exchange', node(), [[name(),...]]} 
- | {'del_member', name(), pid()},
-   #state{}) -> {'noreply', #state{}}.
-
--spec all(fun((T) -> boolean()), List :: [T]) ->
- boolean() when is_subtype(T, term()). % (*)
-
--spec get_closest_pid(term()) -> 
-       Return :: pid()
- | {'error', {'no_process', term()}
-   | {'no_such_group', term()}}.
-
--spec add( X :: integer()
-, Y :: integer()
-) -> integer().
-
--opaque attributes_data() :: 
-[{'column', column()} | {'line', info_line()} |
- {'text', string()}] |  {line(),column()}.   
--record(r,{
-	  f1 :: attributes_data(),
-f222 = foo:bar(34, #rec3{}, 234234234423, 
-               aassdsfsdfsdf, 2234242323) :: 
-[t24() | 1|2|3|4|a|b|c|d| 
- nonempty_maybe_improper_list(integer, any())],
-f333 :: [t24() | 1|2|3|4|a|b|c|d| 
-	 nonempty_maybe_improper_list(integer, any())],
-f3 = x:y(),
-f4 = x:z() :: t99(),
-f17 :: 'undefined',
-f18 :: 1 | 2 | 'undefined',
-f19 = 3 :: integer()|undefined,
-f5 = 3 :: undefined|integer()}). 
-
--record(state, {
-  sequence_number = 1          :: integer()
-  }).
-
-
-highlighting(X)			  % Function definitions should be highlighted
-  when is_integer(X) ->	  % and so should `when' and `is_integer' be
- %% Highlighting
- %% Various characters (we keep an `atom' after to see that highlighting ends)
- $a,atom,			  % Characters should be marked
- "string",atom,		  % and strings
- 'asdasd',atom,		  % quote should be atoms??
- 'VaV',atom,
- 'aVa',atom,
- '\'atom',atom,
- 'atom\'',atom,
- 'at\'om',atom,
- '#1',atom,
-
- $", atom,					% atom should be ok
- $', atom, 
- 
- "string$", atom,  "string$", atom,  		% currently buggy I know...
- "string\$", atom,   				% workaround for bug above
- 
- "char $in string", atom, 
-
- 'atom$', atom,  'atom$', atom,
- 'atom\$', atom,
-
- 'char $in atom', atom,
-
- $[, ${, $\\, atom,
- ?MACRO_1,
- ?MACRO_2(foo),
-
- %% Numerical constants
- 16#DD,					% AD Should not be highlighted
- 32#dd,					% AD Should not be highlighted
- 32#ddAB,				        % AD Should not be highlighted
- 32#101,				        % AD Should not be highlighted
- 32#ABTR,				        % AD Should not be highlighted
-
- %% Variables
- Variables = lists:foo(),
- _Variables = lists:foo(),                      % AD
- AppSpec = Xyz/2,
- Module42 = Xyz(foo, bar),
- Module:foo(),
- _Module:foo(),				% AD
- FooÅÅ = lists:reverse([tl,hd,tl,hd]),	% AD Should highlight FooÅÅ
- _FooÅÅ = 42,				% AD Should highlight _FooÅÅ
-
- %% Bifs
- erlang:registered(),
- registered(),
- hd(tl(tl(hd([a,b,c])))),
- erlang:anything(lists),
- %% Guards
- is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3),
- is_function(Fun), is_pid(self()), 
- not_a_guard:is_list([]),
- %% Other Types
-
- atom,			  % not (currently) hightlighted
- 234234, 
- 234.43,
-
- [list, are, not, higlighted],    
- {nor, is, tuple},
- ok.
-    
-%%%
-%%%  Indentation
-%%%
-
-%%%  Left
-
-%%   Indented
-
-%    Right
-
-
-indent_basics(X, Y, Z) 
-  when X > 42,
-Z < 13;
-Y =:= 4711 ->
- %% comments
- % right comments
- case lists:filter(fun(_, AlongName, 
-	      B, 
-    C) ->
-		       true
-		   end, 
-		   [a,v,b])
- of
- [] ->
- Y = 5 * 43,
- ok;
- [_|_] -> 
- Y = 5 * 43,
- ok
- end,
- Y,
- %% List, tuples and binaries
- [a, 
-  b, c
- ],
- [ a, 
-   b, c
-  ],
-
- [
- a,
- b
-],
- {a, 
-  b,c
- },
- { a, 
-  b,c
-    },
-
- {
- a,
- b
- },
-    
-<<1:8,
-  2:8
-  >>,
- <<
- 1:8,
- 2:8
-  >>,
- << 1:8,
-   2:8
-    >>,
-
- (a,
-  b,
-  c
- ),
-
-    ( a,
-     b,
-     c
-    ),
-
-    
- (
-  a,
-  b,
-  c
- ),
-
- call(2#42423 bor 
-   #4234,
-  2#5432,
- other_arg),
- ok;
-indent_basics(Xlongname, 
-     #struct{a=Foo,
-     b=Bar}, 
-       [X|
-	Y]) ->
- testing_next_clause,
- ok;
-indent_basics(					% AD added clause
- X, 						% not sure how this should look
- Y,
- Z)
- when
- X < 42, Z > 13;
- Y =:= 4711 ->
- foo;
-indent_basics(X, Y, Z) when			% AD added clause
- X < 42, Z > 13;				% testing when indentation
- Y =:= 4711 ->
- foo;
-indent_basics(X, Y, Z)				% AD added clause
- when						% testing when indentation
- X < 42, Z > 13;				% unsure about this one
- Y =:= 4711 ->
- foo.
-
-
-
-indent_nested() ->
- [
- {foo, 2, "string"},
- {bar, 3, "another string"}
-  ].
-
-
-indent_icr(Z) -> 				% icr = if case receive
- %% If
- if Z >= 0 ->
-	 X = 43 div 4,
-	 foo(X);
-    Z =< 10 ->
-	 X = 43 div 4,
-	 foo(X);
-    Z == 5 orelse
-    Z == 7 ->
-	 X = 43 div 4,
-	 foo(X);
-    true ->
-	 if_works
-  end,
- %% Case
- case {Z, foo, bar} of
-  {Z,_,_} ->
-  X = 43 div 4,
-  foo(X);
-  {Z,_,_}	when
-  Z =:= 42 ->				% AD line should be indented as a when
-  X = 43 div 4,
-  foo(X);
-  {Z,_,_}
-  when Z < 10 ->			% AD when should be indented
-  X = 43 div 4,
-  foo(X);
-  {Z,_,_}
-  when					% AD when should be indented
-  Z < 10				% and the guards should follow when
-  andalso				% unsure about how though
-  true ->
-  X = 43 div 4,
-  foo(X)
- end,
- %% begin
- begin
- sune,
- X = 74234 + foo(8456) +
-  345 div 43,
- ok
- end,
-
-
- %% receive
-  receive 
-  {Z,_,_} ->
-    X = 43 div 4,
-    foo(X);
-  Z ->
-   X = 43 div 4,
-   foo(X) 
-  end,
-  receive
-  {Z,_,_} ->
-  X = 43 div 4,
-  foo(X);
- Z 					% AD added clause
-  when Z =:= 1 ->			% This line should be indented by 2
-  X = 43 div 4,
-  foo(X);
- Z when					% AD added clause
-  Z =:= 2 ->				% This line should be indented by 2
-  X = 43 div 4,
-  foo(X);
- Z ->
-    X = 43 div 4,
-    foo(X) 
- after infinity ->
-    foo(X),
-    asd(X),
-    5*43
- end,
- receive
- after 10 -> 
- foo(X),
- asd(X),
- 5*43
- end,
- ok.
- 
-indent_fun() ->
-    %% Changed fun to one indention level
-Var = spawn(fun(X) 
-       when X == 2;
-	     X > 10 -> 
-  hello,
-  case Hello() of 
-   true when is_atom(X) -> 
-      foo;
-  false ->
-      bar
-  end;
- (Foo) when is_atom(Foo), 
-   is_integer(X) ->
-  X = 6* 45,
-  Y = true andalso
-	  kalle
- end),
-%% check EEP37 named funs
-Fn1 = fun Fact(N) when N > 0 ->
-   F = Fact(N-1),
-          N * F;
-Fact(0) ->
-                 1
-  end,
-%% check anonymous funs too
-   Fn2 = fun(0) ->
-1;
-   (N) ->
-   N
- end,
-  ok.
-
-indent_try_catch() ->
- try
- io:format(stdout, "Parsing file ~s, ", 
- [St0#leex.xfile]),
- {ok,Line3,REAs,Actions,St3} = 
- parse_rules(Xfile, Line2, Macs, St2)
- catch
-  exit:{badarg,R} ->
-  foo(R),
-  io:format(stdout, 
-   "ERROR reason ~p~n",
-    R);
-  error:R 				% AD added clause
-  when R =:= 42 ->			% when should be indented
-  foo(R);
-  error:R 				% AD added clause
-  when					% when should be indented
-  R =:= 42 ->				% but unsure about this (maybe 2 more)
-  foo(R);
-  error:R when				% AD added clause
-  R =:= foo ->				% line should be 2 indented (works)
-  foo(R);
-  error:R ->
-  foo(R),
-  io:format(stdout, 
-   "ERROR reason ~p~n",
-    R)
- after
-  foo('after'),
-  file:close(Xfile)
- end;
-indent_try_catch() ->
- try
-   foo(bar)
- of
- X when true andalso
- kalle ->
-  io:format(stdout, "Parsing file ~s, ",
-  [St0#leex.xfile]),
-  {ok,Line3,REAs,Actions,St3} =
-  parse_rules(Xfile, Line2, Macs, St2);
- X 					% AD added clause
-  when false andalso			% when should be 2 indented
-  bengt ->
-  gurka();
- X when					% AD added clause
-  false andalso				% line should be 2 indented
-  not bengt ->
-  gurka();
- X ->
-  io:format(stdout, "Parsing file ~s, ",
-  [St0#leex.xfile]),
-  {ok,Line3,REAs,Actions,St3} =
-  parse_rules(Xfile, Line2, Macs, St2)
- catch
- exit:{badarg,R} ->
-    foo(R),
-    io:format(stdout, 
-	      "ERROR reason ~p~n",
-	      R);
- error:R ->
-    foo(R),
-    io:format(stdout, 
-	      "ERROR reason ~p~n",
-	      R)
- after
- foo('after'),
-  file:close(Xfile),
-  bar(with_long_arg,
-       with_second_arg)
- end;
- indent_try_catch() ->
- try foo()
- after 
-  foo(),
-  bar(with_long_arg,
-      with_second_arg)
- end.
-
-indent_catch() ->
-  D = B +
-  float(43.1),
-    
-  B = catch oskar(X),
-  
-  A = catch (baz + 
-      bax),
- catch foo(),
-
-  C = catch B + 
-     float(43.1),
- 
-  case catch foo(X) of
-  A ->
- B
- end,
-
- case
-  catch foo(X)
- of
- A ->
-   B
-  end,
-
-  case
-  foo(X)
-   of
- A ->
-	  catch B,
-	  X
-   end,
-
- try sune of
- _ -> foo
-   catch _:_ -> baf
-   end,
-
-    try
-sune
-   of
- _ ->
-   X = 5,
-   (catch foo(X)),
-   X + 10
-   catch _:_ -> baf
-   end,
-
-   try
- (catch sune)
-   of
- _ ->
-   catch foo()  %% BUGBUG can't handle catch inside try without parentheses
-   catch _:_ ->
-    baf
-   end,
-
-   try
-(catch exit())
-   catch
-_ ->
-    catch baf()
-   end,
- ok.
-
-indent_binary() ->
-  X = lists:foldr(fun(M) ->
-    <<Ma/binary, " ">>
-    end, [], A),
-  A = <<X/binary, 0:8>>,
-  B.
-
-
-indent_comprehensions() ->
-%% I don't have a good idea how we want to handle this 
-%% but they are here to show how they are indented today.
-Result1 = [X || 
-  #record{a=X} <- lists:seq(1, 10),
-  true = (X rem 2)
-     ],
-Result2 = [X || <<X:32,_:32>> <= <<0:512>>,
-    true = (X rem 2)
-       ],
-
-Binary1 = << <<X:8>> || 
-  #record{a=X} <- lists:seq(1, 10),
-  true = (X rem 2)
-      >>,
-
-Binary2 = << <<X:8>> || <<X:32,_:32>> <= <<0:512>>,
-  true = (X rem 2)
-      >>,
-ok.
-
-%% This causes an error in earlier erlang-mode versions.
-foo() ->
-[#foo{
-foo = foo}].
-
-%% Record indentation
-some_function_with_a_very_long_name() ->
- #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
- field1=a,
- field2=b},
- case dummy_function_with_a_very_very_long_name(x) of
- #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
- field1=a,
- field2=b} ->
- ok;
- Var = #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
- field1=a,
- field2=b} ->
- Var#'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
- field1=a,
- field2=b};
- #xyz{
- a=1,
- b=2} ->
- ok
- end.
-
-another_function_with_a_very_very_long_name() ->
- #rec{
- field1=1,
- field2=1}.
-
-some_function_name_xyz(xyzzy, #some_record{
- field1=Field1,
- field2=Field2}) ->
- SomeVariable = f(#'Some-long-record-name'{
- field_a = 1,
- 'inter-xyz-parameters' =
- #'Some-other-very-long-record-name'{
- field2 = Field1,
- field2 = Field2}}),
- {ok, SomeVariable}.
-
-commas_first() ->
- {abc, [ {some_var, 1}
-        , {some_other_var, 2}
-        , {erlang_ftw, 9}
-        , {erlang_cookie, 'cookie'}
-        , {cmds,
-            [ {one,   "sudo ls"}
-              , {one,   "sudo ls"}
-              , {two,   "sudo ls"}
-              , {three, "sudo ls"}
-              , {four,  "sudo ls"}
-              , {three, "sudo ls"}
-            ] }
-        , {ssh_username, "yow"}
-        , {cluster,
-            [ {aaaa, [ {"10.198.55.12" , "" }
-                     , {"10.198.55.13" , "" }
-                     ] }
-            , {bbbb, [ {"10.198.55.151", "" }
-                     , {"10.198.55.123", "" }
-                     , {"10.198.55.34" , "" }
-                     , {"10.198.55.85" , "" }
-                     , {"10.198.55.67" , "" }
-                     ] }
-            , {cccc, [ {"10.198.55.68" , "" }
-                     , {"10.198.55.69" , "" }
-                     ] }
-            ] }
-]
-}.
-
-
-%% this used to result in a scan-sexp error
-[{
-}].
-
-%% this used to result in 2x the correct indentation within the function
-%% body, due to the function name being mistaken for a keyword
-catcher(N) ->
-try generate_exception(N) of
-Val -> {N, normal, Val}
-catch
-throw:X -> {N, caught, thrown, X};
-exit:X -> {N, caught, exited, X};
-error:X -> {N, caught, error, X}
-end.
diff -Ndurp otp_src_19.0/lib/tools/emacs/test.erl.original otp_src_19.0-lib-tools-emacs/lib/tools/emacs/test.erl.original
--- otp_src_19.0/lib/tools/emacs/test.erl.original	1970-01-01 03:00:00.000000000 +0300
+++ otp_src_19.0-lib-tools-emacs/lib/tools/emacs/test.erl.original	2016-06-21 16:12:42.000000000 +0300
@@ -0,0 +1,784 @@
+%% -*- erlang -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%%     http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+
+%%%-------------------------------------------------------------------
+%%% File    : test.erl
+%%% Author  : Dan Gudmundsson <dan.gudmundsson@ericsson.com>
+%%% Description :   Test emacs mode indention and font-locking
+%%%                 this file is intentionally not indented.
+%%%                 Copy the file and indent it and you should end up with test.erl.indented
+%%% Created :  6 Oct 2009 by Dan Gudmundsson <dan.gudmundsson@ericsson.com>
+%%%-------------------------------------------------------------------
+
+%% Start off with syntax highlighting you have to verify this by looking here 
+%% and see that the code looks alright
+
+-module(test).
+-compile(export_all).
+
+%% Used to cause an "Unbalanced parentheses" error.
+foo(M) ->
+M#{a :=<<"a">>
+,b:=1}.
+foo() ->
+#{a =><<"a">>
+,b=>1}.
+
+%% Module attributes should be highlighted
+
+-export([t/1]).
+-record(record1, {a, 
+ b, 
+ c
+}).
+-record(record2, {
+  a,
+  b
+ }).
+	  
+-record(record3, {a = 8#42423 bor
+    8#4234,
+  b = 8#5432 
+		  bor 2#1010101
+  c = 123 +
+234,
+		  d}).
+
+-record(record4, {
+ a = 8#42423 bor
+   8#4234,
+ b = 8#5432 
+    bor 2#1010101
+ c = 123 +
+     234,
+ d}).
+
+-record(record5, { a = 1 :: integer()
+, b = foobar :: atom()
+}).
+
+-define(MACRO_1, macro).
+-define(MACRO_2(_), macro).
+
+-spec t(integer()) -> any().
+
+-type ann() :: Var :: integer(). 
+-type ann2() :: Var :: 
+   'return' 
+ | 'return_white_spaces' 
+  | 'return_comments'
+  | 'text' | ann(). 
+-type paren() :: 
+  (ann2()). 
+-type t1() :: atom(). 
+-type t2() :: [t1()]. 
+-type t3(Atom) :: integer(Atom). 
+-type t4() :: t3(foobar). 
+-type t5() :: {t1(), t3(foo)}. 
+-type t6() :: 1 | 2 | 3 | 
+	'foo' | 'bar'. 
+-type t7() :: []. 
+-type t71() :: [_]. 
+-type t8() :: {any(),none(),pid(),port(),
+	       reference(),float()}. 
+-type t9() :: [1|2|3|foo|bar] | 
+    list(a | b | c) | t71(). 
+-type t10() :: {1|2|3|foo|t9()} | {}. 
+-type t11() :: 1..2. 
+-type t13() :: maybe_improper_list(integer(), t11()). 
+-type t14() :: [erl_scan:foo() | 
+        %% Should be highlighted
+	term() |
+	bool() |
+	byte() |
+	char() |
+	non_neg_integer() | nonempty_list() |
+	pos_integer() |
+	neg_integer() |
+	number() |
+	list() |
+	nonempty_improper_list() | nonempty_maybe_improper_list() |
+	maybe_improper_list() | string() | iolist() | byte() |
+	module() |
+	mfa() 	|
+	node() 	|
+	timeout() |
+	no_return() |
+	%% Should not be highlighted
+	nonempty_() | nonlist() | 
+ erl_scan:bar(34, 92) | t13() | m:f(integer() | <<_:_*16>>)].
+
+
+-type t15() :: {binary(),<<>>,<<_:34>>,<<_:_*42>>,
+		<<_:3,_:_*14>>,<<>>} | [<<>>|<<_:34>>|<<_:16>>|
+<<_:3,_:_*1472>>|<<_:19,_:_*14>>| <<_:34>>|
+<<_:34>>|<<_:34>>|<<_:34>>]. 
+-type t16() :: fun(). 
+-type t17() :: fun((...) -> paren()). 
+-type t18() :: fun(() -> t17() | t16()). 
+-type t19() :: fun((t18()) -> t16()) |
+  fun((nonempty_maybe_improper_list('integer', any())|
+      1|2|3|a|b|<<_:3,_:_*14>>|integer()) ->
+nonempty_maybe_improper_list('integer', any())|
+1|2|3|a|b|<<_:3,_:_*14>>|integer()). 
+-type t20() :: [t19(), ...]. 
+-type t21() :: tuple(). 
+-type t21(A) :: A. 
+-type t22() :: t21(integer()). 
+-type t23() :: #rec1{}. 
+-type t24() :: #rec2{a :: t23(), b :: [atom()]}. 
+-type t25() :: #rec3{f123 :: [t24() | 
+1|2|3|4|a|b|c|d| 
+nonempty_maybe_improper_list(integer, any())]}. 
+-type t26() :: #rec4{ a :: integer()
+, b :: any()
+}.
+-type t27() :: { integer()
+, atom()
+}.
+-type t99() ::
+{t2(),t4(),t5(),t6(),t7(),t8(),t10(),t14(),
+t15(),t20(),t21(), t22(),t25()}. 
+-spec t1(FooBar :: t99()) -> t99();
+(t2()) -> t2();
+	(t4()) -> t4() when is_subtype(t4(), t24);
+(t23()) -> t23() when is_subtype(t23(), atom()),
+                      is_subtype(t23(), t14());
+(t24()) -> t24() when is_subtype(t24(), atom()),
+                      is_subtype(t24(), t14()),
+	   is_subtype(t24(), t4()).
+
+-spec over(I :: integer()) -> R1 :: foo:typen();
+  (A :: atom()) -> R2 :: foo:atomen();
+ (T :: tuple()) -> R3 :: bar:typen().
+
+-spec mod:t2() -> any(). 
+
+-spec handle_cast(Cast :: {'exchange', node(), [[name(),...]]} 
+  | {'del_member', name(), pid()},
+     #state{}) -> {'noreply', #state{}}.
+
+-spec handle_cast(Cast :: 
+   {'exchange', node(), [[name(),...]]} 
+ | {'del_member', name(), pid()},
+   #state{}) -> {'noreply', #state{}}.
+
+-spec all(fun((T) -> boolean()), List :: [T]) ->
+ boolean() when is_subtype(T, term()). % (*)
+
+-spec get_closest_pid(term()) -> 
+       Return :: pid()
+ | {'error', {'no_process', term()}
+   | {'no_such_group', term()}}.
+
+-spec add( X :: integer()
+, Y :: integer()
+) -> integer().
+
+-opaque attributes_data() :: 
+[{'column', column()} | {'line', info_line()} |
+ {'text', string()}] |  {line(),column()}.   
+-record(r,{
+	  f1 :: attributes_data(),
+f222 = foo:bar(34, #rec3{}, 234234234423, 
+               aassdsfsdfsdf, 2234242323) :: 
+[t24() | 1|2|3|4|a|b|c|d| 
+ nonempty_maybe_improper_list(integer, any())],
+f333 :: [t24() | 1|2|3|4|a|b|c|d| 
+	 nonempty_maybe_improper_list(integer, any())],
+f3 = x:y(),
+f4 = x:z() :: t99(),
+f17 :: 'undefined',
+f18 :: 1 | 2 | 'undefined',
+f19 = 3 :: integer()|undefined,
+f5 = 3 :: undefined|integer()}). 
+
+-record(state, {
+  sequence_number = 1          :: integer()
+  }).
+
+
+highlighting(X)			  % Function definitions should be highlighted
+  when is_integer(X) ->	  % and so should `when' and `is_integer' be
+ %% Highlighting
+ %% Various characters (we keep an `atom' after to see that highlighting ends)
+ $a,atom,			  % Characters should be marked
+ "string",atom,		  % and strings
+ 'asdasd',atom,		  % quote should be atoms??
+ 'VaV',atom,
+ 'aVa',atom,
+ '\'atom',atom,
+ 'atom\'',atom,
+ 'at\'om',atom,
+ '#1',atom,
+
+ $", atom,					% atom should be ok
+ $', atom, 
+ 
+ "string$", atom,  "string$", atom,  		% currently buggy I know...
+ "string\$", atom,   				% workaround for bug above
+ 
+ "char $in string", atom, 
+
+ 'atom$', atom,  'atom$', atom,
+ 'atom\$', atom,
+
+ 'char $in atom', atom,
+
+ $[, ${, $\\, atom,
+ ?MACRO_1,
+ ?MACRO_2(foo),
+
+ %% Numerical constants
+ 16#DD,					% AD Should not be highlighted
+ 32#dd,					% AD Should not be highlighted
+ 32#ddAB,				        % AD Should not be highlighted
+ 32#101,				        % AD Should not be highlighted
+ 32#ABTR,				        % AD Should not be highlighted
+
+ %% Variables
+ Variables = lists:foo(),
+ _Variables = lists:foo(),                      % AD
+ AppSpec = Xyz/2,
+ Module42 = Xyz(foo, bar),
+ Module:foo(),
+ _Module:foo(),				% AD
+ FooÅÅ = lists:reverse([tl,hd,tl,hd]),	% AD Should highlight FooÅÅ
+ _FooÅÅ = 42,				% AD Should highlight _FooÅÅ
+
+ %% Bifs
+ erlang:registered(),
+ registered(),
+ hd(tl(tl(hd([a,b,c])))),
+ erlang:anything(lists),
+ %% Guards
+ is_atom(foo), is_float(2.3), is_integer(32), is_number(4323.3),
+ is_function(Fun), is_pid(self()), 
+ not_a_guard:is_list([]),
+ %% Other Types
+
+ atom,			  % not (currently) hightlighted
+ 234234, 
+ 234.43,
+
+ [list, are, not, higlighted],    
+ {nor, is, tuple},
+ ok.
+    
+%%%
+%%%  Indentation
+%%%
+
+%%%  Left
+
+%%   Indented
+
+%    Right
+
+
+indent_basics(X, Y, Z) 
+  when X > 42,
+Z < 13;
+Y =:= 4711 ->
+ %% comments
+ % right comments
+ case lists:filter(fun(_, AlongName, 
+	      B, 
+    C) ->
+		       true
+		   end, 
+		   [a,v,b])
+ of
+ [] ->
+ Y = 5 * 43,
+ ok;
+ [_|_] -> 
+ Y = 5 * 43,
+ ok
+ end,
+ Y,
+ %% List, tuples and binaries
+ [a, 
+  b, c
+ ],
+ [ a, 
+   b, c
+  ],
+
+ [
+ a,
+ b
+],
+ {a, 
+  b,c
+ },
+ { a, 
+  b,c
+    },
+
+ {
+ a,
+ b
+ },
+    
+<<1:8,
+  2:8
+  >>,
+ <<
+ 1:8,
+ 2:8
+  >>,
+ << 1:8,
+   2:8
+    >>,
+
+ (a,
+  b,
+  c
+ ),
+
+    ( a,
+     b,
+     c
+    ),
+
+    
+ (
+  a,
+  b,
+  c
+ ),
+
+ call(2#42423 bor 
+   #4234,
+  2#5432,
+ other_arg),
+ ok;
+indent_basics(Xlongname, 
+     #struct{a=Foo,
+     b=Bar}, 
+       [X|
+	Y]) ->
+ testing_next_clause,
+ ok;
+indent_basics(					% AD added clause
+ X, 						% not sure how this should look
+ Y,
+ Z)
+ when
+ X < 42, Z > 13;
+ Y =:= 4711 ->
+ foo;
+indent_basics(X, Y, Z) when			% AD added clause
+ X < 42, Z > 13;				% testing when indentation
+ Y =:= 4711 ->
+ foo;
+indent_basics(X, Y, Z)				% AD added clause
+ when						% testing when indentation
+ X < 42, Z > 13;				% unsure about this one
+ Y =:= 4711 ->
+ foo.
+
+
+
+indent_nested() ->
+ [
+ {foo, 2, "string"},
+ {bar, 3, "another string"}
+  ].
+
+
+indent_icr(Z) -> 				% icr = if case receive
+ %% If
+ if Z >= 0 ->
+	 X = 43 div 4,
+	 foo(X);
+    Z =< 10 ->
+	 X = 43 div 4,
+	 foo(X);
+    Z == 5 orelse
+    Z == 7 ->
+	 X = 43 div 4,
+	 foo(X);
+    true ->
+	 if_works
+  end,
+ %% Case
+ case {Z, foo, bar} of
+  {Z,_,_} ->
+  X = 43 div 4,
+  foo(X);
+  {Z,_,_}	when
+  Z =:= 42 ->				% AD line should be indented as a when
+  X = 43 div 4,
+  foo(X);
+  {Z,_,_}
+  when Z < 10 ->			% AD when should be indented
+  X = 43 div 4,
+  foo(X);
+  {Z,_,_}
+  when					% AD when should be indented
+  Z < 10				% and the guards should follow when
+  andalso				% unsure about how though
+  true ->
+  X = 43 div 4,
+  foo(X)
+ end,
+ %% begin
+ begin
+ sune,
+ X = 74234 + foo(8456) +
+  345 div 43,
+ ok
+ end,
+
+
+ %% receive
+  receive 
+  {Z,_,_} ->
+    X = 43 div 4,
+    foo(X);
+  Z ->
+   X = 43 div 4,
+   foo(X) 
+  end,
+  receive
+  {Z,_,_} ->
+  X = 43 div 4,
+  foo(X);
+ Z 					% AD added clause
+  when Z =:= 1 ->			% This line should be indented by 2
+  X = 43 div 4,
+  foo(X);
+ Z when					% AD added clause
+  Z =:= 2 ->				% This line should be indented by 2
+  X = 43 div 4,
+  foo(X);
+ Z ->
+    X = 43 div 4,
+    foo(X) 
+ after infinity ->
+    foo(X),
+    asd(X),
+    5*43
+ end,
+ receive
+ after 10 -> 
+ foo(X),
+ asd(X),
+ 5*43
+ end,
+ ok.
+ 
+indent_fun() ->
+    %% Changed fun to one indention level
+Var = spawn(fun(X) 
+       when X == 2;
+	     X > 10 -> 
+  hello,
+  case Hello() of 
+   true when is_atom(X) -> 
+      foo;
+  false ->
+      bar
+  end;
+ (Foo) when is_atom(Foo), 
+   is_integer(X) ->
+  X = 6* 45,
+  Y = true andalso
+	  kalle
+ end),
+%% check EEP37 named funs
+Fn1 = fun Fact(N) when N > 0 ->
+   F = Fact(N-1),
+          N * F;
+Fact(0) ->
+                 1
+  end,
+%% check anonymous funs too
+   Fn2 = fun(0) ->
+1;
+   (N) ->
+   N
+ end,
+  ok.
+
+indent_try_catch() ->
+ try
+ io:format(stdout, "Parsing file ~s, ", 
+ [St0#leex.xfile]),
+ {ok,Line3,REAs,Actions,St3} = 
+ parse_rules(Xfile, Line2, Macs, St2)
+ catch
+  exit:{badarg,R} ->
+  foo(R),
+  io:format(stdout, 
+   "ERROR reason ~p~n",
+    R);
+  error:R 				% AD added clause
+  when R =:= 42 ->			% when should be indented
+  foo(R);
+  error:R 				% AD added clause
+  when					% when should be indented
+  R =:= 42 ->				% but unsure about this (maybe 2 more)
+  foo(R);
+  error:R when				% AD added clause
+  R =:= foo ->				% line should be 2 indented (works)
+  foo(R);
+  error:R ->
+  foo(R),
+  io:format(stdout, 
+   "ERROR reason ~p~n",
+    R)
+ after
+  foo('after'),
+  file:close(Xfile)
+ end;
+indent_try_catch() ->
+ try
+   foo(bar)
+ of
+ X when true andalso
+ kalle ->
+  io:format(stdout, "Parsing file ~s, ",
+  [St0#leex.xfile]),
+  {ok,Line3,REAs,Actions,St3} =
+  parse_rules(Xfile, Line2, Macs, St2);
+ X 					% AD added clause
+  when false andalso			% when should be 2 indented
+  bengt ->
+  gurka();
+ X when					% AD added clause
+  false andalso				% line should be 2 indented
+  not bengt ->
+  gurka();
+ X ->
+  io:format(stdout, "Parsing file ~s, ",
+  [St0#leex.xfile]),
+  {ok,Line3,REAs,Actions,St3} =
+  parse_rules(Xfile, Line2, Macs, St2)
+ catch
+ exit:{badarg,R} ->
+    foo(R),
+    io:format(stdout, 
+	      "ERROR reason ~p~n",
+	      R);
+ error:R ->
+    foo(R),
+    io:format(stdout, 
+	      "ERROR reason ~p~n",
+	      R)
+ after
+ foo('after'),
+  file:close(Xfile),
+  bar(with_long_arg,
+       with_second_arg)
+ end;
+ indent_try_catch() ->
+ try foo()
+ after 
+  foo(),
+  bar(with_long_arg,
+      with_second_arg)
+ end.
+
+indent_catch() ->
+  D = B +
+  float(43.1),
+    
+  B = catch oskar(X),
+  
+  A = catch (baz + 
+      bax),
+ catch foo(),
+
+  C = catch B + 
+     float(43.1),
+ 
+  case catch foo(X) of
+  A ->
+ B
+ end,
+
+ case
+  catch foo(X)
+ of
+ A ->
+   B
+  end,
+
+  case
+  foo(X)
+   of
+ A ->
+	  catch B,
+	  X
+   end,
+
+ try sune of
+ _ -> foo
+   catch _:_ -> baf
+   end,
+
+    try
+sune
+   of
+ _ ->
+   X = 5,
+   (catch foo(X)),
+   X + 10
+   catch _:_ -> baf
+   end,
+
+   try
+ (catch sune)
+   of
+ _ ->
+   catch foo()  %% BUGBUG can't handle catch inside try without parentheses
+   catch _:_ ->
+    baf
+   end,
+
+   try
+(catch exit())
+   catch
+_ ->
+    catch baf()
+   end,
+ ok.
+
+indent_binary() ->
+  X = lists:foldr(fun(M) ->
+    <<Ma/binary, " ">>
+    end, [], A),
+  A = <<X/binary, 0:8>>,
+  B.
+
+
+indent_comprehensions() ->
+%% I don't have a good idea how we want to handle this 
+%% but they are here to show how they are indented today.
+Result1 = [X || 
+  #record{a=X} <- lists:seq(1, 10),
+  true = (X rem 2)
+     ],
+Result2 = [X || <<X:32,_:32>> <= <<0:512>>,
+    true = (X rem 2)
+       ],
+
+Binary1 = << <<X:8>> || 
+  #record{a=X} <- lists:seq(1, 10),
+  true = (X rem 2)
+      >>,
+
+Binary2 = << <<X:8>> || <<X:32,_:32>> <= <<0:512>>,
+  true = (X rem 2)
+      >>,
+ok.
+
+%% This causes an error in earlier erlang-mode versions.
+foo() ->
+[#foo{
+foo = foo}].
+
+%% Record indentation
+some_function_with_a_very_long_name() ->
+ #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
+ field1=a,
+ field2=b},
+ case dummy_function_with_a_very_very_long_name(x) of
+ #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
+ field1=a,
+ field2=b} ->
+ ok;
+ Var = #'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
+ field1=a,
+ field2=b} ->
+ Var#'a-long-record-name-like-it-sometimes-is-with-asn.1-records'{
+ field1=a,
+ field2=b};
+ #xyz{
+ a=1,
+ b=2} ->
+ ok
+ end.
+
+another_function_with_a_very_very_long_name() ->
+ #rec{
+ field1=1,
+ field2=1}.
+
+some_function_name_xyz(xyzzy, #some_record{
+ field1=Field1,
+ field2=Field2}) ->
+ SomeVariable = f(#'Some-long-record-name'{
+ field_a = 1,
+ 'inter-xyz-parameters' =
+ #'Some-other-very-long-record-name'{
+ field2 = Field1,
+ field2 = Field2}}),
+ {ok, SomeVariable}.
+
+commas_first() ->
+ {abc, [ {some_var, 1}
+        , {some_other_var, 2}
+        , {erlang_ftw, 9}
+        , {erlang_cookie, 'cookie'}
+        , {cmds,
+            [ {one,   "sudo ls"}
+              , {one,   "sudo ls"}
+              , {two,   "sudo ls"}
+              , {three, "sudo ls"}
+              , {four,  "sudo ls"}
+              , {three, "sudo ls"}
+            ] }
+        , {ssh_username, "yow"}
+        , {cluster,
+            [ {aaaa, [ {"10.198.55.12" , "" }
+                     , {"10.198.55.13" , "" }
+                     ] }
+            , {bbbb, [ {"10.198.55.151", "" }
+                     , {"10.198.55.123", "" }
+                     , {"10.198.55.34" , "" }
+                     , {"10.198.55.85" , "" }
+                     , {"10.198.55.67" , "" }
+                     ] }
+            , {cccc, [ {"10.198.55.68" , "" }
+                     , {"10.198.55.69" , "" }
+                     ] }
+            ] }
+]
+}.
+
+
+%% this used to result in a scan-sexp error
+[{
+}].
+
+%% this used to result in 2x the correct indentation within the function
+%% body, due to the function name being mistaken for a keyword
+catcher(N) ->
+try generate_exception(N) of
+Val -> {N, normal, Val}
+catch
+throw:X -> {N, caught, thrown, X};
+exit:X -> {N, caught, exited, X};
+error:X -> {N, caught, error, X}
+end.
openSUSE Build Service is sponsored by