/****************************************************************************** * Copyright (c) 2009 - 2015 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *****************************************************************************/ package com.ibm.wala.memsat.frontEnd.engine; import java.io.IOException; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.dom.CompilationUnit; import com.ibm.wala.cast.java.client.JDTJavaSourceAnalysisEngine; import com.ibm.wala.cast.java.translator.SourceModuleTranslator; import com.ibm.wala.cast.java.translator.jdt.JDTClassLoaderFactory; import com.ibm.wala.cast.java.translator.jdt.JDTJava2CAstTranslator; import com.ibm.wala.cast.java.translator.jdt.JDTSourceLoaderImpl; import com.ibm.wala.cast.java.translator.jdt.JDTSourceModuleTranslator; import com.ibm.wala.cast.tree.CAstEntity; import com.ibm.wala.cast.tree.impl.CAstImpl; import com.ibm.wala.cast.tree.rewrite.AstLoopUnwinder; import com.ibm.wala.classLoader.ClassLoaderFactory; import com.ibm.wala.classLoader.IClassLoader; import com.ibm.wala.ide.util.EclipseFileProvider; import com.ibm.wala.ide.util.JdtPosition; import com.ibm.wala.ipa.callgraph.AnalysisOptions; import com.ibm.wala.ipa.callgraph.CallGraphBuilder; import com.ibm.wala.ipa.callgraph.Entrypoint; import com.ibm.wala.ipa.callgraph.propagation.InstanceKey; import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.memsat.MiniaturPlugin; import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.MethodReference; import com.ibm.wala.util.MonitorUtil.IProgressMonitor; import com.ibm.wala.util.config.SetOfClasses; public class MiniaturJDTJavaAnalysisEngine extends JDTJavaSourceAnalysisEngine<InstanceKey> implements MiniaturAnalysisEngine { // private final static int defaultLoopUnrollDepth = 3; private final int unrollDepth; private List<MethodReference> methods; public MiniaturJDTJavaAnalysisEngine(String project, int unrollDepth, List<MethodReference> methods) throws IOException, CoreException { super(project); this.unrollDepth = unrollDepth; this.methods = methods; setExclusionsFile( (new EclipseFileProvider()).getFileFromPlugin(MiniaturPlugin.getDefault(), "data/MiniaturExclusions.txt").getAbsolutePath()); } @Override protected ClassLoaderFactory makeClassLoaderFactory(SetOfClasses exclusions) { return new JDTClassLoaderFactory(exclusions) { @Override protected JDTSourceLoaderImpl makeSourceLoader(ClassLoaderReference classLoaderReference, IClassHierarchy cha, IClassLoader parent) throws IOException { return new JDTSourceLoaderImpl(classLoaderReference, parent, getExclusions(), cha) { @Override protected SourceModuleTranslator getTranslator() { return new JDTSourceModuleTranslator(cha.getScope(), this) { @Override protected JDTJava2CAstTranslator makeCAstTranslator(CompilationUnit astRoot, final IFile sourceFile, String fullPath) { return new JDTJava2CAstTranslator(sourceLoader, astRoot, fullPath, true) { @Override public CAstEntity translateToCAst() { CAstEntity ast = super.translateToCAst(); AstLoopUnwinder unwind = new AstLoopUnwinder(new CAstImpl(), true, unrollDepth); return unwind.translate(ast); } @Override public JdtPosition makePosition(int start, int end) { return new JdtPosition(start, end, this.cu.getLineNumber(start), this.cu.getLineNumber(end), sourceFile, this.fullPath); } }; } }; } }; } }; } public CallGraphBuilder buildCallGraph(IClassHierarchy cha, AnalysisOptions options, boolean savePointerAnalysis, IProgressMonitor monitor) throws com.ibm.wala.util.CancelException { return super.buildCallGraph(cha, options, savePointerAnalysis, monitor); } public IClassHierarchy getClassHierarchy() { if (super.getClassHierarchy() == null) { setClassHierarchy( buildClassHierarchy() ); } return super.getClassHierarchy(); } public PointerAnalysis<InstanceKey> getPointerAnalysis() { return super.getPointerAnalysis(); } public Iterable<Entrypoint> getEntrypoints() { return new MiniaturJavaEntrypoints(methods, getClassHierarchy()); } }