Skip to content

Commit 09ce3b9

Browse files
authored
Merge pull request #107 from cedricziel/dict-provider
Refactor Icon detection to use PsiReferences
2 parents 11eab5c + 9566cce commit 09ce3b9

File tree

18 files changed

+7657
-107
lines changed

18 files changed

+7657
-107
lines changed

src/main/java/com/cedricziel/idea/typo3/codeInsight/IconCompletionContributor.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/main/java/com/cedricziel/idea/typo3/codeInsight/navigation/IconGotoDeclarationHandler.java

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.cedricziel.idea.typo3.icons;
2+
3+
public interface IconInterface {
4+
public String getExtension();
5+
6+
public String getName();
7+
8+
public String getExtensionKey();
9+
10+
public String getProvider();
11+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.cedricziel.idea.typo3.icons;
2+
3+
import com.intellij.codeInsight.lookup.LookupElement;
4+
import com.intellij.codeInsight.lookup.LookupElementPresentation;
5+
import com.intellij.icons.AllIcons;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import javax.swing.*;
9+
10+
public class IconLookupElement extends LookupElement {
11+
12+
private final IconInterface icon;
13+
14+
public IconLookupElement(@NotNull IconInterface icon) {
15+
this.icon = icon;
16+
}
17+
18+
@NotNull
19+
@Override
20+
public String getLookupString() {
21+
return icon.getName();
22+
}
23+
24+
@Override
25+
public void renderElement(LookupElementPresentation presentation) {
26+
presentation.setItemText(icon.getName());
27+
presentation.setIcon(iconFromIconInterface(icon));
28+
presentation.setTypeText(icon.getExtensionKey());
29+
presentation.setTypeGrayed(true);
30+
}
31+
32+
private Icon iconFromIconInterface(@NotNull IconInterface icon) {
33+
return AllIcons.FileTypes.Custom;
34+
}
35+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.cedricziel.idea.typo3.icons;
2+
3+
import com.cedricziel.idea.typo3.index.IconIndex;
4+
import com.cedricziel.idea.typo3.util.IconUtil;
5+
import com.intellij.psi.PsiElement;
6+
import com.intellij.psi.PsiElementResolveResult;
7+
import com.intellij.psi.PsiPolyVariantReferenceBase;
8+
import com.intellij.psi.ResolveResult;
9+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
10+
import org.jetbrains.annotations.NotNull;
11+
12+
public class IconReference extends PsiPolyVariantReferenceBase<PsiElement> {
13+
private final String iconName;
14+
15+
public IconReference(StringLiteralExpression psiElement) {
16+
super(psiElement);
17+
18+
iconName = psiElement.getContents();
19+
}
20+
21+
@NotNull
22+
@Override
23+
public ResolveResult[] multiResolve(boolean incompleteCode) {
24+
return PsiElementResolveResult.createResults(IconIndex.getIconDefinitionElements(myElement.getProject(), iconName));
25+
}
26+
27+
@NotNull
28+
@Override
29+
public Object[] getVariants() {
30+
return IconUtil.createIconLookupElements(myElement.getProject());
31+
}
32+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.cedricziel.idea.typo3.icons;
2+
3+
import com.cedricziel.idea.typo3.util.PhpLangUtil;
4+
import com.intellij.patterns.PlatformPatterns;
5+
import com.intellij.psi.*;
6+
import com.intellij.util.ProcessingContext;
7+
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
8+
import org.jetbrains.annotations.NotNull;
9+
10+
public class IconReferenceContributor extends PsiReferenceContributor {
11+
@Override
12+
public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) {
13+
// known method calls
14+
registrar.registerReferenceProvider(
15+
PlatformPatterns.psiElement(StringLiteralExpression.class),
16+
new PsiReferenceProvider() {
17+
@NotNull
18+
@Override
19+
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) {
20+
StringLiteralExpression stringLiteralExpression = (StringLiteralExpression) element;
21+
22+
String methodName = PhpLangUtil.getMethodName(stringLiteralExpression);
23+
String className = PhpLangUtil.getClassName(stringLiteralExpression);
24+
if (methodName != null && className != null && methodName.equals("getIcon") && className.equals("\\TYPO3\\CMS\\Core\\Imaging\\IconFactory")) {
25+
return new PsiReference[]{new IconReference(stringLiteralExpression)};
26+
}
27+
28+
return new PsiReference[0];
29+
}
30+
}
31+
);
32+
}
33+
}

src/main/java/com/cedricziel/idea/typo3/domain/IconStub.java renamed to src/main/java/com/cedricziel/idea/typo3/icons/IconStub.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
package com.cedricziel.idea.typo3.domain;
1+
package com.cedricziel.idea.typo3.icons;
22

33
import com.intellij.openapi.util.TextRange;
4-
import com.intellij.openapi.vfs.VirtualFile;
54
import com.intellij.psi.PsiElement;
65

76
import java.io.Serializable;
87

9-
public class IconStub implements Serializable {
8+
public class IconStub implements IconInterface, Serializable {
109

1110
private String identifier;
1211
private String extension;
@@ -42,18 +41,34 @@ public void setSource(String source) {
4241
this.source = source;
4342
}
4443

44+
public TextRange getTextRange() {
45+
return textRange;
46+
}
47+
48+
@Override
49+
public String getExtension() {
50+
return null;
51+
}
52+
53+
@Override
54+
public String getName() {
55+
return identifier;
56+
}
57+
58+
@Override
59+
public String getExtensionKey() {
60+
return null;
61+
}
62+
63+
@Override
4564
public String getProvider() {
46-
return provider;
65+
return null;
4766
}
4867

4968
public void setProvider(String provider) {
5069
this.provider = provider;
5170
}
5271

53-
public TextRange getTextRange() {
54-
return textRange;
55-
}
56-
5772
@Override
5873
public boolean equals(Object o) {
5974
if (this == o) return true;

src/main/java/com/cedricziel/idea/typo3/index/IconIndex.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.cedricziel.idea.typo3.index;
22

3-
import com.cedricziel.idea.typo3.domain.IconStub;
3+
import com.cedricziel.idea.typo3.icons.IconStub;
44
import com.cedricziel.idea.typo3.index.externalizer.ObjectStreamDataExternalizer;
55
import com.cedricziel.idea.typo3.psi.visitor.CoreFlagParserVisitor;
66
import com.cedricziel.idea.typo3.psi.visitor.CoreIconParserVisitor;
@@ -32,6 +32,7 @@ public class IconIndex extends FileBasedIndexExtension<String, IconStub> {
3232

3333
public static ID<String, IconStub> KEY = ID.create("com.cedricziel.idea.typo3.index.icon");
3434

35+
@NotNull
3536
public static Collection<String> getAllAvailableIcons(@NotNull Project project) {
3637

3738
return FileBasedIndex.getInstance().getAllKeys(KEY, project);
@@ -75,6 +76,17 @@ public static PsiElement[] getIconDefinitionElements(@NotNull Project project, @
7576
return new PsiElement[0];
7677
}
7778

79+
@NotNull
80+
public static IconStub[] getAllIcons(@NotNull Project project) {
81+
List<IconStub> iconStubs = new ArrayList<>();
82+
FileBasedIndex.getInstance().getAllKeys(IconIndex.KEY, project).forEach(k -> {
83+
List<IconStub> values = FileBasedIndex.getInstance().getValues(IconIndex.KEY, k, GlobalSearchScope.allScope(project));
84+
iconStubs.addAll(values);
85+
});
86+
87+
return iconStubs.toArray(new IconStub[iconStubs.size()]);
88+
}
89+
7890
@NotNull
7991
@Override
8092
public ID<String, IconStub> getName() {
@@ -107,7 +119,7 @@ public DataIndexer<String, IconStub, FileContent> getIndexer() {
107119
CoreIconParserVisitor visitor = new CoreIconParserVisitor();
108120
visitor.visitElement(field.getDefaultValue());
109121

110-
visitor.getMap().forEach(map::put);
122+
Map<String, IconStub> map1 = visitor.getMap();map1.forEach(map::put);
111123
}
112124
}
113125
}
@@ -120,7 +132,8 @@ public DataIndexer<String, IconStub, FileContent> getIndexer() {
120132
method.accept(visitor);
121133
visitor.visitElement(method);
122134

123-
visitor.getMap().forEach(map::put);
135+
Map<String, IconStub> map1 = visitor.getMap();
136+
map1.forEach(map::put);
124137
}
125138
}
126139
}

src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreFlagParserVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.cedricziel.idea.typo3.psi.visitor;
22

3-
import com.cedricziel.idea.typo3.domain.IconStub;
3+
import com.cedricziel.idea.typo3.icons.IconStub;
44
import com.intellij.psi.PsiElement;
55
import com.intellij.psi.PsiElementVisitor;
66
import com.intellij.psi.util.PsiTreeUtil;

src/main/java/com/cedricziel/idea/typo3/psi/visitor/CoreIconParserVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.cedricziel.idea.typo3.psi.visitor;
22

3-
import com.cedricziel.idea.typo3.domain.IconStub;
3+
import com.cedricziel.idea.typo3.icons.IconStub;
44
import com.intellij.psi.PsiElement;
55
import com.intellij.psi.PsiRecursiveElementVisitor;
66
import com.jetbrains.php.lang.psi.elements.*;

0 commit comments

Comments
 (0)