@@ -9,13 +9,19 @@ defmodule Dialyxir.Formatter do
9
9
10
10
alias Dialyxir.FilterMap
11
11
12
+ @ type warning ( ) :: { tag :: term ( ) , { file :: Path . t ( ) , line :: pos_integer ( ) } , { atom ( ) , list ( ) } }
13
+
14
+ @ type t ( ) :: module ( )
15
+
16
+ @ callback format ( warning ( ) ) :: String . t ( )
17
+
12
18
def formatted_time ( duration_us ) do
13
19
minutes = div ( duration_us , 60_000_000 )
14
20
seconds = ( rem ( duration_us , 60_000_000 ) / 1_000_000 ) |> Float . round ( 2 )
15
21
"done in #{ minutes } m#{ seconds } s"
16
22
end
17
23
18
- @ spec format_and_filter ( [ tuple ] , module , Keyword . t ( ) , atom ) :: tuple
24
+ @ spec format_and_filter ( [ tuple ] , module , Keyword . t ( ) , t ( ) ) :: tuple
19
25
def format_and_filter ( warnings , filterer , filter_map_args , formatter ) do
20
26
filter_map = filterer . filter_map ( filter_map_args )
21
27
@@ -24,7 +30,7 @@ defmodule Dialyxir.Formatter do
24
30
formatted_warnings =
25
31
filtered_warnings
26
32
|> filter_legacy_warnings ( filterer )
27
- |> Enum . map ( & format_warning ( & 1 , formatter ) )
33
+ |> Enum . map ( & formatter . format / 1 )
28
34
|> Enum . uniq ( )
29
35
30
36
show_count_skipped ( warnings , formatted_warnings , filter_map )
@@ -46,114 +52,6 @@ defmodule Dialyxir.Formatter do
46
52
end
47
53
end
48
54
49
- defp format_warning ( warning , :raw ) do
50
- inspect ( warning , limit: :infinity )
51
- end
52
-
53
- defp format_warning ( warning , :dialyzer ) do
54
- # OTP 22 uses indented output, but that's incompatible with dialyzer.ignore-warnings format.
55
- # Can be disabled, but OTP 21 and older only accept an atom, so only disable on OTP 22+.
56
- opts =
57
- if String . to_integer ( System . otp_release ( ) ) < 22 ,
58
- do: :fullpath ,
59
- else: [ { :filename_opt , :fullpath } , { :indent_opt , false } ]
60
-
61
- warning
62
- |> :dialyzer . format_warning ( opts )
63
- |> String.Chars . to_string ( )
64
- |> String . replace_trailing ( "\n " , "" )
65
- end
66
-
67
- defp format_warning ( { _tag , { file , line } , message } , :short ) do
68
- { warning_name , arguments } = message
69
- base_name = Path . relative_to_cwd ( file )
70
-
71
- warning = warning ( warning_name )
72
- string = warning . format_short ( arguments )
73
-
74
- "#{ base_name } :#{ line } :#{ warning_name } #{ string } "
75
- end
76
-
77
- defp format_warning ( { _tag , { file , _line } , { warning_name , _arguments } } , :ignore_file ) do
78
- ~s( {"#{ file } ", :#{ warning_name } },)
79
- end
80
-
81
- defp format_warning ( dialyzer_warning = { _tag , { file , line } , message } , :dialyxir ) do
82
- { warning_name , arguments } = message
83
- base_name = Path . relative_to_cwd ( file )
84
-
85
- formatted =
86
- try do
87
- warning = warning ( warning_name )
88
- string = warning . format_long ( arguments )
89
-
90
- """
91
- #{ base_name } :#{ line } :#{ warning_name }
92
- #{ string }
93
- """
94
- rescue
95
- e ->
96
- message = """
97
- Unknown error occurred: #{ inspect ( e ) }
98
- """
99
-
100
- wrap_error_message ( message , dialyzer_warning )
101
- catch
102
- { :error , :unknown_warning , warning_name } ->
103
- message = """
104
- Unknown warning:
105
- #{ inspect ( warning_name ) }
106
- """
107
-
108
- wrap_error_message ( message , dialyzer_warning )
109
-
110
- { :error , :lexing , warning } ->
111
- message = """
112
- Failed to lex warning:
113
- #{ inspect ( warning ) }
114
- """
115
-
116
- wrap_error_message ( message , dialyzer_warning )
117
-
118
- { :error , :parsing , failing_string } ->
119
- message = """
120
- Failed to parse warning:
121
- #{ inspect ( failing_string ) }
122
- """
123
-
124
- wrap_error_message ( message , dialyzer_warning )
125
-
126
- { :error , :pretty_printing , failing_string } ->
127
- message = """
128
- Failed to pretty print warning:
129
- #{ inspect ( failing_string ) }
130
- """
131
-
132
- wrap_error_message ( message , dialyzer_warning )
133
-
134
- { :error , :formatting , code } ->
135
- message = """
136
- Failed to format warning:
137
- #{ inspect ( code ) }
138
- """
139
-
140
- wrap_error_message ( message , dialyzer_warning )
141
- end
142
-
143
- formatted <> String . duplicate ( "_" , 80 )
144
- end
145
-
146
- defp wrap_error_message ( message , warning ) do
147
- """
148
- Please file a bug in https://github.com/jeremyjh/dialyxir/issues with this message.
149
-
150
- #{ message }
151
-
152
- Legacy warning:
153
- #{ format_warning ( warning , :dialyzer ) }
154
- """
155
- end
156
-
157
55
defp show_count_skipped ( warnings , filtered_warnings , filter_map ) do
158
56
warnings_count = Enum . count ( warnings )
159
57
filtered_warnings_count = Enum . count ( filtered_warnings )
@@ -189,16 +87,6 @@ defmodule Dialyxir.Formatter do
189
87
|> Enum . count ( )
190
88
end
191
89
192
- defp warning ( warning_name ) do
193
- warnings = Dialyxir.Warnings . warnings ( )
194
-
195
- if Map . has_key? ( warnings , warning_name ) do
196
- Map . get ( warnings , warning_name )
197
- else
198
- throw ( { :error , :unknown_warning , warning_name } )
199
- end
200
- end
201
-
202
90
defp filter_warnings ( warnings , filterer , filter_map ) do
203
91
{ warnings , filter_map } =
204
92
Enum . map_reduce ( warnings , filter_map , & filter_warning ( filterer , & 1 , & 2 ) )
@@ -212,7 +100,7 @@ defmodule Dialyxir.Formatter do
212
100
{ skip? , matching_filters } =
213
101
try do
214
102
filterer . filter_warning? (
215
- { to_string ( file ) , warning_type , line , format_warning ( warning , :short ) } ,
103
+ { to_string ( file ) , warning_type , line , Dialyxir.Formatter.Short . format ( warning ) } ,
216
104
filter_map
217
105
)
218
106
rescue
@@ -242,7 +130,7 @@ defmodule Dialyxir.Formatter do
242
130
Enum . reject ( warnings , fn warning ->
243
131
formatted_warnings =
244
132
warning
245
- |> format_warning ( :dialyzer )
133
+ |> Dialyxir.Formatter.Dialyzer . format ( )
246
134
|> List . wrap ( )
247
135
248
136
Enum . empty? ( filterer . filter_legacy_warnings ( formatted_warnings ) )
0 commit comments