/******************************************************************************* * Copyright (c) 2016 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.quickfix.jdt.processors.imports; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.VariableDeclarationStatement; import org.eclipse.jdt.internal.ui.text.correction.proposals.AddImportCorrectionProposal; import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal; /** * Factory that creates various types of relevance resolvers for "add imports" * proposals based on the type of selected AST node where "add imports" quick * fix should be applied to * */ public class AddImportRelevanceResolverFactory { public List<AddImportRelevanceResolver> getResolvers(ICompilationUnit cu, List<IJavaCompletionProposal> proposals) { List<AddImportRelevanceResolver> computations = new ArrayList<AddImportRelevanceResolver>(); int boost = 100; computations.add(variableDeclarationRHSReturnType(cu, proposals, boost)); return computations; } /** * Computes relevance for proposals that match the return type on the RHS of * a statement where LHS has unresolved type * @param kind * @param cu * @param proposals * @param boost * @return */ protected AddImportRelevanceResolver variableDeclarationRHSReturnType(ICompilationUnit cu, List<IJavaCompletionProposal> proposals, int boost) { return new AddImportRelevanceResolver(cu, proposals, boost) { protected VariableDeclarationStatement getVariableDeclarationStatement(ASTNode selectedNode) { // Go two levels up: if (selectedNode != null) { ASTNode parent = selectedNode.getParent(); if (parent instanceof VariableDeclarationStatement) { return (VariableDeclarationStatement) parent; } else if (parent.getParent() instanceof VariableDeclarationStatement) { return (VariableDeclarationStatement) parent.getParent(); } } return null; } @Override protected AddImportCorrectionProposal findCorrectionProposal(int kind, ASTNode statementNode) throws Exception { VariableDeclarationStatement statement = getVariableDeclarationStatement(statementNode); if (statement != null) { List<?> frags = statement.fragments(); if (frags != null) { for (Object content : frags) { if (content instanceof VariableDeclarationFragment) { VariableDeclarationFragment frag = (VariableDeclarationFragment) content; Expression exp = frag.getInitializer(); if (exp != null) { ITypeBinding binding = exp.resolveTypeBinding(); if (binding != null) { String qualifiedName = binding.getQualifiedName(); if (qualifiedName != null) { for (IJavaCompletionProposal prop : proposals) { if (prop instanceof AddImportCorrectionProposal) { AddImportCorrectionProposal corrProposal = (AddImportCorrectionProposal) prop; String propQuali = corrProposal.getQualifiedTypeName(); if (qualifiedName.contains(propQuali)) { return corrProposal; } } } } } } } } } } return null; } }; } }