package bluej.stride.framedjava.ast;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
import bluej.stride.framedjava.errors.EmptyError;
import bluej.stride.framedjava.errors.FixSuggestion;
import bluej.stride.framedjava.errors.SyntaxCodeError;
import bluej.stride.framedjava.frames.IfFrame;
import bluej.stride.framedjava.frames.ReturnFrame;
import bluej.stride.framedjava.frames.SwitchFrame;
import bluej.stride.framedjava.frames.ThrowFrame;
import bluej.stride.framedjava.frames.WhileFrame;
import bluej.stride.framedjava.slots.ExpressionSlot;
import bluej.stride.generic.Frame;
import threadchecker.OnThread;
| Created by neil on 04/12/2015.
|
public class CallExpressionSlotFragment
extends FilledExpressionSlotFragment{
private static final List<String> KEYWORDS = Arrays.asList("if", "while", "switch", "return", "throw");
public CallExpressionSlotFragment(String content, String javaCode)
{
super(content, javaCode);
}
public CallExpressionSlotFragment(String content, String javaCode, ExpressionSlot slot)
{
super(content, javaCode, slot);
}
@Override
public Stream findEarlyErrors()
{
Stream<SyntaxCodeError> superErrors = super.findEarlyErrors();
if (content.equals("()"))
{
return Stream.concat(Stream.of(new EmptyError(this, "Method name cannot be blank")), superErrors);
}
else if (content.endsWith(")") && KEYWORDS.stream().anyMatch(k -> content.startsWith(k + "(")))
{
String keyword = content.substring(0, content.indexOf("("));
String innerStride = content.substring(content.indexOf("(") + 1, content.length() - 1);
String javaCode = getJavaCode();
String innerJava = javaCode.substring(javaCode.indexOf("(") + 1, javaCode.length() - 1);
FixSuggestion fix = new ReplaceKeywordCallWithFrame(keyword, innerStride, innerJava);
return Stream.concat(Stream.of(new SyntaxCodeError(this, keyword + " is not a valid method name") {
@Override
public List getFixSuggestions()
{
ArrayList<FixSuggestion> fixes = new ArrayList<>();
fixes.addAll(super.getFixSuggestions());
fixes.add(fix);
return fixes;
}
}), superErrors);
}
return superErrors;
}
private class ReplaceKeywordCallWithFrame
extends FixSuggestion
{
private final String keyword;
private final String innerStride;
private final String innerJava;
public ReplaceKeywordCallWithFrame(String keyword, String innerStride, String innerJava)
{
this.keyword = keyword;
this.innerStride = innerStride;
this.innerJava = innerJava;
}
@Override
public String getDescription()
{
return "Replace with " + keyword + " frame";
}
@Override
public void execute()
{
Frame frame = getSlot().getParentFrame();
FilledExpressionSlotFragment inner = new FilledExpressionSlotFragment(innerStride, innerJava);
switch (keyword)
{
case "if":
frame.getParentCanvas().replaceBlock(frame, new IfFrame(frame.getEditor(), inner, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null, true));
break;
case "while":
frame.getParentCanvas().replaceBlock(frame, new WhileFrame(frame.getEditor(), inner, true));
break;
case "switch":
frame.getParentCanvas().replaceBlock(frame, new SwitchFrame(frame.getEditor(), inner, true));
break;
case "return":
frame.getParentCanvas().replaceBlock(frame, new ReturnFrame(frame.getEditor(), inner, true));
break;
case "throw":
frame.getParentCanvas().replaceBlock(frame, new ThrowFrame(frame.getEditor(), inner, true));
break;
}
}
}
}
top,
use,
map,
class CallExpressionSlotFragment
. CallExpressionSlotFragment
. CallExpressionSlotFragment
. findEarlyErrors
. getFixSuggestions
top,
use,
map,
class CallExpressionSlotFragment . ReplaceKeywordCallWithFrame
. ReplaceKeywordCallWithFrame
. getDescription
. execute
145 neLoCode
+ 1 LoComm