diff --git a/groovy/src/main/java/org/jline/script/GroovyEngine.java b/groovy/src/main/java/org/jline/script/GroovyEngine.java index c7b5a6eec..d056df55e 100644 --- a/groovy/src/main/java/org/jline/script/GroovyEngine.java +++ b/groovy/src/main/java/org/jline/script/GroovyEngine.java @@ -767,8 +767,10 @@ private static Set sourcesForPackage(String domain) { } String source = p.toString(); String className = source.substring(2, source.lastIndexOf(".")).replace(separator, "."); - if (onlyPackage && Character.isUpperCase(className.charAt(domain.length() + 1))) { - out.add(className); + if (onlyPackage) { + if (Character.isUpperCase(className.charAt(domain.length() + 1))) { + out.add(className); + } } else { out.add(className); } @@ -1038,7 +1040,7 @@ public void complete(LineReader reader, ParsedLine commandLine, List Object involvedObject = inspector.getInvolvedObject(); int vs = wordbuffer.lastIndexOf('.'); String curBuf = wordbuffer.substring(0, vs + 1); - doMethodCandidates(candidates, involvedObject == null ? clazz : involvedObject, curBuf); + doMethodCandidates(candidates, involvedObject, clazz, curBuf); } } else if (completingConstructor(commandLine)) { if (wordbuffer.matches("[a-z]+.*")) { @@ -1081,20 +1083,23 @@ public void complete(LineReader reader, ParsedLine commandLine, List String var = param.substring(0, param.indexOf('.')); String curBuf = wordbuffer.substring(0, varsep + 1); if (inspector.nameClass().containsKey(var)) { + Class clazz = null; + Object involvedObject = null; if (firstMethod) { - doStaticMethodCandidates(candidates, inspector.nameClass().get(var), curBuf); + clazz = inspector.nameClass().get(var); } else if (!restrictedCompletion) { - Class clazz = inspector.evaluateClass(wordbuffer.substring(eqsep + 1, varsep)); - Object involvedObject = inspector.getInvolvedObject(); - doMethodCandidates(candidates, involvedObject == null ? clazz : involvedObject, curBuf); + clazz = inspector.evaluateClass(wordbuffer.substring(eqsep + 1, varsep)); + involvedObject = inspector.getInvolvedObject(); } + Helpers.doCandidates(candidates, retrieveDecleredClasses(clazz), curBuf, CandidateType.PACKAGE); + doMethodCandidates(candidates, involvedObject, clazz, curBuf); } else if (inspector.hasVariable(var)) { if (firstMethod) { doMethodCandidates(candidates, inspector.getVariable(var), curBuf); } else if (!restrictedCompletion) { Class clazz = inspector.evaluateClass(wordbuffer.substring(eqsep + 1, varsep)); Object involvedObject = inspector.getInvolvedObject(); - doMethodCandidates(candidates, involvedObject == null ? clazz : involvedObject, curBuf); + doMethodCandidates(candidates, involvedObject, clazz, curBuf); } } else { try { @@ -1169,6 +1174,14 @@ private Set doMetaMethodCandidates(List candidates, Object ob return metaMethods; } + private void doMethodCandidates(List candidates, Object object, Class clazz, String curBuf) { + if (object != null) { + doMethodCandidates(candidates, object, curBuf); + } else if (clazz != null) { + doStaticMethodCandidates(candidates, clazz, curBuf); + } + } + private void doMethodCandidates(List candidates, Object object, String curBuf) { if (object == null) { return; @@ -1255,6 +1268,17 @@ private Set retrieveConstructors(boolean all) { return out; } + private Set retrieveDecleredClasses(Class clazz) { + Set out = new HashSet<>(); + if (clazz != null) { + int nameLength = clazz.getCanonicalName().length(); + for (Class c : access.allClasses ? clazz.getDeclaredClasses() : clazz.getClasses()) { + out.add(c.getCanonicalName().substring(nameLength + 1)); + } + } + return out; + } + private Set retrieveClassesWithStaticMethods() { Set out = new HashSet<>(); for (Iterator>> it = inspector.nameClass().entrySet().iterator(); it.hasNext(); ) { @@ -1343,7 +1367,14 @@ public Class evaluateClass(String objectStatement) { Class out = null; try { involvedObject = execute(objectStatement); - out = involvedObject.getClass(); + if (involvedObject instanceof Class) { + out = (Class)involvedObject; + if (!objectStatement.endsWith(".class")) { + involvedObject = null; + } + } else { + out = involvedObject.getClass(); + } } catch (Exception e) { Log.debug("objectStatement: ", objectStatement); if (Log.isDebugEnabled()) { @@ -1351,7 +1382,7 @@ public Class evaluateClass(String objectStatement) { } } try { - if (out == null || out == Class.class) { + if (out == null) { if (!objectStatement.contains(".") ) { out = (Class)execute(objectStatement + ".class"); } else {