/* * 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.smodel; import jetbrains.mps.project.SModuleOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.util.annotation.ToRemove; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.language.SAbstractConcept; import org.jetbrains.mps.openapi.language.SLanguage; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.module.SModule; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.persistence.ModelRoot; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; public enum LanguageAspect { //mostly migrated STRUCTURE("structure", BootstrapLanguages.structureLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Structure"), //mostly migrated EDITOR("editor", BootstrapLanguages.editorLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Editor"), //mostly migrated ACTIONS("actions", BootstrapLanguages.actionsLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Editor+Actions"), //mostly migrated CONSTRAINTS("constraints", BootstrapLanguages.constraintsLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Constraints"), //mostly migrated BEHAVIOR("behavior", BootstrapLanguages.behaviorLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Behavior"), //mostly migrated TYPESYSTEM("typesystem", BootstrapLanguages.typesystemLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Typesystem"), //mostly migrated REFACTORINGS("refactorings", BootstrapLanguages.refactoringLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Refactoring"), //mostly migrated SCRIPTS("scripts", BootstrapLanguages.scriptLanguageRef(), null), //mostly migrated INTENTIONS("intentions", BootstrapLanguages.intentionsLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Intentions"), //mostly migrated FIND_USAGES("findUsages", BootstrapLanguages.findUsagesLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Find+usages"), //migrated, uncomment when migration is finished [compatibility] and deprecate this class PLUGIN("plugin", null, LanguageAspect.CONFLUENCE_BASE + "Plugin"){ @Override public Collection<SLanguage> getMainLanguages() { ArrayList<SLanguage> result = new ArrayList<SLanguage>(); result.add(MetaAdapterFactory.getLanguage(BootstrapLanguages.pluginLanguageRef())); result.add(MetaAdapterFactory.getLanguage(BootstrapLanguages.aspectLanguageRef())); return result; } }, //mostly migrated DATA_FLOW("dataFlow", BootstrapLanguages.dataFlowLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Data+flow#Dataflow-intermediatelanguage"), //mostly migrated TEST("test", BootstrapLanguages.testLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Language+tests+language#Languagetestslanguage-introduction"), //mostly migrated TEXT_GEN("textGen", BootstrapLanguages.textGenLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "TextGen"), //mostly migrated MIGRATION("migration", BootstrapLanguages.migrationLanguageRef(), LanguageAspect.CONFLUENCE_BASE + "Migrations"); //TODO must be changed for each major/minor version release public static final String CONFLUENCE_BASE = "http://confluence.jetbrains.com/display/MPSD20171/"; private String myName; private final SModuleReference myMainLang; private final String myHelpURL; LanguageAspect(String name, SModuleReference mainLang, String helpURL) { myName = name; myMainLang = mainLang; myHelpURL = helpURL; } /** * INTERNAL USE ONLY. * Builds a class name of an aspect class according to hardcoded MPS convention. */ public String getAspectQualifiedClassName(@NotNull SAbstractConcept concept) { StringBuilder builder = new StringBuilder(); builder.append(concept.getLanguage().getQualifiedName()); builder.append('.'); builder.append(getName()); builder.append('.'); builder.append(concept.getName()); return builder.toString(); } 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) { 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; } public SModel createNew(Language l) { return createNew(l, true); } public SModel createNew(final Language l, final boolean saveModel) { assert get(l) == null; SModel structureModel = l.getStructureModelDescriptor(); ModelRoot modelRoot; if (structureModel == null) { modelRoot = l.getModelRoots().iterator().next(); } else { modelRoot = structureModel.getModelRoot(); } return SModuleOperations.createModelWithAdjustments(l.getModuleName() + '.' + getName(), modelRoot); } @Nullable public String getHelpURL() { return myHelpURL; } // FIXME tell it as SLanguage // refactor to have constants as fields, not as methods @Deprecated public SModuleReference getMainLanguage() { return myMainLang; } public Collection<SLanguage> getMainLanguages() { ArrayList<SLanguage> res = new ArrayList<SLanguage>(); res.add(MetaAdapterFactory.getLanguage(getMainLanguage())); return res; } @Deprecated @ToRemove(version = 3.3) //not used in MPS //use jetbrains.mps.smodel.language.LanguageAspectSupport.getAspectModels() public static Collection<SModel> getAspectModels(Language l) { Set<SModel> result = new HashSet<SModel>(); for (LanguageAspect aspect : LanguageAspect.values()) { SModel asp = aspect.get(l); if (asp != null) { result.add(asp); } } return result; } }