Skip to content

Normalization of aliases and imports #40

Open
@jiegillet

Description

@jiegillet

Aliases and imports usually refer to external functions so names should be handled accordingly

Example input

defmodule A do
  import B, only: [b_function: 1]
  import C, except: [c_function: 1]
  alias D, as: Dog
  def use_b(x), do: x |> b_function
  def use_c(c_function), do: c_function(0)
  def use_d(y), do: Dog.sniff(y)
end

Desired output

defmodule(PLACEHOLDER_1) do
  import(B, only: [b_function: 1])
  import(C, except: [c_function: 1])
  alias(D, as: PLACEHOLDER_2)
  def(PLACEHOLDER_3(PLACEHOLDER_4)) do
    PLACEHOLDER_4 |> b_function
  end
  def(PLACEHOLDER_5(PLACEHOLDER_6)) do
    PLACEHOLDER_6(0)
  end
  def(PLACEHOLDER_7(PLACEHOLDER_8)) do
    PLACEHOLDER_2.sniff(PLACEHOLDER_8)
  end
end

b_function is imported so should appear as it is. c_function is excluded, so any mention of it is a local variable and should have a placeholder (current behavior already). Dog is an alias so should be replaced by a placeholder (possible overlap with #33).

Current output

defmodule(PLACEHOLDER_1) do
  import(B, only: [b_function: 1])
  import(C, except: [c_function: 1])
  alias(D, as: Dog)
  def(PLACEHOLDER_2(PLACEHOLDER_3)) do
    PLACEHOLDER_3 |> PLACEHOLDER_4
  end
  def(PLACEHOLDER_5(PLACEHOLDER_6)) do
    PLACEHOLDER_6(0)
  end
  def(PLACEHOLDER_7(PLACEHOLDER_8)) do
    Dog.sniff(PLACEHOLDER_8)
  end
end

In the case of import X where X is a standard library, it is possible to lookup all functions, so these should not de replaced either.

Metadata

Metadata

Assignees

No one assigned

    Labels

    x:action/improveImprove existing functionality/contentx:knowledge/elementaryLittle Exercism knowledge requiredx:module/representerWork on Representersx:size/largeLarge amount of workx:type/codingWrite code that is not student-facing content (e.g. test-runners, generators, but not exercises)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions