private void ensureVersion(CtClass cc) throws NotFoundException, CannotCompileException, BadBytecode { CtMethod ccms[] = cc.getDeclaredMethods(); if (!javassist.Modifier.isAbstract(cc.getModifiers())) { String gsig = cc.getGenericSignature(); ClassSignature csig = SignatureAttribute.toClassSignature(gsig); // Warning: this is not doing proper parent (superclass/interfaces) traversal TypeArgument ta = getTypeArg(csig.getSuperClass().getTypeArguments(), "Lwater/api/rest/Version"); if (ta!=null && !hasExisting("getVersion", "()"+ta.getType().encode(), ccms) ) { String typeName = ta.toString(); String valueName = getValueFromType(typeName); //cc.addMethod(CtNewMethod.make("public "+typeName+" getVersion() {" + cc.addMethod(CtNewMethod.make("public water.api.rest.Version getVersion() {" + " return "+valueName+";" + "}",cc)); } } } private String getValueFromType(String typeName) {
public List<ResolvedTypeParameterDeclaration> getTypeParameters() { if (null == ctClass.getGenericSignature()) { return Collections.emptyList(); } else { try { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.<SignatureAttribute.TypeParameter>stream(classSignature.getParameters()) .map((tp) -> new JavassistTypeParameter(tp, JavassistFactory.toTypeDeclaration(ctClass, typeSolver), typeSolver)) .collect(Collectors.toList()); } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } } }
public List<ResolvedTypeParameterDeclaration> getTypeParameters() { if (null == ctClass.getGenericSignature()) { return Collections.emptyList(); } else { try { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.<SignatureAttribute.TypeParameter>stream(classSignature.getParameters()) .map((tp) -> new JavassistTypeParameter(tp, JavassistFactory.toTypeDeclaration(ctClass, typeSolver), typeSolver)) .collect(Collectors.toList()); } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } } }
public List<ResolvedTypeParameterDeclaration> getTypeParameters() { if (null == ctClass.getGenericSignature()) { return Collections.emptyList(); } else { try { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.<SignatureAttribute.TypeParameter>stream(classSignature.getParameters()) .map((tp) -> new JavassistTypeParameter(tp, JavassistFactory.toTypeDeclaration(ctClass, typeSolver), typeSolver)) .collect(Collectors.toList()); } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } } }
@Override public <T extends TypeUsage> Map<String, TypeUsage> associatedTypeParametersToName(List<T> typeParams) { if (typeParams.isEmpty()) { return Collections.emptyMap(); } String genericSignature = ctClass.getGenericSignature(); try { SignatureAttribute.ClassSignature classSignature =SignatureAttribute.toClassSignature(genericSignature); SignatureAttribute.TypeParameter[] typeParameters = classSignature.getParameters(); if (typeParameters.length != typeParams.size()) { throw new IllegalStateException("It should have " + typeParameters.length + " and it has " + typeParams.size()); } Map<String, TypeUsage> map = new HashMap<>(); int i=0; for (SignatureAttribute.TypeParameter tv : typeParameters) { map.put(tv.getName(), typeParams.get(i)); i++; } return map; } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } }
private static Map<String, TypeUsageNode.TypeVariableData> getVisibleTypeVariables(CtClass ctClass) { Map<String, TypeUsageNode.TypeVariableData> visibleTypeVariables = new HashMap<>(); if (ctClass.getGenericSignature() != null) { try { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); for (SignatureAttribute.TypeParameter typeParameter : classSignature.getParameters()) { TypeVariableUsage.GenericDeclaration genericDeclaration = null; List<? extends TypeUsage> bounds = Collections.emptyList(); TypeUsageNode.TypeVariableData typeVariableData = new TypeUsageNode.TypeVariableData(genericDeclaration, bounds); visibleTypeVariables.put(typeParameter.getName(), typeVariableData); } } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } } return visibleTypeVariables; }
@Override public List<ResolvedReferenceType> getInterfaces() { try { if (ctClass.getGenericSignature() == null) { return Arrays.stream(ctClass.getInterfaces()) .map(i -> new JavassistInterfaceDeclaration(i, typeSolver)) .map(i -> new ReferenceTypeImpl(i, typeSolver)) .collect(Collectors.toList()); } else { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.stream(classSignature.getInterfaces()) .map(i -> JavassistUtils.signatureTypeToType(i, typeSolver, this).asReferenceType()) .collect(Collectors.toList()); } } catch (NotFoundException e) { throw new RuntimeException(e); } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public List<ResolvedReferenceType> getInterfaces() { try { if (ctClass.getGenericSignature() == null) { return Arrays.stream(ctClass.getInterfaces()) .map(i -> new JavassistInterfaceDeclaration(i, typeSolver)) .map(i -> new ReferenceTypeImpl(i, typeSolver)) .collect(Collectors.toList()); } else { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.stream(classSignature.getInterfaces()) .map(i -> JavassistUtils.signatureTypeToType(i, typeSolver, this).asReferenceType()) .collect(Collectors.toList()); } } catch (NotFoundException e) { throw new RuntimeException(e); } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public List<ResolvedReferenceType> getInterfaces() { try { if (ctClass.getGenericSignature() == null) { return Arrays.stream(ctClass.getClassFile().getInterfaces()) .map(i -> typeSolver.solveType(JavassistUtils.internalNameToCanonicalName(i))) .map(i -> new ReferenceTypeImpl(i, typeSolver)) .collect(Collectors.toList()); } else { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return Arrays.stream(classSignature.getInterfaces()) .map(i -> JavassistUtils.signatureTypeToType(i, typeSolver, this).asReferenceType()) .collect(Collectors.toList()); } } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public ResolvedReferenceType getSuperClass() { try { if (ctClass.getSuperclass() == null) { return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver); } if (ctClass.getGenericSignature() == null) { return new ReferenceTypeImpl(new JavassistClassDeclaration(ctClass.getSuperclass(), typeSolver), typeSolver); } SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return JavassistUtils.signatureTypeToType(classSignature.getSuperClass(), typeSolver, this).asReferenceType(); } catch (NotFoundException e) { throw new RuntimeException(e); } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public ResolvedReferenceType getSuperClass() { try { if (ctClass.getSuperclass() == null) { return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver); } if (ctClass.getGenericSignature() == null) { return new ReferenceTypeImpl(new JavassistClassDeclaration(ctClass.getSuperclass(), typeSolver), typeSolver); } SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return JavassistUtils.signatureTypeToType(classSignature.getSuperClass(), typeSolver, this).asReferenceType(); } catch (NotFoundException e) { throw new RuntimeException(e); } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public ResolvedReferenceType getSuperClass() { try { if (ctClass.getClassFile().getSuperclass() == null) { return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver); } if (ctClass.getGenericSignature() == null) { return new ReferenceTypeImpl(typeSolver.solveType(JavassistUtils.internalNameToCanonicalName(ctClass.getClassFile().getSuperclass())), typeSolver); } SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); return JavassistUtils.signatureTypeToType(classSignature.getSuperClass(), typeSolver, this).asReferenceType(); } catch (BadBytecode e) { throw new RuntimeException(e); } }
@Override public List<ReferenceTypeUsage> getAllAncestors() { try { if (ctClass.getGenericSignature() != null) { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(ctClass.getGenericSignature()); List<ReferenceTypeUsage> ancestors = new ArrayList<>(); if (ctClass.getSuperclass() != null) {
private ReferenceTypeUsage toReferenceTypeUsage(CtClass clazz, SignatureAttribute.ClassType genericClassType, SymbolResolver resolver) { try { SignatureAttribute.ClassSignature classSignature = SignatureAttribute.toClassSignature(clazz.getGenericSignature()); TypeDefinition typeDefinition = new JavassistTypeDefinition(clazz, this.resolver); ReferenceTypeUsage referenceTypeUsage = new ReferenceTypeUsage(typeDefinition); int i=0; for (SignatureAttribute.TypeArgument typeArgument : genericClassType.getTypeArguments()) { SignatureAttribute.Type t = typeArgument.getType(); referenceTypeUsage.getTypeParameterValues().add(classSignature.getParameters()[i].getName(), toTypeUsage(t, resolver, Collections.emptyMap())); i++; } return referenceTypeUsage; } catch (BadBytecode badBytecode) { throw new RuntimeException(badBytecode); } }