mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 08:34:33 +00:00
Report accurate regions in unused imports
This commit is contained in:
parent
860b120037
commit
0b620539ef
2 changed files with 22 additions and 25 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue