| package org.jetbrains.android.inspections.lint; |
| |
| import com.android.SdkConstants; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.util.PsiTreeUtil; |
| import com.intellij.psi.xml.XmlAttribute; |
| import com.intellij.psi.xml.XmlFile; |
| import com.intellij.psi.xml.XmlTag; |
| import com.intellij.xml.XmlNamespaceHelper; |
| import org.jetbrains.android.util.AndroidBundle; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.util.Collections; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| class AddMissingPrefixQuickFix implements AndroidLintQuickFix { |
| private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.inspections.lint.AddMissingPrefixQuickFix"); |
| |
| @Override |
| public void apply(@NotNull PsiElement startElement, @NotNull PsiElement endElement, @NotNull AndroidQuickfixContexts.Context context) { |
| final XmlAttribute attribute = PsiTreeUtil.getParentOfType(startElement, XmlAttribute.class, false); |
| if (attribute == null) { |
| return; |
| } |
| |
| final XmlTag tag = attribute.getParent(); |
| if (tag == null) { |
| LOG.debug("tag is null"); |
| return; |
| } |
| |
| String androidNsPrefix = tag.getPrefixByNamespace(SdkConstants.NS_RESOURCES); |
| |
| if (androidNsPrefix == null) { |
| final PsiFile file = tag.getContainingFile(); |
| final XmlNamespaceHelper extension = XmlNamespaceHelper.getHelper(file); |
| |
| if (extension == null) { |
| LOG.debug("Cannot get XmlNamespaceHelper for file + " + file); |
| return; |
| } |
| |
| if (!(file instanceof XmlFile)) { |
| LOG.debug(file + " is not XmlFile"); |
| return; |
| } |
| |
| final XmlFile xmlFile = (XmlFile)file; |
| final String defaultPrefix = "android"; |
| extension.insertNamespaceDeclaration(xmlFile, null, Collections.singleton(SdkConstants.NS_RESOURCES), defaultPrefix, null); |
| androidNsPrefix = defaultPrefix; |
| } |
| attribute.setName(androidNsPrefix + ':' + attribute.getLocalName()); |
| } |
| |
| @Override |
| public boolean isApplicable(@NotNull PsiElement startElement, |
| @NotNull PsiElement endElement, |
| @NotNull AndroidQuickfixContexts.ContextType contextType) { |
| return PsiTreeUtil.getParentOfType(startElement, XmlAttribute.class, false) != null; |
| } |
| |
| @NotNull |
| @Override |
| public String getName() { |
| return AndroidBundle.message("android.lint.fix.add.android.prefix"); |
| } |
| } |