use of org.metaborg.core.transform.TransformException in project spoofax by metaborg.
the class StrategoTransformer method transformAllAnalyzed.
@Override
public Collection<ISpoofaxTransformUnit<ISpoofaxAnalyzeUnit>> transformAllAnalyzed(Iterable<ISpoofaxAnalyzeUnit> inputs, IContext context, TransformActionContrib action, ITransformConfig config) throws TransformException {
final int size = Iterables.size(inputs);
final Collection<ISpoofaxTransformUnit<ISpoofaxAnalyzeUnit>> transformUnits = Lists.newArrayListWithCapacity(size);
for (ISpoofaxAnalyzeUnit input : inputs) {
if (!input.valid()) {
throw new TransformException("Cannot transform analyze unit " + input + ", it is not valid");
}
if (!input.hasAst()) {
throw new TransformException("Cannot transform analyze unit " + input + ", it has no AST");
}
transformUnits.add(transform(input, context, action, input.source(), input.ast(), config));
}
return transformUnits;
}
use of org.metaborg.core.transform.TransformException in project spoofax by metaborg.
the class Builder method transform.
private Collection<T> transform(BuildInput input, ILanguageImpl langImpl, FileObject location, Multimap<IContext, A> allAnalysisUnits, Set<FileName> includeFiles, boolean pardoned, Set<FileName> removedResources, Collection<IMessage> extraMessages, RefBool success, IProgress progress, ICancel cancel) throws InterruptedException {
final int size = allAnalysisUnits.size();
progress.setWorkRemaining(size);
final Collection<T> allTransformUnits = Lists.newArrayListWithCapacity(size);
if (size == 0) {
return allTransformUnits;
}
progress.setDescription("Compiling " + size + " file(s) of " + langImpl.belongsTo().name());
logger.debug("Compiling {} analysis results", size);
for (Entry<IContext, Collection<A>> entry : allAnalysisUnits.asMap().entrySet()) {
cancel.throwIfCancelled();
final IContext context = entry.getKey();
final Iterable<A> analysisResults = entry.getValue();
try (IClosableLock lock = context.read()) {
for (A analysisResult : analysisResults) {
cancel.throwIfCancelled();
final FileObject source = analysisResult.source();
final FileName name = source.getName();
if (removedResources.contains(name) || includeFiles.contains(name)) {
// Don't compile removed resources, which the analysis results contain for legacy reasons.
// Don't transform included resources, they should just be parsed and analyzed.
progress.work(1);
continue;
}
if (!analysisResult.valid()) {
logger.warn("Input result for {} is invalid, cannot transform it", source != null ? source.getName().getPath() : "detached source");
progress.work(1);
continue;
}
for (ITransformGoal goal : input.transformGoals) {
cancel.throwIfCancelled();
if (!transformService.available(context, goal)) {
logger.trace("No {} transformation required for {}", goal, context.language());
progress.work(1);
continue;
}
try {
final Collection<TA> results = transformService.transform(analysisResult, context, goal);
for (TA result : results) {
final boolean noErrors = printMessages(result.messages(), goal + " transformation", input, pardoned);
success.and(noErrors);
@SuppressWarnings("unchecked") final T genericResult = (T) result;
allTransformUnits.add(genericResult);
}
progress.work(1);
} catch (TransformException e) {
final String message = String.format("Transformation failed unexpectedly for %s", name);
logger.error(message, e);
final boolean noErrors = printMessage(source, message, e, input, pardoned);
success.and(noErrors);
extraMessages.add(MessageFactory.newBuilderErrorAtTop(location, "Transformation failed unexpectedly", e));
}
}
}
// GTODO: also compile any affected sources
}
}
return allTransformUnits;
}
use of org.metaborg.core.transform.TransformException in project spoofax by metaborg.
the class StrategoTransformer method transform.
private <I extends IUnit> ISpoofaxTransformUnit<I> transform(I input, IContext context, TransformActionContrib actionContribution, FileObject source, IStrategoTerm term, ITransformConfig config) throws TransformException {
final FileObject location = context.location();
final ILanguageComponent component = actionContribution.contributor;
final TransformAction action = action(actionContribution.action);
// Get input term
final IStrategoTerm inputTerm = common.builderInputTerm(term, source, location);
// Get Stratego runtime
final HybridInterpreter runtime;
try {
runtime = strategoRuntimeService.runtime(component, context, true);
} catch (MetaborgException e) {
throw new TransformException("Transformation failed unexpectedly; cannot get Stratego interpreter", e);
}
// Transform
logger.debug("Transforming {} with '{}'", source, action.name);
final Timer timer = new Timer(true);
final IStrategoTerm outputTerm;
try {
outputTerm = common.invoke(runtime, inputTerm, action.strategy);
} catch (MetaborgException e) {
throw new TransformException(e.getMessage(), e.getCause());
}
final long duration = timer.stop();
if (outputTerm == null) {
final String message = logger.format("Invoking Stratego strategy {} failed", action.strategy);
throw new TransformException(message);
}
// Get the result and, if allowed and required, write to file
List<TransformOutput> outputs;
IStrategoTerm resultTerm;
if (outputTerm.getSubtermCount() == 2 && (outputTerm instanceof IStrategoTuple)) {
final IStrategoTerm resourceTerm = outputTerm.getSubterm(0);
final IStrategoTerm contentTerm = outputTerm.getSubterm(1);
try {
if (resourceTerm instanceof IStrategoString) {
resultTerm = contentTerm;
outputs = Lists.newArrayList(output(resourceTerm, contentTerm, location, config));
} else if (resourceTerm instanceof IStrategoList) {
if (!(contentTerm instanceof IStrategoList) || resourceTerm.getSubtermCount() != contentTerm.getSubtermCount()) {
logger.error("List of terms does not match list of file names, cannot write to file.");
resultTerm = null;
outputs = Collections.emptyList();
} else {
outputs = Lists.newArrayListWithExpectedSize(resourceTerm.getSubtermCount());
for (int i = 0; i < resourceTerm.getSubtermCount(); i++) {
outputs.add(output(resourceTerm.getSubterm(i), contentTerm.getSubterm(i), location, config));
}
resultTerm = resourceTerm.getSubtermCount() == 1 ? resourceTerm.getSubterm(0) : null;
}
} else {
logger.error("First term of result tuple {} is neither a string, nor a list, cannot write output file", resourceTerm);
resultTerm = null;
outputs = Collections.emptyList();
}
} catch (MetaborgException ex) {
resultTerm = null;
outputs = Collections.emptyList();
}
} else {
resultTerm = outputTerm;
outputs = Collections.emptyList();
}
// Open editor
if (action.flags.openEditor) {
List<FileObject> resources = Lists.newArrayListWithExpectedSize(outputs.size());
for (TransformOutput output : outputs) {
if (output.resource != null) {
resources.add(output.resource);
}
}
editorRegistry.open(resources, context.project());
}
// Return result
final TransformContrib contrib = new TransformContrib(resultTerm != null || !Iterables.isEmpty(outputs), true, resultTerm, outputs, Iterables2.<IMessage>empty(), duration);
return unitService.transformUnit(input, contrib, context, actionContribution);
}
Aggregations