From 96fe3e14171dc06b609079aa6fe4fd3089a7b260 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Tue, 24 Sep 2019 18:27:36 -0400 Subject: [PATCH] Throw on missing type variables in Types.newParameterizedType* methods It's a programmer error to omit this, but vararg declaration allows you to. This checks that. We could improve it to ensure matching lengths or bounds, but this is a good start. --- .../src/main/java/com/squareup/moshi/Types.java | 6 ++++++ .../test/java/com/squareup/moshi/TypesTest.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/moshi/src/main/java/com/squareup/moshi/Types.java b/moshi/src/main/java/com/squareup/moshi/Types.java index 1ee9fa4..a9bca93 100644 --- a/moshi/src/main/java/com/squareup/moshi/Types.java +++ b/moshi/src/main/java/com/squareup/moshi/Types.java @@ -109,6 +109,9 @@ public final class Types { * method if {@code rawType} is not enclosed in another type. */ public static ParameterizedType newParameterizedType(Type rawType, Type... typeArguments) { + if (typeArguments.length == 0) { + throw new IllegalArgumentException("Missing type arguments for " + rawType); + } return new ParameterizedTypeImpl(null, rawType, typeArguments); } @@ -118,6 +121,9 @@ public final class Types { */ public static ParameterizedType newParameterizedTypeWithOwner( Type ownerType, Type rawType, Type... typeArguments) { + if (typeArguments.length == 0) { + throw new IllegalArgumentException("Missing type arguments for " + rawType); + } return new ParameterizedTypeImpl(ownerType, rawType, typeArguments); } diff --git a/moshi/src/test/java/com/squareup/moshi/TypesTest.java b/moshi/src/test/java/com/squareup/moshi/TypesTest.java index 60a005e..b2d4920 100644 --- a/moshi/src/test/java/com/squareup/moshi/TypesTest.java +++ b/moshi/src/test/java/com/squareup/moshi/TypesTest.java @@ -85,6 +85,22 @@ public final class TypesTest { assertThat(getFirstTypeArgument(type)).isEqualTo(B.class); } + @Test public void newParameterizedType_missingTypeVars() { + try { + Types.newParameterizedType(List.class); + fail("Should have errored due to missing type variable"); + } catch (Exception e) { + assertThat(e).hasMessageContaining("Missing type arguments"); + } + + try { + Types.newParameterizedTypeWithOwner(TypesTest.class, A.class); + fail("Should have errored due to missing type variable"); + } catch (Exception e) { + assertThat(e).hasMessageContaining("Missing type arguments"); + } + } + @Test public void parameterizedTypeWithRequiredOwnerMissing() throws Exception { try { Types.newParameterizedType(A.class, B.class);