package jetbrains.mps.debugger.java.runtime.evaluation.container; /*Generated by MPS */ import jetbrains.mps.project.AbstractModule; import org.jetbrains.mps.openapi.module.SModule; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.project.structure.modules.ModuleDescriptor; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import java.util.concurrent.atomic.AtomicInteger; import jetbrains.mps.vfs.IFile; import jetbrains.mps.project.structure.modules.ModuleReference; import jetbrains.mps.project.ModuleId; import org.jetbrains.mps.openapi.persistence.ModelRoot; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.persistence.PersistenceRegistry; import jetbrains.mps.extapi.persistence.FileBasedModelRoot; import org.jetbrains.mps.openapi.module.SDependency; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.extapi.module.TransientSModule; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.module.SDependencyImpl; import org.jetbrains.mps.openapi.module.SDependencyScope; import org.jetbrains.mps.openapi.language.SLanguage; import java.util.Collection; import jetbrains.mps.smodel.Language; import jetbrains.mps.smodel.ModuleRepositoryFacade; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import jetbrains.mps.smodel.adapter.MetaAdapterByDeclaration; /** * This module contains a necessary information for the 'evaluate expression' * action during a debug session. * Currently extends AbstractModule though it is obviously not one. */ public final class EvaluationModule extends AbstractModule implements SModule { private static final Logger LOG = LogManager.getLogger(EvaluationModule.class); private final ModuleDescriptor myDescriptor; private final Set<String> myClassPaths = SetSequence.fromSet(new HashSet<String>()); private static final AtomicInteger ourCounter = new AtomicInteger(); private static int incCounter() { return ourCounter.incrementAndGet(); } public EvaluationModule() { super((IFile) null); setModuleReference(new ModuleReference("Evaluation Container Module " + incCounter(), ModuleId.regular())); myDescriptor = new ModuleDescriptor(); } @Override public String toString() { return getModuleName() + " [evaluation module]"; } @Override public ModuleDescriptor getModuleDescriptor() { return myDescriptor; } @Override protected Iterable<ModelRoot> loadRoots() { Set<ModelRoot> result = new HashSet<ModelRoot>(); for (String stub : myClassPaths) { ModelRoot modelRoot = PersistenceFacade.getInstance().getModelRootFactory(PersistenceRegistry.JAVA_CLASSES_ROOT).create(); if (modelRoot instanceof FileBasedModelRoot) { ((FileBasedModelRoot) modelRoot).setContentRoot(stub); ((FileBasedModelRoot) modelRoot).addFile(FileBasedModelRoot.SOURCE_ROOTS, stub); } else { LOG.error("Unexpected model root type: " + modelRoot.getType() + " but need 'java_classes' model root"); } result.add(modelRoot); } return result; } public String addClassPathItem(String path) { if (SetSequence.fromSet(myClassPaths).contains(path)) { path = null; } else { SetSequence.fromSet(myClassPaths).addElement(path); myDescriptor.getAdditionalJavaStubPaths().add(path); } fireChanged(); return path; } @Override public Iterable<SDependency> getDeclaredDependencies() { Iterable<SModule> modules = getRepository().getModules(); return Sequence.fromIterable(modules).where(new IWhereFilter<SModule>() { public boolean accept(SModule it) { return it != EvaluationModule.this && !(it instanceof TransientSModule); } }).select(new ISelector<SModule, SDependencyImpl>() { public SDependencyImpl select(SModule it) { return (new SDependencyImpl(it, SDependencyScope.DEFAULT, false)); } }).ofType(SDependency.class); } @Override public Set<SLanguage> getUsedLanguages() { Collection<Language> languages = new ModuleRepositoryFacade(getRepository()).getAllModules(Language.class); return SetSequence.fromSetWithValues(new HashSet<SLanguage>(), CollectionSequence.fromCollection(languages).select(new ISelector<Language, SLanguage>() { public SLanguage select(Language it) { return MetaAdapterByDeclaration.getLanguage(it); } })); } @Override public boolean isReadOnly() { return false; } }