private static Optional<MetaClass> getMetaClassFromGeneric(final MetaType genericType) { if (genericType instanceof MetaClass) { return Optional.of((MetaClass) genericType); } else if (genericType instanceof MetaParameterizedType && ((MetaParameterizedType) genericType).getRawType() instanceof MetaClass) { final MetaParameterizedType mpt = (MetaParameterizedType) genericType; @SuppressWarnings({ "unchecked", "rawtypes" }) final MetaType[] typeArgs = Arrays .stream(mpt.getTypeParameters()) .map(arg -> ((Optional<MetaType>) (Optional) getMetaClassFromGeneric(arg)).orElse(arg)) .toArray(MetaType[]::new); return Optional.of(parameterizedAs((MetaClass) mpt.getRawType(), typeParametersOf(typeArgs))); } else { return Optional.empty(); } }
public static Class<?>[] asClassArray(final MetaType[] cls) { final Class<?>[] newClasses = new Class<?>[cls.length]; for (int i = 0; i < cls.length; i++) { if (cls[i] instanceof MetaParameterizedType) { newClasses[i] = ((MetaClass) ((MetaParameterizedType) cls[i]).getRawType()).asClass(); } else { newClasses[i] = ((MetaClass) cls[i]).asClass(); } } return newClasses; }
public static Class<?>[] asClassArray(final MetaType[] cls) { final Class<?>[] newClasses = new Class<?>[cls.length]; for (int i = 0; i < cls.length; i++) { if (cls[i] instanceof MetaParameterizedType) { newClasses[i] = ((MetaClass) ((MetaParameterizedType) cls[i]).getRawType()).asClass(); } else { newClasses[i] = ((MetaClass) cls[i]).asClass(); } } return newClasses; }
protected MetaClass[] getTypeArguments(final MetaClass type) { final MetaParameterizedType pType = type.getParameterizedType(); final MetaType[] typeArgs = (pType != null ? pType.getTypeParameters() : new MetaType[0]); final MetaClass[] typeArgsClasses = new MetaClass[typeArgs.length]; for (int i = 0; i < typeArgs.length; i++) { final MetaType argType = typeArgs[i]; if (argType instanceof MetaClass) { typeArgsClasses[i] = (MetaClass) argType; } else if (argType instanceof MetaParameterizedType) { typeArgsClasses[i] = (MetaClass) ((MetaParameterizedType) argType).getRawType(); } } return typeArgsClasses; }
buf.append(getClassReference(parameterizedTypeParemeter.getRawType(), context)); buf.append(getClassReferencesForParameterizedTypes(parameterizedTypeParemeter, context));
private String getTypeParmsString(final MetaParameterizedType parameterizedType) { final StringBuilder buf = new StringBuilder(512); if (parameterizedType != null && parameterizedType.getTypeParameters().length != 0) { buf.append("<"); for (int i = 0; i < parameterizedType.getTypeParameters().length; i++) { final MetaType typeParameter = parameterizedType.getTypeParameters()[i]; if (typeParameter instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParameter = (MetaParameterizedType) typeParameter; buf.append(((MetaClass) parameterizedTypeParameter.getRawType()).getFullyQualifiedName()); buf.append(getTypeParmsString(parameterizedTypeParameter)); } else if (typeParameter instanceof MetaWildcardType) { buf.append(((MetaWildcardType) typeParameter).toString()); } else if (typeParameter instanceof MetaTypeVariable) { buf.append(typeParameter.getName()); } else { buf.append(((MetaClass) typeParameter).getFullyQualifiedName()); } if (i + 1 < parameterizedType.getTypeParameters().length) buf.append(", "); } buf.append(">"); } return buf.toString(); }
private String getTypeParmsString(final MetaParameterizedType parameterizedType) { final StringBuilder buf = new StringBuilder(512); if (parameterizedType != null && parameterizedType.getTypeParameters().length != 0) { buf.append("<"); for (int i = 0; i < parameterizedType.getTypeParameters().length; i++) { final MetaType typeParameter = parameterizedType.getTypeParameters()[i]; if (typeParameter instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParameter = (MetaParameterizedType) typeParameter; buf.append(((MetaClass) parameterizedTypeParameter.getRawType()).getFullyQualifiedName()); buf.append(getTypeParmsString(parameterizedTypeParameter)); } else if (typeParameter instanceof MetaWildcardType) { buf.append(((MetaWildcardType) typeParameter).toString()); } else if (typeParameter instanceof MetaTypeVariable) { buf.append(typeParameter.getName()); } else { buf.append(((MetaClass) typeParameter).getFullyQualifiedName()); } if (i + 1 < parameterizedType.getTypeParameters().length) buf.append(", "); } buf.append(">"); } return buf.toString(); }
private static MetaClass getConcreteTypeParameter(final MetaClass toType, final int typeParamIndex, final int typeParamsSize) { if (toType.getParameterizedType() != null) { final MetaType[] typeParms = toType.getParameterizedType().getTypeParameters(); if (typeParms != null && typeParms.length == typeParamsSize) { MetaClass typeParameter = null; if (typeParms[typeParamIndex] instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParemeter = (MetaParameterizedType) typeParms[typeParamIndex]; typeParameter = (MetaClass) parameterizedTypeParemeter.getRawType(); } else if (typeParms[typeParamIndex] instanceof MetaClass) { typeParameter = (MetaClass) typeParms[typeParamIndex]; } return typeParameter; } } return null; }
buf.append(getClassReference(parameterizedTypeParemeter.getRawType(), context)); buf.append(getClassReferencesForParameterizedTypes(parameterizedTypeParemeter, context));
private static MetaClass getConcreteTypeParameter(final MetaClass toType, final int typeParamIndex, final int typeParamsSize) { if (toType.getParameterizedType() != null) { final MetaType[] typeParms = toType.getParameterizedType().getTypeParameters(); if (typeParms != null && typeParms.length == typeParamsSize) { MetaClass typeParameter = null; if (typeParms[typeParamIndex] instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParemeter = (MetaParameterizedType) typeParms[typeParamIndex]; typeParameter = (MetaClass) parameterizedTypeParemeter.getRawType(); } else if (typeParms[typeParamIndex] instanceof MetaClass) { typeParameter = (MetaClass) typeParms[typeParamIndex]; } return typeParameter; } } return null; }
private MetaClass getTypeOrFirstUpperBound(MetaType clazz, final MetaMethod method) { if (clazz instanceof MetaTypeVariable) { final MetaType[] bounds = ((MetaTypeVariable) clazz).getBounds(); if (bounds.length == 1 && bounds[0] instanceof MetaClass) { clazz = ((MetaTypeVariable) clazz).getBounds()[0]; } else { // TODO add full support for generics in errai codegen logger.log(TreeLogger.WARN, "Ignoring method: " + method + " in class " + bindable + ". Methods using " + "multiple type parameters or type parameters with multiple bounds are currently not supported in " + "@Bindable types! Invoking this method on a bound model will have unpredictable results."); return null; } } else if (clazz instanceof MetaParameterizedType) { clazz = ((MetaParameterizedType) clazz).getRawType(); } if (clazz instanceof MetaClass) { return (MetaClass) clazz; } logger.log(TreeLogger.WARN, "Ignoring method: " + method + " in class " + bindable + ". Method cannot be proxied!"); return null; }
private MetaClass getTypeOrFirstUpperBound(MetaType clazz, final MetaMethod method) { if (clazz instanceof MetaTypeVariable) { final MetaType[] bounds = ((MetaTypeVariable) clazz).getBounds(); if (bounds.length == 1 && bounds[0] instanceof MetaClass) { clazz = ((MetaTypeVariable) clazz).getBounds()[0]; } else { // TODO add full support for generics in errai codegen logger.log(TreeLogger.WARN, "Ignoring method: " + method + " in class " + bindable + ". Methods using " + "multiple type parameters or type parameters with multiple bounds are currently not supported in " + "@Bindable types! Invoking this method on a bound model will have unpredictable results."); return null; } } else if (clazz instanceof MetaParameterizedType) { clazz = ((MetaParameterizedType) clazz).getRawType(); } if (clazz instanceof MetaClass) { return (MetaClass) clazz; } logger.log(TreeLogger.WARN, "Ignoring method: " + method + " in class " + bindable + ". Method cannot be proxied!"); return null; }