Skip to content

Commit

Permalink
Merge pull request #101 from dotta/master
Browse files Browse the repository at this point in the history
Fixed Hyperlinking regression in classfiles
  • Loading branch information
dotta committed May 8, 2012
2 parents 8e2b0a8 + 1a14711 commit 381cd65
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 41 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package scala.tools.eclipse.actions

import scala.tools.eclipse.ScalaSourceFileEditor
import scala.tools.eclipse.hyperlink.text.detector.BaseHyperlinkDetector
import scala.tools.eclipse.hyperlink.text.detector.ImplicitHyperlinkDetector
import scala.tools.eclipse.refactoring.EditorHelpers
import scala.tools.eclipse.ui.actions.HyperlinkOpenAction
import scala.tools.eclipse.ui.actions.HyperlinkOpenActionStrategy
import org.eclipse.core.commands.AbstractHandler
import org.eclipse.core.commands.ExecutionEvent
import org.eclipse.ui.handlers.HandlerUtil
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility
import scala.tools.eclipse.ui.actions.HyperlinkOpenAction
import scala.tools.eclipse.hyperlink.text.detector.ImplicitHyperlinkDetector
import org.eclipse.jface.text.ITextSelection
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor

class OpenImplicitCommand extends AbstractHandler {
class OpenImplicitCommand extends AbstractHandler with HyperlinkOpenActionStrategy {
override val detectionStrategy: BaseHyperlinkDetector = ImplicitHyperlinkDetector()

override def execute(event: ExecutionEvent): Object = {
HandlerUtil.getActiveEditor(event) match {
case editor: ScalaSourceFileEditor =>
new HyperlinkOpenAction(ImplicitHyperlinkDetector(), editor).run()
openHyperlink(editor)
case _ => ()
}
null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,14 @@
package scala.tools.eclipse.ui.actions

import org.eclipse.jdt.ui.actions.OpenAction
import scala.tools.eclipse.ScalaSourceFileEditor
import org.eclipse.jface.text.ITextSelection
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility
import scala.tools.eclipse.javaelements.ScalaCompilationUnit
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor
import scala.tools.eclipse.hyperlink.text.detector.BaseHyperlinkDetector
import scala.tools.eclipse.util.EditorUtils
import org.eclipse.jface.text.TextSelection
import org.eclipse.jface.text.ITextViewer

class HyperlinkOpenAction(detectionStrategy: BaseHyperlinkDetector, editor: JavaEditor) extends OpenAction(editor) {
import scala.tools.eclipse.hyperlink.text.detector.DeclarationHyperlinkDetector

override def run() {
withScalaCompilatioUnit {
_.followReference(detectionStrategy, editor, getSelectionProvider.getSelection.asInstanceOf[ITextSelection])
}
}
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor
import org.eclipse.jdt.ui.actions.OpenAction

private def withScalaCompilatioUnit[T](f: ScalaCompilationUnit => T): Option[T] = {
val inputJavaElement = EditorUtility.getEditorInputJavaElement(editor, false)
Option(inputJavaElement) map (_.asInstanceOf[ScalaCompilationUnit]) map (f)
}
class HyperlinkOpenAction(editor: JavaEditor) extends OpenAction(editor) with HyperlinkOpenActionStrategy {

override def isEnabled: Boolean = getSelectionProvider.getSelection match {
case textSelection: TextSelection =>
val region = EditorUtils.textSelection2region(textSelection)
detectionStrategy.detectHyperlinks(editor.getViewer, region, canShowMultipleHyperlinks = false) != null
case _ => false
}
override protected val detectionStrategy: BaseHyperlinkDetector = DeclarationHyperlinkDetector()

override def run() { openHyperlink(editor) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package scala.tools.eclipse.ui.actions

import scala.tools.eclipse.hyperlink.text.detector.BaseHyperlinkDetector
import scala.tools.eclipse.javaelements.ScalaCompilationUnit
import scala.tools.eclipse.util.EditorUtils

import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor
import org.eclipse.jface.text.ITextSelection

trait HyperlinkOpenActionStrategy {
protected def detectionStrategy: BaseHyperlinkDetector

protected def openHyperlink(editor: JavaEditor) {
getTextSelection(editor) map { selection =>
withScalaCompilatioUnit(editor) { scu =>
scu.followReference(detectionStrategy, editor, selection)
}
}
}

private def withScalaCompilatioUnit[T](editor: JavaEditor)(f: ScalaCompilationUnit => T): Option[T] = {
val inputJavaElement = EditorUtility.getEditorInputJavaElement(editor, false)
Option(inputJavaElement) map (_.asInstanceOf[ScalaCompilationUnit]) map (f)
}

protected def isEnabled(editor: JavaEditor): Boolean = getTextSelection(editor) map { textSelection =>
val region = EditorUtils.textSelection2region(textSelection)
detectionStrategy.detectHyperlinks(editor, region, canShowMultipleHyperlinks = false) != null
} getOrElse(false)

private def getTextSelection(editor: JavaEditor): Option[ITextSelection] = EditorUtils.getTextSelection(editor)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ import org.eclipse.jdt.ui.actions.OpenAction
import scala.tools.eclipse.hyperlink.text.detector.DeclarationHyperlinkDetector

class OpenActionProvider extends IOpenActionProvider {
override def getOpenAction(editor: JavaEditor): OpenAction = new HyperlinkOpenAction(DeclarationHyperlinkDetector(), editor)
override def getOpenAction(editor: JavaEditor): OpenAction = new HyperlinkOpenAction(editor)
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package scala.tools.eclipse.util

import scala.collection.JavaConverters.asScalaIteratorConverter
import scala.tools.eclipse.util.Utils.any2optionable

import org.eclipse.jdt.internal.core.JavaElement
import org.eclipse.jface.text.Position
import org.eclipse.jface.text.source.Annotation
import org.eclipse.ui.IEditorPart
import scala.collection.JavaConverters._
import org.eclipse.jface.text.source.IAnnotationModelExtension2
import scala.tools.eclipse.ScalaWordFinder
import org.eclipse.jface.text.IRegion
import org.eclipse.jface.text.ITextSelection
import org.eclipse.jface.text.Position
import org.eclipse.jface.text.Region
import org.eclipse.jface.text.source.Annotation
import org.eclipse.jface.text.source.IAnnotationModelExtension2
import org.eclipse.ui.IEditorPart
import org.eclipse.ui.texteditor.ITextEditor

// FIXME: This should be merged with merged with {{{scala.tools.eclipse.refactoring.EditorHelpers}}}
object EditorUtils {

def openEditorAndApply[T](element: JavaElement)(editor: IEditorPart => T): T =
Expand All @@ -20,11 +23,12 @@ object EditorUtils {
val model = org.eclipse.jdt.ui.JavaUI.getDocumentProvider.getAnnotationModel(part.getEditorInput)

val annotations = model match {
case am2: IAnnotationModelExtension2 => am2.getAnnotationIterator(offset, 1, true, true)
case _ => model.getAnnotationIterator
case null => Iterator.empty
case am2: IAnnotationModelExtension2 => am2.getAnnotationIterator(offset, 1, true, true).asScala
case _ => model.getAnnotationIterator.asScala
}

val annotationsWithPositions = annotations.asScala collect {
val annotationsWithPositions = annotations collect {
case ann: Annotation => (ann, model.getPosition(ann))
}

Expand All @@ -37,4 +41,13 @@ object EditorUtils {

def textSelection2region(selection: ITextSelection): IRegion =
new Region(selection.getOffset, selection.getLength)

def getTextSelection(editor: ITextEditor): Option[ITextSelection] = {
for{
workbenchSite <- Option(editor.getSite)
provider <- Option(workbenchSite.getSelectionProvider)
selection <- Option(provider.getSelection)
textSelection <- selection.asInstanceOfOpt[ITextSelection]
} yield textSelection
}
}

0 comments on commit 381cd65

Please sign in to comment.