private boolean isLegalClassTypeParam(ExecutableElement elt, TypeInfo type) { if (type.getKind() == ClassKind.CLASS_TYPE && type.isParameterized()) { ParameterizedTypeInfo parameterized = (ParameterizedTypeInfo) type; TypeInfo arg = parameterized.getArg(0); if (arg.isVariable()) { TypeVariableInfo variable = (TypeVariableInfo) arg; for (TypeParameterElement typeParamElt : elt.getTypeParameters()) { if (typeParamElt.getSimpleName().toString().equals(variable.getName())) { return true; } } } } return false; }
private TypeVariableInfo assertTypeVariable(TypeInfo type, String expectedName) { assertEquals(TypeVariableInfo.class, type.getClass()); TypeVariableInfo classType = (TypeVariableInfo) type; assertEquals(ClassKind.OBJECT, classType.getKind()); assertEquals(expectedName, classType.getName()); return classType; }
@Test public void testParameterizedVariableSuperType() throws Exception { ClassModel model = new GeneratorHelper().generateClass(InterfaceWithParameterizedVariableSupertype.class); assertEquals(InterfaceWithParameterizedVariableSupertype.class.getName() + "<T>", model.getIfaceFQCN()); assertEquals(InterfaceWithParameterizedVariableSupertype.class.getSimpleName(), model.getIfaceSimpleName()); assertEquals(1, model.getReferencedTypes().size()); assertTrue(model.getReferencedTypes().contains(GenericInterfaceInfo)); assertEquals(1, model.getSuperTypes().size()); assertTrue(model.getSuperTypes().contains(TypeReflectionFactory.create(InterfaceWithParameterizedVariableSupertype.class.getGenericInterfaces()[0]))); List<TypeInfo> superTypeArgs = model.getSuperTypeArguments(); assertEquals(1, superTypeArgs.size()); TypeVariableInfo superTypeArg = (TypeVariableInfo) superTypeArgs.get(0); assertEquals("T", superTypeArg.getName()); assertTrue(superTypeArg.isClassParam()); }
@Test public void testMethodWithTypeVarParamByGenericType() throws Exception { Runnable test = () -> { try { ClassModel model = new GeneratorHelper().generateClass(MethodWithTypeVarParamByGenericType.class); MethodInfo meth = model.getMethods().get(0); ParamInfo param = meth.getParam(0); ParameterizedTypeInfo handler = (ParameterizedTypeInfo) param.getType(); assertEquals(Handler.class.getName(), handler.getRaw().getName()); ParameterizedTypeInfo genericInt2 = (ParameterizedTypeInfo) handler.getArg(0); assertEquals(GenericInterface2.class.getName(), genericInt2.getRaw().getName()); TypeVariableInfo k = (TypeVariableInfo) genericInt2.getArg(0); assertEquals("K", k.getName()); TypeVariableInfo v = (TypeVariableInfo) genericInt2.getArg(1); assertEquals("V", v.getName()); } catch (Exception e) { throw new AssertionError(e); } }; blacklist(test, Stream.of(WriteStream.class)); test.run(); }
public TypeArgExpression resolveTypeArg(TypeVariableInfo typeVar) { for (TypeParamInfo.Method typeParam : typeParams) { if (typeParam.getName().equals(typeVar.getName())) { for (ParamInfo param : params) { if (param.getType().getKind() == ClassKind.CLASS_TYPE &&
@Test public void testGenericInterfaceExtendingReadStreamAndWriteStream() throws Exception { ClassModel model = new GeneratorHelper().generateClass(GenericInterfaceExtentingReadStreamAndWriteStream.class); ApiTypeInfo apiType = (ApiTypeInfo) model.getType().getRaw(); assertTrue(apiType.isReadStream()); TypeVariableInfo readStreamArg = (TypeVariableInfo) apiType.getReadStreamArg(); assertEquals("U", readStreamArg.getName()); assertTrue(apiType.isWriteStream()); TypeVariableInfo writeStreamArg = (TypeVariableInfo) apiType.getWriteStreamArg(); assertEquals("U", writeStreamArg.getName()); assertFalse(apiType.isHandler()); }
@Test public void testGenericInterfaceExtendingReadStream() throws Exception { ClassModel model = new GeneratorHelper().generateClass(GenericInterfaceExtentingReadStream.class); ApiTypeInfo apiType = (ApiTypeInfo) model.getType().getRaw(); assertTrue(apiType.isReadStream()); TypeVariableInfo readStreamArg = (TypeVariableInfo) apiType.getReadStreamArg(); assertEquals("U", readStreamArg.getName()); assertFalse(apiType.isWriteStream()); assertNull(apiType.getWriteStreamArg()); assertFalse(apiType.isHandler()); }
@Test public void testGenericInterfaceExtendingWriteStream() throws Exception { ClassModel model = new GeneratorHelper().generateClass(GenericInterfaceExtentingWriteStream.class); ApiTypeInfo apiType = (ApiTypeInfo) model.getType().getRaw(); assertFalse(apiType.isReadStream()); assertNull(apiType.getReadStreamArg()); assertTrue(apiType.isWriteStream()); TypeVariableInfo writeStreamArg = (TypeVariableInfo) apiType.getWriteStreamArg(); assertEquals("U", writeStreamArg.getName()); assertFalse(apiType.isHandler()); }