package bluej.stride.framedjava.ast;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import bluej.stride.generic.InteractionManager;
import bluej.utility.javafx.FXPlatformConsumer;
import threadchecker.OnThread;
import threadchecker.Tag;
import bluej.parser.AssistContent.CompletionKind;
import bluej.stride.framedjava.ast.JavaFragment.PosInSourceDoc;
import bluej.stride.framedjava.elements.CodeElement;
import bluej.stride.framedjava.elements.CodeElement.LocalParamInfo;
import bluej.stride.framedjava.elements.ContainerCodeElement;
import bluej.stride.framedjava.elements.MethodWithBodyElement;
import bluej.stride.framedjava.elements.TopLevelCodeElement;
import bluej.stride.generic.AssistContentThreadSafe;
import bluej.utility.javafx.FXConsumer;

public class ASTUtility
{   

   
   public static List findLocalsAndParamsInScopeAt(CodeElement orig, boolean includeFields, boolean includeCurDecl)
   {        
      ArrayList<LocalParamInfo> vars = new ArrayList<>();
       
      CodeElement cur = orig;
      ContainerCodeElement parent = cur.getParent();

      if (includeCurDecl && cur instanceof ContainerCodeElement)
      vars.addAll(((ContainerCodeElement)cur).getDeclaredVariablesWithin(cur));

       
      
      while (parent != null && (includeFields || parent.getTopLevelElement() == null))
       {            
         for (CodeElement c : parent.childrenUpTo(cur))
           {
            vars.addAll(c.getDeclaredVariablesAfter());             
            }
         vars.addAll(parent.getDeclaredVariablesWithin(cur));
            
           
         cur = parent;
         parent = parent.getParent();         
         }
       
      return vars;     
      }

   
   public static TopLevelCodeElement getTopLevelElement(CodeElement orig)
   {
      ContainerCodeElement c = orig.getParent();
      while (c.getTopLevelElement() == null)

c = c.getParent();
         }
      return c.getTopLevelElement();     
      }
    
   
   public static MethodWithBodyElement getMethodElement(CodeElement orig)
   {
      ContainerCodeElement c = orig.getParent();
      while (c != null && c.getMethodElement() == null)

c = c.getParent();
         }
      return c == null ? null : c.getMethodElement();     
      }
    
   
   
   
   @OnThread(Tag.FXPlatform)
   
   public static void withLocalsParamsAndFields(CodeElement el, InteractionManager editor, PosInSourceDoc pos, boolean includeCurDecl, FXPlatformConsumer<Map<String, CodeElement>> handler)
   {
      editor.withAccessibleMembers(pos, Collections.singleton(CompletionKind.FIELD), false,
               
      x ->
       {
         Stream<String> fieldStream = x.stream().map(AssistContentThreadSafe::getName);
            
         List<LocalParamInfo> localsAndParams = findLocalsAndParamsInScopeAt(el, true, includeCurDecl);
            
           
         Map<String, CodeElement> r = new HashMap<>();
            
         fieldStream.forEach(s -> r.put(s,  null));
         r.putAll(localsAndParams.stream().collect(Collectors.toMap(LocalParamInfo::getName, LocalParamInfo::getDeclarer, (early, late) -> late)));
            
         handler.accept(r);         
         });
      } 
   }
top, use, map, class ASTUtility

.   findLocalsAndParamsInScopeAt
.   getTopLevelElement
.   getMethodElement
.   withLocalsParamsAndFields




101 neLoCode + 0 LoComm