sc command support completion

This commit is contained in:
hengyunabc
2019-02-07 21:22:59 +08:00
parent a7ee25b1f2
commit 33fd06ba02
3 changed files with 46 additions and 3 deletions
@@ -3,17 +3,14 @@ package com.taobao.arthas.core.command.basic1000;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import com.taobao.arthas.core.shell.cli.CliToken;
import com.taobao.arthas.core.shell.cli.Completion;
import com.taobao.arthas.core.shell.cli.CompletionUtils;
import com.taobao.arthas.core.shell.command.AnnotatedCommand;
import com.taobao.arthas.core.shell.command.CommandProcess;
import com.taobao.arthas.core.util.FileUtils;
import com.taobao.arthas.core.util.LogUtil;
import com.taobao.arthas.core.util.StringUtils;
import com.taobao.middleware.cli.annotations.Argument;
import com.taobao.middleware.cli.annotations.Description;
import com.taobao.middleware.cli.annotations.Name;
@@ -8,6 +8,8 @@ import java.util.Comparator;
import java.util.List;
import com.taobao.arthas.core.command.Constants;
import com.taobao.arthas.core.shell.cli.Completion;
import com.taobao.arthas.core.shell.cli.CompletionUtils;
import com.taobao.arthas.core.shell.command.AnnotatedCommand;
import com.taobao.arthas.core.shell.command.CommandProcess;
import com.taobao.arthas.core.util.ClassUtils;
@@ -102,4 +104,10 @@ public class SearchClassCommand extends AnnotatedCommand {
}
}
@Override
public void complete(Completion completion) {
if (!CompletionUtils.completeClassName(completion)) {
super.complete(completion);
}
}
}
@@ -10,11 +10,14 @@ import com.taobao.middleware.cli.annotations.CLIConfigurator;
import io.termd.core.util.Helper;
import java.io.File;
import java.lang.instrument.Instrumentation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* @author beiwei30 on 09/11/2016.
@@ -144,6 +147,41 @@ public class CompletionUtils {
return true;
}
public static boolean completeClassName(Completion completion) {
List<CliToken> tokens = completion.lineTokens();
String token = tokens.get(tokens.size() - 1).value();
if (token.startsWith("-") || StringUtils.isBlank(token)) {
return false;
}
Instrumentation instrumentation = completion.session().getInstrumentation();
Class<?>[] allLoadedClasses = instrumentation.getAllLoadedClasses();
Set<String> result = new HashSet<String>();
for(Class<?> clazz : allLoadedClasses) {
String name = clazz.getName();
if(name.startsWith(token)) {
int index = name.indexOf('.', token.length());
if(index > 0) {
result.add(name.substring(0, index + 1));
}else {
result.add(name);
}
}
}
if(result.size() == 1 && result.iterator().next().endsWith(".")) {
completion.complete(result.iterator().next().substring(token.length()), false);
}else {
CompletionUtils.complete(completion, result);
}
return true;
}
public static void completeShortOption(Completion completion, CliToken lastToken, List<Option> options) {
String prefix = lastToken.value().substring(1);
List<String> candidates = new ArrayList<String>();