use of com.intellij.codeInsight.hint.ParameterInfoController in project intellij-community by JetBrains.
the class JavaMethodOverloadSwitchHandler method executeWriteAction.
@Override
public void executeWriteAction(Editor editor, @Nullable Caret caret, DataContext dataContext) {
if (caret == null)
caret = editor.getCaretModel().getPrimaryCaret();
Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null)
return;
PsiDocumentManager.getInstance(project).commitAllDocuments();
PsiElement exprList = getExpressionList(editor, caret.getOffset(), project);
if (!(exprList instanceof PsiExpressionList))
return;
int lbraceOffset = exprList.getTextRange().getStartOffset();
ParameterInfoController controller = ParameterInfoController.findControllerAtOffset(editor, lbraceOffset);
if (controller == null)
return;
Object[] objects = controller.getObjects();
Object highlighted = controller.getHighlighted();
if (objects == null || objects.length <= 1 || highlighted == null)
return;
int currentIndex = ContainerUtil.indexOf(Arrays.asList(objects), highlighted);
if (currentIndex < 0)
return;
PsiMethod currentMethod = (PsiMethod) ((CandidateInfo) objects[currentIndex]).getElement();
Map<String, String> enteredParameters = exprList.getUserData(ENTERED_PARAMETERS);
if (enteredParameters == null) {
exprList.putUserData(ENTERED_PARAMETERS, enteredParameters = new HashMap<>());
}
PsiExpression[] enteredExpressions = ((PsiExpressionList) exprList).getExpressions();
assert enteredExpressions.length == 0 || enteredExpressions.length == currentMethod.getParameterList().getParametersCount();
for (int i = 0; i < enteredExpressions.length; i++) {
PsiExpression expression = enteredExpressions[i];
String value = expression.getText().trim();
if (!value.isEmpty()) {
String key = getParameterKey(currentMethod, i);
enteredParameters.put(key, value);
}
}
PsiMethod targetMethod = (PsiMethod) ((CandidateInfo) objects[(currentIndex + (mySwitchUp ? -1 : 1) + objects.length) % objects.length]).getElement();
PsiParameterList parameterList = targetMethod.getParameterList();
int parametersCount = parameterList.getParametersCount();
// avoid caret impact on hints location
caret.moveToOffset(lbraceOffset);
int offset = lbraceOffset + 1;
int endOffset = exprList.getTextRange().getEndOffset() - 1;
List<Inlay> oldInlays = editor.getInlayModel().getInlineElementsInRange(offset, endOffset);
for (Inlay inlay : oldInlays) {
Disposer.dispose(inlay);
}
editor.getDocument().deleteString(offset, endOffset);
int targetCaretPosition = -1;
List<Inlay> addedHints = new ArrayList<>(parametersCount);
for (int i = 0; i < parametersCount; i++) {
String key = getParameterKey(targetMethod, i);
String value = enteredParameters.getOrDefault(key, "");
if (value.isEmpty() && targetCaretPosition == -1)
targetCaretPosition = offset;
if (i < parametersCount - 1)
value += ", ";
editor.getDocument().insertString(offset, value);
String name = parameterList.getParameters()[i].getName();
if (name != null) {
addedHints.add(ParameterHintsPresentationManager.getInstance().addHint(editor, offset, name + ":", false, true));
}
offset += value.length();
}
if (targetCaretPosition == -1)
targetCaretPosition = offset;
caret.moveToLogicalPosition(editor.offsetToLogicalPosition(targetCaretPosition).leanForward(true));
Disposer.register(controller, () -> {
for (Inlay hint : addedHints) {
if (hint != null)
ParameterHintsPresentationManager.getInstance().unpin(hint);
}
});
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
CompletionMemory.registerChosenMethod(targetMethod, (PsiCall) exprList.getParent());
// update popup immediately (otherwise, it will be updated only after delay)
controller.updateComponent();
}
use of com.intellij.codeInsight.hint.ParameterInfoController in project intellij-community by JetBrains.
the class JavaMethodCallElement method showParameterHints.
public static void showParameterHints(InsertionContext context, PsiMethod method, PsiCallExpression methodCall) {
PsiParameterList parameterList = method.getParameterList();
int parametersCount = parameterList.getParametersCount();
if (methodCall == null || parametersCount == 0 || context.getCompletionChar() == Lookup.COMPLETE_STATEMENT_SELECT_CHAR || Registry.is("java.completion.argument.live.template") || !Registry.is("java.completion.argument.hints")) {
return;
}
Editor editor = context.getEditor();
CaretModel caretModel = editor.getCaretModel();
int offset = caretModel.getOffset();
// avoid caret impact on hints location
caretModel.moveToOffset(offset - 1);
editor.getDocument().insertString(offset, StringUtil.repeat(", ", parametersCount - 1));
List<Inlay> addedHints = new ArrayList<>(parametersCount);
for (PsiParameter parameter : parameterList.getParameters()) {
String name = parameter.getName();
if (name != null) {
addedHints.add(ParameterHintsPresentationManager.getInstance().addHint(editor, offset, name + ":", false, true));
}
offset += 2;
}
int braceOffset = caretModel.getOffset();
caretModel.moveToLogicalPosition(editor.offsetToLogicalPosition(braceOffset + 1).leanForward(true));
Project project = context.getProject();
MethodParameterInfoHandler handler = new MethodParameterInfoHandler();
ShowParameterInfoContext infoContext = new ShowParameterInfoContext(editor, project, context.getFile(), braceOffset, braceOffset);
handler.findElementForParameterInfo(infoContext);
Disposer.register(new ParameterInfoController(project, editor, braceOffset, infoContext.getItemsToShow(), null, methodCall.getArgumentList(), handler, false, false), () -> {
for (Inlay inlay : addedHints) {
if (inlay != null)
ParameterHintsPresentationManager.getInstance().unpin(inlay);
}
});
}
Aggregations