/* * Copyright 2003-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.generator.test; import jetbrains.mps.generator.GenerationStatus; import jetbrains.mps.generator.generationTypes.StreamHandler; import jetbrains.mps.generator.impl.dependencies.GenerationDependencies; import jetbrains.mps.generator.impl.dependencies.GenerationRootDependencies; import jetbrains.mps.text.TextGenResult; import jetbrains.mps.text.TextUnit; import jetbrains.mps.textgen.trace.TracingUtil; import jetbrains.mps.util.IStatus; import jetbrains.mps.util.Status; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.model.SNodeReference; /** * Bridge text generation outcome with GenerationStatus object. * FIXME it's not quite nice to have generator to depend from textgen, shall be separate. * This is the only class in [generator-engine] module that depends on [textgen] * And the sole client is {@link IncrementalTestGenerationHandler} which shall be rewritten anyway * * Compared to its previous incarnation (TextFacility), lost responsibility to perform actual transformation: * <ul> * <li><strike>Transform output model to model of textual representation</strike></li> * <li>Serialize outcome</li> * <li><strike>Update various generation caches based on new textual representation.</strike></li> * <li><strike>Serialize generation caches</strike></li> * </ul> * The class doesn't add much value, perhaps it should focus on GenerationStatus update, while all serializeXXX code shall become external. * @author Artem Tikhomirov */ class TextFacility2 { private final GenerationStatus myGenStatus; private final TextGenResult myTextResult; public TextFacility2(@NotNull GenerationStatus genStatus, @NotNull TextGenResult textResult) { myGenStatus = genStatus; myTextResult = textResult; } /** * Populate GenerationStatus with information from TextGenResult. * XXX what about read access and SNode which we keep in the TextGenResult? */ public void prepare() { GenerationDependencies gd = myGenStatus.getDependencies(); for (TextUnit tu : myTextResult.getUnits()) { final SNodeReference input = TracingUtil.getInput(tu.getStartNode()); gd.update(input, tu.getFileName()); } } public IStatus serializeOutcome(StreamHandler streamHandler) { boolean success = true; for (TextUnit tu : myTextResult.getUnits()) { TextUnit.Status tgStatus = tu.getState(); assert tgStatus != TextUnit.Status.Undefined; if (tgStatus == TextUnit.Status.Empty) { continue; } if (tgStatus == TextUnit.Status.Failed) { success = false; } streamHandler.saveStream(tu.getFileName(), tu.getBytes()); } // let the world know unchanged files are still in use GenerationDependencies gd = myGenStatus.getDependencies(); for (GenerationRootDependencies rdep : gd.getUnchangedDependencies()) { for (String fname : rdep.getFiles()) { streamHandler.touch(fname); } } return success ? Status.NO_ERRORS : new Status.ERROR("Text outcome has been generated with errors"); } }