core/kernel/source/jetbrains/mps/smodel/LanguageAspect.java (90 lines of code) (raw):
/*
* Copyright 2003-2025 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 jetbrains.mps.logging.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SModelName;
import org.jetbrains.mps.openapi.module.SModule;
import org.jetbrains.mps.openapi.persistence.ModelRoot;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
// NOTE, although quite some of these enums are not in use in MPS, there are uses in mbeddr!
public enum LanguageAspect {
//mostly migrated
STRUCTURE("structure"),
//mostly migrated
EDITOR("editor"),
//mostly migrated (no uses in MPS)
ACTIONS("actions"),
//mostly migrated
CONSTRAINTS("constraints"),
//mostly migrated
BEHAVIOR("behavior"),
//mostly migrated
TYPESYSTEM("typesystem"),
//mostly migrated (no uses in MPS)
REFACTORINGS("refactorings"),
//mostly migrated (no uses in MPS)
SCRIPTS("scripts"),
//mostly migrated (no uses in MPS)
INTENTIONS("intentions"),
//mostly migrated
FIND_USAGES("findUsages"),
//migrated, uncomment when migration is finished [compatibility] and deprecate this class
// (no uses in MPS)
PLUGIN("plugin"),
//mostly migrated (no uses in MPS)
DATA_FLOW("dataFlow"),
//mostly migrated (no uses in MPS)
TEST("test"),
//mostly migrated (no uses in MPS)
TEXT_GEN("textGen"),
//mostly migrated. No uses in MPS, 1 in mbeddr
MIGRATION("migration");
//TODO must be changed for each major/minor version release
public static final String HELP_CENTER_BASE = "https://www.jetbrains.com/help/mps/2024.1/";
private String myName;
LanguageAspect(String name) {
myName = name;
}
/**
* INTERNAL USE ONLY.
* Builds a class name of an aspect class according to hardcoded MPS convention.
*/
public String getAspectQualifiedClassName(@NotNull SAbstractConcept concept) {
return concept.getLanguage().getQualifiedName() + '.' + getName() + '.' + concept.getName();
}
public boolean is(@NotNull SModel sm) {
SModule module = sm.getModule();
if (!(module instanceof Language)) return false;
return get(((Language) module)) == sm;
}
@Nullable
public SModel get(Language l) {
return get_internal(l, false);
}
public SModel getOrCreate(Language l) {
Logger.getLogger(LanguageAspect.class).warnDeprecatedUse("Don't use legacy LanguageAspect class to create new aspect models");
return get_internal(l, true);
}
private SModel get_internal(Language l, boolean doCreate) {
final String aspectModelName = l.getModuleName() + '.' + myName;
for (SModel md : l.getModels()) {
if (aspectModelName.equals(md.getModelName())) {
return md;
}
}
return doCreate ? createNew(l) : null;
}
public String getName() {
return myName;
}
/**
* @deprecated use {@link jetbrains.mps.smodel.language.LanguageAspectDescriptor} alternative.
* There are no known uses, the method will be removed after 2025.2
*/
@Deprecated(forRemoval = true)
public SModel createNew(Language l) {
return createNew(l, true);
}
/**
* @deprecated use {@link jetbrains.mps.smodel.language.LanguageAspectDescriptor} alternative.
* There are no known uses, the method will be removed after 2025.2
*/
@Deprecated(forRemoval = true)
public SModel createNew(final Language l, final boolean saveModel) {
assert get(l) == null;
Logger.getLogger(LanguageAspect.class).warnDeprecatedUse("Don't use legacy LanguageAspect class to create new aspect models");
SModel structureModel = l.getStructureModelDescriptor();
ModelRoot modelRoot;
if (structureModel == null) {
modelRoot = l.getModelRoots().iterator().next();
} else {
modelRoot = structureModel.getModelRoot();
}
// I don't care there's no ModelsAutoImportManager, this is deprecated way to instantiate aspect models anyway
return modelRoot.createModel(new SModelName(l.getModuleName(), getName(), null));
}
//not used in MPS
//use jetbrains.mps.smodel.language.LanguageAspectSupport.getAspectModels()
// [2025] still 2 uses in mps-extensions
@Deprecated(since = "3.3", forRemoval = true)
public static Collection<SModel> getAspectModels(Language l) {
Set<SModel> result = new HashSet<>();
for (LanguageAspect aspect : LanguageAspect.values()) {
SModel asp = aspect.get(l);
if (asp != null) {
result.add(asp);
}
}
return result;
}
}