GT-3354: Removing some Guava

This commit is contained in:
Ryan Kurtz 2019-12-05 14:34:03 -05:00
parent 3a6c3312fe
commit 2a64cf2a77
20 changed files with 91 additions and 155 deletions

View file

@ -19,7 +19,8 @@ import static org.junit.Assert.*;
import java.awt.Container; import java.awt.Container;
import java.awt.Window; import java.awt.Window;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -27,8 +28,6 @@ import javax.swing.*;
import org.junit.After; import org.junit.After;
import com.google.common.collect.Lists;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.test.AbstractDockingTest; import docking.test.AbstractDockingTest;
import docking.widgets.fieldpanel.support.Highlight; import docking.widgets.fieldpanel.support.Highlight;
@ -47,6 +46,7 @@ import ghidra.test.AbstractProgramBasedTest;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.search.memory.MemSearchResult; import ghidra.util.search.memory.MemSearchResult;
import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraTable;
import util.CollectionUtils;
/** /**
* Base class for memory search tests. * Base class for memory search tests.
@ -192,7 +192,7 @@ public abstract class AbstractMemSearchTest extends AbstractProgramBasedTest {
AddressSet addressSet = runSwing(() -> markers.getAddressSet()); AddressSet addressSet = runSwing(() -> markers.getAddressSet());
AddressIterator it = addressSet.getAddresses(true); AddressIterator it = addressSet.getAddresses(true);
List<Address> list = Lists.newArrayList((Iterator<Address>) it); List<Address> list = CollectionUtils.asStream(it).collect(Collectors.toList());
assertListEqualUnordered("Search markers not correctly generated", expected, list); assertListEqualUnordered("Search markers not correctly generated", expected, list);
} }
@ -208,8 +208,7 @@ public abstract class AbstractMemSearchTest extends AbstractProgramBasedTest {
protected void performSearchTest(List<Address> expected, String buttonText) throws Exception { protected void performSearchTest(List<Address> expected, String buttonText) throws Exception {
for (int i = 0; i < expected.size(); i++) { for (Address addr : expected) {
Address addr = expected.get(i);
pressSearchButton(buttonText); pressSearchButton(buttonText);
assertEquals("Found", getStatusText()); assertEquals("Found", getStatusText());
cb.updateNow(); cb.updateNow();

View file

@ -25,7 +25,7 @@
import java.util.*; import java.util.*;
import com.google.common.collect.Iterators; import org.apache.commons.collections4.IteratorUtils;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.app.decompiler.parallel.*; import ghidra.app.decompiler.parallel.*;
@ -53,12 +53,12 @@ public class CompareFunctionSizesScript extends GhidraScript {
throws Exception { throws Exception {
InstructionIterator instIter = currentProgram.getListing().getInstructions( InstructionIterator instIter = currentProgram.getListing().getInstructions(
results.getFunction().getBody(), true); results.getFunction().getBody(), true);
int numInstructions = Iterators.size(instIter); int numInstructions = IteratorUtils.size(instIter);
//indicate failure of decompilation by having 0 high pcode ops //indicate failure of decompilation by having 0 high pcode ops
int numHighOps = 0; int numHighOps = 0;
if (results.getHighFunction() != null && if (results.getHighFunction() != null &&
results.getHighFunction().getPcodeOps() != null) { results.getHighFunction().getPcodeOps() != null) {
numHighOps = Iterators.size(results.getHighFunction().getPcodeOps()); numHighOps = IteratorUtils.size(results.getHighFunction().getPcodeOps());
} }
return new FuncBodyData(results.getFunction(), numInstructions, numHighOps); return new FuncBodyData(results.getFunction(), numInstructions, numHighOps);
} }
@ -66,7 +66,7 @@ public class CompareFunctionSizesScript extends GhidraScript {
Set<Function> funcsToDecompile = new HashSet<>(); Set<Function> funcsToDecompile = new HashSet<>();
FunctionIterator fIter = currentProgram.getFunctionManager().getFunctionsNoStubs(true); FunctionIterator fIter = currentProgram.getFunctionManager().getFunctionsNoStubs(true);
Iterators.addAll(funcsToDecompile, fIter); fIter.forEach(e -> funcsToDecompile.add(e));
if (funcsToDecompile.isEmpty()) { if (funcsToDecompile.isEmpty()) {
popup("No functions to decompile!"); popup("No functions to decompile!");

View file

@ -26,8 +26,6 @@
import java.util.*; import java.util.*;
import com.google.common.collect.Iterators;
import ghidra.app.decompiler.*; import ghidra.app.decompiler.*;
import ghidra.app.decompiler.parallel.*; import ghidra.app.decompiler.parallel.*;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
@ -71,7 +69,7 @@ public class FindPotentialDecompilerProblems extends GhidraScript {
Set<Function> funcsToDecompile = new HashSet<>(); Set<Function> funcsToDecompile = new HashSet<>();
FunctionIterator fIter = currentProgram.getFunctionManager().getFunctionsNoStubs(true); FunctionIterator fIter = currentProgram.getFunctionManager().getFunctionsNoStubs(true);
Iterators.addAll(funcsToDecompile, fIter); fIter.forEach(e -> funcsToDecompile.add(e));
if (funcsToDecompile.isEmpty()) { if (funcsToDecompile.isEmpty()) {
popup("No functions to decompile!"); popup("No functions to decompile!");

View file

@ -22,6 +22,7 @@ import java.awt.KeyboardFocusManager;
import java.awt.event.*; import java.awt.event.*;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import javax.swing.*; import javax.swing.*;
@ -32,8 +33,6 @@ import org.jdom.*;
import org.jdom.input.SAXBuilder; import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter; import org.jdom.output.XMLOutputter;
import com.google.common.collect.Sets;
import docking.DockingTool; import docking.DockingTool;
import docking.DockingUtils; import docking.DockingUtils;
import docking.action.*; import docking.action.*;
@ -493,10 +492,10 @@ public class KeyBindingUtils {
*/ */
public static Set<DockingActionIf> getActions(Set<DockingActionIf> allActions, String owner, public static Set<DockingActionIf> getActions(Set<DockingActionIf> allActions, String owner,
String name) { String name) {
return allActions.stream()
Set<DockingActionIf> ownerMatch = .filter(a -> a.getOwner().equals(owner))
Sets.filter(allActions, action -> action.getOwner().equals(owner)); .filter(a -> a.getName().equals(name))
return Sets.filter(ownerMatch, action -> action.getName().equals(name)); .collect(Collectors.toSet());
} }
/** /**

View file

@ -37,8 +37,6 @@ import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Sets;
import docking.*; import docking.*;
import docking.action.DockingActionIf; import docking.action.DockingActionIf;
import docking.action.ToggleDockingActionIf; import docking.action.ToggleDockingActionIf;
@ -1137,7 +1135,9 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
public static Set<DockingActionIf> getActionsByOwnerAndName(DockingTool tool, String owner, public static Set<DockingActionIf> getActionsByOwnerAndName(DockingTool tool, String owner,
String name) { String name) {
Set<DockingActionIf> ownerActions = tool.getDockingActionsByOwnerName(owner); Set<DockingActionIf> ownerActions = tool.getDockingActionsByOwnerName(owner);
return Sets.filter(ownerActions, action -> action.getName().equals(name)); return ownerActions.stream()
.filter(action -> action.getName().equals(name))
.collect(Collectors.toSet());
} }
/** /**

View file

@ -36,6 +36,7 @@ import java.util.concurrent.atomic.AtomicReference;
import javax.swing.*; import javax.swing.*;
import javax.swing.table.JTableHeader; import javax.swing.table.JTableHeader;
import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -43,8 +44,6 @@ import org.apache.logging.log4j.*;
import org.apache.logging.log4j.core.config.Configurator; import org.apache.logging.log4j.core.config.Configurator;
import org.junit.*; import org.junit.*;
import com.google.common.collect.Iterables;
import docking.*; import docking.*;
import docking.action.DockingAction; import docking.action.DockingAction;
import docking.test.AbstractDockingTest; import docking.test.AbstractDockingTest;
@ -1755,7 +1754,8 @@ public class GhidraFileChooserTest extends AbstractDockingTest {
CompletableFuture<List<File>> results = showMultiSelectionChooser(files.parent, FILES_ONLY); CompletableFuture<List<File>> results = showMultiSelectionChooser(files.parent, FILES_ONLY);
selectFiles(Iterables.concat(files.files, files.dirs)); selectFiles(CollectionUtils.asIterable(
IteratorUtils.chainedIterator(files.files.iterator(), files.dirs.iterator())));
pressOk(); pressOk();
assertChooserHidden(); assertChooserHidden();
@ -1769,11 +1769,13 @@ public class GhidraFileChooserTest extends AbstractDockingTest {
CompletableFuture<List<File>> results = CompletableFuture<List<File>> results =
showMultiSelectionChooser(files.parent, GhidraFileChooserMode.FILES_AND_DIRECTORIES); showMultiSelectionChooser(files.parent, GhidraFileChooserMode.FILES_AND_DIRECTORIES);
selectFiles(Iterables.concat(files.files, files.dirs)); selectFiles(CollectionUtils.asIterable(
IteratorUtils.chainedIterator(files.files.iterator(), files.dirs.iterator())));
pressOk(); pressOk();
assertChooserHidden(); assertChooserHidden();
assertChosen(results, Iterables.concat(files.files, files.dirs)); // dirs are dropped assertChosen(results, CollectionUtils.asIterable(
IteratorUtils.chainedIterator(files.files.iterator(), files.dirs.iterator()))); // dirs are dropped
} }
//================================================================================================== //==================================================================================================

View file

@ -18,11 +18,14 @@ package ghidra.util;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.*; import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import util.CollectionUtils;
public final class NumericUtilities { public final class NumericUtilities {
public static final BigInteger MAX_UNSIGNED_LONG = new BigInteger("ffffffffffffffff", 16); public static final BigInteger MAX_UNSIGNED_LONG = new BigInteger("ffffffffffffffff", 16);
public static final BigInteger MAX_SIGNED_LONG = new BigInteger("7fffffffffffffff", 16); public static final BigInteger MAX_SIGNED_LONG = new BigInteger("7fffffffffffffff", 16);
@ -694,9 +697,7 @@ public final class NumericUtilities {
* @return hex string representation * @return hex string representation
*/ */
public static String convertBytesToString(Iterable<Byte> bytes, String delimiter) { public static String convertBytesToString(Iterable<Byte> bytes, String delimiter) {
return convertBytesToString(CollectionUtils.asStream(bytes), delimiter);
Stream<Byte> stream = StreamSupport.stream(bytes.spliterator(), false);
return convertBytesToString(stream, delimiter);
} }
/** /**

View file

@ -24,24 +24,18 @@ import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.*;
/** /**
* A collection of utility methods that prevent you from having to do unsafe casts of * A collection of utility methods that prevent you from having to do unsafe casts of
* {@link Collection} classes due to runtime type erasure. * {@link Collection} classes due to runtime type erasure.
* *
* <P>Be sure to check Guava and Apache collection utils before using this class, as they are * <P>Be sure to check Apache collection utils before using this class, as it's a
* standard utilities and often more efficient. * standard utility and often more efficient.
* *
* <P>Some examples: * <P>Some examples:
* <OL> * <OL>
* <LI>{@link Iterators}</LI>
* <LI>{@link Iterables}</LI>
* <LI>{@link org.apache.commons.collections4.CollectionUtils}</LI> * <LI>{@link org.apache.commons.collections4.CollectionUtils}</LI>
* <LI>{@link IterableUtils}</LI> * <LI>{@link IterableUtils}</LI>
* <LI>{@link IteratorUtils}</LI> * <LI>{@link IteratorUtils}</LI>
* <LI>{@link Maps}</LI>
* <LI>{@link Sets}</LI>
* <LI>{@link StringUtils#join(Iterable, char)} - for pretty printing collections with newlines</LI> * <LI>{@link StringUtils#join(Iterable, char)} - for pretty printing collections with newlines</LI>
* <LI><code>Apache CollectionUtils.collect(Collection, Transformer)</code> - to turn a * <LI><code>Apache CollectionUtils.collect(Collection, Transformer)</code> - to turn a
* collection in to collection of strings when the default <code>toString()</code> is lacking</LI> * collection in to collection of strings when the default <code>toString()</code> is lacking</LI>
@ -404,21 +398,6 @@ public class CollectionUtils {
return () -> iterator; return () -> iterator;
} }
/**
* Combines all collections passed-in, using {@link Iterables}, into a pass-through
* (not creating a new collection) Iterable.
*
* <P>This is just a convenience method for {@link Iterables#concat(Iterable)}
*
* @param iterables the iterables to combine
* @return the iterable
*/
@SafeVarargs
public static <T> Iterable<T> asIterable(Iterable<T>... iterables) {
Iterable<T> concat = Iterables.concat(iterables);
return concat;
}
/** /**
* Turns the given iterator into a stream * Turns the given iterator into a stream
* *
@ -430,16 +409,15 @@ public class CollectionUtils {
} }
/** /**
* Combines all iterables passed-in, using {@link Iterables}, into a pass-through * Combines all iterables passed-in into a pass-through (not creating a new collection) Stream.
* (not creating a new collection) Stream.
* *
* @param iterables the iterables to combine * @param iterables the iterables to combine
* @return the stream * @return the stream
*/ */
@SafeVarargs @SafeVarargs
public static <T> Stream<T> asStream(Iterable<T>... iterables) { public static <T> Stream<T> asStream(Iterable<T>... iterables) {
Iterable<T> concat = Iterables.concat(iterables); Stream<T> s = Stream.of(iterables)
Stream<T> s = StreamSupport.stream(concat.spliterator(), false); .flatMap(e -> StreamSupport.stream(e.spliterator(), false));
return s; return s;
} }

