public CompletionSupplier createRoleCompletion()

in hybrid/src/main/java/jetbrains/jetpad/hybrid/HybridWrapperRoleCompletion.java [66:184]


  public CompletionSupplier createRoleCompletion(final Mapper<?, ?> mapper, ContainerT contextNode, final Role<WrapperT> target) {
    return new CompletionSupplier() {
      @Override
      public List<CompletionItem> get(final CompletionParameters cp) {
        List<CompletionItem> result = new ArrayList<>();

        final BaseCompleter completer = new BaseCompleter() {
          @Override
          public Runnable complete(int selectionIndex, Token... tokens) {
            WrapperT targetItem = myFactory.get();
            target.set(targetItem);
            Mapper<?, ?> targetItemMapper =  mapper.getDescendantMapper(targetItem);
            BaseHybridSynchronizer<?, ?> sync = mySyncProvider.apply(targetItemMapper);
            sync.setTokens(Arrays.asList(tokens));
            CellTraitEventSpec<Event> traitEvent = cp.isMenu() ? Cells.AFTER_COMPLETED : Cells.AFTER_EDITED;
            sync.getTargetList().iterator().next().dispatch(new Event(), traitEvent);
            return targetItemMapper.isAttached()
                ? sync.selectOnCreation(selectionIndex, LAST)
                : Runnables.EMPTY;
          }
        };

        if (cp.isBulkCompletionRequired()) {
          result.add(new BaseCompletionItem() {
            @Override
            public String visibleText(String text) {
              throw new IllegalStateException("This completion item must not be visible");
            }

            @Override
            public int getMatchPriority() {
              return super.getMatchPriority() - 1;
            }

            @Override
            public boolean isStrictMatchPrefix(String text) {
              return !isMatch(text);
            }

            @Override
            public boolean isMatch(String text) {
              return isNotBlank(text);
            }

            @Override
            public Runnable complete(final String text) {
              return new Runnable() {
                @Override
                public void run() {
                  CompletionTokenizer tokenizer = new CompletionTokenizer(mySpec);
                  List<Token> tokens = tokenizer.tokenize(text);
                  if (!tokens.isEmpty()) {
                    completer.complete(tokens.toArray(new Token[tokens.size()])).run();
                  }
                }
              };
            }
          });
        } else {
          if (!(cp.isMenu() && myHideTokensInMenu)) {
            for (final CompletionItem ci : mySpec.getTokenCompletion(new Function<Token, Runnable>() {
              @Override
              public Runnable apply(Token input) {
                return completer.complete(input);
              }
            }).get(cp)) {
              result.add(new WrapperCompletionItem(ci) {
                @Override
                public int getMatchPriority() {
                  return super.getMatchPriority() - 1;
                }
              });
            }
          }

          if (cp.isMenu()) {
            CompletionSupplier compl = mySpec.getAdditionalCompletion(new CompletionContext() {
              @Override
              public int getTargetIndex() {
                return 0;
              }

              @Override
              public List<Token> getPrefix() {
                return Collections.emptyList();
              }

              @Override
              public List<Cell> getViews() {
                return Collections.emptyList();
              }

              @Override
              public List<Token> getTokens() {
                return Collections.emptyList();
              }

              @Override
              public List<Object> getObjects() {
                return Collections.emptyList();
              }

              @Override
              public Mapper<?, ?> getContextMapper() {
                return mapper;
              }

              @Override
              public Object getTarget() {
                return target.get();
              }
            }, completer);
            result.addAll(FluentIterable.from(compl.get(new BaseCompletionParameters())).toList());
          }
        }
        return result;
      }
    };
  }