diff --git a/plugins/android/src/org/jetbrains/android/AndroidXmlSchemaProvider.java b/plugins/android/src/org/jetbrains/android/AndroidXmlSchemaProvider.java index 943d39fc03e5..9916c9cffec8 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidXmlSchemaProvider.java +++ b/plugins/android/src/org/jetbrains/android/AndroidXmlSchemaProvider.java @@ -16,12 +16,14 @@ package org.jetbrains.android; +import com.android.sdklib.SdkConstants; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.util.CachedValue; @@ -30,20 +32,19 @@ import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.psi.xml.XmlFile; import com.intellij.xml.XmlSchemaProvider; -import com.android.sdklib.SdkConstants; import gnu.trove.THashMap; +import org.jetbrains.android.dom.manifest.ManifestDomFileDescription; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.resourceManagers.ResourceManager; -import org.jetbrains.android.dom.manifest.ManifestDomFileDescription; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.net.URL; +import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.HashSet; /** * Created by IntelliJ IDEA. @@ -87,7 +88,8 @@ public class AndroidXmlSchemaProvider extends XmlSchemaProvider { public boolean isAvailable(@NotNull final XmlFile file) { return ApplicationManager.getApplication().runReadAction(new Computable() { public Boolean compute() { - if (ResourceManager.isInResourceSubdirectory(file, null) || ManifestDomFileDescription.isManifestFile(file)) { + if (isXmlResourceFile(file) || + ManifestDomFileDescription.isManifestFile(file)) { return AndroidFacet.getInstance(file) != null; } return false; @@ -95,6 +97,24 @@ public class AndroidXmlSchemaProvider extends XmlSchemaProvider { }); } + private static boolean isXmlResourceFile(XmlFile file) { + if (!ResourceManager.isInResourceSubdirectory(file, null)) { + return false; + } + + final PsiDirectory parent = file.getParent(); + if (parent == null) { + return false; + } + + final String resType = ResourceManager.getResourceTypeByDirName(parent.getName()); + if (resType == null) { + return false; + } + + return !resType.equals("raw"); + } + @NotNull @Override public Set getAvailableNamespaces(@NotNull XmlFile file, @Nullable String tagName) { diff --git a/plugins/android/testData/dom/layout/XsdFile.xsd b/plugins/android/testData/dom/layout/XsdFile.xsd new file mode 100644 index 000000000000..01b27853cb9f --- /dev/null +++ b/plugins/android/testData/dom/layout/XsdFile.xsd @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java index 415a5609aaf1..bc2c6d48a911 100644 --- a/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java @@ -356,7 +356,19 @@ public class AndroidLayoutDomTest extends AndroidDomTest { actions.get(0).invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); } }.execute(); - myFixture.checkResultByFile("res/values/drawables.xml", testFolder + '/' + getTestName(true) + "_drawable_after.xml", true); + myFixture.checkResultByFile("res/values/drawables.xml", testFolder + '/' + getTestName(true) + "_drawable_after.xml", true); + } + + public void testXsdFile1() throws Throwable { + final VirtualFile virtualFile = copyFileToProject("XsdFile.xsd", "res/raw/XsdFile.xsd"); + myFixture.configureFromExistingVirtualFile(virtualFile); + myFixture.checkHighlighting(false, false, false); + } + + public void testXsdFile2() throws Throwable { + final VirtualFile virtualFile = copyFileToProject("XsdFile.xsd", "res/assets/XsdFile.xsd"); + myFixture.configureFromExistingVirtualFile(virtualFile); + myFixture.checkHighlighting(false, false, false); } private void copyOnClickClasses() throws IOException {