package bluej.stride.framedjava.slots;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import bluej.stride.framedjava.ast.links.PossibleTypeLink;
import bluej.stride.generic.InteractionManager;
import bluej.utility.javafx.FXBiConsumer;
import bluej.utility.javafx.FXConsumer;


| Created by neil on 22/05/2016. | public class InfixType extends InfixStructured<TypeSlot, InfixType>{ private InfixType(InteractionManager editor, TypeSlot slot, String initialContent, BracketedStructured wrapper, StructuredSlot.ModificationToken token, Character... closingChars) { super(editor, slot, initialContent, wrapper, token, closingChars); } InfixType(InteractionManager editor, TypeSlot slot, StructuredSlot.ModificationToken token) { super(editor, slot, token); } | Is this string an operator | @Override p.public boolean isOperator(String s) { switch (s) { case ".": case ",": return true; default: return false; } }
| Does the given character form a one-character operator, or begin a multi-character operator | @Override p.public boolean beginsOperator(char c) { switch (c) { case ',': case '.': return true; default: return false; } } @Override p.public boolean canBeUnary(String s) { return false; } @Override protected boolean isOpeningBracket(char c) { return c == '<' || c == '['; } @Override protected boolean isClosingBracket(char c) { return c == '>' || c == ']'; } @Override protected boolean isDisallowed(char c) { return !(Character.isJavaIdentifierStart(c) || Character.isJavaIdentifierPart(c) || c == ',' || c == '.' || c == '<' || c == '>' || c == '?' || c == '[' || c == ']' || c == '$'); } @Override p.public InfixType newInfix(InteractionManager editor, TypeSlot slot, String initialContent, BracketedStructured wrapper, StructuredSlot.ModificationToken token, Character... closingChars) { return new InfixType(editor, slot, initialContent, wrapper, token, closingChars); } @Override public void calculateTooltipFor(StructuredSlotField expressionSlotField, FXConsumer<String> handler) { } void runIfCommaDirect(FXBiConsumer<String, String> listener) { Optional<Integer> optIndex = operators.findFirst(op -> op != null && op.get().equals(",")); optIndex.ifPresent(index -> { String before = getCopyText(null, new CaretPos(index, fields.get(index).getEndPos())); String after = getCopyText(new CaretPos(index + 1, new CaretPos(0, null)), null); listener.accept(before, after); }); } public List findTypeLinks() { List<PossibleTypeLink> links = new ArrayList<>(); int startField = 0; StringBuilder type = new StringBuilder(fields.get(0).getCopyText(null, null)); for (int i = 1; i <= fields.size(); i++) { if (i - 1 >= operators.size() || operators.get(i - 1) == null || !operators.get(i - 1).get().equals(".")) { int start = slot.getTopLevel().caretPosToStringPos(absolutePos(new CaretPos(startField, fields.get(startField).getStartPos())), false); int end = slot.getTopLevel().caretPosToStringPos(absolutePos(new CaretPos(i - 1, fields.get(i - 1).getEndPos())), false); if (start != end && type.length() > 0) links.add(new PossibleTypeLink(type.toString(), start, end, slot)); type = new StringBuilder(); startField = i; } else { type.append(operators.get(i - 1).get()); } if (i >= fields.size()) break; if (fields.get(i) instanceof BracketedStructured) { links.addAll(((BracketedStructured<InfixType, TypeSlot>)fields.get(i)).getContent().findTypeLinks()); } else { type.append(fields.get(i).getCopyText(null, null)); } } return links; } @Override protected boolean supportsFloatLiterals() { return false; } }

.   InfixType
.   isOperator
.   beginsOperator
.   canBeUnary
.   isOpeningBracket
.   isClosingBracket
.   isDisallowed
.   newInfix
.   calculateTooltipFor
.   runIfCommaDirect
.   findTypeLinks
.   supportsFloatLiterals




185 neLoCode + 3 LoComm