more type parameters for analysis engine

This commit is contained in:
Julian Dolby 2018-04-10 16:00:44 -04:00
parent e2c1f72a3e
commit 41d254d547
13 changed files with 89 additions and 77 deletions

View File

@ -40,6 +40,7 @@ import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.IClassHierarchy;
@ -345,11 +346,11 @@ public abstract class IRTests {
return new String[] { "L" + pkgName + "/" + getTestName().substring(4) };
}
protected abstract <I extends InstanceKey> AbstractAnalysisEngine<I> getAnalysisEngine(String[] mainClassDescriptors, Collection<String> sources, List<String> libs);
protected abstract <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> getAnalysisEngine(String[] mainClassDescriptors, Collection<String> sources, List<String> libs);
public <I extends InstanceKey> Pair<CallGraph, PointerAnalysis<I>> runTest(Collection<String> sources, List<String> libs,
String[] mainClassDescriptors, List<? extends IRAssertion> ca, boolean assertReachable) throws IllegalArgumentException, CancelException, IOException {
AbstractAnalysisEngine<I> engine = getAnalysisEngine(mainClassDescriptors, sources, libs);
AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> engine = getAnalysisEngine(mainClassDescriptors, sources, libs);
CallGraph callGraph;
callGraph = engine.buildDefaultCallGraph();

View File

@ -43,7 +43,7 @@ import com.ibm.wala.util.io.FileProvider;
/**
*/
public abstract class JavaSourceAnalysisEngine<I extends InstanceKey> extends AbstractAnalysisEngine<I> {
public abstract class JavaSourceAnalysisEngine<I extends InstanceKey> extends AbstractAnalysisEngine<I, CallGraphBuilder<I>, Void> {
/**
* Modules which are user-space code

View File

@ -51,7 +51,7 @@ import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.Pair;
import com.ibm.wala.util.debug.Assertions;
public abstract class JavaScriptAnalysisEngine<I extends InstanceKey> extends AbstractAnalysisEngine<I> {
public abstract class JavaScriptAnalysisEngine<I extends InstanceKey> extends AbstractAnalysisEngine<I, CallGraphBuilder<I>, Void> {
protected JavaScriptLoaderFactory loaderFactory;
protected JavaScriptTranslatorFactory translatorFactory;

View File

@ -74,7 +74,7 @@ import com.ibm.wala.util.intset.OrdinalSet;
*
* @author Julian Dolby
*/
public class SimpleThreadEscapeAnalysis extends AbstractAnalysisEngine<InstanceKey> {
public class SimpleThreadEscapeAnalysis extends AbstractAnalysisEngine<InstanceKey, CallGraphBuilder<InstanceKey>, Void> {
private final Set<JarFile> applicationJarFiles;

View File

@ -30,6 +30,7 @@ import com.ibm.wala.ipa.callgraph.IAnalysisCacheView;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PropagationCallGraphBuilder;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.ipa.cha.ClassHierarchyFactory;
import com.ibm.wala.ipa.cha.IClassHierarchy;
@ -51,7 +52,7 @@ import com.ibm.wala.util.io.FileProvider;
* Some clients choose to build on this, but many don't. I usually don't in new code; I usually don't find the re-use enabled by
* this class compelling. I would probably nuke this except for some legacy code that uses it.
*/
public abstract class AbstractAnalysisEngine<I extends InstanceKey> implements AnalysisEngine {
public abstract class AbstractAnalysisEngine<I extends InstanceKey, X extends CallGraphBuilder<I>, Y> implements AnalysisEngine {
public interface EntrypointBuilder {
Iterable<Entrypoint> createEntrypoints(AnalysisScope scope, IClassHierarchy cha);
@ -126,11 +127,11 @@ public abstract class AbstractAnalysisEngine<I extends InstanceKey> implements A
private EntrypointBuilder entrypointBuilder = this::makeDefaultEntrypoints;
protected abstract CallGraphBuilder<I> getCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, IAnalysisCacheView cache2);
protected abstract X getCallGraphBuilder(IClassHierarchy cha, AnalysisOptions options, IAnalysisCacheView cache2);
protected CallGraphBuilder buildCallGraph(IClassHierarchy cha, AnalysisOptions options, boolean savePointerAnalysis,
protected X buildCallGraph(IClassHierarchy cha, AnalysisOptions options, boolean savePointerAnalysis,
IProgressMonitor monitor) throws IllegalArgumentException, CancelException {
CallGraphBuilder<I> builder = getCallGraphBuilder(cha, options, cache);
X builder = getCallGraphBuilder(cha, options, cache);
cg = builder.makeCallGraph(options, monitor);
@ -300,7 +301,7 @@ public abstract class AbstractAnalysisEngine<I extends InstanceKey> implements A
* @throws IllegalArgumentException
* @throws IOException
*/
public CallGraphBuilder defaultCallGraphBuilder() throws IllegalArgumentException, CancelException, IOException {
public X defaultCallGraphBuilder() throws IllegalArgumentException, CancelException, IOException {
buildAnalysisScope();
IClassHierarchy cha = buildClassHierarchy();
setClassHierarchy(cha);
@ -322,4 +323,9 @@ public abstract class AbstractAnalysisEngine<I extends InstanceKey> implements A
return options;
}
@SuppressWarnings("unused")
public Y performAnalysis(PropagationCallGraphBuilder builder) throws CancelException {
return null;
}
}

View File

@ -22,6 +22,7 @@ import java.util.Map;
import java.util.Set;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
@ -61,7 +62,7 @@ import com.ibm.wala.util.warnings.Warning;
* This class reads method summaries from an XML Stream.
*/
public class XMLMethodSummaryReader implements BytecodeConstants {
static final boolean DEBUG = false;
/**
@ -198,8 +199,7 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
try {
readXML(xmlFile);
} catch (Exception e) {
e.printStackTrace();
Assertions.UNREACHABLE();
throw new Error("bad xml file", e);
}
}
@ -208,7 +208,8 @@ public class XMLMethodSummaryReader implements BytecodeConstants {
assert xml != null : "Null xml stream";
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.newSAXParser().parse(new InputSource(xml), handler);
SAXParser parser = factory.newSAXParser();
parser.parse(new InputSource(xml), handler);
}
/**

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="source"/>
<classpathentry kind="src" path="data"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,7 @@ import com.ibm.wala.cast.java.ipa.callgraph.JavaSourceAnalysisScope;
import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
@ -27,7 +28,7 @@ public class ECJJavaIRTest extends JavaIRTests {
}
@Override
protected <I extends InstanceKey> AbstractAnalysisEngine<I> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
protected <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
JavaSourceAnalysisEngine<I> engine = new ECJJavaSourceAnalysisEngine<I>() {
@Override
protected Iterable<Entrypoint> makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) {

View File

@ -32,6 +32,7 @@ import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
@ -52,7 +53,7 @@ public class ECJSyncDuplicatorTest extends SyncDuplicatorTests {
Dispatch.STATIC);
@Override
protected <I extends InstanceKey> AbstractAnalysisEngine<I> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
protected <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
JavaSourceAnalysisEngine<I> engine = new ECJJavaSourceAnalysisEngine<I>() {
@Override
protected Iterable<Entrypoint> makeDefaultEntrypoints(AnalysisScope scope, IClassHierarchy cha) {

View File

@ -44,6 +44,7 @@ import java.util.List;
import com.ibm.wala.cast.java.jdt.test.Activator;
import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.ide.tests.util.EclipseTestUtil.ZippedProjectData;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
public class JDTJavaIRTests extends JavaIRTests {
@ -73,7 +74,7 @@ public class JDTJavaIRTests extends JavaIRTests {
}
@Override
protected <I extends InstanceKey> AbstractAnalysisEngine<I> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
protected <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
return JDTJavaTest.makeAnalysisEngine(mainClassDescriptors, project);
}
}

View File

@ -23,6 +23,7 @@ import com.ibm.wala.client.AbstractAnalysisEngine;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.ide.tests.util.EclipseTestUtil.ZippedProjectData;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.InstanceKey;
@ -44,12 +45,12 @@ public abstract class JDTJavaTest extends IRTests {
}
@Override
protected <I extends InstanceKey> AbstractAnalysisEngine<I> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
protected <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> getAnalysisEngine(final String[] mainClassDescriptors, Collection<String> sources, List<String> libs) {
return makeAnalysisEngine(mainClassDescriptors, project);
}
static <I extends InstanceKey> AbstractAnalysisEngine<I> makeAnalysisEngine(final String[] mainClassDescriptors, ZippedProjectData project) {
AbstractAnalysisEngine<I> engine;
static <I extends InstanceKey> AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> makeAnalysisEngine(final String[] mainClassDescriptors, ZippedProjectData project) {
AbstractAnalysisEngine<I, CallGraphBuilder<I>, ?> engine;
engine = new JDTJavaSourceAnalysisEngine<I>(project.projectName) {
{
setDump(Boolean.parseBoolean(System.getProperty("wala.cast.dump", "false")));

View File

@ -30,7 +30,7 @@ import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.io.FileProvider;
abstract public class EclipseProjectAnalysisEngine<P, I extends InstanceKey> extends AbstractAnalysisEngine<I> {
abstract public class EclipseProjectAnalysisEngine<P, I extends InstanceKey> extends AbstractAnalysisEngine<I, CallGraphBuilder<I>, Void> {
protected final P project;