package bluej.stride.framedjava.elements;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

import bluej.stride.generic.InteractionManager;
import bluej.utility.Utility;
import nu.xom.Attribute;
import nu.xom.Element;
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.MethodProtoFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;

public class MethodProtoElement
extends DocumentContainerCodeElement{    
   public static final String ELEMENT = "methodproto";
   
   private final TypeSlotFragment returnType;
   
   private final NameDefSlotFragment name;
   
   private final List<ParamFragment> params;
   
   private final List<ThrowsTypeFragment> throwsTypes;
   
   private MethodProtoFrame frame;
    
   
   public MethodProtoElement(MethodProtoFrame frame, TypeSlotFragment returnType,
           
   NameDefSlotFragment name, List<ParamFragment> params, List<ThrowsTypeFragment> throwsTypes, JavadocUnit documentation, boolean enabled)
   {        
      this.frame = frame;
       
      this.returnType = returnType;
       
      this.name = name;
       
      this.params = params;
       
      this.throwsTypes = throwsTypes;
       
      this.enable = enabled;

       
      this.documentation = documentation;
      if (this.documentation == null) {            
         this.documentation = new JavadocUnit("");         
         }     
      }

   
   public MethodProtoElement(Element el)
   {        
      returnType = new TypeSlotFragment(el.getAttributeValue("type"), el.getAttributeValue("type-java"));
       
      name = new NameDefSlotFragment(el.getAttributeValue("name"));
       
      params = new ArrayList<ParamFragment>();
       
      throwsTypes = new ArrayList<>();
       
      for (int i = 0; i < el.getChildElements().size(); i++) {
         final Element child = el.getChildElements().get(i);
         switch (child.getLocalName()) {                
            case "params":
                   
            for (int j = 0; j < child.getChildElements().size(); j++) {                        
               params.add(new ParamFragment(child.getChildElements().get(j)));                     
               }
                   
            break;
               
            case "throws":
                   
            for (int j = 0; j < child.getChildElements().size(); j++) {                        
               throwsTypes.add(new ThrowsTypeFragment(child.getChildElements().get(j)));                     
               }
                   
            break;
               
            case "javadoc":
                   
            documentation = new JavadocUnit(child);
                   
            break;             
            }         
         }
      if (documentation == null) {            
         documentation = new JavadocUnit("");         
         }
      enable = Boolean.valueOf(el.getAttributeValue("enable"));     
      }
    
   
   @Override
   
   public JavaSource toJavaSource()
   {
      List<JavaFragment> header = getHeaderFragments();
        
      if (getParent() instanceof ClassElement) {
         header.add(0, f(frame, "abstract "));         
         }
        
       
      JavaSource javaSource = new JavaSource(null, header);
      javaSource.prependJavadoc(documentation.getJavaCode());
       
      return javaSource;     
      }
    
   
   private List getHeaderFragments()
   {        
      List<JavaFragment> header = new ArrayList<>();
      Collections.addAll(header, returnType, space(),  name, f(frame, "("));
      ParamFragment.addParamsToHeader(frame, this, params, header);
      header.add(f(frame, ")"));
      header.addAll(throwsToJava());
      header.add(f(frame, ";"));
       
      return header;     
      }

   
   
| Helper method for subclasses when generating Java: Turn throws declaration into Java | private List throwsToJava() { if (throwsTypes.isEmpty()) return Collections.emptyList(); ArrayList<JavaFragment> typesAndCommas = throwsTypes.stream().map(ThrowsTypeFragment::getJavaSource).collect(Utility.intersperse(() -> (JavaFragment)f(null, ", "))); typesAndCommas.add(0, space()); typesAndCommas.add(0, f(frame, "throws")); typesAndCommas.add(0, space()); return typesAndCommas; } @Override public Frame createFrame(InteractionManager editor) { frame = new MethodProtoFrame(editor, returnType, name, params, throwsTypes, documentation.toString(), isEnable()); return frame; } @Override public LocatableElement toXML() { LocatableElement methodEl = new LocatableElement(this, ELEMENT); methodEl.addAttributeStructured("type", returnType); methodEl.addAttributeCode("name", name); addEnableAttribute(methodEl); methodEl.appendChild(documentation.toXML()); params.forEach(param -> methodEl.appendChild(param.toXML())); Element throwsEl = new Element("throws"); for (ThrowsTypeFragment t : throwsTypes) { throwsEl.appendChild(t.toXML()); } methodEl.appendChild(throwsEl); return methodEl; } @Override public void show(ShowReason reason) { frame.show(reason); } @Override public List childrenUpTo(CodeElement c) { return Collections.emptyList(); } @Override public Stream streamContained() { return Stream.empty(); } @Override protected Stream getDirectSlotFragments() { return Stream.concat(Stream.of(returnType, name), params.stream().flatMap(p -> Stream.of(p.getParamType(), p.getParamName()))); } }
top, use, map, class MethodProtoElement

.   MethodProtoElement
.   MethodProtoElement
.   toJavaSource
.   getHeaderFragments
.   throwsToJava
.   createFrame
.   toXML
.   show
.   childrenUpTo
.   streamContained
.   getDirectSlotFragments




224 neLoCode + 1 LoComm