View file

@ -15,7 +15,7 @@
*/ */
package util; package util;
import static org.hamcrest.collection.IsIn.isOneOf; import static org.hamcrest.collection.IsIn.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.util.*; import java.util.*;
@ -225,21 +225,6 @@ public class CollectionUtilsTest {
assertEquals("One", iterator.next()); assertEquals("One", iterator.next());
} }
@Test
public void testAsIterable_Collections() {
List<String> original = Arrays.asList("One", "Two", "Three", "Four");
Collection<String> a = Arrays.asList(original.get(0), original.get(1));
Collection<String> b = Arrays.asList(original.get(2));
Collection<String> c = Collections.emptyList();
Collection<String> d = Arrays.asList(original.get(3));
Iterable<String> iterable = CollectionUtils.asIterable(a, b, c, d);
List<String> result = new ArrayList<>();
iterable.forEach(s -> result.add(s));
assertEquals(original, result);
}
@Test @Test
public void testAsList_UnknownToType() { public void testAsList_UnknownToType() {
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();

View file

@ -20,12 +20,11 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.*; import java.util.*;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.TitledBorder; import javax.swing.border.TitledBorder;
import com.google.common.collect.Iterables;
import docking.DialogComponentProvider; import docking.DialogComponentProvider;
import docking.options.editor.ButtonPanelFactory; import docking.options.editor.ButtonPanelFactory;
import docking.tool.ToolConstants; import docking.tool.ToolConstants;
@ -163,9 +162,8 @@ class ImportGhidraToolsDialog extends DialogComponentProvider {
Set<ToolTemplate> defaultTools = ToolUtils.getDefaultApplicationTools(); Set<ToolTemplate> defaultTools = ToolUtils.getDefaultApplicationTools();
Set<ToolTemplate> extraTools = ToolUtils.getExtraApplicationTools(); Set<ToolTemplate> extraTools = ToolUtils.getExtraApplicationTools();
Iterable<String> defaultToolNames = Stream<String> defaultToolNames = defaultTools.stream().map(ToolTemplate::getPath);
Iterables.transform(defaultTools, ToolTemplate::getPath); Stream<String> extraToolNames = extraTools.parallelStream().map(ToolTemplate::getPath);
Iterable<String> extraToolNames = Iterables.transform(extraTools, ToolTemplate::getPath);
int elementCount = defaultTools.size() + extraTools.size(); int elementCount = defaultTools.size() + extraTools.size();
tools = new String[elementCount]; tools = new String[elementCount];

View file

@ -15,10 +15,7 @@
*/ */
package ghidra.app.plugin.assembler.sleigh.expr; package ghidra.app.plugin.assembler.sleigh.expr;
import java.util.Map; import java.util.*;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import ghidra.app.plugin.assembler.sleigh.sem.*; import ghidra.app.plugin.assembler.sleigh.sem.*;
import ghidra.app.plugin.processors.sleigh.Constructor; import ghidra.app.plugin.processors.sleigh.Constructor;
@ -79,7 +76,7 @@ public class OperandValueSolver extends AbstractExpressionSolver<OperandValue> {
AssemblyResolvedError err = (AssemblyResolvedError) result; AssemblyResolvedError err = (AssemblyResolvedError) result;
return AssemblyResolution.error(err.getError(), return AssemblyResolution.error(err.getError(),
"Solution to " + sym.getName() + " := " + goal + " = " + patexp, "Solution to " + sym.getName() + " := " + goal + " = " + patexp,
ImmutableList.of(result)); List.of(result));
} }
// TODO: Shifting here seems like a hack to me. // TODO: Shifting here seems like a hack to me.
// I assume this only comes at the top of an expression // I assume this only comes at the top of an expression

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.assembler.sleigh.expr;
import java.util.*; import java.util.*;
import com.google.common.collect.ImmutableSet;
import ghidra.app.plugin.assembler.sleigh.sem.AssemblyResolution; import ghidra.app.plugin.assembler.sleigh.sem.AssemblyResolution;
import ghidra.app.plugin.assembler.sleigh.sem.AssemblyResolvedConstructor; import ghidra.app.plugin.assembler.sleigh.sem.AssemblyResolvedConstructor;
import ghidra.app.plugin.assembler.sleigh.util.DbgTimer; import ghidra.app.plugin.assembler.sleigh.util.DbgTimer;
@ -157,7 +155,7 @@ public class RecursiveDescentSolver {
public AssemblyResolution solve(PatternExpression exp, MaskedLong goal, Map<String, Long> vals, public AssemblyResolution solve(PatternExpression exp, MaskedLong goal, Map<String, Long> vals,
Map<Integer, Object> res, AssemblyResolvedConstructor cur, String description) Map<Integer, Object> res, AssemblyResolvedConstructor cur, String description)
throws NeedsBackfillException { throws NeedsBackfillException {
return solve(exp, goal, vals, res, cur, ImmutableSet.of(), description); return solve(exp, goal, vals, res, cur, Set.of(), description);
} }
/** /**

View file

@ -15,9 +15,7 @@
*/ */
package ghidra.app.plugin.assembler.sleigh.expr; package ghidra.app.plugin.assembler.sleigh.expr;
import java.util.Set; import java.util.*;
import com.google.common.collect.ImmutableSet;
/** /**
* A type for solver hints * A type for solver hints
@ -34,9 +32,8 @@ import com.google.common.collect.ImmutableSet;
*/ */
public interface SolverHint { public interface SolverHint {
static Set<SolverHint> with(Set<SolverHint> set, SolverHint... plus) { static Set<SolverHint> with(Set<SolverHint> set, SolverHint... plus) {
ImmutableSet.Builder<SolverHint> hints = ImmutableSet.builder(); Set<SolverHint> hints = new HashSet<>(set);
hints.addAll(set); hints.addAll(Set.of(plus));
hints.add(plus); return Collections.unmodifiableSet(hints);
return hints.build();
} }
} }

View file

@ -17,9 +17,6 @@ package ghidra.app.plugin.assembler.sleigh.sem;
import java.util.*; import java.util.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong; import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong;
import ghidra.app.plugin.assembler.sleigh.expr.RecursiveDescentSolver; import ghidra.app.plugin.assembler.sleigh.expr.RecursiveDescentSolver;
import ghidra.app.plugin.assembler.sleigh.grammars.AssemblyProduction; import ghidra.app.plugin.assembler.sleigh.grammars.AssemblyProduction;
@ -42,10 +39,10 @@ public class AssemblyConstructorSemantic implements Comparable<AssemblyConstruct
protected final Set<AssemblyResolvedConstructor> patterns = new HashSet<>(); protected final Set<AssemblyResolvedConstructor> patterns = new HashSet<>();
protected final Constructor cons; protected final Constructor cons;
protected final ImmutableList<Integer> indices; protected final List<Integer> indices;
// A set initialized on first access with forbidden patterns added // A set initialized on first access with forbidden patterns added
protected ImmutableSet<AssemblyResolvedConstructor> upatterns; protected Set<AssemblyResolvedConstructor> upatterns;
/** /**
* Build a new SLEIGH constructor semantic * Build a new SLEIGH constructor semantic
@ -55,7 +52,7 @@ public class AssemblyConstructorSemantic implements Comparable<AssemblyConstruct
*/ */
public AssemblyConstructorSemantic(Constructor cons, List<Integer> indices) { public AssemblyConstructorSemantic(Constructor cons, List<Integer> indices) {
this.cons = cons; this.cons = cons;
this.indices = ImmutableList.copyOf(indices); this.indices = Collections.unmodifiableList(indices);
} }
public void addPattern(DisjointPattern pat) { public void addPattern(DisjointPattern pat) {
@ -106,7 +103,7 @@ public class AssemblyConstructorSemantic implements Comparable<AssemblyConstruct
* Get the list of operand indices in print piece order * Get the list of operand indices in print piece order
* @return the list * @return the list
*/ */
public ImmutableList<Integer> getOperandIndices() { public List<Integer> getOperandIndices() {
return indices; return indices;
} }
@ -135,7 +132,7 @@ public class AssemblyConstructorSemantic implements Comparable<AssemblyConstruct
AssemblyResolvedConstructor fpat = withComputedForbids(pat); AssemblyResolvedConstructor fpat = withComputedForbids(pat);
result.add(fpat); result.add(fpat);
} }
upatterns = ImmutableSet.copyOf(result); upatterns = Collections.unmodifiableSet(result);
} }
/** /**
@ -239,7 +236,7 @@ public class AssemblyConstructorSemantic implements Comparable<AssemblyConstruct
* reverse, the context is solved immediately before applying the selected constructor * reverse, the context is solved immediately before applying the selected constructor
* patterns. * patterns.
* *
* @see AssemblyTreeResolver#resolveSelectedChildren(AssemblyProduction, List, ImmutableList, Collection) * @see AssemblyTreeResolver#resolveSelectedChildren(AssemblyProduction, List, List, Collection)
*/ */
public AssemblyResolution solveContextChanges(AssemblyResolvedConstructor res, public AssemblyResolution solveContextChanges(AssemblyResolvedConstructor res,
Map<String, Long> vals, Map<Integer, Object> opvals) { Map<String, Long> vals, Map<Integer, Object> opvals) {

View file

@ -18,8 +18,6 @@ package ghidra.app.plugin.assembler.sleigh.sem;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.google.common.collect.ImmutableList;
import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong; import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong;
import ghidra.app.plugin.processors.sleigh.expression.PatternExpression; import ghidra.app.plugin.processors.sleigh.expression.PatternExpression;
import ghidra.app.plugin.processors.sleigh.pattern.DisjointPattern; import ghidra.app.plugin.processors.sleigh.pattern.DisjointPattern;
@ -34,7 +32,7 @@ import ghidra.app.plugin.processors.sleigh.pattern.DisjointPattern;
*/ */
public abstract class AssemblyResolution implements Comparable<AssemblyResolution> { public abstract class AssemblyResolution implements Comparable<AssemblyResolution> {
protected final String description; protected final String description;
protected final ImmutableList<? extends AssemblyResolution> children; protected final List<? extends AssemblyResolution> children;
private boolean hashed = false; private boolean hashed = false;
private int hash; private int hash;
@ -55,9 +53,9 @@ public abstract class AssemblyResolution implements Comparable<AssemblyResolutio
* @param description a textual description used as part of {@link #toString()} * @param description a textual description used as part of {@link #toString()}
* @param children for record keeping, any children used in constructing this resolution * @param children for record keeping, any children used in constructing this resolution
*/ */
AssemblyResolution(String description, ImmutableList<? extends AssemblyResolution> children) { AssemblyResolution(String description, List<? extends AssemblyResolution> children) {
this.description = description; this.description = description;
this.children = children == null ? ImmutableList.of() : children; this.children = children == null ? List.of() : children;
} }
/* ******************************************************************************************** /* ********************************************************************************************
@ -77,33 +75,33 @@ public abstract class AssemblyResolution implements Comparable<AssemblyResolutio
*/ */
public static AssemblyResolvedConstructor resolved(AssemblyPatternBlock ins, public static AssemblyResolvedConstructor resolved(AssemblyPatternBlock ins,
AssemblyPatternBlock ctx, String description, AssemblyPatternBlock ctx, String description,
ImmutableList<? extends AssemblyResolution> sel) { List<? extends AssemblyResolution> sel) {
return new AssemblyResolvedConstructor(description, sel, ins, ctx, null, null); return new AssemblyResolvedConstructor(description, sel, ins, ctx, null, null);
} }
/** /**
* Build an instruction-only successful resolution result * Build an instruction-only successful resolution result
* @see #resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, ImmutableList) * @see #resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, List)
* @param ins the instruction pattern block * @param ins the instruction pattern block
* @param description a description of the resolution * @param description a description of the resolution
* @param children the children selected to resolve this constructor, or null * @param children the children selected to resolve this constructor, or null
* @return the new resolution * @return the new resolution
*/ */
public static AssemblyResolvedConstructor instrOnly(AssemblyPatternBlock ins, public static AssemblyResolvedConstructor instrOnly(AssemblyPatternBlock ins,
String description, ImmutableList<AssemblyResolution> children) { String description, List<AssemblyResolution> children) {
return resolved(ins, AssemblyPatternBlock.nop(), description, children); return resolved(ins, AssemblyPatternBlock.nop(), description, children);
} }
/** /**
* Build a context-only successful resolution result * Build a context-only successful resolution result
* @see #resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, ImmutableList) * @see #resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, List)
* @param ctx the context pattern block * @param ctx the context pattern block
* @param description a description of the resolution * @param description a description of the resolution
* @param children the children selected to resolve this constructor, or null * @param children the children selected to resolve this constructor, or null
* @return the new resolution * @return the new resolution
*/ */
public static AssemblyResolvedConstructor contextOnly(AssemblyPatternBlock ctx, public static AssemblyResolvedConstructor contextOnly(AssemblyPatternBlock ctx,
String description, ImmutableList<AssemblyResolution> children) { String description, List<AssemblyResolution> children) {
return resolved(AssemblyPatternBlock.nop(), ctx, description, children); return resolved(AssemblyPatternBlock.nop(), ctx, description, children);
} }
@ -141,7 +139,7 @@ public abstract class AssemblyResolution implements Comparable<AssemblyResolutio
* @return the new resolution * @return the new resolution
*/ */
public static AssemblyResolvedConstructor nop(String description, public static AssemblyResolvedConstructor nop(String description,
ImmutableList<? extends AssemblyResolution> sel) { List<? extends AssemblyResolution> sel) {
return resolved(AssemblyPatternBlock.nop(), AssemblyPatternBlock.nop(), description, sel); return resolved(AssemblyPatternBlock.nop(), AssemblyPatternBlock.nop(), description, sel);
} }
@ -153,7 +151,7 @@ public abstract class AssemblyResolution implements Comparable<AssemblyResolutio
* @return the new resolution * @return the new resolution
*/ */
public static AssemblyResolvedError error(String error, String description, public static AssemblyResolvedError error(String error, String description,
ImmutableList<? extends AssemblyResolution> children) { List<? extends AssemblyResolution> children) {
return new AssemblyResolvedError(description, children, error); return new AssemblyResolvedError(description, children, error);
} }

View file

@ -24,15 +24,11 @@ import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.Predicate;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import ghidra.app.plugin.assembler.AssemblySelector; import ghidra.app.plugin.assembler.AssemblySelector;
import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong; import ghidra.app.plugin.assembler.sleigh.expr.MaskedLong;
import ghidra.app.plugin.assembler.sleigh.expr.RecursiveDescentSolver; import ghidra.app.plugin.assembler.sleigh.expr.RecursiveDescentSolver;
import ghidra.app.plugin.processors.sleigh.ConstructState; import ghidra.app.plugin.processors.sleigh.ConstructState;
import ghidra.app.plugin.processors.sleigh.ContextOp; import ghidra.app.plugin.processors.sleigh.ContextOp;
import ghidra.util.StringUtilities;
/** /**
* A {@link AssemblyResolution} indicating successful application of a constructor * A {@link AssemblyResolution} indicating successful application of a constructor
@ -57,8 +53,8 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
protected final AssemblyPatternBlock ins; protected final AssemblyPatternBlock ins;
protected final AssemblyPatternBlock ctx; protected final AssemblyPatternBlock ctx;
protected final ImmutableSet<AssemblyResolvedBackfill> backfills; protected final Set<AssemblyResolvedBackfill> backfills;
protected final ImmutableSet<AssemblyResolvedConstructor> forbids; protected final Set<AssemblyResolvedConstructor> forbids;
@Override @Override
protected int computeHash() { protected int computeHash() {
@ -98,14 +94,14 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
* @see AssemblyResolution#resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, List) * @see AssemblyResolution#resolved(AssemblyPatternBlock, AssemblyPatternBlock, String, List)
*/ */
AssemblyResolvedConstructor(String description, AssemblyResolvedConstructor(String description,
ImmutableList<? extends AssemblyResolution> children, AssemblyPatternBlock ins, List<? extends AssemblyResolution> children, AssemblyPatternBlock ins,
AssemblyPatternBlock ctx, ImmutableSet<AssemblyResolvedBackfill> backfills, AssemblyPatternBlock ctx, Set<AssemblyResolvedBackfill> backfills,
ImmutableSet<AssemblyResolvedConstructor> forbids) { Set<AssemblyResolvedConstructor> forbids) {
super(description, children); super(description, children);
this.ins = ins; this.ins = ins;
this.ctx = ctx; this.ctx = ctx;
this.backfills = backfills == null ? ImmutableSet.of() : backfills; this.backfills = backfills == null ? Set.of() : backfills;
this.forbids = forbids == null ? ImmutableSet.of() : forbids; this.forbids = forbids == null ? Set.of() : forbids;
} }
/** /**
@ -120,7 +116,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
* @return the decoded resolution * @return the decoded resolution
*/ */
public static AssemblyResolvedConstructor fromString(String str, String description, public static AssemblyResolvedConstructor fromString(String str, String description,
ImmutableList<AssemblyResolution> children) { List<AssemblyResolution> children) {
AssemblyPatternBlock ins = null; AssemblyPatternBlock ins = null;
if (str.startsWith(INS)) { if (str.startsWith(INS)) {
int end = str.indexOf(SEP); int end = str.indexOf(SEP);
@ -172,7 +168,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
newForbids.add(f.shift(amt)); newForbids.add(f.shift(amt));
} }
return new AssemblyResolvedConstructor(description, children, newIns, ctx, return new AssemblyResolvedConstructor(description, children, newIns, ctx,
ImmutableSet.copyOf(newBackfills), ImmutableSet.copyOf(newForbids)); Collections.unmodifiableSet(newBackfills), Collections.unmodifiableSet(newForbids));
} }
/** /**
@ -214,7 +210,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
} }
} }
return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills, return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills,
ImmutableSet.copyOf(newForbids)); Collections.unmodifiableSet(newForbids));
} }
/** /**
@ -270,7 +266,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
Set<AssemblyResolvedConstructor> newForbids = new HashSet<>(this.forbids); Set<AssemblyResolvedConstructor> newForbids = new HashSet<>(this.forbids);
newForbids.addAll(that.forbids); newForbids.addAll(that.forbids);
return new AssemblyResolvedConstructor(description, children, newIns, newCtx, return new AssemblyResolvedConstructor(description, children, newIns, newCtx,
ImmutableSet.copyOf(newBackfills), ImmutableSet.copyOf(newForbids)); Collections.unmodifiableSet(newBackfills), Collections.unmodifiableSet(newForbids));
} }
/** /**
@ -282,7 +278,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
Set<AssemblyResolvedBackfill> newBackfills = new HashSet<>(this.backfills); Set<AssemblyResolvedBackfill> newBackfills = new HashSet<>(this.backfills);
newBackfills.add(bf); newBackfills.add(bf);
return new AssemblyResolvedConstructor(description, children, ins, ctx, return new AssemblyResolvedConstructor(description, children, ins, ctx,
ImmutableSet.copyOf(newBackfills), forbids); Collections.unmodifiableSet(newBackfills), forbids);
} }
/** /**
@ -294,7 +290,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
Set<AssemblyResolvedConstructor> combForbids = new HashSet<>(this.forbids); Set<AssemblyResolvedConstructor> combForbids = new HashSet<>(this.forbids);
combForbids.addAll(more); combForbids.addAll(more);
return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills, return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills,
ImmutableSet.copyOf(more)); Collections.unmodifiableSet(more));
} }
/** /**
@ -446,7 +442,7 @@ public class AssemblyResolvedConstructor extends AssemblyResolution {
newForbids.add((AssemblyResolvedConstructor) t); newForbids.add((AssemblyResolvedConstructor) t);
} }
return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills, return new AssemblyResolvedConstructor(description, children, ins, ctx, backfills,
ImmutableSet.copyOf(newForbids)); Collections.unmodifiableSet(newForbids));
} }
/** /**

View file

@ -17,8 +17,6 @@ package ghidra.app.plugin.assembler.sleigh.sem;
import java.util.List; import java.util.List;
import com.google.common.collect.ImmutableList;
/** /**
* A {@link AssemblyResolution} indicating the occurrence of a (usually semantic) error * A {@link AssemblyResolution} indicating the occurrence of a (usually semantic) error
* *
@ -49,7 +47,7 @@ public class AssemblyResolvedError extends AssemblyResolution {
/** /**
* @see AssemblyResolution#error(String, String, List) * @see AssemblyResolution#error(String, String, List)
*/ */
AssemblyResolvedError(String description, ImmutableList<? extends AssemblyResolution> children, AssemblyResolvedError(String description, List<? extends AssemblyResolution> children,
String error) { String error) {
super(description, children); super(description, children);
AssemblyTreeResolver.dbg.println(error); AssemblyTreeResolver.dbg.println(error);

View file

@ -19,7 +19,6 @@ import java.util.*;
import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.IteratorUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import ghidra.app.plugin.assembler.sleigh.SleighAssemblerBuilder; import ghidra.app.plugin.assembler.sleigh.SleighAssemblerBuilder;
@ -109,7 +108,7 @@ public class AssemblyTreeResolver {
if (rc.hasBackfills()) { if (rc.hasBackfills()) {
ret.add(AssemblyResolution.error("Solution is incomplete", "failed backfill", ret.add(AssemblyResolution.error("Solution is incomplete", "failed backfill",
ImmutableList.of(rc))); List.of(rc)));
continue; continue;
} }
AssemblyResolvedConstructor ctx = AssemblyResolvedConstructor ctx =
@ -117,7 +116,7 @@ public class AssemblyTreeResolver {
AssemblyResolvedConstructor check = rc.combine(ctx); AssemblyResolvedConstructor check = rc.combine(ctx);
if (null == check) { if (null == check) {
ret.add(AssemblyResolution.error("Incompatible context", "resolving", ret.add(AssemblyResolution.error("Incompatible context", "resolving",
ImmutableList.of(rc))); List.of(rc)));
continue; continue;
} }
rc = check; rc = check;
@ -178,12 +177,11 @@ public class AssemblyTreeResolver {
intoNext.add(child); intoNext.add(child);
while (!path.isEmpty()) { while (!path.isEmpty()) {
AssemblyConstructorSemantic sem = path.pollLast(); AssemblyConstructorSemantic sem = path.pollLast();
ImmutableList<AssemblyParseTreeNode> substs = List<AssemblyParseTreeNode> substs = List.of((AssemblyParseTreeNode) branch);
ImmutableList.of((AssemblyParseTreeNode) branch);
// 1 // 1
for (final AssemblyResolvedConstructor res : intoNext) { for (final AssemblyResolvedConstructor res : intoNext) {
ImmutableList<AssemblyResolvedConstructor> sel = ImmutableList.of(res); List<AssemblyResolvedConstructor> sel = List.of(res);
collected.absorb(resolveSelectedChildren(rec, substs, sel, ImmutableList.of(sem))); collected.absorb(resolveSelectedChildren(rec, substs, sel, List.of(sem)));
} }
intoNext.clear(); intoNext.clear();
// 2 // 2
@ -249,7 +247,7 @@ public class AssemblyTreeResolver {
* @return the results * @return the results
*/ */
protected AssemblyResolutionResults resolveSelectedChildren(AssemblyProduction prod, protected AssemblyResolutionResults resolveSelectedChildren(AssemblyProduction prod,
List<AssemblyParseTreeNode> substs, ImmutableList<AssemblyResolvedConstructor> sel, List<AssemblyParseTreeNode> substs, List<AssemblyResolvedConstructor> sel,
Collection<AssemblyConstructorSemantic> semantics) { Collection<AssemblyConstructorSemantic> semantics) {
try (DbgCtx dc = dbg.start("Selecting: " + IteratorUtils.toString(sel.iterator(), try (DbgCtx dc = dbg.start("Selecting: " + IteratorUtils.toString(sel.iterator(),
@ -503,12 +501,12 @@ public class AssemblyTreeResolver {
// This is also where the shifting will happen. // This is also where the shifting will happen.
Collection<AssemblyConstructorSemantic> semantics = grammar.getSemantics(prod); Collection<AssemblyConstructorSemantic> semantics = grammar.getSemantics(prod);
for (List<AssemblyResolvedConstructor> sel : Sets.cartesianProduct(childRes)) { for (List<AssemblyResolvedConstructor> sel : Sets.cartesianProduct(childRes)) {
results.absorb( results.absorb(resolveSelectedChildren(prod, substs,
resolveSelectedChildren(prod, substs, ImmutableList.copyOf(sel), semantics)); Collections.unmodifiableList(sel), semantics));
} }
if (!childErr.isEmpty()) { if (!childErr.isEmpty()) {
results.add(AssemblyResolution.error("Child errors", "Resolving " + prod, results.add(AssemblyResolution.error("Child errors", "Resolving " + prod,
ImmutableList.copyOf(childErr))); Collections.unmodifiableList(childErr)));
} }
return results; return results;
} }

View file

@ -15,7 +15,7 @@
*/ */
package ghidra.program.database.code; package ghidra.program.database.code;
import com.google.common.base.Objects; import java.util.Objects;
/** /**
* Container object that holds a start and end position within a string. A list of StringDiffs * Container object that holds a start and end position within a string. A list of StringDiffs
@ -105,7 +105,7 @@ public class StringDiff {
} }
StringDiff other = (StringDiff) obj; StringDiff other = (StringDiff) obj;
if (!Objects.equal(text, other.text)) { if (!Objects.equals(text, other.text)) {
return false; return false;
} }
if (start != other.start) { if (start != other.start) {

View file

@ -15,8 +15,7 @@
*/ */
package ghidra.app.plugin.assembler.sleigh.parse; package ghidra.app.plugin.assembler.sleigh.parse;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertTrue;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.*; import java.util.*;
@ -25,8 +24,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.junit.Test; import org.junit.Test;
import com.google.common.collect.ImmutableSet;
import ghidra.app.plugin.assembler.sleigh.grammars.*; import ghidra.app.plugin.assembler.sleigh.grammars.*;
import ghidra.app.plugin.assembler.sleigh.symbol.*; import ghidra.app.plugin.assembler.sleigh.symbol.*;
import ghidra.app.plugin.assembler.sleigh.tree.*; import ghidra.app.plugin.assembler.sleigh.tree.*;
@ -522,7 +519,7 @@ public class ParserTest {
assertTrue(res instanceof AssemblyParseErrorResult); assertTrue(res instanceof AssemblyParseErrorResult);
AssemblyParseErrorResult err = (AssemblyParseErrorResult) res; AssemblyParseErrorResult err = (AssemblyParseErrorResult) res;
Collection<String> sug = err.getSuggestions(); Collection<String> sug = err.getSuggestions();
assertEquals(ImmutableSet.builder().add("b").build(), sug); assertEquals(Set.of("b"), sug);
} }
} }
@ -542,7 +539,7 @@ public class ParserTest {
assertTrue(res instanceof AssemblyParseErrorResult); assertTrue(res instanceof AssemblyParseErrorResult);
AssemblyParseErrorResult err = (AssemblyParseErrorResult) res; AssemblyParseErrorResult err = (AssemblyParseErrorResult) res;
Collection<String> sug = err.getSuggestions(); Collection<String> sug = err.getSuggestions();
assertEquals(ImmutableSet.builder().add(" ").build(), sug); assertEquals(Set.of(" "), sug);
} }
} }