Bug 93567 ContextInformationPopup leaks CompletionEngines?
N20050503-0010 Yourkit memory snapshot N20050503-0010_1.5.0_20050503-1905.memory on my machine.
org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/GenericJavaTypeProposal.java
if (bounds.length == 0 || bounds.length == 1 && "java.lang.Object".equals(bounds[0])) 
			return parameter.getElementName();
		StringBuffer buf= new StringBuffer(parameter.getElementName());
		buf.append(" extends "); 
		for (int i= 0; i < bounds.length; i++) {
			buf.append(Signature.getSimpleName(bounds[i]));
			if (i < bounds.length - 1)
				buf.append(" & "); 
		}
		return buf.toString();
	}
	/**
	 * Returns a type argument proposal for a given type binding. The proposal
	 * is the simple type name for unbounded types or the upper bound of
	 * wildcard types or the the bound of type variables with a single bound.
	 *
	 * @param binding the type argument binding
	 * @return a type argument proposal for <code>binding</code>
	 * @throws JavaModelException 
	 */
	private TypeArgumentProposal computeTypeProposal(ITypeBinding binding, ITypeParameter parameter) throws JavaModelException {
		
		
		final String name= binding.getName();
		if (binding.isWildcardType()) {
			String contextName= name.replaceFirst("\\?", parameter.getElementName()); 
			if (binding.isUpperbound())
				
				return new TypeArgumentProposal(binding.getBound().getName(), true, contextName);