/*******************************************************************************
* Copyright (c) 2012 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.data.jdt.core;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator2;
import org.springframework.ide.eclipse.data.internal.validation.InvalidParameterTypeRule;
@SuppressWarnings("restriction")
public class InvalidParameterTypeMarkerResolutionGenerator implements IMarkerResolutionGenerator2 {
public IMarkerResolution[] getResolutions(IMarker marker) {
if (! hasResolutions(marker)) {
return new IMarkerResolution[0];
}
IResource resource = marker.getResource();
ICompilationUnit cu = null;
if (resource instanceof IFile && resource.isAccessible()) {
IJavaElement element = JavaCore.create((IFile) resource);
if (! (element instanceof ICompilationUnit)) {
return new IMarkerResolution[0];
}
cu = (ICompilationUnit) element;
}
int startPos = marker.getAttribute(IMarker.CHAR_START, 0);
int endPos = marker.getAttribute(IMarker.CHAR_END, 0);
AssistContext assistContext = new AssistContext(cu, startPos, endPos - startPos);
ASTNode astNode = assistContext.getCoveringNode();
MethodDeclaration methodDecl = getSurroundingMethod(astNode);
if (methodDecl == null) {
return new IMarkerResolution[0];
}
@SuppressWarnings("unchecked")
List<SingleVariableDeclaration> parameters = methodDecl.parameters();
if (parameters.size() != 1) {
return new IMarkerResolution[0];
}
String propertyTypeName = marker.getAttribute(InvalidParameterTypeRule.PROPERTY_TYPE_ATTR, null);
String propertyTypePackage = marker.getAttribute(InvalidParameterTypeRule.PROPERTY_TYPE_PACKAGE_ATTR, null);
return new IMarkerResolution[] { new ChangeParameterTypeResolution(parameters.get(0), propertyTypeName, propertyTypePackage, cu) };
}
private MethodDeclaration getSurroundingMethod(ASTNode astNode) {
if (astNode instanceof MethodDeclaration || astNode == null) {
return (MethodDeclaration) astNode;
}
return getSurroundingMethod(astNode.getParent());
}
public boolean hasResolutions(IMarker marker) {
String problemId = marker.getAttribute(IMarker.PROBLEM, null);
String propertyTypeName = marker.getAttribute(InvalidParameterTypeRule.PROPERTY_TYPE_ATTR, null);
String propertyTypePackage = marker.getAttribute(InvalidParameterTypeRule.PROPERTY_TYPE_PACKAGE_ATTR, null);
return InvalidParameterTypeRule.PROBLEM_ID.equals(problemId)
&& propertyTypeName != null && propertyTypePackage != null;
}
}