package bluej.stride.framedjava.elements;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Stream;
import bluej.stride.generic.InteractionManager;
import nu.xom.Attribute;
import nu.xom.Element;
import bluej.parser.AssistContent.ParamInfo;
import bluej.stride.framedjava.ast.AccessPermissionFragment;
import bluej.stride.framedjava.ast.JavaFragment;
import bluej.stride.framedjava.ast.JavaSource;
import bluej.stride.framedjava.ast.JavadocUnit;
import bluej.stride.framedjava.ast.NameDefSlotFragment;
import bluej.stride.framedjava.ast.ParamFragment;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.ast.ThrowsTypeFragment;
import bluej.stride.framedjava.ast.TypeSlotFragment;
import bluej.stride.framedjava.frames.NormalMethodFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;
import threadchecker.OnThread;
import threadchecker.Tag;
public class NormalMethodElement
extends MethodWithBodyElement{
public static final String ELEMENT = "method";
private boolean staticModifier = false;
private boolean finalModifier = false;
private final TypeSlotFragment returnType;
private final NameDefSlotFragment name;
public NormalMethodElement(NormalMethodFrame frame, AccessPermissionFragment access, boolean staticModifier,
boolean finalModifier, TypeSlotFragment returnType, NameDefSlotFragment name, List<ParamFragment> params,
List<ThrowsTypeFragment> throwsTypes, List<CodeElement> contents, JavadocUnit documentation, boolean enabled)
{
super(frame, access, params, throwsTypes, contents, documentation, enabled);
this.staticModifier = staticModifier;
this.finalModifier = finalModifier;
this.returnType = returnType;
this.name = name;
}
public NormalMethodElement(Element el)
{
super(el);
Attribute staticAttribute = el.getAttribute("static");
staticModifier = (staticAttribute == null) ? false : Boolean.valueOf(staticAttribute.getValue());
Attribute finalAttribute = el.getAttribute("final");
finalModifier = (finalAttribute == null) ? false : Boolean.valueOf(finalAttribute.getValue());
returnType = new TypeSlotFragment(el.getAttributeValue("type"), el.getAttributeValue("type-java"));
name = new NameDefSlotFragment(el.getAttributeValue("name"));
}
public NormalMethodElement(String access, String returnType, String name, List<Entry<String,String>> params,
List<CodeElement> contents, String documentation)
{
super(access, params, contents, documentation);
this.returnType = new TypeSlotFragment(returnType, returnType);
this.name = new NameDefSlotFragment(name);
}
@Override
public JavaSource toJavaSource()
{
List<JavaFragment> header = new ArrayList<>();
if (staticModifier) {
header.add(f(frame, "static "));
}
if (finalModifier) {
header.add(f(frame, "final "));
}
Collections.addAll(header, access, space(), returnType, space(), name, f(frame, "("));
ParamFragment.addParamsToHeader(frame, this, params, header);
header.add(f(frame, ")"));
header.addAll(throwsToJava());
return JavaSource.createMethod(frame, this, this, documentation, header, CodeElement.toJavaCodes(contents));
}
@Override
public LocatableElement toXML()
{
LocatableElement methodEl = new LocatableElement(this, ELEMENT);
accessToXML(methodEl);
if (staticModifier) {
methodEl.addAttribute(new Attribute("static", "true"));
}
if (finalModifier) {
methodEl.addAttribute(new Attribute("final", "true"));
}
methodEl.addAttributeStructured("type", returnType);
methodEl.addAttributeCode("name", name);
addEnableAttribute(methodEl);
methodEl.appendChild(documentation.toXML());
paramsToXML(methodEl);
throwsToXML(methodEl);
bodyToXML(methodEl);
return methodEl;
}
@Override
public Frame createFrame(InteractionManager editor)
{
frame = new NormalMethodFrame(editor, access, staticModifier, finalModifier,
returnType.getContent(), name.getContent(), documentation.toString(), isEnable());
setupFrame(editor);
return frame;
}
@Override
public String getType()
{
return returnType.getContent();
}
public String getName()
{
return name.getContent();
}
@Override
public void show(ShowReason reason)
{
frame.show(reason);
}
@OnThread(Tag.FXPlatform)
public boolean equalDeclaration(String name, List<ParamInfo> params, ClassElement el)
{
if ( !this.name.getContent().equals(name) ) {
return false;
}
if ( this.params.size() != params.size() ) {
return false;
}
List<String> ourQualParams = getQualifiedParamTypes(el);
for (int i = 0; i < params.size(); i++)
{
if ( !ourQualParams.get(i).equals(params.get(i).getQualifiedType()) )
{
return false;
}
}
return true;
}
@Override
protected Stream getDirectSlotFragments()
{
Stream<SlotFragment> s = params.stream().flatMap(p -> Stream.of(p.getParamType(), p.getParamName()));
return Stream.<SlotFragment>concat(Stream.<SlotFragment>concat(Stream.of(returnType, name), s), throwsTypes.stream().map(ThrowsTypeFragment::getJavaSource));
}
public NormalMethodFrame getFrame()
{
return (NormalMethodFrame)frame;
}
public boolean isStatic()
{
return staticModifier;
}
public boolean isFinal()
{
return finalModifier;
}
}
top,
use,
map,
class NormalMethodElement
. NormalMethodElement
. NormalMethodElement
. NormalMethodElement
. toJavaSource
. toXML
. createFrame
. getType
. getName
. show
. equalDeclaration
. getDirectSlotFragments
. getFrame
. isStatic
. isFinal
235 neLoCode
+ 0 LoComm