package com.cedricziel.idea.typo3.annotation; import com.cedricziel.idea.typo3.container.IconProvider; import com.cedricziel.idea.typo3.psi.PhpElementsUtil; import com.intellij.lang.annotation.Annotation; import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.Annotator; import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import org.jetbrains.annotations.NotNull; public class IconAnnotator implements Annotator { @Override public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder annotationHolder) { if (!(psiElement instanceof StringLiteralExpression)) { return; } StringLiteralExpression literalExpression = (StringLiteralExpression) psiElement; String value = literalExpression.getContents(); if (value.isEmpty()) { return; } PsiElement methodReference = PsiTreeUtil.getParentOfType(psiElement, MethodReference.class); if (PhpElementsUtil.isMethodWithFirstStringOrFieldReference(methodReference, "getIcon")) { annotateIconUsage(psiElement, annotationHolder, value); } } private void annotateIconUsage(PsiElement psiElement, AnnotationHolder annotationHolder, String value) { IconProvider iconProvider = IconProvider.getInstance(psiElement.getProject()); annotateIcon(psiElement, annotationHolder, value, iconProvider); } private void annotateIcon(PsiElement psiElement, AnnotationHolder annotationHolder, String value, IconProvider iconProvider) { if (iconProvider.has(psiElement.getProject(), value)) { TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset()); Annotation annotation = annotationHolder.createInfoAnnotation(range, null); annotation.setTextAttributes(DefaultLanguageHighlighterColors.LINE_COMMENT); } else { TextRange range = new TextRange(psiElement.getTextRange().getStartOffset(), psiElement.getTextRange().getEndOffset()); annotationHolder.createWarningAnnotation(range, "Unresolved icon - this may also occur if the icon is defined in your extension, but not in the global icon registry."); } } }