From f45f794738a01700416f4325dbc85e35532e4dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Wojtasik?= Date: Wed, 23 Feb 2022 17:26:22 +0100 Subject: [PATCH 1/2] Move loading tokens to file utils module --- lib/gradient/ast_specifier.ex | 12 ++---------- lib/gradient/elixir_file_utils.ex | 16 ++++++++++++++++ test/support/helpers.ex | 11 +++-------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/gradient/ast_specifier.ex b/lib/gradient/ast_specifier.ex index d7e64780..fea2a438 100644 --- a/lib/gradient/ast_specifier.ex +++ b/lib/gradient/ast_specifier.ex @@ -64,16 +64,8 @@ defmodule Gradient.AstSpecifier do """ @spec specify(nonempty_list(:erl_parse.abstract_form())) :: [:erl_parse.abstract_form()] def specify(forms) do - with {:attribute, line, :file, {path, _}} <- hd(forms), - path <- to_string(path), - {:ok, code} <- File.read(path), - {:ok, tokens} <- :elixir.string_to_tokens(String.to_charlist(code), line, line, path, []) do - run_mappers(forms, tokens) - else - error -> - IO.puts("Error occurred when specifying forms : #{inspect(error)}") - forms - end + tokens = Gradient.ElixirFileUtils.load_tokens(forms) + run_mappers(forms, tokens) end @doc """ diff --git a/lib/gradient/elixir_file_utils.ex b/lib/gradient/elixir_file_utils.ex index 42063aa5..19c4c807 100644 --- a/lib/gradient/elixir_file_utils.ex +++ b/lib/gradient/elixir_file_utils.ex @@ -3,6 +3,8 @@ defmodule Gradient.ElixirFileUtils do Module used to load beam files generated from Elixir. """ + alias Gradient.Types + @type path() :: :file.filename() | String.t() @type abstract_forms() :: [:erl_parse.abstract_form() | :erl_parse.form_info()] @@ -39,4 +41,18 @@ defmodule Gradient.ElixirFileUtils do {:forms_error, reason} end end + + @spec load_tokens([:erl_parse.abstract_form()]) :: Types.tokens() + def load_tokens(forms) do + with [{:attribute, _, :file, {path, _}} | _] <- forms, + path <- to_string(path), + {:ok, code} <- File.read(path), + {:ok, tokens} <- :elixir.string_to_tokens(String.to_charlist(code), 1, 1, path, []) do + tokens + else + error -> + IO.puts("Cannot load tokens: #{inspect(error)}") + [] + end + end end diff --git a/test/support/helpers.ex b/test/support/helpers.ex index 3e1621d7..8017da7e 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -8,18 +8,13 @@ defmodule Gradient.TestHelpers do beam_file = String.to_charlist(@examples_path <> beam_file) ex_file = @examples_path <> ex_file - code = - File.read!(ex_file) - |> String.to_charlist() - - {:ok, tokens} = - code - |> :elixir.string_to_tokens(1, 1, ex_file, []) - {:ok, {_, [abstract_code: {:raw_abstract_v1, ast}]}} = :beam_lib.chunks(beam_file, [:abstract_code]) ast = replace_file_path(ast, ex_file) + + [_ | _] = tokens = Gradient.ElixirFileUtils.load_tokens(ast) + {tokens, ast} end From 33e7df34569be18de734937da8021ab35ff2840d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Wojtasik?= Date: Wed, 23 Feb 2022 17:29:16 +0100 Subject: [PATCH 2/2] Test whether nested modules are specified correctly --- .../examples/Elixir.NestedModules.ModuleA.beam | Bin 0 -> 1332 bytes .../examples/Elixir.NestedModules.ModuleB.beam | Bin 0 -> 1332 bytes test/examples/Elixir.NestedModules.beam | Bin 0 -> 1308 bytes test/examples/nested_modules.ex | 17 +++++++++++++++++ test/gradient/ast_specifier_test.exs | 13 +++++++++++++ 5 files changed, 30 insertions(+) create mode 100644 test/examples/Elixir.NestedModules.ModuleA.beam create mode 100644 test/examples/Elixir.NestedModules.ModuleB.beam create mode 100644 test/examples/Elixir.NestedModules.beam create mode 100644 test/examples/nested_modules.ex diff --git a/test/examples/Elixir.NestedModules.ModuleA.beam b/test/examples/Elixir.NestedModules.ModuleA.beam new file mode 100644 index 0000000000000000000000000000000000000000..3ebc5579d64309e75a796a9536a6ab45e28281b3 GIT binary patch literal 1332 zcmZWpYfKbZ6uz^&JXTnCghh(6NQ)Irbr)I`TEOnIEJ(Vph)b0;>Fh9bfq|VzXJ%o6 zf)A8P`VwlTq=40GBi6Jf+LT8hK7JJ1#Hx*Gu_-ADF%eA&iA`#%>6wA1roG8`&%Nh- z_uQE|-<;xYyv^5+Ad5BD*FK%goRAcL2Q?zfV?v+J8WM+Q4% zE1jS1QtXFp;Rgkyf80Oa-8sFJZQMEDx;+9#X2d=8ij0;+yBoQnm|!y6gD?}d1{N6` z6hYqzBpQFc{9dH@yX>o`H}1Lb5L{iIyHuzK=Jz_^sPUs3u&h9l>rq6GeUm*$_lc5T zcP)>JMahClDH7c%P)mZ5DM=O?tSBrpSIZ&~ei^gK3OsEEQ7qA#Ck{MxNEIoL*JM?v zC683Zkj&tE?OS^ zb{wulMO8H%ym)MT8O%q*eSDeAcPW$1UgN)Vac`b@>Uz5WVA`*_uYP!U?Qi2lX}8RK zZ=B_>CG?%?{iXlOcQ=$3JXOKe-^{t-P4~CR`AW8}Kk-kx{pWSho{T&0zTEX`){Z-6 z1(U~C-|RBGUz;Ze>7RPrxA|5GK~CKMeoC|9z-h8|HfeGwJ!6!gw@!Ed-nv?{?cQ}h zg*)hXueJF%$-_M-&pz_n-boa|Mog>Vizi3o;t&Iv`L50B^A}aGN+!X z+KrPSE0|83KrV`MZ{;J K<^Pij1pWp_&Zp}D literal 0 HcmV?d00001 diff --git a/test/examples/Elixir.NestedModules.ModuleB.beam b/test/examples/Elixir.NestedModules.ModuleB.beam new file mode 100644 index 0000000000000000000000000000000000000000..1108c0055346fbaf53ae7dc7d0b81d1b9de60733 GIT binary patch literal 1332 zcmZWp4@?_X7=PE67FL8CpvXcprY0a@%YcpP7?ghkmOtfR5VPd&=)IOJy}NpMg<>|t zWayZLf6gT+F^;KY%Rm&|gc&1fGCE*&&TK}aE{buP3C3kJ3ueymN{x%Yae_mn zs7;KbNL;g5!Lq?F@*d8OH?i0wVLJn-jM(Q9B}Jxqc1MK6E7%oI6l6Wm*dX~2 z^XjqWW&~%n6D!n)CzxI*Fgy+qIhu|4Mc@I8L>7Y?1dsrAoCHJxbObq!G%=5mMAB~U zgYn^Hrnk^ri<=vyl9%w1cXS7lVTsYk5*AA-0%Nn3l3-|y24;^%8wnT02dGn|dN8P*_oy}zpaB>Gk^fl}CB7gh z8~i#zG=Km+5L$x?o>TYghybX$RF0;CQ`G#qfGppLou=t#nkL;BiJ{(vil5UvdS*`c zL^fF_o|R1lalZ9Evwz$^HPrJ%Bir7%u)ih@=~JTaR)}^rhk7?EfMSA4>2kwNv}jnQ zZIgxIMj%n$q_Ke+Xg<>vv39-vul$EyuA*|m0nGD3zE%MP6vwNw za;eGnvgnoUxD^$c8)UfK?2%r;e2462+RY#lPH>u?62o#>P|P4w#f*In?*S>Bg`luQ zdXr7q=R(EJP7Yo?vdaeZQQrt}J6HQfMr8Khk7o>VxAuMBu@>8T>|o!w$BUmC?cJKN z5^>=D(wWuNvD|ZM<5yM$+n%J?i|pTAo$Gbh8$Qf^K0A(2yZK`GPfw=3+c#Qtad2^4 z-3{A!jdQo%{)2geJBRA0ep#AJPBZ54m%blO&E2Kxc0Ia2A2^MxCx5##m%lIh<=ycf z@}8tOypvZOHf*!iEHcT~zZh-Do9}KJ*nj-Z@P*Z>qti{7brWZgOve|u zJoKwFTAnxWKl1hb0&{3=%{AFGQPVbdW-;T`iL=&iC;DGK|EKGNPt3K>$Be_JnOBwm zdwW;jOME5Oy7jH`>794VY#-U4yD>{$zTWjlv1pf}a1QmGAi+1XNLMp-wZGcbXU?iv zEn{fwvj6l#`UOnW*PbXJPq`GROuta&HwV&)!x^1DiAjzndYP_bu9c-NTTT9@fR&;B z)}_iywro{r?YcE}pg22wihODcW&XYe{*)45Q7hbpyVUA##=#~;*;}x^6-!jxb_HSt z=q%J(LPAx!!EV7Im7t#dw+m4cW@J$SF$$LG2@t1O6EXSg8LO N5i^K3|4$|m_#5KtudDz7 literal 0 HcmV?d00001 diff --git a/test/examples/Elixir.NestedModules.beam b/test/examples/Elixir.NestedModules.beam new file mode 100644 index 0000000000000000000000000000000000000000..a285108006600396a6c31033b43ed57f2110eea3 GIT binary patch literal 1308 zcmZWp4NM$G6rR01j#4Py9%u_e!6sG=a0ix_+Mne3IRWnnN~M)rySwbp!E$%I=k6XX zq+%^K_OvAwW6V`T1QG;NeTa!zI~5X)f6BUms;W|b{8wPI}k!$faFw%pI3Rw>cO&tIk(7#{8(N?QM}+4DQYdF zC=y>EQm`D)ih&^S$7?wplrYNxI}xivQBq_oz->$Lh6GmOML{+P7*-NxBRI_gJ)ap% zenx0m-+&eBjz>>#5|{u^yvtE4av0up8bAWHF$_osm>mZ#xb~fMa#b%uvP70X_~I5Y0@7fx=*IL=5t%a9}S0->g;bnDO{lJR}ur@moSIc15aB)6bBj2lMEgvq=*zB(4^F)B{$1rNMf-M z729fMxZ4(#+Hjy%_A@OukO(g{*cv2;&V)aVCM;mWC7C;ShYKIwI59-3Q- z{1J(Y)IKfdsYZ0$s(>RnaPIr){f?b1}4YDtdMz_dKTQxxC7^ zvS+5Tt&{5(;A(eb~1F-Iq7zD6<3YUj%%aOmlYO{ zk~>FH{&(r=2szYJAKZjHw90P4db6R}M$G!KL^T&E5F