/* * 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.core.platform; import jetbrains.mps.classloading.ClassLoaderManager; import jetbrains.mps.components.ComponentPlugin; import jetbrains.mps.components.CoreComponent; import jetbrains.mps.generator.MPSGenerator; import jetbrains.mps.ide.findusages.MPSFindUsages; import jetbrains.mps.lang.dataFlow.MPSDataFlow; import jetbrains.mps.library.LibraryInitializer; import jetbrains.mps.make.facets.MPSMake; import jetbrains.mps.persistence.MPSPersistence; import jetbrains.mps.smodel.MPSModuleRepository; import jetbrains.mps.smodel.language.LanguageRegistry; import jetbrains.mps.text.impl.MPSTextGenerator; import jetbrains.mps.typesystem.MPSTypesystem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import jetbrains.mps.extapi.persistence.ModelFactoryRegistry; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; class PlatformBase implements Platform { private MPSCore myCore; private MPSPersistence myPersistence; private MPSGenerator myGenerator; private MPSTypesystem myTypesystem; private MPSFindUsages myFindUsages; private MPSTextGenerator myTextGen; private MPSDataFlow myDataFlow; private MPSMake myMake; PlatformBase(PlatformOptionsBuilder options) { if (options.loadsCore()) { myCore = new MPSCore(); myCore.init(); } if (options.loadsPersistence()) { myPersistence = new MPSPersistence(myCore.getPersistenceFacade()); myPersistence.init(); } if (options.loadsOthers()) { myMake = new MPSMake(myCore.getLanguageRegistry()); myTypesystem = new MPSTypesystem(myCore.getLanguageRegistry(), myCore.getClassLoaderManager()); myGenerator = new MPSGenerator(); myFindUsages = new MPSFindUsages(myCore.getLanguageRegistry()); myTextGen = new MPSTextGenerator(myCore.getLanguageRegistry()); myDataFlow = new MPSDataFlow(myCore.getClassLoaderManager()); myMake.init(); myTypesystem.init(); myGenerator.init(); myFindUsages.init(); myTextGen.init(); myDataFlow.init(); } } @Override public <T extends CoreComponent> T findComponent(@NotNull Class<T> componentClass) { if (LibraryInitializer.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getLibraryInitializer()); } if (PersistenceFacade.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getPersistenceFacade()); } if (ClassLoaderManager.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getClassLoaderManager()); } if (MPSModuleRepository.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getModuleRepository()); } if (LanguageRegistry.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getLanguageRegistry()); } if (ModelFactoryRegistry.class.isAssignableFrom(componentClass)) { return componentClass.cast(myCore.getModelFactoryRegistry()); } return null; } @Override public void dispose() { dispose(myMake); dispose(myDataFlow); dispose(myTextGen); dispose(myFindUsages); dispose(myGenerator); dispose(myTypesystem); dispose(myPersistence); dispose(myCore); } private static void dispose(@Nullable ComponentPlugin plugin) { if (plugin != null) { plugin.dispose(); } } }