Skip to content

Commit ff53dec

Browse files
committed
Avoid mixins for directly used macros
1 parent 15e9275 commit ff53dec

6 files changed

Lines changed: 74 additions & 8 deletions

File tree

src/cppconv/dwriter/declarationcode.d

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2270,27 +2270,41 @@ void declarationToDCode(ref CodeWriter code, DWriterData data, Declaration d, im
22702270
else
22712271
{
22722272
code.customIndent = origCustomIndent;
2273+
string innerCode = instance.instanceCode[instance.realCodeStart .. instance.realCodeEnd];
22732274
if (instance.macroTranslation == MacroTranslation.enumValue)
22742275
code.writeln("enum ", instance.usedName, " =",
22752276
instance.instanceCode[0 .. instance.realCodeStart],
2276-
instance.instanceCode[instance.realCodeStart .. instance.realCodeEnd], ";",
2277+
innerCode, ";",
22772278
instance.instanceCode[instance.realCodeEnd
22782279
.. $].withoutTrailingWhitespace);
22792280
else if (instance.macroTranslation == MacroTranslation.alias_)
22802281
code.writeln("alias ", instance.usedName, " =",
22812282
instance.instanceCode[0 .. instance.realCodeStart],
2282-
instance.instanceCode[instance.realCodeStart .. instance.realCodeEnd], ";",
2283+
innerCode, ";",
22832284
instance.instanceCode[instance.realCodeEnd
22842285
.. $].withoutTrailingWhitespace);
22852286
else if (instance.macroTranslation == MacroTranslation.mixin_)
2287+
{
2288+
string codePrefix = "q{";
2289+
string codeSuffix = "}";
2290+
if (instance.mixinMacroHasInterpolation)
2291+
{
2292+
codePrefix = "mixin(interpolateMixin(" ~ codePrefix;
2293+
codeSuffix ~= "))";
2294+
}
2295+
if (instance.canForwardMacroMixin && innerCode.startsWith("$(") && innerCode.endsWith(")"))
2296+
{
2297+
codePrefix = "";
2298+
codeSuffix = "";
2299+
innerCode = innerCode[2 .. $ - 1];
2300+
}
22862301
code.writeln("enum ", instance.usedName, " =",
22872302
instance.instanceCode[0 .. instance.realCodeStart],
2288-
instance.mixinMacroHasInterpolation ? "mixin(interpolateMixin(" : "",
2289-
"q{", instance.instanceCode[instance.realCodeStart .. instance.realCodeEnd], "}",
2290-
instance.mixinMacroHasInterpolation ? "))" : "",
2303+
codePrefix, innerCode, codeSuffix,
22912304
";",
22922305
instance.instanceCode[instance.realCodeEnd
22932306
.. $].withoutTrailingWhitespace);
2307+
}
22942308
code.customIndent = newCustomIndent;
22952309
}
22962310
}

src/cppconv/dwriter/macrodeclaration.d

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class MacroDeclarationInstance
6464
size_t realCodeStart;
6565
size_t realCodeEnd;
6666
bool mixinMacroHasInterpolation;
67+
bool canForwardMacroMixin;
6768
string usedName;
6869
MacroTranslation macroTranslation;
6970
MacroDeclarationInstance[] extraDeps;
@@ -708,6 +709,14 @@ void generateMacroCode(DWriterData data, Semantic mergedSemantic, MacroDeclarati
708709
}
709710
else
710711
{
712+
if (usedTrees.length == 1 && usedTrees[0] in data.macroReplacement)
713+
{
714+
auto instance3 = data.macroReplacement[usedTrees[0]];
715+
if (instance3.macroDeclaration.type != DeclarationType.macroParam
716+
&& instance3.macroTranslation == MacroTranslation.mixin_)
717+
instance.canForwardMacroMixin = true;
718+
}
719+
711720
foreach (usedTree; usedTrees)
712721
{
713722
if (code.data.length == 0 && usedTree.isValid)
@@ -1060,13 +1069,20 @@ void writeMacroInstance(ref CodeWriter code, DWriterData data, Tree tree, immuta
10601069
if (!allCodesSame)
10611070
code.write("/* WARNING: Parameter has been split. */");
10621071
code.write(x.instanceCode[0 .. x.realCodeStart]);
1072+
string innerCode = x.instanceCode[x.realCodeStart .. x.realCodeEnd];
10631073
if (!data.inMixinMacro && x.mixinMacroHasInterpolation)
10641074
{
10651075
codePrefix = "mixin(interpolateMixin(" ~ codePrefix;
10661076
codeSuffix ~= "))";
10671077
}
1078+
if (x.canForwardMacroMixin && innerCode.startsWith("$(") && innerCode.endsWith(")"))
1079+
{
1080+
codePrefix = "";
1081+
codeSuffix = "";
1082+
innerCode = innerCode[2 .. $ - 1];
1083+
}
10681084
code.write(codePrefix);
1069-
code.write(x.instanceCode[x.realCodeStart .. x.realCodeEnd]);
1085+
code.write(innerCode);
10701086
code.write(codeSuffix);
10711087
code.write(x.instanceCode[x.realCodeEnd .. $]);
10721088
}

tests/multifile/testinclude99/testinclude99a.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ void g()
1313
{
1414
import testinclude99b;
1515

16-
int z = mixin(M(mixin(interpolateMixin(q{$(X)}))));
16+
int z = mixin(M(X));
1717
}
1818

tests/single/test34.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ extern(D) alias f = function string(string x)
2020
};
2121
__gshared int i3 = mixin(f(q{5}));
2222
/+ #define Y f(6) +/
23-
enum Y = mixin(interpolateMixin(q{$(imported!q{test34}.f(q{6}))}));
23+
enum Y = imported!q{test34}.f(q{6});
2424
__gshared int i4 = mixin(Y);
2525
/+ #define g() X +/
2626
extern(D) alias g = function string()

tests/single/testdefines71.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const int g = 1;
2+
#define f(x) x
3+
#define X (1*g)
4+
int i = f(X) + 1;
5+
6+
#define Y X
7+
int i2 = Y;
8+
9+
#define f2(y) f(y)
10+
int i3 = f2(X) + 3;

tests/single/testdefines71.d

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module testdefines71;
2+
3+
import config;
4+
import cppconvhelpers;
5+
6+
__gshared const(int) g = 1;
7+
/+ #define f(x) x +/
8+
extern(D) alias f = function string(string x)
9+
{
10+
return mixin(interpolateMixin(q{$(x)}));
11+
};
12+
/+ #define X (1*g) +/
13+
enum X = q{(1*imported!q{testdefines71}.g)};
14+
__gshared int i = mixin(f(X)) + 1;
15+
16+
/+ #define Y X +/
17+
enum Y = imported!q{testdefines71}.X;
18+
__gshared int i2 = mixin(Y);
19+
20+
/+ #define f2(y) f(y) +/
21+
extern(D) alias f2 = function string(string y)
22+
{
23+
return mixin(interpolateMixin(q{$(imported!q{testdefines71}.f(q{$(y)}))}));
24+
};
25+
__gshared int i3 = mixin(f2(X)) + 3;
26+

0 commit comments

Comments
 (0)