下面列出了com.intellij.psi.PsiMethodCallExpression#getArgumentList ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
static PsiExpressionList createArgumentList(
PsiElement context, String clsName, String methodName, PsiElementFactory elementFactory) {
final PsiMethodCallExpression stub =
(PsiMethodCallExpression)
elementFactory.createExpressionFromText(
"methodName(" + clsName + "." + methodName + "())", context);
return stub.getArgumentList();
}
private static void handleMethodCall(
PsiMethodCallExpression currentMethodCall,
Set<String> methodNamesCalled,
BiConsumer<Collection<String>, PsiReferenceExpression> errorHandler,
Function<PsiMethodCallExpression, PsiClass> generatedClassResolver) {
PsiReferenceExpression methodExpression = currentMethodCall.getMethodExpression();
methodNamesCalled.add(methodExpression.getReferenceName());
// Assumption to find next method in a call chain
PsiMethodCallExpression nextMethodCall =
PsiTreeUtil.getChildOfType(methodExpression, PsiMethodCallExpression.class);
if (nextMethodCall != null) {
handleMethodCall(nextMethodCall, methodNamesCalled, errorHandler, generatedClassResolver);
} else if ("create".equals(methodExpression.getReferenceName())) {
// Finish call chain
// TODO T47712852: allow setting required prop in another statement
Optional.ofNullable(generatedClassResolver.apply(currentMethodCall))
.map(generatedCls -> collectMissingRequiredProps(generatedCls, methodNamesCalled))
.filter(result -> !result.isEmpty())
.ifPresent(
missingRequiredProps -> errorHandler.accept(missingRequiredProps, methodExpression));
}
PsiExpressionList argumentList = currentMethodCall.getArgumentList();
for (PsiExpression argument : argumentList.getExpressions()) {
handleIfMethodCall(argument, errorHandler, generatedClassResolver);
}
}
@Override
public void annotate(PsiElement element, AnnotationHolder holder) {
DEBUG_LOGGER.logStep("start " + element);
// Implementation similar to {@link HighlightMethodUtil#checkMethodCall}
if (!(element instanceof PsiMethodCallExpression)) {
return;
}
// MethodCall == method usage
final PsiMethodCallExpression eventHandlerSetter = (PsiMethodCallExpression) element;
final PsiExpressionList list = eventHandlerSetter.getArgumentList();
if (!list.isEmpty()) {
return;
}
final String eventQualifiedName = resolveEventName(eventHandlerSetter);
if (eventQualifiedName == null) {
return;
}
final PsiClass parentCls =
(PsiClass) PsiTreeUtil.findFirstParent(eventHandlerSetter, PsiClass.class::isInstance);
if (parentCls == null) {
return;
}
final LayoutSpecModel parentLayoutModel = ComponentGenerateUtils.createLayoutModel(parentCls);
if (parentLayoutModel == null) {
return;
}
final ImmutableList<SpecMethodModel<EventMethod, EventDeclarationModel>>
implementedEventHandlers = parentLayoutModel.getEventMethods();
final String componentQualifiedName = parentLayoutModel.getComponentTypeName().toString();
final Project project = eventHandlerSetter.getProject();
final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
final String message = "Add " + AddArgumentFix.getCapitalizedMethoName(eventHandlerSetter);
final SpecModelValidationError error = new SpecModelValidationError(list, message);
final List<IntentionAction> fixes =
implementedEventHandlers.stream()
.filter(handler -> eventQualifiedName.equals(handler.typeModel.name.reflectionName()))
.map(handler -> handler.name.toString())
.distinct()
.map(
methodName ->
AddArgumentFix.createAddMethodCallFix(
eventHandlerSetter, componentQualifiedName, methodName, elementFactory))
.collect(Collectors.toList());
final PsiClass event = PsiSearchUtils.findClass(project, eventQualifiedName);
if (event != null) {
fixes.add(
AddArgumentFix.createNewMethodCallFix(
eventHandlerSetter, componentQualifiedName, event, parentCls));
}
AnnotatorUtils.addError(holder, error, fixes);
DEBUG_LOGGER.logStep("end " + element);
}