From 2e2f1a41d4126afdf37d06ca702e945cab014a0a Mon Sep 17 00:00:00 2001 From: Soham Chowdhury Date: Tue, 29 Nov 2022 18:03:38 +0100 Subject: [PATCH 1/2] Add .direnv and .envrc to gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 32ba67466..162318279 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *.swp *.swo __pycache__ +/.direnv +/.envrc From ecf7ccc179c9729bcc464d5cba2a166ff405263c Mon Sep 17 00:00:00 2001 From: Soham Chowdhury Date: Tue, 29 Nov 2022 18:00:08 +0100 Subject: [PATCH 2/2] Replace most of set.bzl by Skylib's sets.bzl --- haskell/c2hs.bzl | 3 +- haskell/cabal.bzl | 11 +- haskell/doctest.bzl | 3 +- haskell/experimental/private/module.bzl | 3 +- haskell/haddock.bzl | 1 + haskell/private/actions/compile.bzl | 7 +- haskell/private/actions/process_hsc_file.bzl | 3 +- haskell/private/actions/runghc.bzl | 3 +- haskell/private/dependencies.bzl | 5 +- haskell/private/haskell_impl.bzl | 29 ++-- haskell/private/list.bzl | 7 +- haskell/private/path_utils.bzl | 2 +- haskell/private/set.bzl | 157 ++----------------- haskell/private/version_macros.bzl | 3 +- haskell/repl.bzl | 1 + 15 files changed, 62 insertions(+), 176 deletions(-) diff --git a/haskell/c2hs.bzl b/haskell/c2hs.bzl index cdaa1d74d..6666961f9 100644 --- a/haskell/c2hs.bzl +++ b/haskell/c2hs.bzl @@ -18,6 +18,7 @@ load( "target_unique_name", ) load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") load(":private/version_macros.bzl", "version_macro_includes") def _c2hs_library_impl(ctx): @@ -62,7 +63,7 @@ def _c2hs_library_impl(ctx): ] args.add_all(chi_includes) - version_macro_headers = set.empty() + version_macro_headers = sets.make() if ctx.attr.version: dep_info = gather_dep_info(ctx.attr.name, ctx.attr.deps) (version_macro_headers, version_macro_flags) = version_macro_includes(dep_info) diff --git a/haskell/cabal.bzl b/haskell/cabal.bzl index 11c1c83aa..60c3cceae 100644 --- a/haskell/cabal.bzl +++ b/haskell/cabal.bzl @@ -21,6 +21,7 @@ load( "truly_relativize", ) load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") load(":private/validate_attrs.bzl", "typecheck_stackage_extradeps") load(":haddock.bzl", "generate_unified_haddock_info") load( @@ -582,11 +583,11 @@ def _haskell_cabal_library_impl(ctx): hs_info = HaskellInfo( package_databases = depset([package_database], transitive = [dep_info.package_databases]), empty_lib_package_databases = dep_info.empty_lib_package_databases, - version_macros = set.empty(), + version_macros = sets.make(), source_files = depset(), boot_files = depset(), extra_source_files = depset(), - import_dirs = set.empty(), + import_dirs = sets.make(), hs_libraries = depset( direct = [lib for lib in [vanilla_library, dynamic_library, profiling_library] if lib], transitive = [dep_info.hs_libraries], @@ -881,11 +882,11 @@ def _haskell_cabal_binary_impl(ctx): hs_info = HaskellInfo( package_databases = dep_info.package_databases, empty_lib_package_databases = dep_info.empty_lib_package_databases, - version_macros = set.empty(), + version_macros = sets.make(), source_files = depset(), boot_files = depset(), extra_source_files = depset(), - import_dirs = set.empty(), + import_dirs = sets.make(), hs_libraries = dep_info.hs_libraries, deps_hs_libraries = dep_info.deps_hs_libraries, empty_hs_libraries = dep_info.empty_hs_libraries, @@ -1933,7 +1934,7 @@ def _stack_snapshot_impl(repository_ctx): else: visibility = sorted( # use set to de-duplicate - set.to_list(set.from_list([ + sets.to_list(sets.make([ str(vendored_packages[rdep].relative(":__pkg__")) for rdep in reverse_deps[name] if rdep in vendored_packages diff --git a/haskell/doctest.bzl b/haskell/doctest.bzl index f7a2200a3..8b03cd600 100644 --- a/haskell/doctest.bzl +++ b/haskell/doctest.bzl @@ -4,6 +4,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load(":cc.bzl", "cc_interop_info", "ghc_cc_program_args") load(":private/context.bzl", "haskell_context", "render_env") load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") load( "@rules_haskell//haskell:providers.bzl", "HaskellCcLibrariesInfo", @@ -121,7 +122,7 @@ def _haskell_doctest_single(target, ctx): if ctx.attr.modules: inputs = ctx.attr.modules - args.add_all(set.to_list(hs_info.import_dirs), format_each = "-i%s") + args.add_all(sets.to_list(hs_info.import_dirs), format_each = "-i%s") else: inputs = [source.path for source in hs_info.source_files.to_list()] diff --git a/haskell/experimental/private/module.bzl b/haskell/experimental/private/module.bzl index 8e49e8c7b..4b2c482b5 100644 --- a/haskell/experimental/private/module.bzl +++ b/haskell/experimental/private/module.bzl @@ -1,4 +1,5 @@ load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_skylib//lib:sets.bzl", "sets") load("//haskell:private/path_utils.bzl", "infer_main_module") load( "//haskell:private/dependencies.bzl", @@ -840,7 +841,7 @@ def build_haskell_modules( repl_info = struct( source_files = depset(source_files), boot_files = depset(boot_files), - import_dirs = set.from_list(import_dirs), + import_dirs = sets.make(import_dirs), user_compile_flags = user_compile_flags, ), ) diff --git a/haskell/haddock.bzl b/haskell/haddock.bzl index cec977925..b9d572ae2 100644 --- a/haskell/haddock.bzl +++ b/haskell/haddock.bzl @@ -17,6 +17,7 @@ load( ) load(":private/context.bzl", "haskell_context", "render_env") load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def generate_unified_haddock_info(this_package_id, this_package_haddock, this_package_html, deps): """Collapse dependencies into a single `HaddockInfo`. diff --git a/haskell/private/actions/compile.bzl b/haskell/private/actions/compile.bzl index d3fc93f40..320f777bd 100644 --- a/haskell/private/actions/compile.bzl +++ b/haskell/private/actions/compile.bzl @@ -25,6 +25,7 @@ load( "link_libraries", ) load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") load("//haskell/experimental:providers.bzl", "HaskellModuleInfo") load( ":private/actions/process_hsc_file.bzl", @@ -161,7 +162,7 @@ def _compilation_defaults( # the two must both have the same root; i.e., both plain files, # both in bin_dir, or both in genfiles_dir. - import_dirs = set.from_list([ + import_dirs = sets.make([ hs.src_root, paths.join(hs.bin_dir.path, hs.src_root), paths.join(hs.genfiles_dir.path, hs.src_root), @@ -176,7 +177,7 @@ def _compilation_defaults( elif s.extension == "hsc": s0, idir = process_hsc_file(hs, cc, hsc_flags, hsc_inputs, s) source_files.append(s0) - set.mutable_insert(import_dirs, idir) + sets.insert(import_dirs, idir) elif s.extension in ["hs-boot", "lhs-boot"]: boot_files.append(s) else: @@ -184,7 +185,7 @@ def _compilation_defaults( if s in import_dir_map: idir = import_dir_map[s] - set.mutable_insert(import_dirs, idir) + sets.insert(import_dirs, idir) # Write the -optP flags to a parameter file because they can be very long on Windows # e.g. 27Kb for grpc-haskell diff --git a/haskell/private/actions/process_hsc_file.bzl b/haskell/private/actions/process_hsc_file.bzl index cde44136c..b156e01a2 100644 --- a/haskell/private/actions/process_hsc_file.bzl +++ b/haskell/private/actions/process_hsc_file.bzl @@ -4,6 +4,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load(":private/version_macros.bzl", "version_macro_includes") load(":private/path_utils.bzl", "declare_compiled") load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def process_hsc_file(hs, cc, hsc_flags, hsc_inputs, hsc_file): """Process a single hsc file. @@ -108,6 +109,6 @@ def preprocess_hsc_flags_and_inputs(dep_info, user_compile_flags, version): if version: (version_macro_headers, version_macro_flags) = version_macro_includes(dep_info) hsc_flags += ["--cflag=" + x for x in version_macro_flags] - hsc_inputs += set.to_list(version_macro_headers) + hsc_inputs += sets.to_list(version_macro_headers) return hsc_flags, hsc_inputs diff --git a/haskell/private/actions/runghc.bzl b/haskell/private/actions/runghc.bzl index f3c7d20d9..2346f5fd8 100644 --- a/haskell/private/actions/runghc.bzl +++ b/haskell/private/actions/runghc.bzl @@ -17,6 +17,7 @@ load( "link_libraries", ) load("@bazel_skylib//lib:shell.bzl", "shell") +load("@bazel_skylib//lib:sets.bzl", "sets") def build_haskell_runghc( hs, @@ -56,7 +57,7 @@ def build_haskell_runghc( ) if lib_info != None: - for idir in set.to_list(hs_info.import_dirs): + for idir in sets.to_list(hs_info.import_dirs): args += ["-i{0}".format(idir)] link_libraries( diff --git a/haskell/private/dependencies.bzl b/haskell/private/dependencies.bzl index 25d13667c..c8165a608 100644 --- a/haskell/private/dependencies.bzl +++ b/haskell/private/dependencies.bzl @@ -4,6 +4,7 @@ load( "HaskellLibraryInfo", ) load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def gather_dep_info(name, deps): """Collapse dependencies into a single `HaskellInfo`. @@ -64,7 +65,7 @@ def gather_dep_info(name, deps): if HaskellInfo in dep ]) - import_dirs = set.empty() + import_dirs = sets.make() for dep in deps: if HaskellInfo in dep: import_dirs = set.mutable_union(import_dirs, dep[HaskellInfo].import_dirs) @@ -83,7 +84,7 @@ def gather_dep_info(name, deps): acc = HaskellInfo( package_databases = package_databases, empty_lib_package_databases = empty_lib_package_databases, - version_macros = set.empty(), + version_macros = sets.make(), hs_libraries = hs_libraries, deps_hs_libraries = deps_hs_libraries, empty_hs_libraries = empty_hs_libraries, diff --git a/haskell/private/haskell_impl.bzl b/haskell/private/haskell_impl.bzl index e7f881571..b01f68723 100644 --- a/haskell/private/haskell_impl.bzl +++ b/haskell/private/haskell_impl.bzl @@ -45,6 +45,7 @@ load( ) load(":private/pkg_id.bzl", "pkg_id") load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") load(":private/list.bzl", "list") load(":private/version_macros.bzl", "generate_version_macros") load(":providers.bzl", "GhcPluginInfo", "HaskellCoverageInfo") @@ -285,7 +286,7 @@ def _haskell_binary_common_impl(ctx, is_test): hs_info = HaskellInfo( package_databases = all_deps_info.package_databases, - version_macros = set.empty(), + version_macros = sets.make(), source_files = depset(transitive = [c.source_files, module_outputs.repl_info.source_files]), boot_files = depset(transitive = [c.boot_files, module_outputs.repl_info.boot_files]), extra_source_files = c.extra_source_files, @@ -531,13 +532,13 @@ def haskell_library_impl(ctx): # Validate that hidden modules appear as modules in src list or modules list, depending which appears: declared_modules = haskell_module_names if modules else module_map.keys() - hidden_minus_declared_modules = set.difference(set.from_list(ctx.attr.hidden_modules), set.from_list(declared_modules)) - if not hidden_minus_declared_modules == set.empty(): - fail("""Hidden modules must be a subset of all modules, found additional hidden modules {}""".format(set.to_list(hidden_minus_declared_modules))) + hidden_minus_declared_modules = sets.difference(sets.make(ctx.attr.hidden_modules), sets.make(declared_modules)) + if not hidden_minus_declared_modules == sets.make(): + fail("""Hidden modules must be a subset of all modules, found additional hidden modules {}""".format(sets.to_list(hidden_minus_declared_modules))) - exposed_modules = set.from_list(module_map.keys() + exposed_modules_reexports + haskell_module_names) - set.mutable_difference(exposed_modules, set.from_list(other_modules)) - exposed_modules = set.to_list(exposed_modules) + exposed_modules = sets.make(module_map.keys() + exposed_modules_reexports + haskell_module_names) + exposed_modules = set.mutable_difference(exposed_modules, sets.make(other_modules)) + exposed_modules = sets.to_list(exposed_modules) if non_empty: static_library = link_library_static( @@ -598,14 +599,14 @@ def haskell_library_impl(ctx): transitive = [all_deps_info.interface_dirs, module_outputs.his, module_outputs.dyn_his], ) - version_macros = set.empty() + version_macros = sets.make() if version: package_name = hs.name if hasattr(ctx.attr, "package_name") and ctx.attr.package_name: package_name = ctx.attr.package_name - version_macros = set.singleton( + version_macros = sets.make([ generate_version_macros(ctx, package_name, version), - ) + ]) empty_libs = _create_empty_library(hs, cc, posix, my_pkg_id, with_shared, with_profiling, empty_libs_dir) @@ -986,11 +987,11 @@ def haskell_import_impl(ctx): file for file in ctx.files.static_libraries + ctx.files.shared_libraries ] - version_macros = set.empty() + version_macros = sets.make() if ctx.attr.version != None: - version_macros = set.singleton( + version_macros = sets.make([ generate_version_macros(ctx, ctx.label.name, ctx.attr.version), - ) + ]) hs_info = HaskellInfo( # XXX Empty set of conf and cache files only works for global db. package_databases = depset(), @@ -999,7 +1000,7 @@ def haskell_import_impl(ctx): source_files = depset(), boot_files = depset(), extra_source_files = depset(), - import_dirs = set.empty(), + import_dirs = sets.make(), hs_libraries = depset(), deps_hs_libraries = depset(), empty_hs_libraries = depset(), diff --git a/haskell/private/list.bzl b/haskell/private/list.bzl index f1839d51c..dd3dce41d 100644 --- a/haskell/private/list.bzl +++ b/haskell/private/list.bzl @@ -1,6 +1,7 @@ """Helper functions on lists.""" load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def _dedup_on(f, list_): """deduplicate `list_` by comparing the result of applying @@ -12,12 +13,12 @@ def _dedup_on(f, list_): dedup_on(compare_x, [struct(x=3), struct(x=4), struct(x=3)]) => [struct(x=3), struct(x=4)] """ - seen = set.empty() + seen = sets.make() deduped = [] for el in list_: by = f(el) - if not set.is_member(seen, by): - set.mutable_insert(seen, by) + if not sets.contains(seen, by): + sets.insert(seen, by) deduped.append(el) return deduped diff --git a/haskell/private/path_utils.bzl b/haskell/private/path_utils.bzl index 497a27300..008d5f06c 100644 --- a/haskell/private/path_utils.bzl +++ b/haskell/private/path_utils.bzl @@ -1,7 +1,7 @@ """Utilities for module and path manipulations.""" load("@bazel_skylib//lib:paths.bzl", "paths") -load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def is_haskell_extension(extension): """Whether the given extension defines a Haskell source file.""" diff --git a/haskell/private/set.bzl b/haskell/private/set.bzl index 75430b157..835653f2e 100644 --- a/haskell/private/set.bzl +++ b/haskell/private/set.bzl @@ -1,83 +1,14 @@ """Immutable sets that support efficient merging, traversal, and membership -check. +check. """ -def _empty(): - """Create an empty set. - - Returns: - set, new empty set. - """ - return struct(_set_items = dict()) - -def _singleton(e): - """Create a set with single element `e` inside. - - Args: - e: The element to put in the set. - - Returns: - set, new set. - """ - r = dict() - r[e] = None - return struct(_set_items = r) - -def _is_member(s, e): - """Return true if `e` is in the set `s`. - - Args: - s: The set to inspect. - e: The element to search for. - - Result: - Bool, true if `e` is in `s`, false otherwise. - """ - return e in s._set_items - -def _insert(s, e): - """Insert an element into the set. - - Args: - s: Set to insert new element into. - e: The element to insert. - - Result: - A copy of set `s` with `s` element added. - """ - r = dict(s._set_items) - r[e] = None - return struct(_set_items = r) - -def _mutable_insert(s, e): - """The same as `set.insert`, but modifies the first argument in place. - - Args: - s: Set to insert new element into. - e: The element to insert. - - Result: - set `s` with `s` element added. - """ - s._set_items[e] = None - return s - -def _union(s0, s1): - """Return union of two sets. - - Args: - s0: One set. - s1: Another set. - - Result: - set, union of the two sets. - """ - r = dict(s0._set_items) - r.update(s1._set_items) - return struct(_set_items = r) +load("@bazel_skylib//lib:sets.bzl", "sets") def _mutable_union(s0, s1): """Modify set `s0` adding elements from `s1` to it. + This is soon to be upstreamed to Skylib and removed from this file. See + and + for more information. Args: s0: One set. @@ -86,27 +17,15 @@ def _mutable_union(s0, s1): Result: set, union of the two sets. """ - s0._set_items.update(s1._set_items) - return s0 -def _difference(s0, s1): - """Return the set of elements from s0 not appearing in s1. - - Args: - s0: One set. - s1: Another set. - - Result: - set, difference of the two sets. - """ - s2 = _empty() - for item in s0._set_items.keys(): - if not _is_member(s1, item): - _mutable_insert(s2, item) - return s2 + s0._values.update(s1._values) + return s0 def _mutable_difference(s0, s1): """Modify set `s0` removing elements from `s1` from it. + This is soon to be upstreamed to Skylib and removed from this file. See + and + for more information. Args: s0: One set. @@ -115,68 +34,22 @@ def _mutable_difference(s0, s1): Result: set, difference of the two sets. """ - for item in s1._set_items.keys(): - s0._set_items.pop(item) - return s0 - -def _map(s, f): - """Map elements of given set using a function. - - Args: - s: Original set. - f: Function to apply to elements of the set. - - Result: - set with elements obtained by application of function `f` to the - elements of `s`. - """ - return struct(_set_items = {f(x): None for x in s._set_items.keys()}) - -def _from_list(l): - """Create a set containing elements from given list. - - Args: - l: List, source of the elements for the new set. - - Result: - set containing elements from given list. - """ - return (struct(_set_items = {x: None for x in l})) - -def _to_list(s): - """Convert set into a list of its elements. - Args: - s: Set to convert. - - Returns: - List of elements of the set. - """ - return s._set_items.keys() + for item in s1._values.keys(): + s0._values.pop(item) + return s0 def _to_depset(s): - """Similar to `set.to_list`, but produces a depset. - + """Similar to `sets.to_list`, but produces a depset. Args: s: Set to convert. - Returns: Depset of elements from the set. """ - return depset(_to_list(s)) + return depset(sets.to_list(s)) set = struct( - empty = _empty, - singleton = _singleton, - is_member = _is_member, - insert = _insert, - mutable_insert = _mutable_insert, - union = _union, mutable_union = _mutable_union, - difference = _difference, mutable_difference = _mutable_difference, - map = _map, - from_list = _from_list, - to_list = _to_list, to_depset = _to_depset, ) diff --git a/haskell/private/version_macros.bzl b/haskell/private/version_macros.bzl index 79b4540cd..804894c25 100644 --- a/haskell/private/version_macros.bzl +++ b/haskell/private/version_macros.bzl @@ -1,4 +1,5 @@ load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") def generate_version_macros(ctx, pkg_name, version): """Generate a version macros header file. @@ -41,7 +42,7 @@ def version_macro_includes(hs_info): files = hs_info.version_macros flags = [ f - for include in set.to_list(files) + for include in sets.to_list(files) for f in ["-include", include.path] ] return (files, flags) diff --git a/haskell/repl.bzl b/haskell/repl.bzl index 7a9023e3a..c28b5f020 100644 --- a/haskell/repl.bzl +++ b/haskell/repl.bzl @@ -34,6 +34,7 @@ load( ) load(":private/java.bzl", "java_interop_info") load(":private/set.bzl", "set") +load("@bazel_skylib//lib:sets.bzl", "sets") HaskellReplLoadInfo = provider( doc = """Haskell REPL target information.