Skip to content

Commit c7c020b

Browse files
committed
fix(parser): Accept short hand package syntax (:a) in subpackages too
The hack that we had in place to accept this did not properly recurse in arrays and associative array, the former causing the issue shown on the linked pull request. Additionally, add a comprehensive unittest as found in an old issue (1615) as it covers both cases.
1 parent 8d4060f commit c7c020b

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

source/dub/recipe/packagerecipe.d

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -790,22 +790,32 @@ unittest { // issue #1407 - duplicate main source file
790790
*
791791
* TODO: Remove the special case in the parser and remove this hack.
792792
*/
793-
package void fixDependenciesNames (T) (string root, ref T aggr) nothrow
793+
package void fixDependenciesNames (T) (string root, ref T aggr)
794794
{
795-
static foreach (idx, FieldRef; T.tupleof) {
796-
static if (is(immutable typeof(FieldRef) == immutable RecipeDependencyAA)) {
797-
string[] toReplace;
798-
foreach (key; aggr.tupleof[idx].byKey)
799-
if (key.length && key[0] == ':')
800-
toReplace ~= key;
801-
foreach (k; toReplace) {
802-
aggr.tupleof[idx][root ~ k] = aggr.tupleof[idx][k];
803-
aggr.tupleof[idx].data.remove(k);
804-
}
805-
}
806-
else static if (is(typeof(FieldRef) == struct))
807-
fixDependenciesNames(root, aggr.tupleof[idx]);
808-
}
795+
static foreach (idx, FieldRef; T.tupleof)
796+
fixFieldDependenciesNames(root, aggr.tupleof[idx]);
797+
}
798+
799+
/// Ditto
800+
private void fixFieldDependenciesNames (Field) (string root, ref Field field)
801+
{
802+
static if (is(immutable Field == immutable RecipeDependencyAA)) {
803+
string[] toReplace;
804+
foreach (key; field.byKey)
805+
if (key.length && key[0] == ':')
806+
toReplace ~= key;
807+
foreach (k; toReplace) {
808+
field[root ~ k] = field[k];
809+
field.data.remove(k);
810+
}
811+
} else static if (is(Field == struct))
812+
fixDependenciesNames(root, field);
813+
else static if (is(Field : Elem[], Elem))
814+
foreach (ref entry; field)
815+
fixFieldDependenciesNames(root, entry);
816+
else static if (is(Field : Value[Key], Value, Key))
817+
foreach (key, ref value; field)
818+
fixFieldDependenciesNames(root, value);
809819
}
810820

811821
/**

source/dub/test/subpackages.d

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,18 @@ unittest
6060
assert(dub.project.getDependency("b:a", true), "Missing 'b:a' dependency");
6161
assert(dub.project.getDependency("c:a", true), "Missing 'c:a' dependency");
6262
}
63+
64+
// https://github.com/dlang/dub/issues/1615
65+
// https://github.com/dlang/dub/pull/2972
66+
unittest
67+
{
68+
scope dub = new TestDub((scope Filesystem root) {
69+
root.writeFile(TestDub.ProjectPath ~ "dub.json",
70+
`{"name": "t9",
71+
"subPackages":[{"name": "a","dependencies": {":b": "*"}},{"name": "b"}],
72+
"dependencies": {":a": "*",":b": "*"}}`);
73+
});
74+
dub.loadPackage();
75+
76+
assert(dub.project.hasAllDependencies(), "project has missing dependencies");
77+
}

0 commit comments

Comments
 (0)