forked from magento/magento2-phpstorm-plugin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathModuleDeclarationInModuleXmlInspection.java
106 lines (94 loc) · 4.11 KB
/
ModuleDeclarationInModuleXmlInspection.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
package com.magento.idea.magento2plugin.inspections.xml;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.codeInspection.XmlSuppressableInspectionTool;
import com.intellij.patterns.XmlAttributeValuePattern;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.XmlElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
import com.magento.idea.magento2plugin.inspections.util.GetEditableModuleNameByRootFileUtil;
import com.magento.idea.magento2plugin.inspections.xml.fix.XmlModuleNameQuickFix;
import com.magento.idea.magento2plugin.magento.files.ModuleXml;
import com.magento.idea.magento2plugin.util.magento.IsFileInEditableModuleUtil;
import org.jetbrains.annotations.NotNull;
public class ModuleDeclarationInModuleXmlInspection extends XmlSuppressableInspectionTool {
@NotNull
@Override
public PsiElementVisitor buildVisitor(
final @NotNull ProblemsHolder problemsHolder,
final boolean isOnTheFly
) {
return new XmlElementVisitor() {
@Override
public void visitXmlAttributeValue(final XmlAttributeValue value) {
final PsiFile file = value.getContainingFile();
final String filename = file.getName();
if (!filename.equals(ModuleXml.FILE_NAME)) {
return;
}
if (!IsFileInEditableModuleUtil.execute(file)) {
return;
}
if (isSubTag(value, (XmlFile) file)) {
return;
}
final PsiDirectory etcDirectory = file.getParent();
if (etcDirectory == null) {
return;
}
final String attributeName = XmlAttributeValuePattern.getLocalName(value);
if (attributeName != null && attributeName.equals(ModuleXml.MODULE_ATTR_NAME)) {
final String expectedName
= GetEditableModuleNameByRootFileUtil.execute(etcDirectory);
final String actualName = value.getValue();
if (actualName.equals(expectedName)) {
return;
}
final InspectionBundle inspectionBundle = new InspectionBundle();
problemsHolder.registerProblem(
value,
inspectionBundle.message(
"inspection.moduleDeclaration.warning.wrongModuleName",
actualName,
expectedName
),
ProblemHighlightType.ERROR,
new XmlModuleNameQuickFix(expectedName)
);
}
}
};
}
protected boolean isSubTag(final XmlAttributeValue value, final XmlFile file) {
final XmlAttribute xmlAttribute = PsiTreeUtil.getParentOfType(value, XmlAttribute.class);
if (xmlAttribute == null) {
return true;
}
final XmlTag xmlTag = PsiTreeUtil.getParentOfType(xmlAttribute, XmlTag.class);
if (xmlTag == null) {
return true;
}
final XmlDocument xmlDocument = file.getDocument();
if (xmlDocument == null) {
return true;
}
final XmlTag xmlRootTag = xmlDocument.getRootTag();
if (xmlRootTag == null) {
return true;
}
final XmlTag rootTag = PsiTreeUtil.getParentOfType(xmlTag, XmlTag.class);
return rootTag == null || !(rootTag.getName().equals(xmlRootTag.getName()));
}
}