Skip to content

Commit 559775b

Browse files
committed
Added support find usages for PHP classes in neon
1 parent 8519fb6 commit 559775b

File tree

5 files changed

+75
-3
lines changed

5 files changed

+75
-3
lines changed

resources/META-INF/plugin.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<change-notes><![CDATA[
1111
<h2>0.5.2</h2>
1212
<ul>
13-
<li>Added support find usages for PHP classes in neon</li>
13+
<li>Added support find usages for PHP classes used in neon</li>
14+
<li>Added inspections for used undefined classes</li>
1415
<li>Increased minimum compatibility with PHPStorm 2018.3</li>
1516
</ul>
1617
<h2>0.5.1</h2>
@@ -74,5 +75,10 @@
7475

7576
<gotoDeclarationHandler implementation="cz.juzna.intellij.neon.reference.GoToClassHandler"/>
7677
<annotator implementationClass="cz.juzna.intellij.neon.annotator.NeonAnnotator" language="neon"/>
78+
79+
<localInspection language="neon" shortName="ClassUsages" id="ClassUsages"
80+
displayName="Class usages"
81+
groupName="Neon" enabledByDefault="true"
82+
implementationClass="cz.juzna.intellij.neon.inspections.ClassUsagesInspection"/>
7783
</extensions>
7884
</idea-plugin>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package cz.juzna.intellij.neon.inspections;
2+
3+
import com.intellij.codeInspection.*;
4+
import com.intellij.psi.PsiElement;
5+
import com.intellij.psi.PsiFile;
6+
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
7+
import cz.juzna.intellij.neon.psi.NeonFile;
8+
import cz.juzna.intellij.neon.psi.impl.NeonScalarImpl;
9+
import cz.juzna.intellij.neon.util.NeonPhpUtil;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class ClassUsagesInspection extends LocalInspectionTool {
17+
18+
@NotNull
19+
@Override
20+
public String getShortName() {
21+
return "ClassUsages";
22+
}
23+
24+
@Nullable
25+
@Override
26+
public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull final InspectionManager manager, final boolean isOnTheFly) {
27+
if (!(file instanceof NeonFile)) {
28+
return null;
29+
}
30+
31+
final List<ProblemDescriptor> problems = new ArrayList<ProblemDescriptor>();
32+
file.acceptChildren(new PsiRecursiveElementWalkingVisitor() {
33+
@Override
34+
public void visitElement(PsiElement element) {
35+
if (element instanceof NeonScalarImpl && ((NeonScalarImpl) element).isPhpScalar()) {
36+
String className = ((NeonScalarImpl) element).getName();
37+
if (NeonPhpUtil.getClassesByFQN(element.getProject(), className).size() == 0) {
38+
String description = "Undefined class '" + className + "'";
39+
ProblemDescriptor problem = manager.createProblemDescriptor(element, description, true, ProblemHighlightType.GENERIC_ERROR, isOnTheFly);
40+
problems.add(problem);
41+
}
42+
43+
} else {
44+
super.visitElement(element);
45+
}
46+
}
47+
});
48+
49+
return problems.toArray(new ProblemDescriptor[problems.size()]);
50+
}
51+
}

src/cz/juzna/intellij/neon/psi/impl/NeonScalarImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.intellij.psi.impl.source.tree.LeafPsiElement;
77
import cz.juzna.intellij.neon.lexer.NeonTokenTypes;
88
import cz.juzna.intellij.neon.psi.NeonScalar;
9+
import cz.juzna.intellij.neon.util.NeonPhpUtil;
910
import org.jetbrains.annotations.NotNull;
1011
import org.jetbrains.annotations.Nullable;
1112

@@ -30,6 +31,10 @@ public String getValueText() {
3031
return text;
3132
}
3233

34+
public boolean isPhpScalar() {
35+
return NeonPhpUtil.isPhpClassScalar(this);
36+
}
37+
3338
@Override
3439
public String getName() {
3540
return getValueText();

src/cz/juzna/intellij/neon/reference/NeonReferenceContributor.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import cz.juzna.intellij.neon.NeonLanguage;
88
import cz.juzna.intellij.neon.psi.impl.NeonScalarImpl;
99
import cz.juzna.intellij.neon.reference.references.NeonPhpClassReference;
10-
import cz.juzna.intellij.neon.util.NeonPhpUtil;
1110
import org.jetbrains.annotations.NotNull;
1211

1312
public class NeonReferenceContributor extends PsiReferenceContributor {
@@ -23,7 +22,7 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNu
2322
}
2423

2524
String name = ((NeonScalarImpl) element).getName();
26-
if (name != null && NeonPhpUtil.isPhpClassScalar(element)) {
25+
if (name != null && ((NeonScalarImpl) element).isPhpScalar()) {
2726
return new PsiReference[]{
2827
new NeonPhpClassReference((NeonScalarImpl) element, new TextRange(0, name.length() + 1))};
2928
}

src/cz/juzna/intellij/neon/util/NeonPhpUtil.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package cz.juzna.intellij.neon.util;
22

3+
import com.intellij.openapi.project.Project;
34
import com.intellij.psi.PsiElement;
45
import com.intellij.psi.PsiRecursiveElementVisitor;
6+
import com.jetbrains.php.PhpIndex;
57
import com.jetbrains.php.lang.psi.elements.ClassReference;
68
import com.jetbrains.php.lang.psi.elements.ExtendsList;
79
import com.jetbrains.php.lang.psi.elements.PhpClass;
810
import cz.juzna.intellij.neon.psi.impl.NeonScalarImpl;
911
import org.jetbrains.annotations.NotNull;
1012

1113
import java.util.ArrayList;
14+
import java.util.Collection;
1215
import java.util.List;
1316

1417
public class NeonPhpUtil {
@@ -35,6 +38,14 @@ public static void findNeonPhpClasses(List<NeonScalarImpl> properties, PsiElemen
3538
}
3639
}
3740

41+
public static Collection<PhpClass> getClassesByFQN(Project project, String className) {
42+
return getPhpIndex(project).getAnyByFQN(className);
43+
}
44+
45+
private static PhpIndex getPhpIndex(Project project) {
46+
return PhpIndex.getInstance(project);
47+
}
48+
3849
public static boolean isPhpClassScalar(@NotNull PsiElement element) {
3950
if (!(element instanceof NeonScalarImpl)) {
4051
return false;

0 commit comments

Comments
 (0)