diff --git a/.gitignore b/.gitignore
index c496bd8d03..fe76d8f6e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,6 @@
*.[oa]
*.deps
src/dmd
-src/ddmd/id.d
-src/ddmd/id.h
test/test_results
test/trace.def
test/trace.log
diff --git a/src/ddmd/idgen.d b/src/ddmd/id.d
similarity index 78%
rename from src/ddmd/idgen.d
rename to src/ddmd/id.d
index 2ec2aa47f3..98fe739591 100644
--- a/src/ddmd/idgen.d
+++ b/src/ddmd/id.d
@@ -2,28 +2,51 @@
* Compiler implementation of the
* $(LINK2 http://www.dlang.org, D programming language).
*
+ * This module contains the `Id` struct with a list of predefined symbols the
+ * compiler knows about.
+ *
* Copyright: Copyright (c) 1999-2017 by Digital Mars, All Rights Reserved
* Authors: $(LINK2 http://www.digitalmars.com, Walter Bright)
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
- * Source: $(DMDSRC _idgen.d)
+ * Source: $(DMDSRC _id.d)
*/
+module ddmd.id;
-// Program to generate string files in d data structures.
-// Saves much tedious typing, and eliminates typo problems.
-// Generates:
-// id.h
-// id.c
+import ddmd.identifier;
+import ddmd.tokens;
-import core.stdc.stdio;
-import core.stdc.stdlib;
-
-struct Msgtable
+/**
+ * Represents a list of predefined symbols the compiler knows about.
+ *
+ * All static fields in this struct represents a specific predefined symbol.
+ */
+struct Id
{
- const(char)* ident; // name to use in DMD source
- const(char)* name; // name in D executable
-};
+ static __gshared:
-Msgtable[] msgtable =
+ mixin(msgtable.generate(&identifier));
+
+ /**
+ * Populates the identifier pool with all predefined symbols.
+ *
+ * An identifier that corresponds to each static field in this struct will
+ * be placed in the identifier pool.
+ */
+ void initialize()
+ {
+ mixin(msgtable.generate(&initializer));
+ }
+}
+
+private:
+
+
+/**
+ * Each element in this array will generate one static field in the `Id` struct
+ * and a call to `Identifier.idPool` to populate the identifier pool in the
+ * `Id.initialize` method.
+ */
+immutable Msgtable[] msgtable =
[
{ "IUnknown" },
{ "Object" },
@@ -372,82 +395,60 @@ Msgtable[] msgtable =
];
-int main()
+/*
+ * Tuple of DMD source code identifier and symbol in the D executable.
+ *
+ * The first element of the tuple is the identifier to use in the DMD source
+ * code and the second element, if present, is the name to use in the D
+ * executable. If second element, `name`, is not present the identifier,
+ * `ident`, will be used instead
+ */
+struct Msgtable
{
+ // The identifier to use in the DMD source.
+ string ident;
+
+ // The name to use in the D executable
+ private string name_;
+
+ /*
+ * Returns: the name to use in the D executable, `name_` if non-empty,
+ * otherwise `ident`
+ */
+ string name()
{
- auto fp = fopen("ddmd/id.h","wb");
- if (!fp)
- {
- printf("can't open ddmd/id.h\n");
- exit(EXIT_FAILURE);
- }
-
- fprintf(fp, "// File generated by idgen.d\n");
- fprintf(fp, "#ifndef DMD_ID_H\n");
- fprintf(fp, "#define DMD_ID_H 1\n");
- fprintf(fp, "class Identifier;\n");
- fprintf(fp, "struct Id\n");
- fprintf(fp, "{\n");
-
- foreach(e; msgtable)
- {
- auto id = e.ident;
- fprintf(fp," static Identifier *%s;\n", id);
- }
-
- fprintf(fp, " static void initialize();\n");
- fprintf(fp, "};\n");
- fprintf(fp, "#endif\n");
-
- fclose(fp);
+ return name_ ? name_ : ident;
}
-
- {
- auto fp = fopen("ddmd/id.d","wb");
- if (!fp)
- {
- printf("can't open ddmd.id.d\n");
- exit(EXIT_FAILURE);
- }
-
- fprintf(fp, "// File generated by idgen.d\n");
- fprintf(fp, "\n");
- fprintf(fp, "module ddmd.id;\n");
- fprintf(fp, "\n");
- fprintf(fp, "import ddmd.identifier, ddmd.tokens;\n");
- fprintf(fp, "\n");
- fprintf(fp, "struct Id\n");
- fprintf(fp, "{\n");
-
- foreach(e; msgtable)
- {
- auto id = e.ident;
- auto p = e.name;
-
- if (!p)
- p = id;
- fprintf(fp, " extern (C++) static __gshared Identifier %s;\n", id);
- }
-
- fprintf(fp, "\n");
- fprintf(fp, " extern (C++) static void initialize()\n");
- fprintf(fp, " {\n");
-
- foreach(e; msgtable)
- {
- auto id = e.ident;
- auto p = e.name;
-
- if (!p)
- p = id;
- fprintf(fp," %s = Identifier.idPool(\"%s\");\n", id, p);
- }
-
- fprintf(fp, " }\n");
- fprintf(fp, "}\n");
-
- fclose(fp);
- }
-
- return EXIT_SUCCESS;
+}
+
+/*
+ * Iterates the given Msgtable array, passes each element to the given lambda
+ * and accumulates a string from each return value of calling the lambda.
+ * Appends a newline character after each call to the lambda.
+ */
+string generate(immutable(Msgtable)[] msgtable, string function(Msgtable) dg)
+{
+ string code;
+
+ foreach (i, m ; msgtable)
+ {
+ if (i != 0)
+ code ~= '\n';
+
+ code ~= dg(m);
+ }
+
+ return code;
+}
+
+// Used to generate the code for each identifier.
+string identifier(Msgtable m)
+{
+ return "Identifier " ~ m.ident ~ ";";
+}
+
+// Used to generate the code for each initializer.
+string initializer(Msgtable m)
+{
+ return m.ident ~ ` = Identifier.idPool("` ~ m.name ~ `");`;
}
diff --git a/src/posix.mak b/src/posix.mak
index c85791cd77..80086570a9 100644
--- a/src/posix.mak
+++ b/src/posix.mak
@@ -228,7 +228,7 @@ FRONT_SRCS=$(addsuffix .d, $(addprefix $D/,access aggregate aliasthis apply argt
cppmangle ctfeexpr dcast dclass declaration delegatize denum dimport \
dinifile dinterpret dmacro dmangle dmodule doc dscope dstruct dsymbol \
dtemplate dversion escape expression func \
- hdrgen impcnvtab imphint init inline inlinecost intrange \
+ hdrgen id impcnvtab imphint init inline inlinecost intrange \
json lib link mars mtype nogc nspace objc opover optimize parse sapply \
sideeffect statement staticassert target traits visitor \
typinf utils statement_rewrite_walker statementsem staticcond safe blockexit asttypename printast))
@@ -288,7 +288,7 @@ endif
SRC = $(addprefix $D/, win32.mak posix.mak osmodel.mak aggregate.h aliasthis.h arraytypes.h \
attrib.h complex_t.h cond.h ctfe.h ctfe.h declaration.h dsymbol.h \
- enum.h errors.h expression.h globals.h hdrgen.h identifier.h idgen.d \
+ enum.h errors.h expression.h globals.h hdrgen.h identifier.h \
import.h init.h intrange.h json.h lexer.h \
mars.h module.h mtype.h nspace.h objc.h \
scope.h statement.h staticassert.h target.h template.h tokens.h \
@@ -396,7 +396,7 @@ endif
clean:
rm -R $(GENERATED)
rm -f parser_test parser_test.o example_avg example_avg.o
- rm -f dmd $(idgen_output)
+ rm -f dmd
rm -f $(addprefix $D/backend/, $(optabgen_output))
@[ ! -d ${PGO_DIR} ] || echo You should issue manually: rm -rf ${PGO_DIR}
@@ -457,15 +457,6 @@ $(optabgen_files): optabgen.out
.INTERMEDIATE: optabgen.out
optabgen.out : $G/optabgen
-######## idgen generates some source
-
-idgen_output = $D/id.h $D/id.d
-$(idgen_output) : $G/idgen
-
-$G/idgen: $D/idgen.d $(HOST_DMD_PATH)
- CC=$(HOST_CXX) $(HOST_DMD_RUN) -of$@ $<
- $G/idgen
-
######## VERSION
VERSION := $(shell cat ../VERSION) # default to checked-in VERSION file
diff --git a/src/vcbuild/dmd.visualdproj b/src/vcbuild/dmd.visualdproj
index d5831735b1..4f3f503268 100644
--- a/src/vcbuild/dmd.visualdproj
+++ b/src/vcbuild/dmd.visualdproj
@@ -412,28 +412,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -526,6 +504,7 @@
+
diff --git a/src/vcbuild/dmd_backend.vcxproj b/src/vcbuild/dmd_backend.vcxproj
index 4bc3c29921..3a21194156 100644
--- a/src/vcbuild/dmd_backend.vcxproj
+++ b/src/vcbuild/dmd_backend.vcxproj
@@ -158,21 +158,9 @@
-
- Building and running $(IntDir)%(Filename).exe
- $(IntDir)generated\ddmd\id.d;$(IntDir)generated\ddmd\id.c;$(IntDir)generated\ddmd\id.h;$(IntDir)generated\%(Filename).exe;%(Outputs)
- set DMDDir=$(DMDBinDir)
-set PATH=%DMDDir%;%PATH%
-dmd -od$(IntDir)generated -of$(IntDir)generated\%(Filename).exe %(Identity)
-if errorlevel 1 exit /B %ERRORLEVEL%
-pushd $(IntDir)generated
-%(Filename).exe
-if errorlevel 1 exit /B %ERRORLEVEL%
-popd
-
Building and running $(IntDir)%(Filename).exe
- cl /TP /I..\ddmd\tk /I..\ddmd\root /I. /I.. /FIwarnings.h /Fo"$(IntDir)%(Filename).obj" /Fe"$(IntDir)generated\%(Filename).exe" "%(FullPath)"
+ cl /TP /I..\ddmd\tk /I..\ddmd\root /I. /I.. /FIwarnings.h /Fo"$(IntDir)%(Filename).obj" /Fe"$(IntDir)generated\%(Filename).exe" "%(FullPath)"
if errorlevel 1 exit /B %ERRORLEVEL%
pushd $(IntDir)generated
"%(Filename).exe"
@@ -267,4 +255,4 @@ popd
-
\ No newline at end of file
+
diff --git a/src/win32.mak b/src/win32.mak
index 378b437005..7cc406cb09 100644
--- a/src/win32.mak
+++ b/src/win32.mak
@@ -161,7 +161,7 @@ FRONT_SRCS=$D/access.d $D/aggregate.d $D/aliasthis.d $D/apply.d $D/argtypes.d $D
$D/declaration.d $D/delegatize.d $D/denum.d $D/dimport.d $D/dinifile.d $D/dinterpret.d \
$D/dmacro.d $D/dmangle.d $D/dmodule.d $D/doc.d $D/dscope.d $D/dstruct.d $D/dsymbol.d \
$D/dtemplate.d $D/dversion.d $D/escape.d \
- $D/expression.d $D/func.d $D/hdrgen.d $D/imphint.d \
+ $D/expression.d $D/func.d $D/hdrgen.d $D/id.d $D/imphint.d \
$D/impcnvtab.d $D/init.d $D/inline.d $D/inlinecost.d $D/intrange.d $D/json.d $D/lib.d $D/link.d \
$D/mars.d $D/mtype.d $D/nogc.d $D/nspace.d $D/objc.d $D/opover.d $D/optimize.d $D/parse.d \
$D/sapply.d $D/sideeffect.d $D/statement.d $D/staticassert.d $D/target.d \
@@ -347,7 +347,7 @@ clean:
$(RD) /s /q $(GEN)
$(DEL) $D\msgs.h $D\msgs.c
$(DEL) optabgen.exe parser_test.exe example_avg.exe
- $(DEL) $(TARGETEXE) $(DMDFRONTENDEXE) $(IDGENOUTPUT) *.map *.obj
+ $(DEL) $(TARGETEXE) $(DMDFRONTENDEXE) *.map *.obj
install: detab install-copy
@@ -417,7 +417,6 @@ $(TOOLS_DIR)\checkwhitespace.d:
############################## Generated Source ##############################
OPTABGENOUTPUT = $G\elxxx.c $G\cdxxx.c $G\optab.c $G\debtab.c $G\fltables.c $G\tytab.c
-IDGENOUTPUT = $D/id.d $D/id.h
$(OPTABGENOUTPUT) : \
$C\cdef.h $C\cc.h $C\oper.h $C\ty.h $C\optabgen.c
@@ -426,10 +425,6 @@ $(OPTABGENOUTPUT) : \
copy *.c "$G\"
$(DEL) *.c
-$(IDGENOUTPUT) : $D\idgen.d
- $(HOST_DC) -of$G\idgen $D\idgen.d
- $G/idgen
-
$G\VERSION : ..\VERSION $G
copy ..\VERSION $@