package jadx.core.dex.regions;
import jadx.core.dex.nodes.IBranchRegion;
import jadx.core.dex.nodes.IContainer;
import jadx.core.dex.nodes.IRegion;
import jadx.core.dex.trycatch.ExceptionHandler;
import jadx.core.dex.trycatch.TryCatchBlock;
import jadx.core.utils.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public final class TryCatchRegion extends AbstractRegion implements IBranchRegion {
private final IContainer tryRegion;
private Map<ExceptionHandler, IContainer> catchRegions = Collections.emptyMap();
private IContainer finallyRegion;
private TryCatchBlock tryCatchBlock;
public TryCatchRegion(IRegion parent, IContainer tryRegion) {
super(parent);
this.tryRegion = tryRegion;
}
public void setTryCatchBlock(TryCatchBlock tryCatchBlock) {
this.tryCatchBlock = tryCatchBlock;
int count = tryCatchBlock.getHandlersCount();
this.catchRegions = new LinkedHashMap<ExceptionHandler, IContainer>(count);
for (ExceptionHandler handler : tryCatchBlock.getHandlers()) {
IContainer handlerRegion = handler.getHandlerRegion();
if (handlerRegion != null) {
if (handler.isFinally()) {
finallyRegion = handlerRegion;
} else {
catchRegions.put(handler, handlerRegion);
}
}
}
}
public IContainer getTryRegion() {
return tryRegion;
}
public Map<ExceptionHandler, IContainer> getCatchRegions() {
return catchRegions;
}
public TryCatchBlock getTryCatchBlock() {
return tryCatchBlock;
}
public IContainer getFinallyRegion() {
return finallyRegion;
}
public void setFinallyRegion(IContainer finallyRegion) {
this.finallyRegion = finallyRegion;
}
@Override
public List<IContainer> getSubBlocks() {
List<IContainer> all = new ArrayList<IContainer>(2 + catchRegions.size());
all.add(tryRegion);
all.addAll(catchRegions.values());
if (finallyRegion != null) {
all.add(finallyRegion);
}
return Collections.unmodifiableList(all);
}
@Override
public List<IContainer> getBranches() {
return getSubBlocks();
}
@Override
public String baseString() {
return tryRegion.baseString();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Try: ").append(tryRegion);
if (!catchRegions.isEmpty()) {
sb.append(" catches: ").append(Utils.listToString(catchRegions.values()));
}
if (finallyRegion != null) {
sb.append(" finally: ").append(finallyRegion);
}
return sb.toString();
}
}