package jetbrains.mps.baseLanguage.javastub; /*Generated by MPS */ import org.jetbrains.mps.annotations.Immutable; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import jetbrains.mps.project.AbstractModule; import java.util.Collection; import org.jetbrains.annotations.NotNull; import jetbrains.mps.extapi.model.SModelData; import jetbrains.mps.vfs.IFile; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.java.stub.StubReferenceFactory; import java.util.Collections; import jetbrains.mps.internal.collections.runtime.CollectionSequence; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.internal.collections.runtime.ITranslator2; @Immutable public final class ASMModelLoader { private static final Logger LOG = LogManager.getLogger(ASMModelLoader.class); private final AbstractModule myModule; private final Collection<String> myPaths; private boolean mySkipPrivate; private boolean myOnlyPublic; public ASMModelLoader(@NotNull AbstractModule module, Collection<String> paths) { myModule = module; myPaths = paths; } public ASMModelLoader onlyPublicClasses(boolean onlyPublicClasses) { myOnlyPublic = onlyPublicClasses; return this; } public ASMModelLoader skipPrivateMembers(boolean skipPrivateMembers) { mySkipPrivate = skipPrivateMembers; return this; } public void populateRoots(SModelData modelData) { // XXX may pass openapi.SModel in addition to SModelData so that ClassifierLoader may use model as factory for (IFile classfile : getTopClassFiles()) { ClassifierLoader loader = new ClassifierLoader(classfile, myOnlyPublic, mySkipPrivate); SNode c = loader.createClassifier(); if (c != null) { modelData.addRootNode(c); } } } public Collection<SModelReference> completeModel(SModel partialModel, SModelData completeModelData) { try { StubReferenceFactory refFactory = new StubReferenceFactory(myModule, partialModel); for (IFile classfile : getTopClassFiles()) { ClassifierLoader rootLoader = new ClassifierLoader(classfile, myOnlyPublic, mySkipPrivate); SNode c = rootLoader.createClassifier(); if (c != null) { rootLoader.updateClassifier(c, refFactory); completeModelData.addRootNode(c); } } return refFactory.getImports(); } catch (Throwable e) { LOG.error("Exception for model " + partialModel.getReference(), e); } return Collections.emptyList(); } public Iterable<IFile> getTopClassFiles() { return CollectionSequence.fromCollection(myPaths).select(new ISelector<String, IFile>() { public IFile select(String it) { return myModule.getFileSystem().getFile(it); } }).where(new IWhereFilter<IFile>() { public boolean accept(IFile it) { return it != null; } }).translate(new ITranslator2<IFile, IFile>() { public Iterable<IFile> translate(IFile it) { return it.getChildren(); } }).where(new IWhereFilter<IFile>() { public boolean accept(IFile it) { return !(it.isDirectory()) && it.getName().endsWith(".class") && !(ClassifierLoader.getClassName(it).contains("$")); } }); } }