Packages
credo
0.4.7
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.7-rc.0
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.2-rc.4
1.7.2-rc.3
1.7.2-rc.2
1.7.2-rc.1
1.7.2-rc.0
1.7.1
1.7.0
1.7.0-rc.2
1.7.0-rc.1
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.4.1
1.4.0
1.4.0-rc.2
1.4.0-rc.1
1.3.2
1.3.1
1.3.0
1.3.0-rc3
1.3.0-rc2
1.3.0-rc1
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc4
1.2.0-rc3
1.2.0-rc2
1.2.0-rc1
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.1.0-rc3
1.1.0-rc2
1.1.0-rc1
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.1-rc1
1.0.0
1.0.0-rc1
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.9.0-rc8
0.9.0-rc7
0.9.0-rc6
0.9.0-rc5
0.9.0-rc4
0.9.0-rc3
0.9.0-rc2
0.9.0-rc1
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.8.0-rc7
0.8.0-rc6
0.8.0-rc5
0.8.0-rc4
0.8.0-rc3
0.8.0-rc2
0.8.0-rc1
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.6.0-rc2
0.6.0-rc1
0.5.3
0.5.2
0.5.1
0.5.0
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.10-dev
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-beta5
0.4.0-beta4
0.4.0-beta3
0.4.0-beta2
0.4.0-beta1
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-dev2
0.3.0-dev
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.1-dev
A static code analysis tool with a focus on code consistency and teaching.
Current section
Files
Jump to
Current section
Files
lib/credo/code.ex
defmodule Credo.Code do
@moduledoc """
Credo.Code contains a lot of utility or helper functions that deal with the
analysis if - you guessed it - Code.
Whenever a function serves a general purpose in this area, e.g. getting the
value of a module attribute inside a given module, we want to extract that
function and put it in the Credo.Code namespace, so others can utilize them
without reinventing the wheel.
The most often utilized functions are conveniently imported to
`Credo.Check.CodeHelper`.
"""
alias Credo.SourceFile
defmodule ParserError do
@moduledoc """
This is an internal Issue raised by Credo when it finds itself unable to
parse the source code in a file.
"""
@explanation []
#use Credo.Check, category: :error, base_priority: :normal
end
@doc """
Traverses a given SourceFile's AST or a given AST.
Technically this is just a wrapper around `Macro.prewalk/3`.
"""
def traverse(ast_or_source_file, fun, accumulator \\ [])
def traverse(%SourceFile{ast: source_ast}, fun, accumulator) do
traverse(source_ast, fun, accumulator)
end
def traverse(source_ast, fun, accumulator) do
{_, accumulated} = Macro.prewalk(source_ast, accumulator, fun)
accumulated
end
@doc """
Takes a SourceFile or String and returns an AST.
"""
def ast(%SourceFile{source: source, filename: filename}) do
ast(source, filename)
end
def ast(source, filename \\ "nofilename") do
case Code.string_to_quoted(source, line: 1) do
{:ok, value} -> {:ok, value}
{:error, error} -> {:error, [issue_for(error, filename)]}
end
end
@doc """
Converts a String into a List of tuples of `{line_no, line}`.
"""
def to_lines(source) do
source
|> String.split("\n")
|> Enum.with_index
|> Enum.map(fn({line, i}) -> {i + 1, line} end)
end
@doc """
Converts a String into a List of tokens using the `:elixir_tokenizer`.
"""
def to_tokens(source) do
{_, _, _, tokens} =
source
|> String.to_char_list
|> :elixir_tokenizer.tokenize(1, [])
tokens
end
defp issue_for({line_no, error_message, _}, filename) do
%Credo.Issue{
check: ParserError,
category: :error,
filename: filename,
message: error_message,
line_no: line_no
}
end
end