protected String _case(
     JvmConstructor input,
     XConstructorCall context,
     EReference ref,
     JvmFeatureDescription jvmFeatureDescription) {
   List<XExpression> arguments = context.getArguments();
   if (!isValidNumberOfArguments(input, arguments)) return INVALID_NUMBER_OF_ARGUMENTS;
   // expected constructor type argument count is the sum of the declaring type's type parameters
   // and the constructors type parameters
   int expectedTypeArguments =
       input.getTypeParameters().size()
           + ((JvmTypeParameterDeclarator) input.getDeclaringType()).getTypeParameters().size();
   if ((!context.getTypeArguments().isEmpty()) // raw type or inferred arguments
       && expectedTypeArguments != context.getTypeArguments().size())
     return INVALID_NUMBER_OF_TYPE_ARGUMENTS;
   // TODO check type parameter bounds against type arguments
   if (!areArgumentTypesValid(input, arguments)) return INVALID_ARGUMENT_TYPES;
   return null;
 }