/*
* Copyright 2003-2017 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.smodel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.language.SLanguage;
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.mps.openapi.module.SModuleReference;
import java.util.ArrayList;
import java.util.Collection;
/**
* Auxiliary facility to deal with model imports without knowledge
* about {@link SModelInternal} and its constantly updating API.
* <p/>
* This class doesn't address model access.
* <p/>
* FIXME shall reside in [smodel], kept in [kernel] until SModelInternal moves there
* (could not now as depends from Language module and smodel.SModel.ImportElement)
*
* @implNote This class is deemed as low-level API to model imports, contrary to
* <code>jetbrains.mps.project.ModelImporter</code> that focuses on user interaction and input check.
* OTOH, don't get confused with 'low-level'. This class is intended for SModel clients, not for SModel implementers, don't
* use it from within {@link jetbrains.mps.extapi.model.SModelDescriptorStub} or {@link jetbrains.mps.extapi.model.SModelBase}.
*
* @author Artem Tikhomirov
* @since 3.4
*/
public final class ModelImports {
private final SModelInternal myModel;
public ModelImports(org.jetbrains.mps.openapi.model.SModel model) {
myModel = (SModelInternal) model;
}
/**
* @return nothing but snapshot of models explicitly listed as imports of the initial model, in no particular order.
* XXX and likely without null values.
*/
public Collection<SModelReference> getImportedModels() {
return myModel.getModelImports();
}
public void addModelImport(@NotNull org.jetbrains.mps.openapi.model.SModelReference modelToImport) {
myModel.addModelImport(modelToImport);
}
public void removeModelImport(@NotNull org.jetbrains.mps.openapi.model.SModelReference modelToRemove) {
myModel.deleteModelImport(modelToRemove);
}
public Collection<SLanguage> getUsedLanguages() {
return myModel.importedLanguageIds();
}
public void addUsedLanguage(@NotNull SLanguage language) {
myModel.addLanguage(language);
}
public void removeUsedLanguage(@NotNull SLanguage language) {
myModel.deleteLanguageId(language);
}
public Collection<SLanguage> getLanguagesEngagedOnGeneration() {
return myModel.getLanguagesEngagedOnGeneration();
}
/**
* Use another model as source for necessary imports.
* Copies immediate imports of other models.
* @param other model to copy imports from
*/
public void copyImportedModelsFrom(@NotNull org.jetbrains.mps.openapi.model.SModel other) {
for (org.jetbrains.mps.openapi.model.SModelReference model : new ModelImports(other).getImportedModels()) {
myModel.addModelImport(model);
}
}
/**
* Use another model as source for necessary used languages.
* Note, only directly imported languages (not devkits nor closure of visible)
* @param other model to copy used languages from
*/
public void copyUsedLanguagesFrom(@NotNull org.jetbrains.mps.openapi.model.SModel other) {
for (SLanguage ref : ((SModelInternal) other).importedLanguageIds()) {
myModel.addLanguage(ref);
}
}
/**
* Use another model as source for necessary devkits.
* @param other model to copy devkit imports from
*/
public void copyEmployedDevKitsFrom(@NotNull org.jetbrains.mps.openapi.model.SModel other) {
for (SModuleReference ref : ((SModelInternal) other).importedDevkits()) {
myModel.addDevKit(ref);
}
}
/**
* Use another model as specification of languages that are engaged during generation.
* @param other model to copy engaged languages from
*/
public void copyLanguageEngagedOnGeneration(@NotNull org.jetbrains.mps.openapi.model.SModel other) {
for (SLanguage ref : ((SModelInternal) other).getLanguagesEngagedOnGeneration()) {
myModel.addEngagedOnGenerationLanguage(ref);
}
}
public void clearImportedModels() {
for (SModelReference ref : getImportedModels()) {
myModel.deleteModelImport(ref);
}
}
public void clearEmployedDevKits() {
for (SModuleReference ref : new ArrayList<>(myModel.importedDevkits())) {
myModel.deleteDevKit(ref);
}
}
public void clearUsedLanguages() {
for (SLanguage ref : new ArrayList<>(myModel.importedLanguageIds())) {
myModel.deleteLanguageId(ref);
}
}
}