Skip to content

Commit 1ed1d87

Browse files
committed
Support more places
Signed-off-by: Shi Chen <[email protected]>
1 parent 2385b79 commit 1ed1d87

1 file changed

Lines changed: 40 additions & 6 deletions

File tree

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/SourceAssistProcessor.java

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.util.Set;
2323
import java.util.stream.Stream;
2424

25+
import com.google.common.collect.Sets;
26+
2527
import org.eclipse.core.runtime.CoreException;
2628
import org.eclipse.core.runtime.IProgressMonitor;
2729
import org.eclipse.core.runtime.NullProgressMonitor;
@@ -34,9 +36,11 @@
3436
import org.eclipse.jdt.core.dom.ASTNode;
3537
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
3638
import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
39+
import org.eclipse.jdt.core.dom.BodyDeclaration;
3740
import org.eclipse.jdt.core.dom.CompilationUnit;
3841
import org.eclipse.jdt.core.dom.ITypeBinding;
39-
import org.eclipse.jdt.core.dom.SimpleName;
42+
import org.eclipse.jdt.core.dom.Statement;
43+
import org.eclipse.jdt.core.dom.Type;
4044
import org.eclipse.jdt.core.dom.TypeDeclaration;
4145
import org.eclipse.jdt.core.manipulation.CoreASTProvider;
4246
import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation;
@@ -77,8 +81,6 @@
7781
import org.eclipse.lsp4j.jsonrpc.messages.Either;
7882
import org.eclipse.text.edits.TextEdit;
7983

80-
import com.google.common.collect.Sets;
81-
8284
public class SourceAssistProcessor {
8385

8486
private static final Set<String> UNSUPPORTED_RESOURCES = Sets.newHashSet("module-info.java", "package-info.java");
@@ -146,9 +148,18 @@ public List<Either<Command, CodeAction>> getSourceActionCommands(CodeActionParam
146148
if (node == null) {
147149
node = context.getCoveringNode();
148150
}
149-
if (node instanceof SimpleName) {
150-
ASTNode parent = node.getParent();
151-
if (parent instanceof TypeDeclaration) {
151+
ASTNode declarationNode = getDeclarationNode(node);
152+
if (declarationNode instanceof TypeDeclaration) {
153+
TypeDeclaration typeDeclaration = (TypeDeclaration)declarationNode;
154+
List<ASTNode> candidates = new ArrayList<>();
155+
Type superType = typeDeclaration.getSuperclassType();
156+
if (superType != null) {
157+
candidates.add(superType);
158+
}
159+
candidates.add(typeDeclaration.getName());
160+
candidates.addAll(typeDeclaration.modifiers());
161+
candidates.addAll(typeDeclaration.superInterfaceTypes());
162+
if (isCovered(node, candidates)) {
152163
quickAssistHashCodeEquals = getHashCodeEqualsAction(params, JavaCodeActionKind.QUICK_ASSIST);
153164
addSourceActionCommand($, params.getContext(), quickAssistHashCodeEquals);
154165
}
@@ -574,4 +585,27 @@ public static ICompilationUnit getCompilationUnit(CodeActionParams params) {
574585
return JDTUtils.resolveCompilationUnit(params.getTextDocument().getUri());
575586
}
576587

588+
private static ASTNode getDeclarationNode(ASTNode node) {
589+
if (node == null) {
590+
return null;
591+
}
592+
if (node instanceof BodyDeclaration) {
593+
return null;
594+
}
595+
while (node != null && !(node instanceof BodyDeclaration) && !(node instanceof Statement)) {
596+
node = node.getParent();
597+
}
598+
return node;
599+
}
600+
601+
private static boolean isCovered(ASTNode node, List<ASTNode> candidates) {
602+
int startPosition = node.getStartPosition();
603+
int endPosition = startPosition + node.getLength();
604+
for (ASTNode candidate : candidates) {
605+
if (startPosition >= candidate.getStartPosition() && endPosition <= candidate.getStartPosition() + candidate.getLength()) {
606+
return true;
607+
}
608+
}
609+
return false;
610+
}
577611
}

0 commit comments

Comments
 (0)