Skip to content

Commit

Permalink
Groovy REPL: add option to complete groovy metaMethods
Browse files Browse the repository at this point in the history
  • Loading branch information
mattirn committed Sep 27, 2020
1 parent 22faa8b commit ce3c930
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 34 deletions.
55 changes: 46 additions & 9 deletions groovy/src/main/groovy/org/jline/groovy/ObjectInspector.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -11,42 +11,79 @@ package org.jline.groovy
import groovy.inspect.Inspector

class ObjectInspector {
public static final List<String> METHOD_COLUMNS = ['language','modifiers','this','return','name','parameters','exception','8']
public static final String FIELD_NAME = 'name'
public static final String FIELD_PARAMETERS = 'parameters'
public static final String FIELD_MODIFIERS = 'modifiers'
public static final String FIELD_RETURN = 'return'
public static final List<String> METHOD_COLUMNS = ['language', FIELD_MODIFIERS, 'this', FIELD_RETURN, FIELD_NAME
, FIELD_PARAMETERS,'exception','8']
public static final List<String> GLOBAL_META_METHODS = ['print', 'println', 'printf', 'sprintf', 'sleep']
private static final List<String> OPERATOR_META_METHODS = ['plus', 'minus', 'multiply', 'div', 'mod', 'power', 'or', 'and'
, 'xor', 'asType', 'call', 'getAt', 'putAt', 'isCase', 'leftShift'
, 'rightShift', 'rightShiftUnsigned', 'next', 'previous', 'positive'
, 'negative', 'bitwiseNegate'
/* other methods to exclude from completion */ , 'asBoolean' , 'toBoolean' , 'addShutdownHook']
def obj
def inspector
def types = []

ObjectInspector(def obj) {
this.obj = obj
types.add(obj.getClass().getSimpleName())
addInterfaces(obj.getClass())
def superClass = obj.getClass().getSuperclass()
while (superClass) {
types.add(superClass.getSimpleName())
addInterfaces(superClass)
superClass = superClass.getSuperclass()
}
this.inspector = new Inspector(obj)
}

private void addInterfaces(def clazz) {
clazz.interfaces.each{types.add(it.getSimpleName())}
}

List<Map<String, String>> methods() {
def out = []
inspector.methods.each {
def mdef = [:]
for (int i = 0; i < it.size(); i++) {
mdef.put(METHOD_COLUMNS.get(i), it.getAt(i))
mdef.put(METHOD_COLUMNS.get(i), it[i])
}
out.add(mdef)
}
out
}

List<Map<String, String>> metaMethods() {
metaMethods(true)
}

List<Map<String, String>> metaMethods(boolean includeOperatorMethods) {
def out = []
inspector.metaMethods.each {
def mdef = [:]
for (int i = 0; i < it.size(); i++) {
mdef.put(METHOD_COLUMNS.get(i), it.getAt(i))
}
out.add(mdef)
def added = []
types.each { type ->
inspector.metaMethods.each {
def mdef = [:]
for (int i = 0; i < it.size(); i++) {
mdef.put(METHOD_COLUMNS.get(i), it[i])
}
if (type == mdef.this && !added.contains(mdef.name + mdef.parameters)) {
if (!GLOBAL_META_METHODS.contains(mdef.name)
&& (includeOperatorMethods || !OPERATOR_META_METHODS.contains(mdef.name))) {
added.add(mdef.name + mdef.parameters)
out.add(mdef)
}
}
}
}
out
}

def properties() {
def out = [:]
def props=['propertyInfo', 'publicFields', 'classProps']
def props = ['propertyInfo', 'publicFields', 'classProps']
props.each {
def val = inspector.properties.get(it)
out.put(it, val)
Expand Down

0 comments on commit ce3c930

Please sign in to comment.