Skip to content

Normalization of aliases and imports #40

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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