/******************************************************************************* * Copyright (c) 2008 Vlad Dumitrescu and others. 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: Vlad Dumitrescu *******************************************************************************/ package org.erlide.ui.editors.erl.correction; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext; import org.eclipse.jface.text.quickassist.IQuickAssistProcessor; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.IMarkerResolution; import org.eclipse.ui.IMarkerResolutionGenerator; import org.eclipse.ui.texteditor.MarkerAnnotation; import org.erlide.engine.MarkerUtils; import org.erlide.util.ErlLogger; import com.google.common.collect.Lists; public class ErlangQuickAssistProcessor implements IQuickAssistProcessor, IMarkerResolutionGenerator { private final ErlangQuickFixCollector collector = new ErlangQuickFixCollector(); @Override public boolean canAssist(final IQuickAssistInvocationContext invocationContext) { return collector.hasAssists(invocationContext); } @Override public boolean canFix(final Annotation annotation) { return annotation instanceof MarkerAnnotation && !annotation.isMarkedDeleted(); } @Override public ICompletionProposal[] computeQuickAssistProposals( final IQuickAssistInvocationContext invocationContext) { final List<ICompletionProposal> result = computeProposals(invocationContext); return result.toArray(new ICompletionProposal[result.size()]); } @Override public String getErrorMessage() { return null; } @Override public IMarkerResolution[] getResolutions(final IMarker marker) { return collector.getResolutions(marker); } private List<ICompletionProposal> computeProposals( final IQuickAssistInvocationContext invocationContext) { final ISourceViewer sourceViewer = invocationContext.getSourceViewer(); @SuppressWarnings("unchecked") final Iterator<Annotation> iter = sourceViewer.getAnnotationModel() .getAnnotationIterator(); final List<ICompletionProposal> result = Lists.newArrayList(); while (iter.hasNext()) { final Annotation annotation = iter.next(); if (annotation instanceof MarkerAnnotation) { final MarkerAnnotation markerAnnotation = (MarkerAnnotation) annotation; final IMarker marker = markerAnnotation.getMarker(); try { if (!marker.getType().equals(MarkerUtils.PROBLEM_MARKER)) { continue; } final int invocationLine = sourceViewer.getDocument() .getLineOfOffset(invocationContext.getOffset()); final int markerLine = marker.getAttribute(IMarker.LINE_NUMBER, -1) - 1; if (invocationLine == markerLine) { final IMarkerResolution[] qfixes = getResolutions(marker); for (final IMarkerResolution qfix : qfixes) { result.add(new MarkerResolutionProposal(qfix, marker)); } } } catch (final BadLocationException e) { ErlLogger.debug(e); } catch (final CoreException e) { ErlLogger.debug(e); } } } result.addAll(collector.getAssists(invocationContext)); return result; } }