Skip to content

Commit

Permalink
Sub processor pushdown1 (#1078)
Browse files Browse the repository at this point in the history
* Abstract out JavadocTagsSubProcessor for extension
* Abstract out SerialVersionSubProcessor
* Separate core from ui for UnInitializedFinalFieldSubProcessor
* Allow all subprocessors to use IInvocationContextCore

Signed-off-by: Rob Stryker <stryker@redhat.com>
Co-authored-by: Rob Stryker <stryker@redhat.com>
  • Loading branch information
robstryker and Rob Stryker committed Jan 17, 2024
1 parent 8c6926b commit 8e28ae0
Show file tree
Hide file tree
Showing 21 changed files with 940 additions and 822 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2019 IBM Corporation and others.
* Copyright (c) 2019, 2024 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
Expand All @@ -22,17 +22,45 @@

import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Javadoc;
import org.eclipse.jdt.core.dom.ModuleDirective;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.ProvidesDirective;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.TagElement;
import org.eclipse.jdt.core.dom.TextElement;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeParameter;
import org.eclipse.jdt.core.dom.UsesDirective;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;

import org.eclipse.jdt.internal.corext.dom.ASTNodes;

public class JavadocTagsSubProcessorCore {

public static Set<String> getPreviousProvidesNames(List<ModuleDirective> directives, ASTNode missingNode) {
Set<String> previousNames= new HashSet<>();
for (int i= 0; i < directives.size() && missingNode != directives.get(i); i++) {
ModuleDirective directive= directives.get(i);
if (directive instanceof ProvidesDirective) {
ProvidesDirective providesDirective= (ProvidesDirective) directive;
previousNames.add(providesDirective.getName().getFullyQualifiedName().toString());
}
}
return previousNames;
}

public static Set<String> getPreviousUsesNames(List<ModuleDirective> directives, ASTNode missingNode) {
Set<String> previousNames= new HashSet<>();
for (int i= 0; i < directives.size() && missingNode != directives.get(i); i++) {
ModuleDirective directive= directives.get(i);
if (directive instanceof UsesDirective) {
UsesDirective usesDirective= (UsesDirective) directive;
previousNames.add(usesDirective.getName().getFullyQualifiedName().toString());
}
}
return previousNames;
}

static Set<String> getPreviousExceptionNames(List<Type> list, ASTNode missingNode) {
Set<String> previousNames= new HashSet<>();
for (int i= 0; i < list.size() && missingNode != list.get(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*******************************************************************************
* Copyright (c) 2024 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.text.correction;

import java.util.Collection;

import org.eclipse.core.runtime.Assert;

import org.eclipse.jdt.internal.corext.fix.IProposableFix;
import org.eclipse.jdt.internal.corext.fix.PotentialProgrammingProblemsFixCore;

/**
* Subprocessor for serial version quickfix proposals.
*
* @since 3.1
*/
public abstract class SerialVersionBaseSubProcessor<T> {
public SerialVersionBaseSubProcessor() {
}

/**
* Determines the serial version quickfix proposals.
*
* @param context the invocation context
* @param location the problem location
* @param proposals the proposal collection to extend
*/
public void addSerialVersionProposals(final IInvocationContextCore context, final IProblemLocationCore location, final Collection<T> proposals) {

Assert.isNotNull(context);
Assert.isNotNull(location);
Assert.isNotNull(proposals);

IProposableFix[] fixes= PotentialProgrammingProblemsFixCore.createMissingSerialVersionFixes(context.getASTRoot(), location);
if (fixes != null) {
proposals.add(createSerialVersionProposal(fixes[0], IProposalRelevance.MISSING_SERIAL_VERSION_DEFAULT, context, true));
proposals.add(createSerialVersionProposal(fixes[1], IProposalRelevance.MISSING_SERIAL_VERSION, context, false));
}
}

protected abstract T createSerialVersionProposal(IProposableFix iProposableFix, int missingSerialVersion, IInvocationContextCore context, boolean b);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*******************************************************************************
* Copyright (c) 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Renaud Waldura &lt;renaud+eclipse@waldura.com&gt; - New class/interface with wizard
* Rabea Gransberger <rgransberger@gmx.de> - [quick fix] Fix several visibility issues - https://bugs.eclipse.org/394692
* Jens Reimann <jreimann@redhat.com> Bug 38201: [quick assist] Allow creating abstract method - https://bugs.eclipse.org/38201
*******************************************************************************/
package org.eclipse.jdt.internal.ui.text.correction;

import java.util.Collection;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SimpleName;

import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;

import org.eclipse.jdt.internal.ui.text.correction.proposals.InitializeFinalFieldProposalCore;

public abstract class UnInitializedFinalFieldBaseSubProcessor<T> {

public UnInitializedFinalFieldBaseSubProcessor() {
}

public void addProposals(IInvocationContextCore context, IProblemLocationCore problem, Collection<T> proposals) throws CoreException {
ICompilationUnit cu= context.getCompilationUnit();

CompilationUnit astRoot= context.getASTRoot();
ASTNode selectedNode= problem.getCoveringNode(astRoot);

if (selectedNode == null) {
return;
}

int type= selectedNode.getNodeType();
if (type == ASTNode.METHOD_DECLARATION) {
// propose add initialization to constructor
IMethodBinding targetBinding= null;
MethodDeclaration node= (MethodDeclaration) selectedNode;
if (!node.isConstructor()) {
return;
}
IMethodBinding binding= node.resolveBinding();
if (binding != null) {
targetBinding= binding;
} else {
return;
}
ITypeBinding targetDecl= targetBinding.getDeclaringClass();
ICompilationUnit targetCU= ASTResolving.findCompilationUnitForBinding(cu, astRoot, targetDecl);

T p1 = createInitializeFinalFieldProposal(problem, targetCU, node, IProposalRelevance.CREATE_CONSTRUCTOR, InitializeFinalFieldProposalCore.UPDATE_AT_CONSTRUCTOR);
if( p1 != null )
proposals.add(p1);

T p2= conditionallyCreateInitializeFinalFieldProposal(problem, targetCU, node, IProposalRelevance.CREATE_CONSTRUCTOR, InitializeFinalFieldProposalCore.UPDATE_CONSTRUCTOR_NEW_PARAMETER);
if( p2 != null ) {
proposals.add(p2);
}

} else if (type == ASTNode.SIMPLE_NAME) {
// propose add initialization at declaration
IVariableBinding targetBinding= null;
SimpleName node= (SimpleName) selectedNode;
IBinding binding= node.resolveBinding();
if (binding instanceof IVariableBinding) {
targetBinding= (IVariableBinding) binding;
} else {
return;
}
ITypeBinding targetDecl= targetBinding.getDeclaringClass();
ICompilationUnit targetCU= ASTResolving.findCompilationUnitForBinding(cu, astRoot, targetDecl);

T p3= createInitializeFinalFieldProposal(problem, targetCU, node, targetBinding, IProposalRelevance.CREATE_CONSTRUCTOR);
if( p3 != null )
proposals.add(p3);
}
}

protected abstract T createInitializeFinalFieldProposal(IProblemLocationCore problem, ICompilationUnit targetCU, SimpleName node, IVariableBinding targetBinding, int createConstructor);
protected abstract T createInitializeFinalFieldProposal(IProblemLocationCore problem, ICompilationUnit targetCU, MethodDeclaration node, int createConstructor, int updateAtConstructor);
protected abstract T conditionallyCreateInitializeFinalFieldProposal(IProblemLocationCore problem, ICompilationUnit targetCU, MethodDeclaration node, int createConstructor, int updateAtConstructor);
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation;
import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer;
import org.eclipse.jdt.core.manipulation.JavaManipulation;
import org.eclipse.jdt.core.refactoring.CompilationUnitChange;

Expand All @@ -41,6 +42,26 @@

public class CompilationUnitRewriteOperationsFixCore extends AbstractFixCore {

public static final String UNTOUCH_COMMENT_PROPERTY= "untouchComment"; //$NON-NLS-1$
public abstract static class CompilationUnitRewriteOperationWithSourceRange extends CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation {
public abstract void rewriteASTInternal(final CompilationUnitRewrite cuRewrite, final LinkedProposalModelCore linkedModel) throws CoreException;

@Override
public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore linkedModel) throws CoreException {
cuRewrite.getASTRewrite().setTargetSourceRangeComputer(new TargetSourceRangeComputer() {
@Override
public SourceRange computeSourceRange(final ASTNode node) {
if (Boolean.TRUE.equals(node.getProperty(UNTOUCH_COMMENT_PROPERTY))) {
return new SourceRange(node.getStartPosition(), node.getLength());
}

return super.computeSourceRange(node);
}
});
rewriteASTInternal(cuRewrite, linkedModel);
}
}

public abstract static class CompilationUnitRewriteOperation {

public abstract void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore linkedModel) throws CoreException;
Expand Down Expand Up @@ -73,12 +94,16 @@ public CompilationUnitRewriteOperationsFixCore(String name, CompilationUnit comp
}

public CompilationUnitRewriteOperationsFixCore(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] operations) {
this(name, compilationUnit, operations, new LinkedProposalModelCore());
}

public CompilationUnitRewriteOperationsFixCore(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] operations, LinkedProposalModelCore proposalModel) {
super(name);
Assert.isNotNull(operations);
Assert.isLegal(operations.length > 0);
fCompilationUnit= compilationUnit;
fOperations= operations;
fLinkedProposalModel= new LinkedProposalModelCore();
fLinkedProposalModel= proposalModel != null ? proposalModel : new LinkedProposalModelCore();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,42 +15,26 @@
package org.eclipse.jdt.internal.corext.fix;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;

import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer;

import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite;

public class CompilationUnitRewriteOperationsFix extends CompilationUnitRewriteOperationsFixCore implements ILinkedFix {
public static final String UNTOUCH_COMMENT= "untouchComment"; //$NON-NLS-1$

public abstract static class CompilationUnitRewriteOperation extends CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation {
public abstract void rewriteASTInternal(final CompilationUnitRewrite cuRewrite, final LinkedProposalModelCore linkedModel) throws CoreException;

@Override
public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore linkedModel) throws CoreException {
cuRewrite.getASTRewrite().setTargetSourceRangeComputer(new TargetSourceRangeComputer() {
@Override
public SourceRange computeSourceRange(final ASTNode node) {
if (Boolean.TRUE.equals(node.getProperty(UNTOUCH_COMMENT))) {
return new SourceRange(node.getStartPosition(), node.getLength());
}

return super.computeSourceRange(node);
}
});
rewriteASTInternal(cuRewrite, linkedModel);
}
public static final String UNTOUCH_COMMENT= CompilationUnitRewriteOperationsFixCore.UNTOUCH_COMMENT_PROPERTY;

/**
* Logic moved down to lower bundle.
* Please use CompilationUnitRewriteOperationWithSourceRange instead
*/
@Deprecated
public abstract static class CompilationUnitRewriteOperation extends CompilationUnitRewriteOperationWithSourceRange {
}

public CompilationUnitRewriteOperationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation operation) {
this(name, compilationUnit, new CompilationUnitRewriteOperation[] { operation });
public CompilationUnitRewriteOperationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperationWithSourceRange operation) {
this(name, compilationUnit, new CompilationUnitRewriteOperationWithSourceRange[] { operation });
Assert.isNotNull(operation);
}

public CompilationUnitRewriteOperationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] operations) {
public CompilationUnitRewriteOperationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperationWithSourceRange[] operations) {
this(name, compilationUnit, operations, new LinkedProposalModelCore());
}

Expand Down
Loading

0 comments on commit 8e28ae0

Please sign in to comment.