!7 compact module ListMethodsOfActiveModule > DynTextArea { transient O module; transient JButton btnCall; void start { dm_updateMeOnNewActiveModule(); } S methodToCall() { S s = trim(lineAtCaret(textArea)), m; ret endsWith(s, "!") && isIdentifier(m = dropLast(s)) ? m : null; } JComponent visualize() { JComponent c = super.visualize(); onCaretAndNow(textArea, r { S m = methodToCall(); setEnabledAndText(btnCall, m != null, m != null ? "Call method " + singleQuote(m) : "Move cursor to call a method"); }); ret centerAndSouth(c, withMargin(jcenteredline(btnCall = jbutton("Call method", r-thread { S m = methodToCall(); if (m != null) { print("Calling method " + m + " on " + module); call(module, m); } })))); } void update { O _m = dm_activeModule(); if (dm_isOtherModule(_m) && setField(module := _m)) { setText("Active Module: " + dm_moduleName(module) + "\n"); new StringBuilder buf; L l = allLiveMethods_skipOverridden_sortByNameWithinClass(module); new L lines; Class c = null; for (Method m : l) { if (m.getDeclaringClass() != c) { c = m.getDeclaringClass(); lines.add("\nclass " + shortClassName(c) + "\n"); } Class[] args = m.getParameterTypes(); Class returns = m.getReturnType(); lines.add(" " + m.getName() + (typeIsVoid(returns) && empty(args) ? "!" : trim(": " + joinWithComma(shortClassNames(args))) + " -> " + shortClassName(returns)); } setText(getText() + lines(lines)); } } }