public static CodeCompletion newCodeCompletion(String description, String insertion,
			PyObject pyObj, String userInput) {
		JComponent comp = null;

		if (pyObj != null) {
			if (includeTypes) {
				/* append the class name to the end of the description */
				String className = getSimpleName(pyObj.getClass());
				if (pyObj instanceof PyInstance) {
					/* get the real class */
					className = getSimpleName(((PyInstance) pyObj).instclass.__name__);
				}
				else if (className.startsWith("Py")) {
					/* strip off the "Py" */
					className = className.substring("Py".length());
				}
				description = description + " (" + className + ")";
			}

			comp = new GDLabel(description);
			Iterator<Class<?>> iter = classes.iterator();
			while (iter.hasNext()) {
				Class<?> testClass = iter.next();
				if (testClass.isInstance(pyObj)) {
					comp.setForeground(classToColorMap.get(testClass));
					break;
				}
			}
		}

		int charsToRemove = userInput.length();
		return new CodeCompletion(description, insertion, comp, charsToRemove);
	}
Creates a new CodeCompletion from the given Jython objects.

@param description description of the new CodeCompletion
@param insertion what will be inserted to make the code complete
@param pyObj a Jython Object
@param userInput a word we want to complete, can be an empty string.
       It's used to determine which part (if any) of the input should be 
       removed before the insertion of the completion
@return A new CodeCompletion from the given Jython objects.
Ghidra/Features/Jython/src/main/java/ghidra/jython/JythonCodeCompletionFactory.java