package com.redhat.ceylon.eclipse.code.hover; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.texteditor.MarkerAnnotation; import com.redhat.ceylon.eclipse.code.correct.CeylonCorrectionProcessor; import com.redhat.ceylon.eclipse.code.correct.ProblemLocation; import com.redhat.ceylon.eclipse.code.editor.CeylonAnnotation; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.core.builder.MarkerCreator; /** * An annotation info contains information about an * {@link Annotation} It's used as input for the * {@link AnnotationInformationControl} * * @since 3.4 */ class AnnotationInfo { private final class FixContext implements IQuickAssistInvocationContext { private final ProblemLocation location; private FixContext(ProblemLocation location) { this.location = location; } public ISourceViewer getSourceViewer() { ITextViewer viewer = getViewer(); if (viewer instanceof ISourceViewer) { return (ISourceViewer) viewer; } return null; } public int getOffset() { return location.getOffset(); } public int getLength() { return location.getLength(); } } private final Map<Annotation,Position> annotationPositions; private final ITextViewer viewer; private static final ICompletionProposal[] NO_PROPOSALS = new ICompletionProposal[0]; private final CeylonEditor editor; private ICompletionProposal[] proposals = null; AnnotationInfo(CeylonEditor editor, Map<Annotation,Position> annotationPositions, ITextViewer textViewer) { this.annotationPositions = annotationPositions; this.viewer = textViewer; this.editor = editor; } public CeylonEditor getEditor() { return editor; } /** * Create completion proposals which can resolve the * given annotation at the given position. Returns an * empty array if no such proposals exist. * * @return the proposals or an empty array */ ICompletionProposal[] getCompletionProposals() { List<ICompletionProposal> list = new ArrayList<ICompletionProposal>(); CeylonCorrectionProcessor cp = new CeylonCorrectionProcessor(editor); for (Map.Entry<Annotation,Position> e: getAnnotationPositions().entrySet()) { Annotation annotation = e.getKey(); Position position = e.getValue(); if (annotation instanceof CeylonAnnotation) { collectProposals(list, cp, position, (CeylonAnnotation) annotation); } else if (annotation instanceof MarkerAnnotation) { collectProposals(list, cp, position, (MarkerAnnotation) annotation); } } return list.toArray(NO_PROPOSALS); } public void collectProposals(List<ICompletionProposal> list, CeylonCorrectionProcessor cp, Position position, MarkerAnnotation ca) { try { Integer code = (Integer) ca.getMarker() .getAttribute( MarkerCreator.ERROR_CODE_KEY); if (code!=null) { ProblemLocation location = new ProblemLocation( position.getOffset(), position.getLength(), code); cp.collectCorrections( new FixContext(location), location, list); } } catch (CoreException e1) { e1.printStackTrace(); } } public void collectProposals(List<ICompletionProposal> list, CeylonCorrectionProcessor cp, Position position, CeylonAnnotation ca) { ProblemLocation location = new ProblemLocation( position.getOffset(), position.getLength(), ca.getId()); IQuickAssistInvocationContext context = new FixContext(location); cp.collectCorrections(context, location, list); cp.collectWarningProposals(ca, context, location, list); } Map<Annotation,Position> getAnnotationPositions() { return annotationPositions; } ITextViewer getViewer() { return viewer; } public ICompletionProposal[] getProposals() { return proposals; } public void setProposals(ICompletionProposal[] proposals) { this.proposals = proposals; } }