From 33fd06ba02c8e6a7a04518541592d960c9f29903 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Thu, 7 Feb 2019 21:22:59 +0800 Subject: [PATCH] sc command support completion --- .../core/command/basic1000/CatCommand.java | 3 -- .../command/klass100/SearchClassCommand.java | 8 ++++ .../core/shell/cli/CompletionUtils.java | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java b/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java index 90c9b272d..f5262223a 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/basic1000/CatCommand.java @@ -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; diff --git a/core/src/main/java/com/taobao/arthas/core/command/klass100/SearchClassCommand.java b/core/src/main/java/com/taobao/arthas/core/command/klass100/SearchClassCommand.java index fc677a2c5..244c7290b 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/klass100/SearchClassCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/klass100/SearchClassCommand.java @@ -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); + } + } } diff --git a/core/src/main/java/com/taobao/arthas/core/shell/cli/CompletionUtils.java b/core/src/main/java/com/taobao/arthas/core/shell/cli/CompletionUtils.java index 548ab0c62..d52a89254 100644 --- a/core/src/main/java/com/taobao/arthas/core/shell/cli/CompletionUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/shell/cli/CompletionUtils.java @@ -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 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 result = new HashSet(); + 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