blob: eb8e150bef046e2ab36a6203070a4fac6008673f [file] [log] [blame]
// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.graph;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
import java.util.Collection;
import java.util.function.Consumer;
import java.util.stream.Stream;
public abstract class DexItem {
static <T extends DexItem> void collectAll(IndexedItemCollection indexedItems, T[] items) {
consumeArray(items, (T item) -> item.collectIndexedItems(indexedItems));
}
public static <T extends DexItem> void collectAll(MixedSectionCollection mixedItems, T[] items) {
consumeArray(items, (T item) -> item.collectMixedSectionItems(mixedItems));
}
public static <T extends DexItem> void collectAll(MixedSectionCollection mixedItems,
Collection<T> items) {
items.forEach((T item) -> item.collectMixedSectionItems(mixedItems));
}
/**
* Helper method to iterate over elements in an array.
* Handles the case where the array is null.
*/
private static <T extends DexItem> void consumeArray(T[] items, Consumer<T> consumer) {
if (items == null) {
return;
}
for (T item : items) {
if (item != null) {
consumer.accept(item);
}
}
}
abstract void collectIndexedItems(IndexedItemCollection collection,
DexMethod method, int instructionOffset);
public void collectIndexedItems(IndexedItemCollection collection) {
collectIndexedItems(collection, null, -1);
}
public void collectIndexedItems(IndexedItemCollection collection, DexMethod method) {
collectIndexedItems(collection, method, -1);
}
abstract void collectMixedSectionItems(MixedSectionCollection collection);
protected void flushCachedValues() {
// Overwritten in subclasses.
}
public String toSmaliString() {
return toString();
}
public String toSourceString() {
return toString();
}
static <T extends DexItem> Stream<T> filter(Stream<DexItem> stream, Class<T> clazz) {
return stream.filter(clazz::isInstance).map(clazz::cast);
}
}