in scala/scala-impl/src/org/jetbrains/plugins/scala/highlighter/usages/ScalaHighlightUsagesHandlerFactory.scala [27:141]
override def createHighlightUsagesHandler(editor: Editor, file: PsiFile): HighlightUsagesHandlerBase[_ <: PsiElement] = {
if (!file.is[ScalaFile]) return null
val offset = TargetElementUtil.adjustOffset(file, editor.getDocument, editor.getCaretModel.getOffset)
val element: PsiElement = file.findElementAt(offset) match {
case _: PsiWhiteSpace => file.findElementAt(offset - 1)
case elem => elem
}
if (element == null || element.getNode == null) return null
element.getParent match {
case end: ScEnd =>
val endMarkerHandler =
if (end.tag.isIdentifier && end.tag == element) {
end.begin.map(_.tag).collect {
case named: ScNamedElement =>
ScHighlightEndMarkerUsagesHandler(named, editor, file)
case ref: ScStableCodeReference =>
ScHighlightEndMarkerUsagesHandler(ref, editor, file)
}
} else None
return endMarkerHandler.orNull
case _ =>
}
element.getNode.getElementType match {
case `kRETURN` =>
val fun = PsiTreeUtil.getParentOfType(element, classOf[ScFunctionDefinition])
if (fun != null) return new ScalaHighlightExitPointsHandler(fun, editor, file, element)
case `kDEF` =>
val fun = PsiTreeUtil.getParentOfType(element, classOf[ScFunction])
fun match {
case d: ScFunctionDefinition => return new ScalaHighlightExitPointsHandler(d, editor, file, element)
case _ =>
}
case `kVAL` =>
PsiTreeUtil.getParentOfType(element, classOf[ScPatternDefinition]) match {
case pattern@ScPatternDefinition.expr(expr) if pattern.isSimple =>
return new ScalaHighlightExprResultHandler(expr, editor, file, element)
case _ =>
}
case `kVAR` =>
PsiTreeUtil.getParentOfType(element, classOf[ScVariableDefinition]) match {
case pattern@ScVariableDefinition.expr(expr) if pattern.isSimple =>
return new ScalaHighlightExprResultHandler(expr, editor, file, element)
case _ =>
}
case `kCASE` =>
val cc = PsiTreeUtil.getParentOfType(element, classOf[ScCaseClause])
if (cc != null) {
cc.expr match {
case Some(expr) =>
return new ScalaHighlightExprResultHandler(expr, editor, file, element)
case _ =>
}
}
case `kMATCH` =>
val matchStmt = PsiTreeUtil.getParentOfType(element, classOf[ScMatch])
if (matchStmt != null) {
return new ScalaHighlightExprResultHandler(matchStmt, editor, file, element)
}
case `kTRY` =>
val tryStmt = PsiTreeUtil.getParentOfType(element, classOf[ScTry])
if (tryStmt != null) {
return new ScalaHighlightExprResultHandler(tryStmt, editor, file, element)
}
case `kFOR` =>
val forStmt = PsiTreeUtil.getParentOfType(element, classOf[ScFor])
if (forStmt != null && forStmt.isYield) {
forStmt.body match {
case Some(body) =>
return new ScalaHighlightExprResultHandler(body, editor, file, element)
case _ =>
}
}
case `kIF` =>
val ifStmt = PsiTreeUtil.getParentOfType(element, classOf[ScIf])
if (ifStmt != null && ifStmt.elseExpression.isDefined) {
return new ScalaHighlightExprResultHandler(ifStmt, editor, file, element)
}
case `tFUNTYPE` | `tFUNTYPE_ASCII` =>
val maybeResult = element.getParent match {
case funcExpr: ScFunctionExpr => funcExpr.result
case caseClause: ScCaseClause => caseClause.resultExpr
case _ => None
}
maybeResult match {
case Some(resultExpr) =>
return new ScalaHighlightExprResultHandler(resultExpr, editor, file, element)
case _ =>
}
case IsTemplateDefinition() | ScalaTokenTypes.kTYPE =>
val typeDefinition = PsiTreeUtil.getParentOfType(element, classOf[ScTypeDefinitionLike])
if (typeDefinition != null) {
return new CompanionHighlightHandler(element, typeDefinition, editor, file)
}
case `tIDENTIFIER` =>
element.getParent match {
case ScConstructorInvocation.byReference(constr) => return new ScalaHighlightConstructorInvocationUsages(constr, file, editor)
case ref@ScConstructorInvocation.byUniversalApply(_) => return new ScalaHighlightConstructorInvocationUsages(Option(ref), file, editor)
case named: ScNamedElement => return implicitHighlighter(editor, file, named)
case ref@ReferenceToCaseClassApplyOrUnapply(cc) => return new ScalaHighlightCaseClassHandler(ref, cc, file, editor)
case ref: ScReference => return implicitHighlighter(editor, file, ref)
case _ =>
}
//to highlight usages of implicit parameter from context bound
case `tCOLON` =>
element.getNextSiblingNotWhitespaceComment match {
case cb: ScContextBound => return implicitHighlighter(editor, file, cb)
case _ =>
}
case _ =>
}
null
}