@@ -12,117 +12,8 @@ extern crate rustc_errors;
12
12
extern crate rustc_plugin;
13
13
extern crate syntax;
14
14
15
- use rustc:: session:: config:: { ErrorOutputType , Input } ;
16
- use rustc:: session:: { config, Session } ;
17
- use rustc_codegen_utils:: codegen_backend:: CodegenBackend ;
18
- use rustc_driver:: { driver, Compilation , CompilerCalls , RustcDefaultCalls } ;
19
- use std:: path:: PathBuf ;
15
+ use rustc_driver:: { driver:: CompileController , Compilation } ;
20
16
use std:: process:: Command ;
21
- use syntax:: ast;
22
-
23
- struct ClippyCompilerCalls {
24
- default : Box < RustcDefaultCalls > ,
25
- run_lints : bool ,
26
- }
27
-
28
- impl ClippyCompilerCalls {
29
- fn new ( run_lints : bool ) -> Self {
30
- Self {
31
- default : Box :: new ( RustcDefaultCalls ) ,
32
- run_lints,
33
- }
34
- }
35
- }
36
-
37
- impl < ' a > CompilerCalls < ' a > for ClippyCompilerCalls {
38
- fn early_callback (
39
- & mut self ,
40
- matches : & getopts:: Matches ,
41
- sopts : & config:: Options ,
42
- cfg : & ast:: CrateConfig ,
43
- descriptions : & rustc_errors:: registry:: Registry ,
44
- output : ErrorOutputType ,
45
- ) -> Compilation {
46
- self . default . early_callback ( matches, sopts, cfg, descriptions, output)
47
- }
48
- fn no_input (
49
- & mut self ,
50
- matches : & getopts:: Matches ,
51
- sopts : & config:: Options ,
52
- cfg : & ast:: CrateConfig ,
53
- odir : & Option < PathBuf > ,
54
- ofile : & Option < PathBuf > ,
55
- descriptions : & rustc_errors:: registry:: Registry ,
56
- ) -> Option < ( Input , Option < PathBuf > ) > {
57
- self . default . no_input ( matches, sopts, cfg, odir, ofile, descriptions)
58
- }
59
- fn late_callback (
60
- & mut self ,
61
- trans_crate : & CodegenBackend ,
62
- matches : & getopts:: Matches ,
63
- sess : & Session ,
64
- crate_stores : & rustc:: middle:: cstore:: CrateStore ,
65
- input : & Input ,
66
- odir : & Option < PathBuf > ,
67
- ofile : & Option < PathBuf > ,
68
- ) -> Compilation {
69
- self . default
70
- . late_callback ( trans_crate, matches, sess, crate_stores, input, odir, ofile)
71
- }
72
- fn build_controller ( self : Box < Self > , sess : & Session , matches : & getopts:: Matches ) -> driver:: CompileController < ' a > {
73
- let mut control = self . default . clone ( ) . build_controller ( sess, matches) ;
74
-
75
- if self . run_lints {
76
- let old = std:: mem:: replace ( & mut control. after_parse . callback , box |_| { } ) ;
77
- control. after_parse . callback = Box :: new ( move |state| {
78
- {
79
- let mut registry = rustc_plugin:: registry:: Registry :: new (
80
- state. session ,
81
- state
82
- . krate
83
- . as_ref ( )
84
- . expect (
85
- "at this compilation stage \
86
- the crate must be parsed",
87
- )
88
- . span ,
89
- ) ;
90
- registry. args_hidden = Some ( Vec :: new ( ) ) ;
91
- clippy_lints:: register_plugins ( & mut registry) ;
92
-
93
- let rustc_plugin:: registry:: Registry {
94
- early_lint_passes,
95
- late_lint_passes,
96
- lint_groups,
97
- llvm_passes,
98
- attributes,
99
- ..
100
- } = registry;
101
- let sess = & state. session ;
102
- let mut ls = sess. lint_store . borrow_mut ( ) ;
103
- for pass in early_lint_passes {
104
- ls. register_early_pass ( Some ( sess) , true , pass) ;
105
- }
106
- for pass in late_lint_passes {
107
- ls. register_late_pass ( Some ( sess) , true , pass) ;
108
- }
109
-
110
- for ( name, to) in lint_groups {
111
- ls. register_group ( Some ( sess) , true , name, to) ;
112
- }
113
-
114
- sess. plugin_llvm_passes . borrow_mut ( ) . extend ( llvm_passes) ;
115
- sess. plugin_attributes . borrow_mut ( ) . extend ( attributes) ;
116
- }
117
- old ( state) ;
118
- } ) ;
119
-
120
- control. compilation_done . stop = Compilation :: Stop ;
121
- }
122
-
123
- control
124
- }
125
- }
126
17
127
18
#[ allow( print_stdout) ]
128
19
fn show_version ( ) {
@@ -198,6 +89,49 @@ pub fn main() {
198
89
}
199
90
}
200
91
201
- let ccc = ClippyCompilerCalls :: new ( clippy_enabled) ;
202
- rustc_driver:: run ( move || rustc_driver:: run_compiler ( & args, Box :: new ( ccc) , None , None ) ) ;
92
+ let mut controller = CompileController :: basic ( ) ;
93
+ if clippy_enabled {
94
+ controller. after_parse . callback = Box :: new ( move |state| {
95
+ let mut registry = rustc_plugin:: registry:: Registry :: new (
96
+ state. session ,
97
+ state
98
+ . krate
99
+ . as_ref ( )
100
+ . expect (
101
+ "at this compilation stage \
102
+ the crate must be parsed",
103
+ )
104
+ . span ,
105
+ ) ;
106
+ registry. args_hidden = Some ( Vec :: new ( ) ) ;
107
+ clippy_lints:: register_plugins ( & mut registry) ;
108
+
109
+ let rustc_plugin:: registry:: Registry {
110
+ early_lint_passes,
111
+ late_lint_passes,
112
+ lint_groups,
113
+ llvm_passes,
114
+ attributes,
115
+ ..
116
+ } = registry;
117
+ let sess = & state. session ;
118
+ let mut ls = sess. lint_store . borrow_mut ( ) ;
119
+ for pass in early_lint_passes {
120
+ ls. register_early_pass ( Some ( sess) , true , pass) ;
121
+ }
122
+ for pass in late_lint_passes {
123
+ ls. register_late_pass ( Some ( sess) , true , pass) ;
124
+ }
125
+
126
+ for ( name, to) in lint_groups {
127
+ ls. register_group ( Some ( sess) , true , name, to) ;
128
+ }
129
+
130
+ sess. plugin_llvm_passes . borrow_mut ( ) . extend ( llvm_passes) ;
131
+ sess. plugin_attributes . borrow_mut ( ) . extend ( attributes) ;
132
+ } ) ;
133
+ }
134
+ controller. compilation_done . stop = Compilation :: Stop ;
135
+
136
+ rustc_driver:: run_compiler ( & args, Box :: new ( controller) , None , None ) ;
203
137
}
0 commit comments