private List<ValueParameterDescriptor> createValueParameterDescriptors( ExpressionTypingContext context, JetFunctionLiteral functionLiteral, FunctionDescriptorImpl functionDescriptor, boolean functionTypeExpected) { List<ValueParameterDescriptor> valueParameterDescriptors = Lists.newArrayList(); List<JetParameter> declaredValueParameters = functionLiteral.getValueParameters(); List<ValueParameterDescriptor> expectedValueParameters = (functionTypeExpected) ? JetStandardClasses.getValueParameters(functionDescriptor, context.expectedType) : null; boolean hasDeclaredValueParameters = functionLiteral.getValueParameterList() != null; if (functionTypeExpected && !hasDeclaredValueParameters && expectedValueParameters.size() == 1) { ValueParameterDescriptor valueParameterDescriptor = expectedValueParameters.get(0); ValueParameterDescriptor it = new ValueParameterDescriptorImpl( functionDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "it", false, valueParameterDescriptor.getOutType(), valueParameterDescriptor.hasDefaultValue(), valueParameterDescriptor.getVarargElementType()); valueParameterDescriptors.add(it); context.trace.record(AUTO_CREATED_IT, it); } else { for (int i = 0; i < declaredValueParameters.size(); i++) { JetParameter declaredParameter = declaredValueParameters.get(i); JetTypeReference typeReference = declaredParameter.getTypeReference(); JetType type; if (typeReference != null) { type = context.getTypeResolver().resolveType(context.scope, typeReference); } else { if (expectedValueParameters != null && i < expectedValueParameters.size()) { type = expectedValueParameters.get(i).getOutType(); } else { context.trace.report(CANNOT_INFER_PARAMETER_TYPE.on(declaredParameter)); type = ErrorUtils.createErrorType("Cannot be inferred"); } } ValueParameterDescriptor valueParameterDescriptor = context .getDescriptorResolver() .resolveValueParameterDescriptor(functionDescriptor, declaredParameter, i, type); valueParameterDescriptors.add(valueParameterDescriptor); } } return valueParameterDescriptors; }
@NotNull private static ValueParameterDescriptor createValueParameterDescriptor( @NotNull ExpressionTypingContext context, @NotNull FunctionDescriptorImpl functionDescriptor, @NotNull List<JetParameter> declaredValueParameters, @Nullable List<ValueParameterDescriptor> expectedValueParameters, int index) { JetParameter declaredParameter = declaredValueParameters.get(index); JetTypeReference typeReference = declaredParameter.getTypeReference(); JetType expectedType; if (expectedValueParameters != null && index < expectedValueParameters.size()) { expectedType = expectedValueParameters.get(index).getType(); } else { expectedType = null; } JetType type; if (typeReference != null) { type = context .expressionTypingServices .getTypeResolver() .resolveType(context.scope, typeReference, context.trace, true); if (expectedType != null) { if (!JetTypeChecker.INSTANCE.isSubtypeOf(expectedType, type)) { context.trace.report( EXPECTED_PARAMETER_TYPE_MISMATCH.on(declaredParameter, expectedType)); } } } else { if (expectedType == null || expectedType == DONT_CARE || expectedType == CANT_INFER_TYPE_PARAMETER) { context.trace.report(CANNOT_INFER_PARAMETER_TYPE.on(declaredParameter)); } if (expectedType != null) { type = expectedType; } else { type = CANT_INFER_LAMBDA_PARAM_TYPE; } } return context .expressionTypingServices .getDescriptorResolver() .resolveValueParameterDescriptorWithAnnotationArguments( context.scope, functionDescriptor, declaredParameter, index, type, context.trace); }