package org.erlide.core.internal.dev; import java.io.PrintStream; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.erlide.engine.ErlangEngine; import org.erlide.engine.model.ErlModelException; import org.erlide.engine.model.IErlElement; import org.erlide.engine.model.SourcePathUtils; import org.erlide.engine.model.erlang.IErlAttribute; import org.erlide.engine.model.erlang.IErlFunction; import org.erlide.engine.model.erlang.IErlImportExport; import org.erlide.engine.model.erlang.IErlPreprocessorDef; import org.erlide.engine.model.erlang.IErlTypespec; import org.erlide.engine.model.root.IErlModel; import org.erlide.engine.model.root.IErlModule; import org.erlide.engine.model.root.IErlProject; import org.erlide.engine.model.root.SourcePathProvider; import org.erlide.util.ErlLogger; import com.google.common.collect.Lists; import com.google.common.collect.Sets; public class ParserDB { private static ParserDB db; private static PrintStream out; private static volatile boolean running = false; public static void create() { final Runnable x = new Runnable() { @Override public void run() { running = true; try { db = new ParserDB(); // out = new PrintStream( // new File("/home/qvladum/parserDB.txt")); out = System.out; final IErlModel model = ErlangEngine.getInstance().getModel(); final Collection<SourcePathProvider> sourcePathProviders = SourcePathUtils .getSourcePathProviders(); final long time = System.currentTimeMillis(); db.run(model, sourcePathProviders, false); System.out.println( " took " + (System.currentTimeMillis() - time) / 1000); } catch (final Exception e) { ErlLogger.error(e); } running = false; } }; if (!running) { new Thread(x).start(); } } private void run(final IErlModel model, final Collection<SourcePathProvider> sourcePathProviders, final boolean includeTests) throws ErlModelException { // we include all projects in workspace - create one for OTP too int normal = 0; int test = 0; final Collection<IErlProject> projects = model.getErlangProjects(); for (final IErlProject project : projects) { final Collection<IErlModule> modules = project.getModulesAndIncludes(); for (final IErlModule module : modules) { if (isTest(module.getResource().getLocation().toPortableString())) { test++; } else { normal++; } handleModule(module); } if (includeTests) { // final TestCodeBuilder builder = new TestCodeBuilder(); // try { // final Set<BuildResource> resources = builder // .getAffectedResources( // (IProject) project.getResource(), // new NullProgressMonitor(), false); // for (final BuildResource res : resources) { // if (res.getResource().isLinked() // || res.getResource().isDerived()) { // System.out.println("SKIP!!!! " + res.getResource()); // continue; // } // test++; // final IErlModule module = ErlModelManager // .getInstance().getModel().findModule( // (IFile) res.getResource()); // handleModule(module); // } // } catch (final CoreException e) { // ErlLogger.error(e); // } } } out.println("--- " + normal + " " + test); System.out.println("--- " + normal + " " + test); } public void handleModule(final IErlModule module) throws ErlModelException { module.open(null); final int numForms = module.getChildCount(); final String path = module.getResource().getLocation().toPortableString(); out.println(path + " " + numForms + " " + isTest(path)); System.out.println(path + " " + numForms + " " + isTest(path)); for (final IErlElement form : module.getChildren()) { out.print(" " + form.getKind() + " "); if (form instanceof IErlImportExport) { final IErlImportExport export = (IErlImportExport) form; out.println(export.getFunctions().size()); } else if (form instanceof IErlPreprocessorDef) { final IErlPreprocessorDef def = (IErlPreprocessorDef) form; out.println(fix(def.getDefinedName())); } else if (form instanceof IErlTypespec) { final IErlTypespec attribute = (IErlTypespec) form; out.println("TYPESPEC " + fix(attribute.getName())); } else if (form instanceof IErlAttribute) { final IErlAttribute attribute = (IErlAttribute) form; out.println(fix(attribute.getName())); } else if (form instanceof IErlFunction) { final IErlFunction function = (IErlFunction) form; int numClauses = function.getChildCount(); numClauses = numClauses == 0 ? 1 : numClauses; out.println(fix(function.getName()) + " " + function.getArity() + " " + numClauses); } else { out.println("?? " + form.getClass().getName()); } } module.close(); module.dispose(); } private String fix(final String name) { return name.trim().replace(' ', '^'); } public List<String> getTestSourcePaths( final Collection<SourcePathProvider> sourcePathProviders, final Collection<IErlProject> projects) { final List<String> spaths = Lists.newArrayList(); for (final IErlProject project : projects) { final Set<IPath> paths = Sets.newHashSet(); for (final SourcePathProvider provider : sourcePathProviders) { final IProject resource = (IProject) project.getResource(); paths.addAll(provider.getSourcePathsForModel(resource)); } for (final IPath path : paths) { spaths.add(path.toPortableString()); } } Collections.sort(spaths); return spaths; } private boolean isTest(final String path) { return path.contains("/test/") || path.contains("_SUITE"); } }