diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 2edc4d9..d439273 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -1559,7 +1559,7 @@ const baseName = PackageName(packageParts.name).main; // Found locally - if (dub.packageManager.getBestPackage(baseName, packageParts.range)) + if (dub.packageManager.getBestPackage(baseName.toString(), packageParts.range)) return 0; // Non-interactive, either via flag, or because a version was provided @@ -1569,8 +1569,8 @@ } // Otherwise we go the long way of asking the user. // search for the package and filter versions for exact matches - auto search = dub.searchPackages(baseName) - .map!(tup => tup[1].find!(p => p.name == baseName)) + auto search = dub.searchPackages(baseName.toString()) + .map!(tup => tup[1].find!(p => p.name == baseName.toString())) .filter!(ps => !ps.empty); if (search.empty) { logWarn("Package '%s' was neither found locally nor online.", packageParts); @@ -3133,7 +3133,7 @@ } else dep = Dependency(parts.range); - recipe.buildSettings.dependencies[depname] = dep; + recipe.buildSettings.dependencies[depname.toString()] = dep; logInfo("Adding dependency %s %s", depname, dep.toString()); return true; } diff --git a/source/dub/dependency.d b/source/dub/dependency.d index 9809f29..39435e3 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -26,9 +26,6 @@ /// Where the separator lies, if any private size_t separator; - /// For compatibility in `PackageDependency` - alias toString this; - /// Creates a new instance of this struct public this(string fn) @safe pure { diff --git a/source/dub/dub.d b/source/dub/dub.d index 951d5db..d91fb46 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -639,7 +639,7 @@ try if (m_packageManager.getOrLoadPackage(path)) continue; catch (Exception e) { logDebug("Failed to load path based selection: %s", e.toString().sanitize); } } else if (!dep.repository.empty) { - if (m_packageManager.loadSCMPackage(name, dep.repository)) + if (m_packageManager.loadSCMPackage(name.toString(), dep.repository)) continue; } else { if (m_packageManager.getPackage(p, dep.version_)) continue; @@ -666,13 +666,13 @@ if (options & UpgradeOptions.dryRun) { bool any = false; - string rootbasename = PackageName(m_project.rootPackage.name).main; + string rootbasename = PackageName(m_project.rootPackage.name).main.toString(); foreach (p, ver; versions) { if (!ver.path.empty || !ver.repository.empty) continue; auto basename = PackageName(p).main; - if (basename == rootbasename) continue; + if (basename.toString() == rootbasename) continue; if (!m_project.selections.hasSelectedVersion(basename)) { logInfo("Upgrade", Color.cyan, @@ -685,7 +685,7 @@ if (ver.version_ <= sver.version_) continue; logInfo("Upgrade", Color.cyan, "%s would be upgraded from %s to %s.", - basename.color(Mode.bold), sver, ver); + basename.toString().color(Mode.bold), sver, ver); any = true; } if (any) logInfo("Use \"%s\" to perform those changes", "dub upgrade".color(Mode.bold)); @@ -703,7 +703,7 @@ continue; } } else if (!ver.repository.empty) { - pack = m_packageManager.loadSCMPackage(name, ver.repository); + pack = m_packageManager.loadSCMPackage(name.toString(), ver.repository); } else { assert(ver.isExactVersion, "Resolved dependency is neither path, nor repository, nor exact version based!?"); pack = m_packageManager.getPackage(p, ver.version_); @@ -797,7 +797,7 @@ auto tool = PackageName("dscanner"); - auto tool_pack = m_packageManager.getBestPackage(tool); + auto tool_pack = m_packageManager.getBestPackage(tool.toString()); if (!tool_pack) { logInfo("Hint", Color.light_blue, "%s is not present, getting and storing it locally", tool); tool_pack = this.fetch(tool); @@ -904,7 +904,7 @@ Package fetch(string name, in Version vers, PlacementLocation location, FetchOptions options, string reason = "") { const n = PackageName(name); - return this.fetch(n, VersionRange(vers, vers), location, options, reason); + return this.fetch(n, VersionRange(vers, vers), options, location, reason); } deprecated("Use `fetch(PackageName, VersionRange, [FetchOptions, PlacementLocation, string])`") @@ -973,7 +973,7 @@ PackageSupplier supplier; foreach(ps; m_packageSuppliers){ try { - pinfo = ps.fetchPackageRecipe(basePackageName, range, (options & FetchOptions.usePrerelease) != 0); + pinfo = ps.fetchPackageRecipe(name.main, range, (options & FetchOptions.usePrerelease) != 0); if (pinfo.type == Json.Type.null_) continue; supplier = ps; @@ -989,7 +989,7 @@ Version ver = Version(pinfo["version"].get!string); // always upgrade branch based versions - TODO: actually check if there is a new commit available - Package existing = m_packageManager.getPackage(name, ver, location); + Package existing = m_packageManager.getPackage(name.toString(), ver, location); if (options & FetchOptions.printOnly) { if (existing && existing.version_ != ver) logInfo("A new version for %s is available (%s -> %s). Run \"%s\" to switch.", @@ -1023,13 +1023,13 @@ { import std.zip : ZipException; - auto path = getTempFile(basePackageName, ".zip"); - supplier.fetchPackage(path, basePackageName, range, (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? + auto path = getTempFile(basePackageName.toString(), ".zip"); + supplier.fetchPackage(path, name.main, range, (options & FetchOptions.usePrerelease) != 0); // Q: continue on fail? scope(exit) removeFile(path); logDiagnostic("Placing to %s...", location.toString()); try { - return m_packageManager.store(path, location, basePackageName, ver); + return m_packageManager.store(path, location, name.main.toString(), ver); } catch (ZipException e) { logInfo("Failed to extract zip archive for %s@%s...", name, ver); // re-throw the exception at the end of the loop @@ -1471,7 +1471,7 @@ ? PackageName("ddox") : PackageName(m_project.rootPackage.recipe.ddoxTool); - auto tool_pack = m_packageManager.getBestPackage(tool); + auto tool_pack = m_packageManager.getBestPackage(tool.toString()); if (!tool_pack) { logInfo("%s is not present, getting and storing it user wide", tool); tool_pack = this.fetch(tool); @@ -1847,18 +1847,18 @@ auto basepack = pack.basePackage; foreach (d; pack.getAllDependenciesRange()) { - auto dbasename = PackageName(d.name).main; + auto dbasename = d.name.main.toString(); // detect dependencies to the root package (or sub packages thereof) if (dbasename == basepack.name) { auto absdeppath = d.spec.mapToPath(pack.path).path; absdeppath.endsWithSlash = true; - auto subpack = m_dub.m_packageManager.getSubPackage(basepack, PackageName(d.name).sub, true); + auto subpack = m_dub.m_packageManager.getSubPackage(basepack, d.name.sub, true); if (subpack) { auto desireddeppath = basepack.path; desireddeppath.endsWithSlash = true; - auto altdeppath = d.name == dbasename ? basepack.path : subpack.path; + auto altdeppath = d.name == d.name.main ? basepack.path : subpack.path; altdeppath.endsWithSlash = true; if (!d.spec.path.empty && absdeppath != desireddeppath) @@ -1869,7 +1869,7 @@ format("Dependency from %s to %s uses wrong path: %s vs. %s", node.pack, subpack.name, absdeppath.toNativeString(), desireddeppath.toNativeString())); } - ret ~= TreeNodes(d.name, node.config); + ret ~= TreeNodes(d.name.toString(), node.config); continue; } @@ -1882,18 +1882,18 @@ Dependency dspec = d.spec.mapToPath(pack.path); // if not upgrading, use the selected version - if (!(m_options & UpgradeOptions.upgrade) && m_selectedVersions.hasSelectedVersion(dbasename)) - dspec = m_selectedVersions.getSelectedVersion(dbasename); + if (!(m_options & UpgradeOptions.upgrade) && m_selectedVersions.hasSelectedVersion(d.name.main)) + dspec = m_selectedVersions.getSelectedVersion(d.name.main); // keep selected optional dependencies and avoid non-selected optional-default dependencies by default if (!m_selectedVersions.bare) { - if (dt == DependencyType.optionalDefault && !m_selectedVersions.hasSelectedVersion(dbasename)) + if (dt == DependencyType.optionalDefault && !m_selectedVersions.hasSelectedVersion(d.name.main)) dt = DependencyType.optional; - else if (dt == DependencyType.optional && m_selectedVersions.hasSelectedVersion(dbasename)) + else if (dt == DependencyType.optional && m_selectedVersions.hasSelectedVersion(d.name.main)) dt = DependencyType.optionalDefault; } - ret ~= TreeNodes(d.name, dspec, dt); + ret ~= TreeNodes(d.name.toString(), dspec, dt); } return ret.data; } @@ -1930,11 +1930,11 @@ } // shortcut if the referenced package is the root package - if (name.main == m_rootPackage.basePackage.name) + if (name.main.toString() == m_rootPackage.basePackage.name) return m_rootPackage.basePackage; if (!dep.repository.empty) { - auto ret = m_dub.packageManager.loadSCMPackage(name, dep.repository); + auto ret = m_dub.packageManager.loadSCMPackage(name.toString(), dep.repository); return ret !is null && dep.matches(ret.version_) ? ret : null; } if (!dep.path.empty) { @@ -1948,10 +1948,10 @@ } const vers = dep.version_; - if (auto ret = m_dub.m_packageManager.getBestPackage(name, vers)) + if (auto ret = m_dub.m_packageManager.getBestPackage(name.toString(), vers)) return ret; - auto key = name ~ ":" ~ vers.toString(); + auto key = name.toString() ~ ":" ~ vers.toString(); if (auto ret = key in m_remotePackages) return *ret; @@ -1978,7 +1978,7 @@ FetchOptions fetchOpts; fetchOpts |= prerelease ? FetchOptions.usePrerelease : FetchOptions.none; m_dub.fetch(name.main, vers, fetchOpts, m_dub.defaultPlacementLocation, "need sub package description"); - auto ret = m_dub.m_packageManager.getBestPackage(name, vers); + auto ret = m_dub.m_packageManager.getBestPackage(name.toString(), vers); if (!ret) { logWarn("Package %s %s doesn't have a sub package %s", name.main, dep, name); return null; diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index 75914f3..7bc51c4 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -432,7 +432,7 @@ string gitReference = repo.ref_.chompPrefix("~"); NativePath destination = this.getPackagePath(PlacementLocation.user, name, repo.ref_); - foreach (p; getPackageIterator(name)) { + foreach (p; getPackageIterator(name.toString())) { if (p.path == destination) { return p; } @@ -1474,7 +1474,8 @@ */ NativePath getPackagePath (in PackageName name, string vers) { - NativePath result = this.packagePath ~ name.main ~ vers ~ name.main; + NativePath result = this.packagePath ~ name.main.toString() ~ vers ~ + name.main.toString(); result.endsWithSlash = true; return result; } diff --git a/source/dub/packagesuppliers/filesystem.d b/source/dub/packagesuppliers/filesystem.d index 299b064..ac7a99e 100644 --- a/source/dub/packagesuppliers/filesystem.d +++ b/source/dub/packagesuppliers/filesystem.d @@ -31,7 +31,7 @@ const zipFileGlob = name.main.toString() ~ "*.zip"; foreach (DirEntry d; dirEntries(m_path.toNativeString(), zipFileGlob, SpanMode.shallow)) { NativePath p = NativePath(d.name); - auto vers = p.head.name[name.main.length+1..$-4]; + auto vers = p.head.name[name.main.toString().length+1..$-4]; if (!isValidVersion(vers)) { logDebug("Ignoring entry '%s' because it isn't a version of package '%s'", p, name.main); continue; diff --git a/source/dub/packagesuppliers/maven.d b/source/dub/packagesuppliers/maven.d index cc4d154..18b8bba 100644 --- a/source/dub/packagesuppliers/maven.d +++ b/source/dub/packagesuppliers/maven.d @@ -106,12 +106,18 @@ else throw e; } - auto json = Json(["name": Json(name.main), "versions": Json.emptyArray]); + auto json = Json([ + "name": Json(name.main.toString()), + "versions": Json.emptyArray + ]); auto xml = new DocumentParser(xmlData); xml.onStartTag["versions"] = (ElementParser xml) { xml.onEndTag["version"] = (in Element e) { - json["versions"] ~= serializeToJson(["name": name.main, "version": e.text]); + json["versions"] ~= serializeToJson([ + "name": name.main.toString(), + "version": e.text, + ]); }; xml.parse(); }; diff --git a/source/dub/packagesuppliers/registry.d b/source/dub/packagesuppliers/registry.d index 174c9fc..15e8a03 100644 --- a/source/dub/packagesuppliers/registry.d +++ b/source/dub/packagesuppliers/registry.d @@ -60,7 +60,8 @@ if (best.type != Json.Type.null_) { auto vers = best["version"].get!string; - ret = m_registryUrl ~ NativePath(PackagesPath~"/"~name.main~"/"~vers~".zip"); + ret = m_registryUrl ~ NativePath( + "%s/%s/%s.zip".format(PackagesPath, name.main, vers)); } return ret; } @@ -106,7 +107,8 @@ auto url = m_registryUrl ~ NativePath("api/packages/infos"); url.queryString = "packages=" ~ - encodeComponent(`["` ~ name.main ~ `"]`) ~ "&include_dependencies=true&minimize=true"; + encodeComponent(`["` ~ name.main.toString() ~ `"]`) ~ + "&include_dependencies=true&minimize=true"; logDebug("Downloading metadata for %s", name.main); string jsonData; @@ -119,7 +121,7 @@ logDebug("adding %s to metadata cache", pkg); m_metadataCache[PackageName(pkg)] = CacheEntry(info, now); } - return json[name.main]; + return json[name.main.toString()]; } SearchResult[] searchPackages(string query) { diff --git a/source/dub/project.d b/source/dub/project.d index a7768f7..fe42ecf 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -196,10 +196,10 @@ auto depmap = p.getDependencies(cfg); deps = depmap.byKey.map!(k => PackageDependency(k, depmap[k])).array; } - deps.sort!((a, b) => a.name < b.name); + deps.sort!((a, b) => a.name.toString() < b.name.toString()); foreach (d; deps) { - auto dependency = getDependency(d.name, true); + auto dependency = getDependency(d.name.toString(), true); assert(dependency || d.spec.optional, format("Non-optional dependency '%s' of '%s' not found in dependency tree!?.", d.name, p.name)); if(dependency) perform_rec(dependency); @@ -433,7 +433,8 @@ ? format(`dependency "%s" repository="git+" version=""`, d.name) : format(`"%s": {"repository": "git+", "version": ""}`, d.name); logWarn("Dependency '%s' depends on git branch '%s', which is deprecated.", - d.name.color(Mode.bold), d.spec.version_.toString.color(Mode.bold)); + d.name.toString().color(Mode.bold), + d.spec.version_.toString.color(Mode.bold)); logWarnTag("", "Specify the git repository and commit hash in your %s:", (isSDL ? "dub.sdl" : "dub.json").color(Mode.bold)); logWarnTag("", "%s", suggestion.color(Mode.bold)); @@ -446,25 +447,25 @@ ~ "and will have no effect.", pack.color(Mode.bold), config.color(Color.blue)); } - void checkSubConfig(string pack, string config) { - auto p = getDependency(pack, true); + void checkSubConfig(in PackageName name, string config) { + auto p = getDependency(name.toString(), true); if (p && !p.configurations.canFind(config)) { logWarn("The sub configuration directive \"%s\" -> [%s] " ~ "references a configuration that does not exist.", - pack.color(Mode.bold), config.color(Color.red)); + name.toString().color(Mode.bold), config.color(Color.red)); } } auto globalbs = m_rootPackage.getBuildSettings(); foreach (p, c; globalbs.subConfigurations) { if (p !in globalbs.dependencies) warnSubConfig(p, c); - else checkSubConfig(p, c); + else checkSubConfig(PackageName(p), c); } foreach (c; m_rootPackage.configurations) { auto bs = m_rootPackage.getBuildSettings(c); foreach (p, subConf; bs.subConfigurations) { if (p !in bs.dependencies && p !in globalbs.dependencies) warnSubConfig(p, subConf); - else checkSubConfig(p, subConf); + else checkSubConfig(PackageName(p), subConf); } } @@ -483,14 +484,18 @@ if (m_selections.hasSelectedVersion(basename)) { auto selver = m_selections.getSelectedVersion(basename); if (d.spec.merge(selver) == Dependency.invalid) { - logWarn(`Selected package %s %s does not match the dependency specification %s in package %s. Need to "%s"?`, - basename.color(Mode.bold), selver, vers, pack.name.color(Mode.bold), "dub upgrade".color(Mode.bold)); + logWarn(`Selected package %s@%s does not match ` ~ + `the dependency specification %s in ` ~ + `package %s. Need to "%s"?`, + basename.toString().color(Mode.bold), selver, + vers, pack.name.color(Mode.bold), + "dub upgrade".color(Mode.bold)); } } }, ); - auto deppack = getDependency(d.name, true); + auto deppack = getDependency(d.name.toString(), true); if (deppack in visited) continue; visited[deppack] = true; if (deppack) validateDependenciesRec(deppack); @@ -537,15 +542,15 @@ // need to be satisfied bool is_desired = !vspec.optional || m_selections.hasSelectedVersion(basename) || (vspec.default_ && m_selections.bare); - if (dep.name == m_rootPackage.basePackage.name) { + if (dep.name.toString() == m_rootPackage.basePackage.name) { vspec = Dependency(m_rootPackage.version_); p = m_rootPackage.basePackage; - } else if (basename == m_rootPackage.basePackage.name) { + } else if (basename.toString() == m_rootPackage.basePackage.name) { vspec = Dependency(m_rootPackage.version_); try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, subname, false); catch (Exception e) { logDiagnostic("%sError getting sub package %s: %s", indent, dep.name, e.msg); - if (is_desired) m_missingDependencies ~= dep.name; + if (is_desired) m_missingDependencies ~= dep.name.toString(); continue; } } else if (m_selections.hasSelectedVersion(basename)) { @@ -557,17 +562,17 @@ return resolveSubPackage(tmp, subname, true); }, (Repository repo) { - auto tmp = m_packageManager.loadSCMPackage(basename, repo); + auto tmp = m_packageManager.loadSCMPackage(basename.toString(), repo); return resolveSubPackage(tmp, subname, true); }, (VersionRange range) { // See `dub.recipe.selection : SelectedDependency.fromYAML` assert(range.isExactVersion()); - return m_packageManager.getPackage(dep.name, vspec.version_); + return m_packageManager.getPackage(dep.name.toString(), vspec.version_); }, ); - } else if (m_dependencies.canFind!(d => getBasePackageName(d.name) == basename)) { - auto idx = m_dependencies.countUntil!(d => getBasePackageName(d.name) == basename); + } else if (m_dependencies.canFind!(d => PackageName(d.name).main == basename)) { + auto idx = m_dependencies.countUntil!(d => PackageName(d.name).main == basename); auto bp = m_dependencies[idx].basePackage; vspec = Dependency(bp.path); p = resolveSubPackage(bp, subname, false); @@ -580,7 +585,7 @@ if (p is null) { if (!vspec.repository.empty) { - p = m_packageManager.loadSCMPackage(basename, vspec.repository); + p = m_packageManager.loadSCMPackage(basename.toString(), vspec.repository); resolveSubPackage(p, subname, false); enforce(p !is null, "Unable to fetch '%s@%s' using git - does the repository and version exists?".format( @@ -595,12 +600,12 @@ p = p.parentPackage; } p = resolveSubPackage(p, subname, false); - enforce(p.name == dep.name, + enforce(p.name == dep.name.toString(), format("Path based dependency %s is referenced with a wrong name: %s vs. %s", path.toNativeString(), dep.name, p.name)); } else { logDiagnostic("%sMissing dependency %s %s of %s", indent, dep.name, vspec, pack.name); - if (is_desired) m_missingDependencies ~= dep.name; + if (is_desired) m_missingDependencies ~= dep.name.toString(); continue; } } @@ -608,7 +613,7 @@ if (!m_dependencies.canFind(p)) { logDiagnostic("%sFound dependency %s %s", indent, dep.name, vspec.toString()); m_dependencies ~= p; - if (basename == m_rootPackage.basePackage.name) + if (basename.toString() == m_rootPackage.basePackage.name) p.warnOnSpecialCompilerFlags(); collectDependenciesRec(p, depth+1); } @@ -647,7 +652,7 @@ parents[m_rootPackage.name] = null; foreach (p; getTopologicalPackageList()) foreach (d; p.getAllDependencies()) - parents[d.name] ~= p.name; + parents[d.name.toString()] ~= p.name; size_t createConfig(string pack, string config) { foreach (i, v; configs) @@ -721,7 +726,7 @@ { string[][string] depconfigs; foreach (d; p.getAllDependencies()) { - auto dp = getDependency(d.name, true); + auto dp = getDependency(d.name.toString(), true); if (!dp) continue; string[] cfgs; @@ -731,7 +736,7 @@ if (!subconf.empty) cfgs = [subconf]; else cfgs = dp.getPlatformConfigurations(platform); } - cfgs = cfgs.filter!(c => haveConfig(d.name, c)).array; + cfgs = cfgs.filter!(c => haveConfig(d.name.toString(), c)).array; // if no valid configuration was found for a dependency, don't include the // current configuration @@ -739,14 +744,14 @@ logDebug("Skip %s %s (missing configuration for %s)", p.name, c, dp.name); return; } - depconfigs[d.name] = cfgs; + depconfigs[d.name.toString()] = cfgs; } // add this configuration to the graph size_t cidx = createConfig(p.name, c); foreach (d; p.getAllDependencies()) - foreach (sc; depconfigs.get(d.name, null)) - createEdge(cidx, createConfig(d.name, sc)); + foreach (sc; depconfigs.get(d.name.toString(), null)) + createEdge(cidx, createConfig(d.name.toString(), sc)); } // create a graph of all possible package configurations (package, config) -> (sub-package, sub-config) @@ -759,7 +764,7 @@ // first, add all dependency configurations foreach (d; p.getAllDependencies) { - auto dp = getDependency(d.name, true); + auto dp = getDependency(d.name.toString(), true); if (!dp) continue; determineAllConfigs(dp); } @@ -1893,11 +1898,11 @@ /// Internal implementation of selectVersion private void selectVersionInternal(in PackageName name, in Dependency dep) { - if (auto pdep = name.main in m_selections.versions) { + if (auto pdep = name.main.toString() in m_selections.versions) { if (*pdep == dep) return; } - m_selections.versions[name.main] = dep; + m_selections.versions[name.main.toString()] = dep; m_dirty = true; } @@ -1918,7 +1923,7 @@ /// Ditto void deselectVersion(in PackageName name) { - m_selections.versions.remove(name); + m_selections.versions.remove(name.main.toString()); m_dirty = true; } @@ -1932,7 +1937,7 @@ /// Ditto bool hasSelectedVersion(in PackageName name) const { - return (name.main in m_selections.versions) !is null; + return (name.main.toString() in m_selections.versions) !is null; } /** Returns the selection for a particular package. @@ -1953,7 +1958,7 @@ Dependency getSelectedVersion(in PackageName name) const { enforce(hasSelectedVersion(name)); - return m_selections.versions[name.main]; + return m_selections.versions[name.main.toString()]; } /** Stores the selections to disk. diff --git a/source/dub/recipe/sdl.d b/source/dub/recipe/sdl.d index 01e6d18..520b2f5 100644 --- a/source/dub/recipe/sdl.d +++ b/source/dub/recipe/sdl.d @@ -23,17 +23,13 @@ deprecated("Use `parseSDL(PackageRecipe, string, PackageName, string)` instead") void parseSDL(ref PackageRecipe recipe, string sdl, string parent_name, string filename) { - // Work around broken compiler overload resolution (seen at v2.106) - scope void function(ref PackageRecipe, Tag, in PackageName) func = &parseSDL; - func(recipe, parseSource(sdl, filename), PackageName(parent_name)); + parseSDL(recipe, parseSource(sdl, filename), PackageName(parent_name)); } deprecated("Use `parseSDL(PackageRecipe, Tag, PackageName)` instead") void parseSDL(ref PackageRecipe recipe, Tag sdl, string parent_name) { - // Work around broken compiler overload resolution (seen at v2.106) - scope void function(ref PackageRecipe, Tag, in PackageName) func = &parseSDL; - func(recipe, sdl, PackageName(parent_name)); + parseSDL(recipe, sdl, PackageName(parent_name)); } void parseSDL(ref PackageRecipe recipe, string sdl, in PackageName parent, @@ -449,9 +445,7 @@ // Just a wrapper around `parseSDL` for easier testing version (unittest) private void parseSDLTest(ref PackageRecipe recipe, string sdl) { - // Work around broken compiler overload resolution (seen at v2.106) - scope void function(ref PackageRecipe, Tag, in PackageName) func = &parseSDL; - func(recipe, parseSource(sdl, "testfile"), PackageName.init); + parseSDL(recipe, parseSource(sdl, "testfile"), PackageName.init); } unittest { // test all possible fields