Report accurate regions in unused imports

This commit is contained in:
Richard Feldman 2020-12-13 22:51:23 -05:00
parent 860b120037
commit 0b620539ef
2 changed files with 22 additions and 25 deletions

View file

@ -18,7 +18,7 @@ pub enum ExposedModuleTypes {
} }
pub struct ConstrainedModule { pub struct ConstrainedModule {
pub unused_imports: MutSet<ModuleId>, pub unused_imports: MutMap<ModuleId, Region>,
pub constraint: Constraint, pub constraint: Constraint,
} }
@ -132,7 +132,7 @@ pub fn constrain_imports(
pub struct ConstrainableImports { pub struct ConstrainableImports {
pub imported_symbols: Vec<Import>, pub imported_symbols: Vec<Import>,
pub imported_aliases: MutMap<Symbol, Alias>, pub imported_aliases: MutMap<Symbol, Alias>,
pub unused_imports: MutSet<ModuleId>, pub unused_imports: MutMap<ModuleId, Region>,
} }
/// Run this before constraining imports. /// Run this before constraining imports.
@ -143,7 +143,7 @@ pub struct ConstrainableImports {
pub fn pre_constrain_imports( pub fn pre_constrain_imports(
home: ModuleId, home: ModuleId,
references: &MutSet<Symbol>, references: &MutSet<Symbol>,
imported_modules: MutSet<ModuleId>, imported_modules: MutMap<ModuleId, Region>,
exposed_types: &mut SubsByModule, exposed_types: &mut SubsByModule,
stdlib: &StdLib, stdlib: &StdLib,
) -> ConstrainableImports { ) -> ConstrainableImports {

View file

@ -106,12 +106,12 @@ impl Dependencies {
&mut self, &mut self,
module_id: ModuleId, module_id: ModuleId,
opt_effect_module: Option<ModuleId>, opt_effect_module: Option<ModuleId>,
dependencies: &MutSet<ModuleId>, dependencies: &MutMap<ModuleId, Region>,
goal_phase: Phase, goal_phase: Phase,
) -> MutSet<(ModuleId, Phase)> { ) -> MutSet<(ModuleId, Phase)> {
use Phase::*; use Phase::*;
for dep in dependencies.iter().copied() { for dep in dependencies.keys().copied() {
// to parse and generate constraints, the headers of all dependencies must be loaded! // to parse and generate constraints, the headers of all dependencies must be loaded!
// otherwise, we don't know whether an imported symbol is actually exposed // otherwise, we don't know whether an imported symbol is actually exposed
self.add_dependency_help(module_id, dep, Phase::Parse, Phase::LoadHeader); self.add_dependency_help(module_id, dep, Phase::Parse, Phase::LoadHeader);
@ -146,7 +146,7 @@ impl Dependencies {
let mut output = MutSet::default(); let mut output = MutSet::default();
// all the dependencies can be loaded // all the dependencies can be loaded
for dep in dependencies { for dep in dependencies.keys() {
// TODO figure out how to "load" (because it doesn't exist on the file system) the Effect module // TODO figure out how to "load" (because it doesn't exist on the file system) the Effect module
if Some(*dep) != opt_effect_module { if Some(*dep) != opt_effect_module {
@ -420,7 +420,7 @@ fn start_phase<'a>(module_id: ModuleId, phase: Phase, state: &mut State<'a>) ->
let mut aliases = MutMap::default(); let mut aliases = MutMap::default();
for imported in parsed.imported_modules.iter() { for imported in parsed.imported_modules.keys() {
match state.module_cache.aliases.get(imported) { match state.module_cache.aliases.get(imported) {
None => unreachable!( None => unreachable!(
r"imported module {:?} did not register its aliases, so {:?} cannot use them", r"imported module {:?} did not register its aliases, so {:?} cannot use them",
@ -556,7 +556,7 @@ struct ModuleHeader<'a> {
exposed_ident_ids: IdentIds, exposed_ident_ids: IdentIds,
deps_by_name: MutMap<PQModuleName<'a>, ModuleId>, deps_by_name: MutMap<PQModuleName<'a>, ModuleId>,
packages: MutMap<&'a str, PackageOrPath<'a>>, packages: MutMap<&'a str, PackageOrPath<'a>>,
imported_modules: MutSet<ModuleId>, imported_modules: MutMap<ModuleId, Region>,
exposes: Vec<Symbol>, exposes: Vec<Symbol>,
exposed_imports: MutMap<Ident, (Symbol, Region)>, exposed_imports: MutMap<Ident, (Symbol, Region)>,
src: &'a [u8], src: &'a [u8],
@ -574,7 +574,7 @@ enum HeaderFor<'a> {
struct ConstrainedModule { struct ConstrainedModule {
module: Module, module: Module,
declarations: Vec<Declaration>, declarations: Vec<Declaration>,
imported_modules: MutSet<ModuleId>, imported_modules: MutMap<ModuleId, Region>,
constraint: Constraint, constraint: Constraint,
ident_ids: IdentIds, ident_ids: IdentIds,
var_store: VarStore, var_store: VarStore,
@ -631,7 +631,7 @@ struct ParsedModule<'a> {
src: &'a str, src: &'a str,
module_timing: ModuleTiming, module_timing: ModuleTiming,
deps_by_name: MutMap<PQModuleName<'a>, ModuleId>, deps_by_name: MutMap<PQModuleName<'a>, ModuleId>,
imported_modules: MutSet<ModuleId>, imported_modules: MutMap<ModuleId, Region>,
exposed_ident_ids: IdentIds, exposed_ident_ids: IdentIds,
exposed_imports: MutMap<Ident, (Symbol, Region)>, exposed_imports: MutMap<Ident, (Symbol, Region)>,
parsed_defs: &'a [Located<roc_parse::ast::Def<'a>>], parsed_defs: &'a [Located<roc_parse::ast::Def<'a>>],
@ -659,7 +659,7 @@ enum Msg<'a> {
solved_subs: Solved<Subs>, solved_subs: Solved<Subs>,
decls: Vec<Declaration>, decls: Vec<Declaration>,
module_timing: ModuleTiming, module_timing: ModuleTiming,
unused_imports: MutSet<ModuleId>, unused_imports: MutMap<ModuleId, Region>,
}, },
FinishedAllTypeChecking { FinishedAllTypeChecking {
solved_subs: Solved<Subs>, solved_subs: Solved<Subs>,
@ -871,7 +871,7 @@ enum BuildTask<'a> {
constraint: Constraint, constraint: Constraint,
var_store: VarStore, var_store: VarStore,
declarations: Vec<Declaration>, declarations: Vec<Declaration>,
unused_imports: MutSet<ModuleId>, unused_imports: MutMap<ModuleId, Region>,
}, },
BuildPendingSpecializations { BuildPendingSpecializations {
module_timing: ModuleTiming, module_timing: ModuleTiming,
@ -1624,11 +1624,8 @@ fn update<'a>(
Occupied(entry) => entry.into_mut(), Occupied(entry) => entry.into_mut(),
}; };
for unused in unused_imports.drain() { for (unused, region) in unused_imports.drain() {
existing.push(roc_problem::can::Problem::UnusedImport( existing.push(roc_problem::can::Problem::UnusedImport(unused, region));
unused,
Region::zero(),
));
} }
let work = state.dependencies.notify(module_id, Phase::SolveTypes); let work = state.dependencies.notify(module_id, Phase::SolveTypes);
@ -2365,7 +2362,7 @@ fn send_header<'a>(
let mut imported: Vec<(QualifiedModuleName, Vec<Ident>, Region)> = let mut imported: Vec<(QualifiedModuleName, Vec<Ident>, Region)> =
Vec::with_capacity(imports.len()); Vec::with_capacity(imports.len());
let mut imported_modules: MutSet<ModuleId> = MutSet::default(); let mut imported_modules: MutMap<ModuleId, Region> = MutMap::default();
let mut scope_size = 0; let mut scope_size = 0;
for loc_entry in imports { for loc_entry in imports {
@ -2425,7 +2422,7 @@ fn send_header<'a>(
}; };
let module_id = module_ids.get_or_insert(&pq_module_name); let module_id = module_ids.get_or_insert(&pq_module_name);
imported_modules.insert(module_id); imported_modules.insert(module_id, region);
deps_by_name.insert(pq_module_name, module_id); deps_by_name.insert(pq_module_name, module_id);
@ -2549,7 +2546,7 @@ fn send_header_two<'a>(
let mut imported: Vec<(QualifiedModuleName, Vec<Ident>, Region)> = let mut imported: Vec<(QualifiedModuleName, Vec<Ident>, Region)> =
Vec::with_capacity(imports.len()); Vec::with_capacity(imports.len());
let mut imported_modules: MutSet<ModuleId> = MutSet::default(); let mut imported_modules: MutMap<ModuleId, Region> = MutMap::default();
let num_exposes = provides.len(); let num_exposes = provides.len();
let mut deps_by_name: MutMap<PQModuleName, ModuleId> = let mut deps_by_name: MutMap<PQModuleName, ModuleId> =
@ -2557,7 +2554,7 @@ fn send_header_two<'a>(
// add standard imports // add standard imports
// TODO add Effect by default // TODO add Effect by default
imported_modules.insert(app_module_id); imported_modules.insert(app_module_id, Region::zero());
deps_by_name.insert( deps_by_name.insert(
PQModuleName::Unqualified(ModuleName::APP.into()), PQModuleName::Unqualified(ModuleName::APP.into()),
app_module_id, app_module_id,
@ -2609,7 +2606,7 @@ fn send_header_two<'a>(
}; };
let module_id = module_ids.get_or_insert(&pq_module_name); let module_id = module_ids.get_or_insert(&pq_module_name);
imported_modules.insert(module_id); imported_modules.insert(module_id, region);
deps_by_name.insert(pq_module_name, module_id); deps_by_name.insert(pq_module_name, module_id);
@ -2735,7 +2732,7 @@ impl<'a> BuildTask<'a> {
module_timing: ModuleTiming, module_timing: ModuleTiming,
constraint: Constraint, constraint: Constraint,
var_store: VarStore, var_store: VarStore,
imported_modules: MutSet<ModuleId>, imported_modules: MutMap<ModuleId, Region>,
exposed_types: &mut SubsByModule, exposed_types: &mut SubsByModule,
stdlib: &StdLib, stdlib: &StdLib,
declarations: Vec<Declaration>, declarations: Vec<Declaration>,
@ -2780,7 +2777,7 @@ fn run_solve<'a>(
constraint: Constraint, constraint: Constraint,
mut var_store: VarStore, mut var_store: VarStore,
decls: Vec<Declaration>, decls: Vec<Declaration>,
unused_imports: MutSet<ModuleId>, unused_imports: MutMap<ModuleId, Region>,
) -> Msg<'a> { ) -> Msg<'a> {
// We have more constraining work to do now, so we'll add it to our timings. // We have more constraining work to do now, so we'll add it to our timings.
let constrain_start = SystemTime::now(); let constrain_start = SystemTime::now();
@ -3081,7 +3078,7 @@ fn fabricate_effects_module<'a>(
rigid_variables: module_output.rigid_variables, rigid_variables: module_output.rigid_variables,
}; };
let imported_modules = MutSet::default(); let imported_modules = MutMap::default();
// Should a effect module ever have a ModuleDocumentation? // Should a effect module ever have a ModuleDocumentation?
let module_docs = ModuleDocumentation { let module_docs = ModuleDocumentation {