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