Fork of daniellemaywood.uk/gleam — Wasm codegen work
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}