Skip to content

Commit

Permalink
feature-refactor-driver
Browse files Browse the repository at this point in the history
  • Loading branch information
ciechowoj committed Mar 19, 2018
1 parent 50919b6 commit 81013cf
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 123 deletions.
7 changes: 7 additions & 0 deletions clang/Compiler.d
Expand Up @@ -52,6 +52,13 @@ struct Compiler
return [virtualPath];
}

string[] extraIncludeFlags ()
{
import std.algorithm;
import std.array;
return extraIncludePaths.map!(x => "-I" ~ x).array;
}

CXUnsavedFile[] extraHeaders ()
{
import std.algorithm : map;
Expand Down
186 changes: 66 additions & 120 deletions dstep/driver/Application.d
Expand Up @@ -40,57 +40,34 @@ class Application
public void run ()
{
import std.exception : enforce;
import std.range;

enforce!DStepException(config.inputFiles.length > 0,
"dstep: error: must supply at least one input file\n");

enforceInputFilesExist(config);

// when only one input file is supplied, -o argument is
// interpreted as file path, otherwise as base directory path
bool singleFileInput = config.inputFiles.length == 1;
auto translationUnits = makeTranslationUnits(config);

Task!(
startParsingFile,
Configuration,
string,
string)*[] conversionTasks;
enforceTranslationUnitsCompiled(translationUnits);

conversionTasks.length = config.inputFiles.length;
auto inputFiles = config.inputFiles;
auto outputFiles = makeOutputFiles(config);

// parallel generation of D modules for each of input files
foreach (size_t index, fileName; config.inputFiles)
foreach (tuple; zip(inputFiles, outputFiles, translationUnits).parallel(1))
{
string outputFilename;

if (singleFileInput)
{
if (config.output.length)
outputFilename = config.output;
else
outputFilename = defaultOutputFilename(fileName, false);
}
else
{
outputFilename = Path.buildPath(config.output,
defaultOutputFilename(fileName, false));
}

string outputDir = Path.dirName(outputFilename);
string outputDirectory = Path.dirName(tuple[1]);

if (!exists(outputDir))
mkdirRecurse(outputDir);
if (!exists(outputDirectory))
mkdirRecurse(outputDirectory);

conversionTasks[index] = task!startParsingFile(
config,
fileName,
outputFilename);
Options options = this.config.toOptions(tuple[0], tuple[1]);

conversionTasks[index].executeInNewThread();
auto translator = new Translator(tuple[2], options);
translator.translate;
}

foreach (conversionTask; conversionTasks)
conversionTask.yieldForce();
taskPool.finish(true);
}

static void enforceInputFilesExist(const Configuration config)
Expand All @@ -110,115 +87,84 @@ class Application
}
}

static void startParsingFile (const Configuration config, string fileName,
string outputFilename)
void enforceTranslationUnitsCompiled(TranslationUnit[] translationUnits)
{
ParseFile(config, fileName, outputFilename)
.startConversion();
}
import std.array : Appender;
import std.exception : enforce;

static string defaultOutputFilename (string inputFile, bool useBaseName = true)
{
if (useBaseName)
return Path.setExtension(Path.baseName(inputFile), "d");
bool translate = true;
auto message = Appender!string();

return Path.setExtension(inputFile, "d");
}
}
foreach (translationUnit; translationUnits)
{
foreach (diagnostics ; translationUnit.diagnostics)
{
auto severity = diagnostics.severity;

private struct ParseFile
{
private
{
string inputFile;
string outputFile;
Index index;
TranslationUnit translationUnit;
DiagnosticVisitor diagnostics;
with (CXDiagnosticSeverity)
if (translate)
translate = !(severity == error || severity == fatal);

const Configuration config;
Compiler compiler;
message.put(diagnostics.format);
message.put("\n");
}
}

enforce!DStepException(translate, message.data);
}

this (
const Configuration config,
string inputFile,
string outputFile)
static string makeDefaultOutputFile(string inputFile, bool useBaseName = true)
{
this.config = config;
this.inputFile = inputFile;
this.outputFile = outputFile;
if (useBaseName)
return Path.setExtension(Path.baseName(inputFile), "d");

return Path.setExtension(inputFile, "d");
}

void startConversion ()
static string[] makeOutputFiles(Configuration config)
{
import std.algorithm.iteration : map;
import std.algorithm;
import std.array;
import std.range;

index = Index(false, false);
auto inputFiles = config.inputFiles;

auto include_flags = compiler
.extraIncludePaths.map!(e => "-I" ~ e).array();
translationUnit = TranslationUnit.parse(
index,
inputFile,
config.clangParams ~ include_flags,
compiler.extraHeaders);

diagnostics = translationUnit.diagnostics;

enforceCompiled();

if (exists(inputFile))
// when only one input file is supplied, -o argument is
// interpreted as file path, otherwise as base directory path
if (inputFiles.length == 1)
{
import std.algorithm : map;
import std.array : array;

Options options = this.config.toOptions(inputFile, outputFile);

auto translator = new Translator(translationUnit, options);
translator.translate;
return [config.output.empty
? makeDefaultOutputFile(inputFiles.front, false)
: config.output];
}
}

~this ()
{
clean();
}

private:
else
{
alias fmap = file => Path.buildPath(
config.output,
makeDefaultOutputFile(file, false));

void clean ()
{
translationUnit.dispose;
index.dispose;
return inputFiles.map!fmap.array;
}
}

bool anyErrors ()
static TranslationUnit[] makeTranslationUnits(Configuration config)
{
return diagnostics.length > 0;
}
import std.parallelism;

void enforceCompiled ()
{
import std.array : Appender;
import std.exception : enforce;
Index translationIndex = Index(false, false);
Compiler compiler;

bool translate = true;
auto message = Appender!string();
auto translationUnits = new TranslationUnit[config.inputFiles.length];

foreach (diag ; diagnostics)
foreach (index, ref unit; translationUnits.parallel(1))
{
auto severity = diag.severity;

with (CXDiagnosticSeverity)
if (translate)
translate = !(severity == error || severity == fatal);

message.put(diag.format);
message.put("\n");
unit = TranslationUnit.parse(
translationIndex,
config.inputFiles[index],
config.clangParams ~ compiler.extraIncludeFlags,
compiler.extraHeaders);
}

enforce!DStepException(translate, message.data);
return translationUnits;
}
}
2 changes: 1 addition & 1 deletion dstep/translator/Record.d
Expand Up @@ -45,7 +45,7 @@ BitField[] translateBitFields(
Context context,
Cursor[] cursors)
{
void pad(ref BitField[] bitFields, uint totalWidth)
static void pad(ref BitField[] bitFields, uint totalWidth)
{
uint padding = 0;

Expand Down
4 changes: 2 additions & 2 deletions tests/unit/Common.d
Expand Up @@ -652,13 +652,13 @@ auto testRunDStep(
if (sourcePaths.length == 1)
{
outputPaths ~= buildPath(outputDir,
Application.defaultOutputFilename(sourcePaths[0], false));
Application.makeDefaultOutputFile(sourcePaths[0], false));
}
else
{
foreach (sourcePath; sourcePaths)
outputPaths ~= buildPath(outputDir,
Application.defaultOutputFilename(sourcePath, false));
Application.makeDefaultOutputFile(sourcePath, false));
}

auto localCommand = ["./bin/dstep"] ~ sourcePaths ~ arguments;
Expand Down

0 comments on commit 81013cf

Please sign in to comment.