Changeset 94


Ignore:
Timestamp:
03/03/10 18:13:46 (2 years ago)
Author:
dom
Message:

Start work on include files

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/TODO

    r93 r94  
    44------------ 
    55 
     6- a removed source file does not get removed from tester!!! 
     7 
    68Check for possible bugs: 
    79----------------------- 
    8  
    9 - does a removed source file get removed from tester? 
    1010 
    1111Features? 
    1212--------- 
    1313 
    14 - detect -include dependencies and recompile all when .hrl changes 
     14- detect -include dependencies and recompile (all? includers?) when .hrl changes 
     15- tests that never end (e.g. infinite loop) 
    1516- run tests in parallel 
    1617- run a single (specific) test 
  • trunk/src/compiler.erl

    r93 r94  
    66-export ([init/2]). 
    77-export ([init/3]). 
     8-export ([reset_includes/2]). 
    89 
    910init (Notify, Dir) -> 
     
    1314    Args = [Dir, notify_me ()], 
    1415    Watcher = spawn_link (directory_watcher, init_recursive, Args), 
    15     State = {dict: new (), [], [], Options}, 
     16    State = {dict: new (), dict: new (), [], [], [{i, Dir} | Options]}, 
    1617    loop (Notify, Watcher, State). 
    1718 
     
    2021        check -> 
    2122            Watcher ! check, 
    22             {Modules, Binaries, Removed, Options} = State, 
    23             case receive_files (Watcher, Modules) of 
    24                 Modules -> 
    25                     loop (Notify, Watcher, State); 
    26                 Changed -> 
    27                     New_state = {Changed, Binaries, Removed, Options}, 
    28                     compile (Notify, Watcher, New_state) 
    29             end; 
     23            {Modules, Includes, Binaries, Removed, Options} = State, 
     24            Received = receive_files (Watcher, Modules, Includes), 
     25            {New_modules, New_includes} = Received, 
     26            New_options = reset_includes (New_includes, Options), 
     27            New_state = {New_modules, New_includes, Binaries, Removed, New_options}, 
     28            Last_state = 
     29                if 
     30                    New_modules /= Modules -> 
     31                        compile (Notify, New_state); 
     32                    true -> 
     33                        New_state 
     34                end, 
     35            loop (Notify, Watcher, Last_state); 
    3036        {Pid, stop} -> 
    3137            Pid ! {self (), bye} 
    3238    end. 
    3339 
    34 receive_files (Watcher, Modules) -> 
     40receive_files (Watcher, Modules, Includes) -> 
     41%%          Includes = sets: from_list ([D || {i, D} <- Options]), 
    3542    receive 
    3643        {Watcher, {{file, ".erl"}, File, Event}} -> 
    37             receive_files (Watcher, dict: store (File, Event, Modules)); 
     44            receive_files (Watcher, dict: store (File, Event, Modules), Includes); 
     45        {Watcher, {{file, ".hrl"}, File, Event}} -> 
     46            receive_files (Watcher, Modules, dict: store (File, Event, Includes)); 
    3847        {Watcher, _} -> 
    39             receive_files (Watcher, Modules) 
     48            receive_files (Watcher, Modules, Includes) 
    4049    after 500 -> 
    41             Modules 
     50            {Modules, Includes} 
    4251    end. 
    4352 
    44 compile (Notify, Watcher, State) -> 
    45     {Modules, _, _, _} = State, 
     53compile (Notify, State) -> 
     54    {Modules, _, _, _, _} = State, 
    4655    Notify (totals (Modules)), 
    4756    Process = process_fun (Notify), 
    4857    Processed = dict: fold (Process, State, Modules), 
    49     Notified = notify_end (Notify, Processed), 
    50     loop (Notify, Watcher, Notified). 
     58    notify_end (Notify, Processed). 
     59 
     60reset_includes (Dict, Options) -> 
     61    dict: fold (fun reset_includes/3, Options, Dict). 
     62 
     63reset_includes (File, found, Options) -> 
     64    Is_include = fun ({i, _}) -> true; (_) -> false end, 
     65    {Includes, Other} = lists: partition (Is_include, Options), 
     66    Dirs = sets: from_list ([D || {i, D} <- Includes]), 
     67    Dir = filename: dirname (File), 
     68    New_dirs = sets: add_element (Dir, Dirs), 
     69    New_includes = [{i, D} || D <- sets: to_list (New_dirs)], 
     70    Other ++ New_includes; 
     71reset_includes (_, _, Options) -> 
     72    Options. 
    5173 
    5274process_fun (Notify) -> 
    5375    fun (File, Event, Acc) when Event == found; Event == changed -> 
    54             {Modules, Binaries, Removed, Options} = Acc, 
     76            {Modules, Includes, Binaries, Removed, Options} = Acc, 
    5577            Result = modules: compile (File, Options), 
    5678            notify_result (Result, Notify), 
     
    5880            Notify (totals (New_modules)), 
    5981            New_binaries = binaries (Result, Binaries), 
    60             {New_modules, New_binaries, Removed, Options}; 
     82            {New_modules, Includes, New_binaries, Removed, Options}; 
    6183        (File, Event, Acc) when Event == lost -> 
    62             {Modules, Binaries, Removed, Options} = Acc, 
     84            {Modules, Includes, Binaries, Removed, Options} = Acc, 
    6385            New_modules = dict: erase (File, Modules), 
    6486            New_removed = [modules: module_name (File) | Removed], 
    65             {New_modules, Binaries, New_removed, Options}; 
     87            {New_modules, Includes, Binaries, New_removed, Options}; 
    6688        (_, _, Acc) -> 
    6789            Acc 
     
    97119 
    98120notify_end (Notify, State) -> 
    99     {Modules, _, _, _} = State, 
     121    {Modules, _,  _, _, _} = State, 
    100122    notify_end (Notify, totals (Modules), State). 
    101123 
    102 notify_end (Notify, {N, N, N}, {Modules, Binaries, Removed, Options}) -> 
     124notify_end (Notify, {N, N, N}, {Modules, Includes, Binaries, Removed, Options}) -> 
    103125    Notify ({{binaries, Binaries}, {removed, Removed}}), 
    104     {Modules, [], [], Options}; 
     126    {Modules, Includes, [], [], Options}; 
    105127notify_end (_, _, State) -> 
    106128    State. 
  • trunk/src/compiler_test.erl

    r93 r94  
    1414-export ([provides_all_binaries_not_just_latest_when_all_compiled/0]). 
    1515-export ([can_be_given_include_directories/0]). 
     16-export ([discovers_hrl_files_and_includes_their_path/0]). 
     17-export ([adds_root_to_include_path/0]). 
     18-export ([reset_includes_none/0]). 
     19-export ([reset_includes_found/0]). 
    1620-include_lib("stdlib/include/ms_transform.hrl"). 
    1721 
     
    7175    ok = fixtures: use_tree (Tree, fun include_no_directory/2), 
    7276    ok = fixtures: use_tree (Tree, fun include_with_directory/2). 
     77 
     78adds_root_to_include_path () -> 
     79    Tree = 
     80        [{directory, "include", 
     81          [{file, "eg_include.hrl", "-define(eg_macro,ok)."}]}, 
     82         {directory, "src", 
     83          [{file, "eg_code_with_include.erl", 
     84            ["-module (eg_code_with_include).", 
     85             "-test (ok).", 
     86             "-export ([ok/0]).", 
     87             "-include (\"include/eg_include.hrl\").", 
     88             "ok () ->", 
     89             "    ok = ?eg_macro."]}]}], 
     90    ok = fixtures: use_tree (Tree, fun adds_root_to_include_path/2).     
     91 
     92adds_root_to_include_path (Root, _) -> 
     93    Compiler = spawn_link (compiler, init, [notify_me (), Root]), 
     94    Compiler ! check, 
     95    Ms = receive_all (), 
     96    Compiler ! stop, 
     97    [{1, 0, 0}, {1, 1, 1}, {{binaries, _}, _}] = Ms, 
     98    ok. 
     99 
     100discovers_hrl_files_and_includes_their_path () -> 
     101    Tree = 
     102        [{directory, "include", 
     103          [{file, "eg_include.hrl", "-define(eg_macro,ok)."}]}, 
     104         {directory, "src", 
     105          [{file, "eg_code_with_include.erl", 
     106            ["-module (eg_code_with_include).", 
     107             "-test (ok).", 
     108             "-export ([ok/0]).", 
     109             "-include (\"eg_include.hrl\").", 
     110             "ok () ->", 
     111             "    ok = ?eg_macro."]}]}], 
     112    ok = fixtures: use_tree (Tree, fun discovers_hrl/2).     
     113 
     114discovers_hrl (Root, _) -> 
     115    Compiler = spawn_link (compiler, init, [notify_me (), Root]), 
     116    Compiler ! check, 
     117    Ms = receive_all (), 
     118    Compiler ! stop, 
     119    [{1, 0, 0}, {1, 1, 1}, _] = Ms, 
     120    ok. 
    73121 
    74122provides_binaries_when_all_compiled (Root, _) -> 
     
    205253    after 2000 -> lists: reverse ([timeout | Ms]) 
    206254    end. 
     255 
     256reset_includes_none () -> 
     257    [debug, bla] = compiler: reset_includes (dict: new (), [debug, bla]). 
     258 
     259reset_includes_found () -> 
     260    Found = [{"/dir/file.hrl", found}, {"/dir/subdir/file2.hrl", found}], 
     261    New = dict: from_list (Found), 
     262    Options = [debug, bla], 
     263    Expected = [debug, bla, {i, "/dir/subdir"}, {i, "/dir"}], 
     264    Expected = compiler: reset_includes (New, Options). 
  • trunk/src/tester_test.erl

    r92 r94  
    138138    [{1, 0, 0}, {1, 1, 1}] = Results, 
    139139    ok = receive {Tester, bye} -> ok after 100 -> timeout end. 
    140                   
     140 
    141141receive_all (Ms) -> 
    142142    receive 
     
    203203    ]. 
    204204 
    205 %%% Test to be added: 
    206 %%% tests that never end (e.g. infinite loop) 
    207 %%% Code loading and re-running all tests when one of many is refreshed 
Note: See TracChangeset for help on using the changeset viewer.