package bluej.stride.framedjava.elements;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import bluej.stride.framedjava.ast.JavaFragment;
import bluej.stride.framedjava.ast.NameDefSlotFragment;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.ast.TypeSlotFragment;
import bluej.stride.framedjava.frames.TryFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.SandwichCanvasesFrame;
import nu.xom.Attribute;
import nu.xom.Element;
import threadchecker.OnThread;
import threadchecker.Tag;
public class TryElement
extends SandwichCanvasesElement{
public static final String ELEMENT = "try";
private static final String CATCH_LABEL = "catch";
private static final String FINALLY_LABEL = "finally";
private static final String EXCEPTION_TYPE_LABEL = "type";
private static final String EXCEPTION_NAME_LABEL = "name";
private List<TypeSlotFragment> catchTypes = new ArrayList<>();
private List<NameDefSlotFragment> catchNames = new ArrayList<>();
private TryFrame frame;
|
| @param frame
| @param tryContents
| @param catchContents
| @param finallyContents Note that passing null here means no finally, whereas passing
| an empty list indicates that there is a finally, but it is empty.
|
public TryElement(TryFrame frame, List<CodeElement> tryContents, List<TypeSlotFragment> catchTypes,
List<NameDefSlotFragment> catchNames, List<List<CodeElement>> catchContents,
List<CodeElement> finallyContents, boolean enabled)
{
super(frame, ELEMENT, tryContents, CATCH_LABEL, CATCH_LABEL, catchContents, FINALLY_LABEL, finallyContents, enabled);
this.catchTypes = catchTypes;
this.catchNames = catchNames;
}
public TryElement(Element element)
{
super(ELEMENT, CATCH_LABEL, CATCH_LABEL, FINALLY_LABEL);
loadElement(element);
}
@Override
protected void loadMainAttributes(final Element element)
{
}
@Override
protected void loadIntermediateAttributes(final Element element)
{
catchTypes.add(new TypeSlotFragment(element.getAttributeValue(EXCEPTION_TYPE_LABEL), element.getAttributeValue(EXCEPTION_TYPE_LABEL + "-java")));
catchNames.add(new NameDefSlotFragment(element.getAttributeValue(EXCEPTION_NAME_LABEL)));
}
@Override
protected List getIntermediateHeaderFragment(int index)
{
List<JavaFragment> headerFragment = super.getIntermediateHeaderFragment(index);
headerFragment.addAll(Arrays.asList(f(frame, " ("), catchTypes.get(index), space(), catchNames.get(index), f(frame, ")")));
return headerFragment;
}
@Override
protected void addMainAttributes(LocatableElement element)
{
}
@Override
protected void addIntermediateAttributes(LocatableElement element, int index)
{
element.addAttributeStructured(EXCEPTION_TYPE_LABEL, catchTypes.get(index));
element.addAttributeCode(EXCEPTION_NAME_LABEL, catchNames.get(index));
}
@OnThread(Tag.FX)
@Override
protected SandwichCanvasesFrame buildFrame(InteractionManager editor, List<Frame> firstCanvasFrames,
List<List<Frame>> intermediateCanvasFrames, List<Frame> tailCanvasFrames, boolean enable)
{
frame = new TryFrame(editor, firstCanvasFrames, catchTypes, catchNames, intermediateCanvasFrames,
tailCanvasFrames, enable);
return frame;
}
@Override
protected Stream getDirectSlotFragments()
{
return Stream.empty();
}
@Override
public List getDeclaredVariablesWithin(CodeElement child)
{
Optional<Integer> subCanvas = findDirectIntermediateChild(child);
return subCanvas.map(i -> Arrays.asList(new LocalParamInfo(catchTypes.get(i).getContent(), catchNames.get(i).getContent(), false, this))).orElse(Collections.emptyList());
}
}
top,
use,
map,
class TryElement
. TryElement
. TryElement
. loadMainAttributes
. loadIntermediateAttributes
. getIntermediateHeaderFragment
. addMainAttributes
. addIntermediateAttributes
. buildFrame
. getDirectSlotFragments
. getDeclaredVariablesWithin
138 neLoCode
+ 5 LoComm