Skip to content

Commit 4fd7a12

Browse files
WalterBright9rnsr
authored andcommitted
Merge pull request #1642 from AndrejMitrovic/Fix9484
Issue 9484 - Selective and Renamed symbol imports should be separate.
1 parent 7d955fe commit 4fd7a12

File tree

7 files changed

+85
-10
lines changed

7 files changed

+85
-10
lines changed

src/json.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -739,19 +739,41 @@ void Import::toJson(JsonOut *json)
739739
if (aliasId)
740740
json->property("alias", aliasId->toChars());
741741

742-
if (names.dim)
742+
bool hasRenamed = false;
743+
bool hasSelective = false;
744+
for (size_t i = 0; i < aliases.dim; i++)
745+
{ // avoid empty "renamed" and "selective" sections
746+
if (hasRenamed && hasSelective)
747+
break;
748+
else if (aliases[i])
749+
hasRenamed = true;
750+
else
751+
hasSelective = true;
752+
}
753+
754+
if (hasRenamed)
743755
{
744-
json->propertyStart("aliases");
745-
json->arrayStart();
746-
for (size_t i = 0; i < names.dim; i++)
756+
// import foo : alias1 = target1;
757+
json->propertyStart("renamed");
758+
json->objectStart();
759+
for (size_t i = 0; i < aliases.dim; i++)
747760
{
748761
Identifier *name = names[i];
749762
Identifier *alias = aliases[i];
763+
if (alias) json->property(alias->toChars(), name->toChars());
764+
}
765+
json->objectEnd();
766+
}
750767

751-
if (alias)
752-
json->property(alias->toChars(), name->toChars());
753-
else
754-
json->item(name->toChars());
768+
if (hasSelective)
769+
{
770+
// import foo : target1;
771+
json->propertyStart("selective");
772+
json->arrayStart();
773+
for (size_t i = 0; i < names.dim; i++)
774+
{
775+
Identifier *name = names[i];
776+
if (!aliases[i]) json->item(name->toChars());
755777
}
756778
json->arrayEnd();
757779
}

test/compilable/extra-files/json.out

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,45 @@
304304
"deco" : "FNbNdZi",
305305
"originalType" : "nothrow int()",
306306
"endline" : 74
307+
},
308+
{
309+
"name" : "imports.jsonimport1",
310+
"kind" : "import",
311+
"line" : 77,
312+
"protection" : "private",
313+
"selective" : [
314+
"target1",
315+
"target2"
316+
]
317+
},
318+
{
319+
"name" : "imports.jsonimport2",
320+
"kind" : "import",
321+
"line" : 78,
322+
"protection" : "private",
323+
"renamed" : {
324+
"alias1" : "target1",
325+
"alias2" : "target2"
326+
}
327+
},
328+
{
329+
"name" : "imports.jsonimport3",
330+
"kind" : "import",
331+
"line" : 79,
332+
"protection" : "private",
333+
"renamed" : {
334+
"alias3" : "target1",
335+
"alias4" : "target2"
336+
},
337+
"selective" : [
338+
"target3"
339+
]
340+
},
341+
{
342+
"name" : "imports.jsonimport4",
343+
"kind" : "import",
344+
"line" : 80,
345+
"protection" : "private"
307346
}
308347
]
309348
}

test/compilable/imports/jsonimport1.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module imports.jsonimport1;
2+
3+
int target1, target2;

test/compilable/imports/jsonimport2.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module imports.jsonimport2;
2+
3+
int target1, target2;

test/compilable/imports/jsonimport3.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module imports.jsonimport3;
2+
3+
int target1, target2, target3;

test/compilable/imports/jsonimport4.d

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module imports.jsonimport4;

test/compilable/json.d

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Bar2 : Bar!1, Baz!(int, 2, null) {
3131
class Bar3 : Bar2 {
3232
private int val;
3333
this(int i) { val = i; }
34-
34+
3535
protected override Foo!int baz() { return Foo!int(val); }
3636
}
3737

@@ -73,4 +73,8 @@ body {
7373
return x + z;
7474
}
7575

76-
76+
/** Issue 9484 - selective and renamed imports */
77+
import imports.jsonimport1 : target1, target2;
78+
import imports.jsonimport2 : alias1 = target1, alias2 = target2;
79+
import imports.jsonimport3 : alias3 = target1, alias4 = target2, target3;
80+
import imports.jsonimport4;

0 commit comments

Comments
 (0)