Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

gleam / compiler-core / src / build / package_loader.rs
47 kB 1672 lines
1#[cfg(test)] 2mod tests; 3 4use std::{ 5 collections::{HashMap, HashSet}, 6 time::{Duration, SystemTime}, 7}; 8 9use camino::{Utf8Path, Utf8PathBuf}; 10 11// TODO: emit warnings for cached modules even if they are not compiled again. 12 13use ecow::EcoString; 14use itertools::Itertools; 15use vec1::Vec1; 16 17use crate::{ 18 ast::SrcSpan, 19 build::{module_loader::ModuleLoader, package_compiler::module_name, Module, Origin}, 20 config::PackageConfig, 21 dep_tree, 22 error::{FileIoAction, FileKind, ImportCycleLocationDetails}, 23 io::{CommandExecutor, FileSystemReader, FileSystemWriter}, 24 metadata, type_, 25 uid::UniqueIdGenerator, 26 warning::WarningEmitter, 27 Error, Result, 28}; 29 30use super::{ 31 module_loader::read_source, 32 package_compiler::{CacheMetadata, CachedModule, Input, Loaded, UncompiledModule}, 33 Mode, Target, 34}; 35 36#[derive(Debug, Clone, Copy, PartialEq, Eq)] 37pub enum CodegenRequired { 38 Yes, 39 No, 40} 41 42impl CodegenRequired { 43 /// Returns `true` if the codegen required is [`Yes`]. 44 /// 45 /// [`Yes`]: CodegenRequired::Yes 46 #[must_use] 47 pub fn is_required(&self) -> bool { 48 matches!(self, Self::Yes) 49 } 50} 51 52#[derive(Debug)] 53pub struct PackageLoader<'a, IO> { 54 io: IO, 55 ids: UniqueIdGenerator, 56 mode: Mode, 57 root: &'a Utf8Path, 58 warnings: &'a WarningEmitter, 59 codegen: CodegenRequired, 60 artefact_directory: &'a Utf8Path, 61 package_name: &'a EcoString, 62 target: Target, 63 stale_modules: &'a mut StaleTracker, 64 already_defined_modules: &'a mut im::HashMap<EcoString, Utf8PathBuf>, 65 incomplete_modules: &'a HashSet<EcoString>, 66} 67 68impl<'a, IO> PackageLoader<'a, IO> 69where 70 IO: FileSystemWriter + FileSystemReader + CommandExecutor + Clone, 71{ 72 pub(crate) fn new( 73 io: IO, 74 ids: UniqueIdGenerator, 75 mode: Mode, 76 root: &'a Utf8Path, 77 warnings: &'a WarningEmitter, 78 codegen: CodegenRequired, 79 artefact_directory: &'a Utf8Path, 80 target: Target, 81 package_name: &'a EcoString, 82 stale_modules: &'a mut StaleTracker, 83 already_defined_modules: &'a mut im::HashMap<EcoString, Utf8PathBuf>, 84 incomplete_modules: &'a HashSet<EcoString>, 85 ) -> Self { 86 Self { 87 io, 88 ids, 89 mode, 90 root, 91 warnings, 92 codegen, 93 target, 94 package_name, 95 artefact_directory, 96 stale_modules, 97 already_defined_modules, 98 incomplete_modules, 99 } 100 } 101 102 pub(crate) fn run(mut self) -> Result<Loaded> { 103 // First read the source files. This will use the `ModuleLoader`, which 104 // will check the mtimes and hashes of sources and caches to determine 105 // which should be loaded. 106 let mut inputs = self.read_sources_and_caches()?; 107 108 // Determine order in which modules are to be processed 109 let mut dep_location_map = HashMap::new(); 110 let deps = inputs 111 .values() 112 .map(|m| { 113 let name = m.name().clone(); 114 let _ = dep_location_map.insert(name.clone(), m); 115 (name, m.dependencies()) 116 }) 117 // Making sure that the module order is deterministic, to prevent different 118 // compilations of the same project compiling in different orders. This could impact 119 // any bugged outcomes, though not any where the compiler is working correctly, so it's 120 // mostly to aid debugging. 121 .sorted_by(|(a, _), (b, _)| a.cmp(b)) 122 .collect(); 123 let sequence = dep_tree::toposort_deps(deps) 124 .map_err(|e| self.convert_deps_tree_error(e, dep_location_map))?; 125 126 // Now that we have loaded sources and caches we check to see if any of 127 // the caches need to be invalidated because their dependencies have 128 // changed. 129 let mut loaded = Loaded::default(); 130 for name in sequence { 131 let input = inputs 132 .remove(&name) 133 .expect("Getting parsed module for name"); 134 135 match input { 136 // A new uncached module is to be compiled 137 Input::New(module) => { 138 tracing::debug!(module = %module.name, "module_to_be_compiled"); 139 self.stale_modules.add(module.name.clone()); 140 loaded.to_compile.push(module); 141 } 142 143 // A cached module with dependencies that are stale must be 144 // recompiled as the changes in the dependencies may have affect 145 // the output, making the cache invalid. 146 Input::Cached(info) if self.stale_modules.includes_any(&info.dependencies) => { 147 tracing::debug!(module = %info.name, "module_to_be_compiled"); 148 self.stale_modules.add(info.name.clone()); 149 let module = self.load_and_parse(info)?; 150 loaded.to_compile.push(module); 151 } 152 153 // A cached module with no stale dependencies can be used as-is 154 // and does not need to be recompiled. 155 Input::Cached(info) => { 156 tracing::debug!(module = %info.name, "module_to_load_from_cache"); 157 let module = self.load_cached_module(info)?; 158 loaded.cached.push(module); 159 } 160 } 161 } 162 163 Ok(loaded) 164 } 165 166 fn load_cached_module(&self, info: CachedModule) -> Result<type_::ModuleInterface, Error> { 167 let path = self 168 .artefact_directory 169 .join(info.name.replace("/", "@").as_ref()) 170 .with_extension("cache"); 171 let bytes = self.io.read_bytes(&path)?; 172 metadata::ModuleDecoder::new(self.ids.clone()).read(bytes.as_slice()) 173 } 174 175 pub fn is_gleam_path(&self, path: &Utf8Path, dir: &Utf8Path) -> bool { 176 use regex::Regex; 177 use std::cell::OnceCell; 178 const RE: OnceCell<Regex> = OnceCell::new(); 179 180 RE.get_or_init(|| { 181 Regex::new(&format!( 182 "^({module}{slash})*{module}\\.gleam$", 183 module = "[a-z][_a-z0-9]*", 184 slash = "(/|\\\\)", 185 )) 186 .expect("is_gleam_path() RE regex") 187 }) 188 .is_match( 189 path.strip_prefix(dir) 190 .expect("is_gleam_path(): strip_prefix") 191 .as_str(), 192 ) 193 } 194 195 fn read_sources_and_caches(&self) -> Result<HashMap<EcoString, Input>> { 196 let span = tracing::info_span!("load"); 197 let _enter = span.enter(); 198 199 let mut inputs = Inputs::new(self.already_defined_modules); 200 201 let src = self.root.join("src"); 202 let mut loader = ModuleLoader { 203 io: self.io.clone(), 204 warnings: self.warnings, 205 mode: self.mode, 206 target: self.target, 207 codegen: self.codegen, 208 package_name: self.package_name, 209 artefact_directory: self.artefact_directory, 210 source_directory: &src, 211 origin: Origin::Src, 212 incomplete_modules: self.incomplete_modules, 213 }; 214 215 // Src 216 for path in self.io.gleam_source_files(&src) { 217 // If the there is a .gleam file with a path that would be an 218 // invalid module name it does not get loaded. For example, if it 219 // has a uppercase letter in it. 220 // Emit a warning so that the programmer understands why it has been 221 // skipped. 222 if !self.is_gleam_path(&path, &src) { 223 self.warnings.emit(crate::Warning::InvalidSource { path }); 224 continue; 225 } 226 227 let input = loader.load(path)?; 228 inputs.insert(input)?; 229 } 230 231 // Test 232 if self.mode.includes_tests() { 233 let test = self.root.join("test"); 234 loader.origin = Origin::Test; 235 loader.source_directory = &test; 236 237 for path in self.io.gleam_source_files(&test) { 238 if !self.is_gleam_path(&path, &test) { 239 self.warnings.emit(crate::Warning::InvalidSource { path }); 240 continue; 241 } 242 let input = loader.load(path)?; 243 inputs.insert(input)?; 244 } 245 } 246 247 // If we are compiling for Erlang then modules all live in a single 248 // namespace. If we were to name a module the same as a module that 249 // is included in the standard Erlang distribution then this new 250 // Gleam module would overwrite the existing Erlang one, likely 251 // resulting in cryptic errors. 252 // This would most commonly happen for modules like "user" and 253 // "code". Emit an error so this never happens. 254 if self.target.is_erlang() { 255 for input in inputs.collection.values() { 256 ensure_gleam_module_does_not_overwrite_standard_erlang_module(&input)?; 257 } 258 } 259 260 Ok(inputs.collection) 261 } 262 263 fn load_and_parse(&self, cached: CachedModule) -> Result<UncompiledModule> { 264 let mtime = self.io.modification_time(&cached.source_path)?; 265 read_source( 266 self.io.clone(), 267 self.target, 268 cached.origin, 269 cached.source_path, 270 cached.name, 271 self.package_name.clone(), 272 mtime, 273 self.warnings.clone(), 274 ) 275 } 276 277 fn convert_deps_tree_error( 278 &self, 279 e: dep_tree::Error, 280 dep_location_map: HashMap<EcoString, &Input>, 281 ) -> Error { 282 match e { 283 dep_tree::Error::Cycle(modules) => { 284 let modules = modules 285 .iter() 286 .enumerate() 287 .map(|(i, module)| { 288 // cycles are in order of reference so get next in list or loop back to first 289 let index_of_importer = if i == 0 { modules.len() - 1 } else { i - 1 }; 290 let importing_module = modules 291 .get(index_of_importer) 292 .expect("importing module must exist"); 293 let input = dep_location_map.get(module).expect("dependency must exist"); 294 let location = match input { 295 Input::New(module) => { 296 let (_, location) = module 297 .dependencies 298 .iter() 299 .find(|d| &d.0 == importing_module) 300 .expect("import must exist for there to be a cycle"); 301 ImportCycleLocationDetails { 302 location: *location, 303 path: module.path.clone(), 304 src: module.code.clone(), 305 } 306 } 307 Input::Cached(cached_module) => { 308 let (_, location) = cached_module 309 .dependencies 310 .iter() 311 .find(|d| &d.0 == importing_module) 312 .expect("import must exist for there to be a cycle"); 313 let src = self 314 .io 315 .read(&cached_module.source_path) 316 .expect("failed to read source") 317 .into(); 318 ImportCycleLocationDetails { 319 location: *location, 320 path: cached_module.source_path.clone(), 321 src, 322 } 323 } 324 }; 325 (module.clone(), location) 326 }) 327 .collect_vec(); 328 Error::ImportCycle { 329 modules: Vec1::try_from(modules) 330 .expect("at least 1 module must exist in cycle"), 331 } 332 } 333 } 334 } 335} 336 337fn ensure_gleam_module_does_not_overwrite_standard_erlang_module(input: &Input) -> Result<()> { 338 // We only need to check uncached modules as it's not possible for these 339 // to have compiled successfully. 340 let Input::New(input) = input else { 341 return Ok(()); 342 }; 343 344 // These names were got with this Erlang 345 // 346 // ```erl 347 // file:write_file("names.txt", lists:join("\n",lists:map(fun(T) -> erlang:element(1, T) end, code:all_available()))). 348 // ``` 349 // 350 match input.name.as_str() { 351 "alarm_handler" 352 | "application" 353 | "application_controller" 354 | "application_master" 355 | "application_starter" 356 | "appmon_info" 357 | "argparse" 358 | "array" 359 | "asn1_db" 360 | "asn1ct" 361 | "asn1ct_check" 362 | "asn1ct_constructed_ber_bin_v2" 363 | "asn1ct_constructed_per" 364 | "asn1ct_eval_ext" 365 | "asn1ct_func" 366 | "asn1ct_gen" 367 | "asn1ct_gen_ber_bin_v2" 368 | "asn1ct_gen_check" 369 | "asn1ct_gen_jer" 370 | "asn1ct_gen_per" 371 | "asn1ct_imm" 372 | "asn1ct_name" 373 | "asn1ct_parser2" 374 | "asn1ct_pretty_format" 375 | "asn1ct_rtt" 376 | "asn1ct_table" 377 | "asn1ct_tok" 378 | "asn1ct_value" 379 | "asn1rt_nif" 380 | "atomics" 381 | "auth" 382 | "base64" 383 | "beam_a" 384 | "beam_asm" 385 | "beam_block" 386 | "beam_bounds" 387 | "beam_call_types" 388 | "beam_clean" 389 | "beam_dict" 390 | "beam_digraph" 391 | "beam_disasm" 392 | "beam_flatten" 393 | "beam_jump" 394 | "beam_kernel_to_ssa" 395 | "beam_lib" 396 | "beam_listing" 397 | "beam_opcodes" 398 | "beam_ssa" 399 | "beam_ssa_alias" 400 | "beam_ssa_bc_size" 401 | "beam_ssa_bool" 402 | "beam_ssa_bsm" 403 | "beam_ssa_check" 404 | "beam_ssa_codegen" 405 | "beam_ssa_dead" 406 | "beam_ssa_lint" 407 | "beam_ssa_opt" 408 | "beam_ssa_pp" 409 | "beam_ssa_pre_codegen" 410 | "beam_ssa_private_append" 411 | "beam_ssa_recv" 412 | "beam_ssa_share" 413 | "beam_ssa_throw" 414 | "beam_ssa_type" 415 | "beam_trim" 416 | "beam_types" 417 | "beam_utils" 418 | "beam_validator" 419 | "beam_z" 420 | "binary" 421 | "c" 422 | "calendar" 423 | "cdv_atom_cb" 424 | "cdv_bin_cb" 425 | "cdv_detail_wx" 426 | "cdv_dist_cb" 427 | "cdv_ets_cb" 428 | "cdv_fun_cb" 429 | "cdv_gen_cb" 430 | "cdv_html_wx" 431 | "cdv_info_wx" 432 | "cdv_int_tab_cb" 433 | "cdv_mem_cb" 434 | "cdv_mod_cb" 435 | "cdv_multi_wx" 436 | "cdv_persistent_cb" 437 | "cdv_port_cb" 438 | "cdv_proc_cb" 439 | "cdv_sched_cb" 440 | "cdv_table_wx" 441 | "cdv_term_cb" 442 | "cdv_timer_cb" 443 | "cdv_virtual_list_wx" 444 | "cdv_wx" 445 | "cerl" 446 | "cerl_clauses" 447 | "cerl_inline" 448 | "cerl_prettypr" 449 | "cerl_trees" 450 | "code" 451 | "code_server" 452 | "compile" 453 | "core_lib" 454 | "core_lint" 455 | "core_parse" 456 | "core_pp" 457 | "core_scan" 458 | "counters" 459 | "cover" 460 | "cprof" 461 | "cpu_sup" 462 | "crashdump_viewer" 463 | "crypto" 464 | "crypto_ec_curves" 465 | "ct" 466 | "ct_config" 467 | "ct_config_plain" 468 | "ct_config_xml" 469 | "ct_conn_log_h" 470 | "ct_cover" 471 | "ct_default_gl" 472 | "ct_event" 473 | "ct_framework" 474 | "ct_ftp" 475 | "ct_gen_conn" 476 | "ct_groups" 477 | "ct_hooks" 478 | "ct_hooks_lock" 479 | "ct_logs" 480 | "ct_make" 481 | "ct_master" 482 | "ct_master_event" 483 | "ct_master_logs" 484 | "ct_master_status" 485 | "ct_netconfc" 486 | "ct_property_test" 487 | "ct_release_test" 488 | "ct_repeat" 489 | "ct_rpc" 490 | "ct_run" 491 | "ct_slave" 492 | "ct_snmp" 493 | "ct_ssh" 494 | "ct_suite" 495 | "ct_telnet" 496 | "ct_telnet_client" 497 | "ct_testspec" 498 | "ct_util" 499 | "cth_conn_log" 500 | "cth_log_redirect" 501 | "cth_surefire" 502 | "dbg" 503 | "dbg_debugged" 504 | "dbg_icmd" 505 | "dbg_idb" 506 | "dbg_ieval" 507 | "dbg_iload" 508 | "dbg_iserver" 509 | "dbg_istk" 510 | "dbg_wx_break" 511 | "dbg_wx_break_win" 512 | "dbg_wx_code" 513 | "dbg_wx_filedialog_win" 514 | "dbg_wx_interpret" 515 | "dbg_wx_mon" 516 | "dbg_wx_mon_win" 517 | "dbg_wx_settings" 518 | "dbg_wx_src_view" 519 | "dbg_wx_trace" 520 | "dbg_wx_trace_win" 521 | "dbg_wx_view" 522 | "dbg_wx_win" 523 | "dbg_wx_winman" 524 | "debugger" 525 | "dets" 526 | "dets_server" 527 | "dets_sup" 528 | "dets_utils" 529 | "dets_v9" 530 | "dialyzer" 531 | "dialyzer_analysis_callgraph" 532 | "dialyzer_behaviours" 533 | "dialyzer_callgraph" 534 | "dialyzer_cl" 535 | "dialyzer_cl_parse" 536 | "dialyzer_clean_core" 537 | "dialyzer_codeserver" 538 | "dialyzer_contracts" 539 | "dialyzer_coordinator" 540 | "dialyzer_cplt" 541 | "dialyzer_dataflow" 542 | "dialyzer_dep" 543 | "dialyzer_dot" 544 | "dialyzer_explanation" 545 | "dialyzer_gui_wx" 546 | "dialyzer_incremental" 547 | "dialyzer_iplt" 548 | "dialyzer_options" 549 | "dialyzer_plt" 550 | "dialyzer_succ_typings" 551 | "dialyzer_timing" 552 | "dialyzer_typegraph" 553 | "dialyzer_typesig" 554 | "dialyzer_utils" 555 | "dialyzer_worker" 556 | "diameter" 557 | "diameter_app" 558 | "diameter_callback" 559 | "diameter_capx" 560 | "diameter_codec" 561 | "diameter_codegen" 562 | "diameter_config" 563 | "diameter_config_sup" 564 | "diameter_dbg" 565 | "diameter_dict_parser" 566 | "diameter_dict_scanner" 567 | "diameter_dict_util" 568 | "diameter_dist" 569 | "diameter_etcp" 570 | "diameter_etcp_sup" 571 | "diameter_exprecs" 572 | "diameter_gen" 573 | "diameter_gen_acct_rfc6733" 574 | "diameter_gen_base_accounting" 575 | "diameter_gen_base_rfc3588" 576 | "diameter_gen_base_rfc6733" 577 | "diameter_gen_doic_rfc7683" 578 | "diameter_gen_relay" 579 | "diameter_info" 580 | "diameter_lib" 581 | "diameter_make" 582 | "diameter_misc_sup" 583 | "diameter_peer" 584 | "diameter_peer_fsm" 585 | "diameter_peer_fsm_sup" 586 | "diameter_reg" 587 | "diameter_sctp" 588 | "diameter_sctp_sup" 589 | "diameter_service" 590 | "diameter_service_sup" 591 | "diameter_session" 592 | "diameter_stats" 593 | "diameter_sup" 594 | "diameter_sync" 595 | "diameter_tcp" 596 | "diameter_tcp_sup" 597 | "diameter_traffic" 598 | "diameter_transport" 599 | "diameter_transport_sup" 600 | "diameter_types" 601 | "diameter_watchdog" 602 | "diameter_watchdog_sup" 603 | "dict" 604 | "digraph" 605 | "digraph_utils" 606 | "disk_log" 607 | "disk_log_1" 608 | "disk_log_server" 609 | "disk_log_sup" 610 | "disksup" 611 | "dist_ac" 612 | "dist_util" 613 | "docgen_edoc_xml_cb" 614 | "docgen_otp_specs" 615 | "docgen_xmerl_xml_cb" 616 | "docgen_xml_to_chunk" 617 | "dtls_connection" 618 | "dtls_connection_sup" 619 | "dtls_gen_connection" 620 | "dtls_handshake" 621 | "dtls_listener_sup" 622 | "dtls_packet_demux" 623 | "dtls_record" 624 | "dtls_server_session_cache_sup" 625 | "dtls_server_sup" 626 | "dtls_socket" 627 | "dtls_sup" 628 | "dtls_v1" 629 | "dyntrace" 630 | "edlin" 631 | "edlin_context" 632 | "edlin_expand" 633 | "edlin_key" 634 | "edlin_type_suggestion" 635 | "edoc" 636 | "edoc_cli" 637 | "edoc_data" 638 | "edoc_doclet" 639 | "edoc_doclet_chunks" 640 | "edoc_extract" 641 | "edoc_layout" 642 | "edoc_layout_chunks" 643 | "edoc_lib" 644 | "edoc_macros" 645 | "edoc_parser" 646 | "edoc_refs" 647 | "edoc_report" 648 | "edoc_run" 649 | "edoc_scanner" 650 | "edoc_specs" 651 | "edoc_tags" 652 | "edoc_types" 653 | "edoc_wiki" 654 | "eldap" 655 | "epp" 656 | "epp_dodger" 657 | "eprof" 658 | "erl2html2" 659 | "erl_abstract_code" 660 | "erl_anno" 661 | "erl_bif_types" 662 | "erl_bifs" 663 | "erl_bits" 664 | "erl_boot_server" 665 | "erl_comment_scan" 666 | "erl_compile" 667 | "erl_compile_server" 668 | "erl_ddll" 669 | "erl_distribution" 670 | "erl_epmd" 671 | "erl_error" 672 | "erl_erts_errors" 673 | "erl_eval" 674 | "erl_expand_records" 675 | "erl_features" 676 | "erl_init" 677 | "erl_internal" 678 | "erl_kernel_errors" 679 | "erl_lint" 680 | "erl_parse" 681 | "erl_posix_msg" 682 | "erl_pp" 683 | "erl_prettypr" 684 | "erl_prim_loader" 685 | "erl_recomment" 686 | "erl_reply" 687 | "erl_scan" 688 | "erl_signal_handler" 689 | "erl_stdlib_errors" 690 | "erl_syntax" 691 | "erl_syntax_lib" 692 | "erl_tar" 693 | "erl_tracer" 694 | "erl_types" 695 | "erlang" 696 | "erlsrv" 697 | "erpc" 698 | "error_handler" 699 | "error_logger" 700 | "error_logger_file_h" 701 | "error_logger_tty_h" 702 | "erts_alloc_config" 703 | "erts_code_purger" 704 | "erts_debug" 705 | "erts_dirty_process_signal_handler" 706 | "erts_internal" 707 | "erts_literal_area_collector" 708 | "escript" 709 | "et" 710 | "et_collector" 711 | "et_selector" 712 | "et_viewer" 713 | "et_wx_contents_viewer" 714 | "et_wx_viewer" 715 | "etop" 716 | "etop_tr" 717 | "etop_txt" 718 | "ets" 719 | "eunit" 720 | "eunit_autoexport" 721 | "eunit_data" 722 | "eunit_lib" 723 | "eunit_listener" 724 | "eunit_proc" 725 | "eunit_serial" 726 | "eunit_server" 727 | "eunit_striptests" 728 | "eunit_surefire" 729 | "eunit_test" 730 | "eunit_tests" 731 | "eunit_tty" 732 | "eval_bits" 733 | "file" 734 | "file_io_server" 735 | "file_server" 736 | "file_sorter" 737 | "filelib" 738 | "filename" 739 | "format_lib_supp" 740 | "fprof" 741 | "ftp" 742 | "ftp_app" 743 | "ftp_internal" 744 | "ftp_progress" 745 | "ftp_response" 746 | "ftp_sup" 747 | "gb_sets" 748 | "gb_trees" 749 | "gen" 750 | "gen_event" 751 | "gen_fsm" 752 | "gen_sctp" 753 | "gen_server" 754 | "gen_statem" 755 | "gen_tcp" 756 | "gen_tcp_socket" 757 | "gen_udp" 758 | "gen_udp_socket" 759 | "gl" 760 | "global" 761 | "global_group" 762 | "global_search" 763 | "glu" 764 | "group" 765 | "group_history" 766 | "heart" 767 | "http_chunk" 768 | "http_request" 769 | "http_response" 770 | "http_transport" 771 | "http_uri" 772 | "http_util" 773 | "httpc" 774 | "httpc_cookie" 775 | "httpc_handler" 776 | "httpc_handler_sup" 777 | "httpc_manager" 778 | "httpc_profile_sup" 779 | "httpc_request" 780 | "httpc_response" 781 | "httpc_sup" 782 | "httpd" 783 | "httpd_acceptor" 784 | "httpd_acceptor_sup" 785 | "httpd_cgi" 786 | "httpd_conf" 787 | "httpd_connection_sup" 788 | "httpd_custom" 789 | "httpd_custom_api" 790 | "httpd_esi" 791 | "httpd_example" 792 | "httpd_file" 793 | "httpd_instance_sup" 794 | "httpd_log" 795 | "httpd_logger" 796 | "httpd_manager" 797 | "httpd_misc_sup" 798 | "httpd_request" 799 | "httpd_request_handler" 800 | "httpd_response" 801 | "httpd_script_env" 802 | "httpd_socket" 803 | "httpd_sup" 804 | "httpd_util" 805 | "i" 806 | "inet" 807 | "inet6_sctp" 808 | "inet6_tcp" 809 | "inet6_tcp_dist" 810 | "inet6_tls_dist" 811 | "inet6_udp" 812 | "inet_config" 813 | "inet_db" 814 | "inet_dns" 815 | "inet_epmd_dist" 816 | "inet_epmd_socket" 817 | "inet_gethost_native" 818 | "inet_hosts" 819 | "inet_parse" 820 | "inet_res" 821 | "inet_sctp" 822 | "inet_tcp" 823 | "inet_tcp_dist" 824 | "inet_tls_dist" 825 | "inet_udp" 826 | "inets" 827 | "inets_app" 828 | "inets_lib" 829 | "inets_service" 830 | "inets_sup" 831 | "inets_trace" 832 | "init" 833 | "instrument" 834 | "int" 835 | "io" 836 | "io_lib" 837 | "io_lib_format" 838 | "io_lib_fread" 839 | "io_lib_pretty" 840 | "kernel" 841 | "kernel_config" 842 | "kernel_refc" 843 | "lcnt" 844 | "leex" 845 | "lists" 846 | "local_tcp" 847 | "local_udp" 848 | "log_mf_h" 849 | "logger" 850 | "logger_backend" 851 | "logger_config" 852 | "logger_disk_log_h" 853 | "logger_filters" 854 | "logger_formatter" 855 | "logger_h_common" 856 | "logger_handler_watcher" 857 | "logger_olp" 858 | "logger_proxy" 859 | "logger_server" 860 | "logger_simple_h" 861 | "logger_std_h" 862 | "logger_sup" 863 | "make" 864 | "maps" 865 | "math" 866 | "megaco" 867 | "megaco_ber_encoder" 868 | "megaco_ber_media_gateway_control_v1" 869 | "megaco_ber_media_gateway_control_v2" 870 | "megaco_ber_media_gateway_control_v3" 871 | "megaco_binary_encoder" 872 | "megaco_binary_encoder_lib" 873 | "megaco_binary_name_resolver_v1" 874 | "megaco_binary_name_resolver_v2" 875 | "megaco_binary_name_resolver_v3" 876 | "megaco_binary_term_id" 877 | "megaco_binary_term_id_gen" 878 | "megaco_binary_transformer_v1" 879 | "megaco_binary_transformer_v2" 880 | "megaco_binary_transformer_v3" 881 | "megaco_compact_text_encoder" 882 | "megaco_compact_text_encoder_v1" 883 | "megaco_compact_text_encoder_v2" 884 | "megaco_compact_text_encoder_v3" 885 | "megaco_config" 886 | "megaco_config_misc" 887 | "megaco_digit_map" 888 | "megaco_edist_compress" 889 | "megaco_encoder" 890 | "megaco_erl_dist_encoder" 891 | "megaco_erl_dist_encoder_mc" 892 | "megaco_filter" 893 | "megaco_flex_scanner" 894 | "megaco_flex_scanner_handler" 895 | "megaco_messenger" 896 | "megaco_messenger_misc" 897 | "megaco_misc_sup" 898 | "megaco_monitor" 899 | "megaco_per_encoder" 900 | "megaco_per_media_gateway_control_v1" 901 | "megaco_per_media_gateway_control_v2" 902 | "megaco_per_media_gateway_control_v3" 903 | "megaco_pretty_text_encoder" 904 | "megaco_pretty_text_encoder_v1" 905 | "megaco_pretty_text_encoder_v2" 906 | "megaco_pretty_text_encoder_v3" 907 | "megaco_sdp" 908 | "megaco_stats" 909 | "megaco_sup" 910 | "megaco_tcp" 911 | "megaco_tcp_accept" 912 | "megaco_tcp_accept_sup" 913 | "megaco_tcp_connection" 914 | "megaco_tcp_connection_sup" 915 | "megaco_tcp_sup" 916 | "megaco_text_mini_decoder" 917 | "megaco_text_mini_parser" 918 | "megaco_text_parser_v1" 919 | "megaco_text_parser_v2" 920 | "megaco_text_parser_v3" 921 | "megaco_text_scanner" 922 | "megaco_timer" 923 | "megaco_trans_sender" 924 | "megaco_trans_sup" 925 | "megaco_transport" 926 | "megaco_udp" 927 | "megaco_udp_server" 928 | "megaco_udp_sup" 929 | "megaco_user" 930 | "megaco_user_default" 931 | "memsup" 932 | "merl" 933 | "merl_transform" 934 | "misc_supp" 935 | "mnesia" 936 | "mnesia_app" 937 | "mnesia_backend_type" 938 | "mnesia_backup" 939 | "mnesia_bup" 940 | "mnesia_checkpoint" 941 | "mnesia_checkpoint_sup" 942 | "mnesia_controller" 943 | "mnesia_dumper" 944 | "mnesia_event" 945 | "mnesia_ext_sup" 946 | "mnesia_frag" 947 | "mnesia_frag_hash" 948 | "mnesia_index" 949 | "mnesia_kernel_sup" 950 | "mnesia_late_loader" 951 | "mnesia_lib" 952 | "mnesia_loader" 953 | "mnesia_locker" 954 | "mnesia_log" 955 | "mnesia_monitor" 956 | "mnesia_recover" 957 | "mnesia_registry" 958 | "mnesia_rpc" 959 | "mnesia_schema" 960 | "mnesia_snmp_hook" 961 | "mnesia_sp" 962 | "mnesia_subscr" 963 | "mnesia_sup" 964 | "mnesia_text" 965 | "mnesia_tm" 966 | "mod_actions" 967 | "mod_alias" 968 | "mod_auth" 969 | "mod_auth_dets" 970 | "mod_auth_mnesia" 971 | "mod_auth_plain" 972 | "mod_auth_server" 973 | "mod_cgi" 974 | "mod_dir" 975 | "mod_disk_log" 976 | "mod_esi" 977 | "mod_get" 978 | "mod_head" 979 | "mod_log" 980 | "mod_range" 981 | "mod_responsecontrol" 982 | "mod_security" 983 | "mod_security_server" 984 | "mod_trace" 985 | "ms_transform" 986 | "msacc" 987 | "net" 988 | "net_adm" 989 | "net_kernel" 990 | "nteventlog" 991 | "observer" 992 | "observer_alloc_wx" 993 | "observer_app_wx" 994 | "observer_backend" 995 | "observer_html_lib" 996 | "observer_lib" 997 | "observer_perf_wx" 998 | "observer_port_wx" 999 | "observer_pro_wx" 1000 | "observer_procinfo" 1001 | "observer_sock_wx" 1002 | "observer_sys_wx" 1003 | "observer_trace_wx" 1004 | "observer_traceoptions_wx" 1005 | "observer_tv_table" 1006 | "observer_tv_wx" 1007 | "observer_wx" 1008 | "orddict" 1009 | "ordsets" 1010 | "os" 1011 | "os_mon" 1012 | "os_mon_mib" 1013 | "os_mon_sysinfo" 1014 | "os_sup" 1015 | "otp_internal" 1016 | "peer" 1017 | "persistent_term" 1018 | "pg" 1019 | "pg2" 1020 | "pool" 1021 | "prettypr" 1022 | "prim_buffer" 1023 | "prim_eval" 1024 | "prim_file" 1025 | "prim_inet" 1026 | "prim_net" 1027 | "prim_socket" 1028 | "prim_tty" 1029 | "prim_zip" 1030 | "proc_lib" 1031 | "proplists" 1032 | "pubkey_cert" 1033 | "pubkey_cert_records" 1034 | "pubkey_crl" 1035 | "pubkey_ocsp" 1036 | "pubkey_os_cacerts" 1037 | "pubkey_pbe" 1038 | "pubkey_pem" 1039 | "pubkey_policy_tree" 1040 | "pubkey_ssh" 1041 | "public_key" 1042 | "qlc" 1043 | "qlc_pt" 1044 | "queue" 1045 | "ram_file" 1046 | "rand" 1047 | "random" 1048 | "raw_file_io" 1049 | "raw_file_io_compressed" 1050 | "raw_file_io_deflate" 1051 | "raw_file_io_delayed" 1052 | "raw_file_io_inflate" 1053 | "raw_file_io_list" 1054 | "rb" 1055 | "rb_format_supp" 1056 | "re" 1057 | "rec_env" 1058 | "release_handler" 1059 | "release_handler_1" 1060 | "reltool" 1061 | "reltool_app_win" 1062 | "reltool_fgraph" 1063 | "reltool_fgraph_win" 1064 | "reltool_mod_win" 1065 | "reltool_server" 1066 | "reltool_sys_win" 1067 | "reltool_target" 1068 | "reltool_utils" 1069 | "rpc" 1070 | "runtime_tools" 1071 | "runtime_tools_sup" 1072 | "sasl" 1073 | "sasl_report" 1074 | "sasl_report_file_h" 1075 | "sasl_report_tty_h" 1076 | "scheduler" 1077 | "seq_trace" 1078 | "sets" 1079 | "shell" 1080 | "shell_default" 1081 | "shell_docs" 1082 | "slave" 1083 | "snmp" 1084 | "snmp_app" 1085 | "snmp_app_sup" 1086 | "snmp_community_mib" 1087 | "snmp_conf" 1088 | "snmp_config" 1089 | "snmp_framework_mib" 1090 | "snmp_generic" 1091 | "snmp_generic_mnesia" 1092 | "snmp_index" 1093 | "snmp_log" 1094 | "snmp_mini_mib" 1095 | "snmp_misc" 1096 | "snmp_note_store" 1097 | "snmp_notification_mib" 1098 | "snmp_pdus" 1099 | "snmp_shadow_table" 1100 | "snmp_standard_mib" 1101 | "snmp_target_mib" 1102 | "snmp_user_based_sm_mib" 1103 | "snmp_usm" 1104 | "snmp_verbosity" 1105 | "snmp_view_based_acm_mib" 1106 | "snmpa" 1107 | "snmpa_acm" 1108 | "snmpa_agent" 1109 | "snmpa_agent_sup" 1110 | "snmpa_app" 1111 | "snmpa_authentication_service" 1112 | "snmpa_conf" 1113 | "snmpa_discovery_handler" 1114 | "snmpa_discovery_handler_default" 1115 | "snmpa_error" 1116 | "snmpa_error_io" 1117 | "snmpa_error_logger" 1118 | "snmpa_error_report" 1119 | "snmpa_get" 1120 | "snmpa_get_lib" 1121 | "snmpa_get_mechanism" 1122 | "snmpa_local_db" 1123 | "snmpa_mib" 1124 | "snmpa_mib_data" 1125 | "snmpa_mib_data_tttn" 1126 | "snmpa_mib_lib" 1127 | "snmpa_mib_storage" 1128 | "snmpa_mib_storage_dets" 1129 | "snmpa_mib_storage_ets" 1130 | "snmpa_mib_storage_mnesia" 1131 | "snmpa_misc_sup" 1132 | "snmpa_mpd" 1133 | "snmpa_net_if" 1134 | "snmpa_net_if_filter" 1135 | "snmpa_network_interface" 1136 | "snmpa_network_interface_filter" 1137 | "snmpa_notification_delivery_info_receiver" 1138 | "snmpa_notification_filter" 1139 | "snmpa_set" 1140 | "snmpa_set_lib" 1141 | "snmpa_set_mechanism" 1142 | "snmpa_supervisor" 1143 | "snmpa_svbl" 1144 | "snmpa_symbolic_store" 1145 | "snmpa_target_cache" 1146 | "snmpa_trap" 1147 | "snmpa_usm" 1148 | "snmpa_vacm" 1149 | "snmpc" 1150 | "snmpc_lib" 1151 | "snmpc_mib_gram" 1152 | "snmpc_mib_to_hrl" 1153 | "snmpc_misc" 1154 | "snmpc_tok" 1155 | "snmpm" 1156 | "snmpm_conf" 1157 | "snmpm_config" 1158 | "snmpm_misc_sup" 1159 | "snmpm_mpd" 1160 | "snmpm_net_if" 1161 | "snmpm_net_if_filter" 1162 | "snmpm_net_if_mt" 1163 | "snmpm_network_interface" 1164 | "snmpm_network_interface_filter" 1165 | "snmpm_server" 1166 | "snmpm_server_sup" 1167 | "snmpm_supervisor" 1168 | "snmpm_user" 1169 | "snmpm_user_default" 1170 | "snmpm_user_old" 1171 | "snmpm_usm" 1172 | "socket" 1173 | "socket_registry" 1174 | "sofs" 1175 | "ssh" 1176 | "ssh_acceptor" 1177 | "ssh_acceptor_sup" 1178 | "ssh_agent" 1179 | "ssh_app" 1180 | "ssh_auth" 1181 | "ssh_bits" 1182 | "ssh_channel" 1183 | "ssh_channel_sup" 1184 | "ssh_cli" 1185 | "ssh_client_channel" 1186 | "ssh_client_key_api" 1187 | "ssh_connection" 1188 | "ssh_connection_handler" 1189 | "ssh_daemon_channel" 1190 | "ssh_dbg" 1191 | "ssh_file" 1192 | "ssh_fsm_kexinit" 1193 | "ssh_fsm_userauth_client" 1194 | "ssh_fsm_userauth_server" 1195 | "ssh_info" 1196 | "ssh_io" 1197 | "ssh_lib" 1198 | "ssh_message" 1199 | "ssh_no_io" 1200 | "ssh_options" 1201 | "ssh_server_channel" 1202 | "ssh_server_key_api" 1203 | "ssh_sftp" 1204 | "ssh_sftpd" 1205 | "ssh_sftpd_file" 1206 | "ssh_sftpd_file_api" 1207 | "ssh_shell" 1208 | "ssh_subsystem_sup" 1209 | "ssh_system_sup" 1210 | "ssh_tcpip_forward_acceptor" 1211 | "ssh_tcpip_forward_acceptor_sup" 1212 | "ssh_tcpip_forward_client" 1213 | "ssh_tcpip_forward_srv" 1214 | "ssh_transport" 1215 | "ssh_xfer" 1216 | "ssl" 1217 | "ssl_admin_sup" 1218 | "ssl_alert" 1219 | "ssl_app" 1220 | "ssl_certificate" 1221 | "ssl_cipher" 1222 | "ssl_cipher_format" 1223 | "ssl_client_session_cache_db" 1224 | "ssl_config" 1225 | "ssl_connection_sup" 1226 | "ssl_crl" 1227 | "ssl_crl_cache" 1228 | "ssl_crl_cache_api" 1229 | "ssl_crl_hash_dir" 1230 | "ssl_dh_groups" 1231 | "ssl_dist_admin_sup" 1232 | "ssl_dist_connection_sup" 1233 | "ssl_dist_sup" 1234 | "ssl_gen_statem" 1235 | "ssl_handshake" 1236 | "ssl_listen_tracker_sup" 1237 | "ssl_logger" 1238 | "ssl_manager" 1239 | "ssl_pem_cache" 1240 | "ssl_pkix_db" 1241 | "ssl_record" 1242 | "ssl_server_session_cache" 1243 | "ssl_server_session_cache_db" 1244 | "ssl_server_session_cache_sup" 1245 | "ssl_session" 1246 | "ssl_session_cache_api" 1247 | "ssl_srp_primes" 1248 | "ssl_sup" 1249 | "ssl_trace" 1250 | "ssl_upgrade_server_session_cache_sup" 1251 | "standard_error" 1252 | "string" 1253 | "supervisor" 1254 | "supervisor_bridge" 1255 | "sys" 1256 | "sys_core_alias" 1257 | "sys_core_bsm" 1258 | "sys_core_fold" 1259 | "sys_core_fold_lists" 1260 | "sys_core_inline" 1261 | "sys_core_prepare" 1262 | "sys_messages" 1263 | "sys_pre_attributes" 1264 | "system_information" 1265 | "systools" 1266 | "systools_lib" 1267 | "systools_make" 1268 | "systools_rc" 1269 | "systools_relup" 1270 | "tags" 1271 | "test_server" 1272 | "test_server_ctrl" 1273 | "test_server_gl" 1274 | "test_server_io" 1275 | "test_server_node" 1276 | "test_server_sup" 1277 | "tftp" 1278 | "tftp_app" 1279 | "tftp_binary" 1280 | "tftp_engine" 1281 | "tftp_file" 1282 | "tftp_lib" 1283 | "tftp_logger" 1284 | "tftp_sup" 1285 | "timer" 1286 | "tls_bloom_filter" 1287 | "tls_client_connection_1_3" 1288 | "tls_client_ticket_store" 1289 | "tls_connection" 1290 | "tls_connection_sup" 1291 | "tls_dist_server_sup" 1292 | "tls_dist_sup" 1293 | "tls_dtls_connection" 1294 | "tls_dyn_connection_sup" 1295 | "tls_gen_connection" 1296 | "tls_gen_connection_1_3" 1297 | "tls_handshake" 1298 | "tls_handshake_1_3" 1299 | "tls_record" 1300 | "tls_record_1_3" 1301 | "tls_sender" 1302 | "tls_server_connection_1_3" 1303 | "tls_server_session_ticket" 1304 | "tls_server_session_ticket_sup" 1305 | "tls_server_sup" 1306 | "tls_socket" 1307 | "tls_sup" 1308 | "tls_v1" 1309 | "ttb" 1310 | "ttb_autostart" 1311 | "ttb_et" 1312 | "typer" 1313 | "typer_core" 1314 | "unicode" 1315 | "unicode_util" 1316 | "unix_telnet" 1317 | "uri_string" 1318 | "user_drv" 1319 | "user_sup" 1320 | "v3_core" 1321 | "v3_kernel" 1322 | "v3_kernel_pp" 1323 | "win32reg" 1324 | "wrap_log_reader" 1325 | "wx" 1326 | "wxAcceleratorEntry" 1327 | "wxAcceleratorTable" 1328 | "wxActivateEvent" 1329 | "wxArtProvider" 1330 | "wxAuiDockArt" 1331 | "wxAuiManager" 1332 | "wxAuiManagerEvent" 1333 | "wxAuiNotebook" 1334 | "wxAuiNotebookEvent" 1335 | "wxAuiPaneInfo" 1336 | "wxAuiSimpleTabArt" 1337 | "wxAuiTabArt" 1338 | "wxBitmap" 1339 | "wxBitmapButton" 1340 | "wxBitmapDataObject" 1341 | "wxBookCtrlBase" 1342 | "wxBookCtrlEvent" 1343 | "wxBoxSizer" 1344 | "wxBrush" 1345 | "wxBufferedDC" 1346 | "wxBufferedPaintDC" 1347 | "wxButton" 1348 | "wxCalendarCtrl" 1349 | "wxCalendarDateAttr" 1350 | "wxCalendarEvent" 1351 | "wxCaret" 1352 | "wxCheckBox" 1353 | "wxCheckListBox" 1354 | "wxChildFocusEvent" 1355 | "wxChoice" 1356 | "wxChoicebook" 1357 | "wxClientDC" 1358 | "wxClipboard" 1359 | "wxClipboardTextEvent" 1360 | "wxCloseEvent" 1361 | "wxColourData" 1362 | "wxColourDialog" 1363 | "wxColourPickerCtrl" 1364 | "wxColourPickerEvent" 1365 | "wxComboBox" 1366 | "wxCommandEvent" 1367 | "wxContextMenuEvent" 1368 | "wxControl" 1369 | "wxControlWithItems" 1370 | "wxCursor" 1371 | "wxDC" 1372 | "wxDCOverlay" 1373 | "wxDataObject" 1374 | "wxDateEvent" 1375 | "wxDatePickerCtrl" 1376 | "wxDialog" 1377 | "wxDirDialog" 1378 | "wxDirPickerCtrl" 1379 | "wxDisplay" 1380 | "wxDisplayChangedEvent" 1381 | "wxDropFilesEvent" 1382 | "wxEraseEvent" 1383 | "wxEvent" 1384 | "wxEvtHandler" 1385 | "wxFileDataObject" 1386 | "wxFileDialog" 1387 | "wxFileDirPickerEvent" 1388 | "wxFilePickerCtrl" 1389 | "wxFindReplaceData" 1390 | "wxFindReplaceDialog" 1391 | "wxFlexGridSizer" 1392 | "wxFocusEvent" 1393 | "wxFont" 1394 | "wxFontData" 1395 | "wxFontDialog" 1396 | "wxFontPickerCtrl" 1397 | "wxFontPickerEvent" 1398 | "wxFrame" 1399 | "wxGBSizerItem" 1400 | "wxGCDC" 1401 | "wxGLCanvas" 1402 | "wxGLContext" 1403 | "wxGauge" 1404 | "wxGenericDirCtrl" 1405 | "wxGraphicsBrush" 1406 | "wxGraphicsContext" 1407 | "wxGraphicsFont" 1408 | "wxGraphicsGradientStops" 1409 | "wxGraphicsMatrix" 1410 | "wxGraphicsObject" 1411 | "wxGraphicsPath" 1412 | "wxGraphicsPen" 1413 | "wxGraphicsRenderer" 1414 | "wxGrid" 1415 | "wxGridBagSizer" 1416 | "wxGridCellAttr" 1417 | "wxGridCellBoolEditor" 1418 | "wxGridCellBoolRenderer" 1419 | "wxGridCellChoiceEditor" 1420 | "wxGridCellEditor" 1421 | "wxGridCellFloatEditor" 1422 | "wxGridCellFloatRenderer" 1423 | "wxGridCellNumberEditor" 1424 | "wxGridCellNumberRenderer" 1425 | "wxGridCellRenderer" 1426 | "wxGridCellStringRenderer" 1427 | "wxGridCellTextEditor" 1428 | "wxGridEvent" 1429 | "wxGridSizer" 1430 | "wxHelpEvent" 1431 | "wxHtmlEasyPrinting" 1432 | "wxHtmlLinkEvent" 1433 | "wxHtmlWindow" 1434 | "wxIcon" 1435 | "wxIconBundle" 1436 | "wxIconizeEvent" 1437 | "wxIdleEvent" 1438 | "wxImage" 1439 | "wxImageList" 1440 | "wxInitDialogEvent" 1441 | "wxJoystickEvent" 1442 | "wxKeyEvent" 1443 | "wxLayoutAlgorithm" 1444 | "wxListBox" 1445 | "wxListCtrl" 1446 | "wxListEvent" 1447 | "wxListItem" 1448 | "wxListItemAttr" 1449 | "wxListView" 1450 | "wxListbook" 1451 | "wxLocale" 1452 | "wxLogNull" 1453 | "wxMDIChildFrame" 1454 | "wxMDIClientWindow" 1455 | "wxMDIParentFrame" 1456 | "wxMask" 1457 | "wxMaximizeEvent" 1458 | "wxMemoryDC" 1459 | "wxMenu" 1460 | "wxMenuBar" 1461 | "wxMenuEvent" 1462 | "wxMenuItem" 1463 | "wxMessageDialog" 1464 | "wxMiniFrame" 1465 | "wxMirrorDC" 1466 | "wxMouseCaptureChangedEvent" 1467 | "wxMouseCaptureLostEvent" 1468 | "wxMouseEvent" 1469 | "wxMoveEvent" 1470 | "wxMultiChoiceDialog" 1471 | "wxNavigationKeyEvent" 1472 | "wxNotebook" 1473 | "wxNotificationMessage" 1474 | "wxNotifyEvent" 1475 | "wxOverlay" 1476 | "wxPageSetupDialog" 1477 | "wxPageSetupDialogData" 1478 | "wxPaintDC" 1479 | "wxPaintEvent" 1480 | "wxPalette" 1481 | "wxPaletteChangedEvent" 1482 | "wxPanel" 1483 | "wxPasswordEntryDialog" 1484 | "wxPen" 1485 | "wxPickerBase" 1486 | "wxPopupTransientWindow" 1487 | "wxPopupWindow" 1488 | "wxPostScriptDC" 1489 | "wxPreviewCanvas" 1490 | "wxPreviewControlBar" 1491 | "wxPreviewFrame" 1492 | "wxPrintData" 1493 | "wxPrintDialog" 1494 | "wxPrintDialogData" 1495 | "wxPrintPreview" 1496 | "wxPrinter" 1497 | "wxPrintout" 1498 | "wxProgressDialog" 1499 | "wxQueryNewPaletteEvent" 1500 | "wxRadioBox" 1501 | "wxRadioButton" 1502 | "wxRegion" 1503 | "wxSashEvent" 1504 | "wxSashLayoutWindow" 1505 | "wxSashWindow" 1506 | "wxScreenDC" 1507 | "wxScrollBar" 1508 | "wxScrollEvent" 1509 | "wxScrollWinEvent" 1510 | "wxScrolledWindow" 1511 | "wxSetCursorEvent" 1512 | "wxShowEvent" 1513 | "wxSingleChoiceDialog" 1514 | "wxSizeEvent" 1515 | "wxSizer" 1516 | "wxSizerFlags" 1517 | "wxSizerItem" 1518 | "wxSlider" 1519 | "wxSpinButton" 1520 | "wxSpinCtrl" 1521 | "wxSpinEvent" 1522 | "wxSplashScreen" 1523 | "wxSplitterEvent" 1524 | "wxSplitterWindow" 1525 | "wxStaticBitmap" 1526 | "wxStaticBox" 1527 | "wxStaticBoxSizer" 1528 | "wxStaticLine" 1529 | "wxStaticText" 1530 | "wxStatusBar" 1531 | "wxStdDialogButtonSizer" 1532 | "wxStyledTextCtrl" 1533 | "wxStyledTextEvent" 1534 | "wxSysColourChangedEvent" 1535 | "wxSystemOptions" 1536 | "wxSystemSettings" 1537 | "wxTaskBarIcon" 1538 | "wxTaskBarIconEvent" 1539 | "wxTextAttr" 1540 | "wxTextCtrl" 1541 | "wxTextDataObject" 1542 | "wxTextEntryDialog" 1543 | "wxToggleButton" 1544 | "wxToolBar" 1545 | "wxToolTip" 1546 | "wxToolbook" 1547 | "wxTopLevelWindow" 1548 | "wxTreeCtrl" 1549 | "wxTreeEvent" 1550 | "wxTreebook" 1551 | "wxUpdateUIEvent" 1552 | "wxWebView" 1553 | "wxWebViewEvent" 1554 | "wxWindow" 1555 | "wxWindowCreateEvent" 1556 | "wxWindowDC" 1557 | "wxWindowDestroyEvent" 1558 | "wxXmlResource" 1559 | "wx_misc" 1560 | "wx_object" 1561 | "wxe_master" 1562 | "wxe_server" 1563 | "wxe_util" 1564 | "xmerl" 1565 | "xmerl_b64Bin" 1566 | "xmerl_b64Bin_scan" 1567 | "xmerl_eventp" 1568 | "xmerl_html" 1569 | "xmerl_lib" 1570 | "xmerl_otpsgml" 1571 | "xmerl_regexp" 1572 | "xmerl_sax_old_dom" 1573 | "xmerl_sax_parser" 1574 | "xmerl_sax_parser_latin1" 1575 | "xmerl_sax_parser_list" 1576 | "xmerl_sax_parser_utf16be" 1577 | "xmerl_sax_parser_utf16le" 1578 | "xmerl_sax_parser_utf8" 1579 | "xmerl_sax_simple_dom" 1580 | "xmerl_scan" 1581 | "xmerl_sgml" 1582 | "xmerl_simple" 1583 | "xmerl_text" 1584 | "xmerl_ucs" 1585 | "xmerl_uri" 1586 | "xmerl_validate" 1587 | "xmerl_xlate" 1588 | "xmerl_xml" 1589 | "xmerl_xpath" 1590 | "xmerl_xpath_lib" 1591 | "xmerl_xpath_parse" 1592 | "xmerl_xpath_pred" 1593 | "xmerl_xpath_scan" 1594 | "xmerl_xs" 1595 | "xmerl_xsd" 1596 | "xmerl_xsd_type" 1597 | "xref" 1598 | "xref_base" 1599 | "xref_compiler" 1600 | "xref_parser" 1601 | "xref_reader" 1602 | "xref_scanner" 1603 | "xref_utils" 1604 | "yecc" 1605 | "yeccparser" 1606 | "yeccscan" 1607 | "zip" 1608 | "zlib" => (), 1609 _ => return Ok(()), 1610 } 1611 1612 Err(Error::GleamModuleWouldOverwriteStandardErlangModule { 1613 name: input.name.clone(), 1614 path: input.path.to_owned(), 1615 }) 1616} 1617#[derive(Debug, Default)] 1618pub struct StaleTracker(HashSet<EcoString>); 1619 1620impl StaleTracker { 1621 fn add(&mut self, name: EcoString) { 1622 _ = self.0.insert(name); 1623 } 1624 1625 fn includes_any(&self, names: &[(EcoString, SrcSpan)]) -> bool { 1626 names.iter().any(|n| self.0.contains(n.0.as_str())) 1627 } 1628 1629 pub fn empty(&mut self) { 1630 let _ = self.0.drain(); // Clears the set but retains allocated memory 1631 } 1632} 1633 1634#[derive(Debug)] 1635pub struct Inputs<'a> { 1636 collection: HashMap<EcoString, Input>, 1637 already_defined_modules: &'a im::HashMap<EcoString, Utf8PathBuf>, 1638} 1639 1640impl<'a> Inputs<'a> { 1641 fn new(already_defined_modules: &'a im::HashMap<EcoString, Utf8PathBuf>) -> Self { 1642 Self { 1643 collection: Default::default(), 1644 already_defined_modules, 1645 } 1646 } 1647 1648 /// Insert a module into the hashmap. If there is already a module with the 1649 /// same name then an error is returned. 1650 fn insert(&mut self, input: Input) -> Result<()> { 1651 let name = input.name().clone(); 1652 1653 if let Some(first) = self.already_defined_modules.get(&name) { 1654 return Err(Error::DuplicateModule { 1655 module: name.clone(), 1656 first: first.to_path_buf(), 1657 second: input.source_path().to_path_buf(), 1658 }); 1659 } 1660 1661 let second = input.source_path().to_path_buf(); 1662 if let Some(first) = self.collection.insert(name.clone(), input) { 1663 return Err(Error::DuplicateModule { 1664 module: name, 1665 first: first.source_path().to_path_buf(), 1666 second, 1667 }); 1668 } 1669 1670 Ok(()) 1671 } 1672}