CompletionSupplier sideTransform()

in hybrid/src/main/java/jetbrains/jetpad/hybrid/TokenCompleter.java [174:237]


  CompletionSupplier sideTransform(Cell tokenCell, final int delta) {
    final int index = mySync.tokenCells().indexOf(tokenCell);

    return new CompletionSupplier() {

      private Completer createCompleter(final CompletionParameters cp) {
        return new BaseCompleter() {
          @Override
          public Runnable complete(int selectionIndex, Token... tokens) {
            int i = index + delta;
            TokenListEditor<?> tokenListEditor = getTokenListEditor();
            ObservableList<Token> editorTokenList = tokenListEditor.tokens;
            if (i < editorTokenList.size() && tokens.length >= 1 && tokens[0] instanceof ValueToken && editorTokenList.get(i) instanceof ValueToken) {
              editorTokenList.remove(i);
            }
            for (Token t : tokens) {
              editorTokenList.add(i++, t);
            }
            tokenListEditor.processComments();
            tokenListEditor.updateToPrintedTokens();
            Runnable result;
            int targetIndex = index + delta + selectionIndex;
            final Cell targetCell =  mySync.tokenCells().get(targetIndex);
            if (isComment(targetCell)) {
              result = new Runnable() {
                @Override
                public void run() {
                  targetCell.focus();
                  ((TextCell) targetCell).caretPosition().set(getCommentPrefixLength(targetCell));
                }
              };
            } else {
              result = getTokenOperations().selectOnCreation(targetIndex, LAST);
            }
            if (cp.isEndRightTransform() && !cp.isMenu()) {
              result = seq(result, activateCompletion(targetIndex));
            }
            return result;
          }
        };
      }

      private TokenCompletionContext createContext(CompletionParameters cp) {
        if (cp.isEndRightTransform()) {
          return new TokenCompletionContext(index + 1);
        }

        return new TokenCompletionContext(index + delta);
      }

      @Override
      public Iterable<CompletionItem> get(final CompletionParameters cp) {
        return tokenCompletion(createContext(cp), createCompleter(cp)).get(cp);
      }

      @Override
      public Async<? extends Iterable<CompletionItem>> getAsync(CompletionParameters cp) {
        if (cp.isMenu()) {
          return getEditorSpec().getAdditionalCompletion(createContext(cp), createCompleter(cp)).getAsync(cp);
        }
        return Asyncs.<Iterable<CompletionItem>>constant(new ArrayList<CompletionItem>());
      }
    };
  }