diff --git a/plugins/android/src/org/jetbrains/android/AndroidCompletionContributor.java b/plugins/android/src/org/jetbrains/android/AndroidCompletionContributor.java index f950060e7081..d668822e65e2 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidCompletionContributor.java +++ b/plugins/android/src/org/jetbrains/android/AndroidCompletionContributor.java @@ -88,6 +88,7 @@ public class AndroidCompletionContributor extends CompletionContributor { } else if (LayoutDomFileDescription.isLayoutFile(xmlFile)) { resultSet.addElement(LookupElementBuilder.create("view")); + resultSet.addElement(LookupElementBuilder.create("merge")); Map viewClassMap = AndroidDomExtender.getViewClassMap(facet); final PsiClass viewGroupClass = viewClassMap.get("ViewGroup"); for (String tagName : viewClassMap.keySet()) { diff --git a/plugins/android/src/org/jetbrains/android/dom/AndroidDomExtender.java b/plugins/android/src/org/jetbrains/android/dom/AndroidDomExtender.java index b59163d81938..a1aaeff76e9a 100644 --- a/plugins/android/src/org/jetbrains/android/dom/AndroidDomExtender.java +++ b/plugins/android/src/org/jetbrains/android/dom/AndroidDomExtender.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiClass; import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlTag; import com.intellij.util.ArrayUtil; import com.intellij.util.Processor; @@ -354,10 +355,13 @@ public class AndroidDomExtender extends DomExtender { private static final MyAttributeProcessor ourLayoutAttrsProcessor = new MyAttributeProcessor() { @Override public void process(@NotNull XmlName attrName, @NotNull DomExtension extension, @NotNull DomElement element) { - if (element instanceof LayoutViewElement && - SdkConstants.NS_RESOURCES.equals(attrName.getNamespaceKey()) && - ("layout_width".equals(attrName.getLocalName()) || "layout_height".equals(attrName.getLocalName()))) { - extension.addCustomAnnotation(new MyRequired()); + if (element instanceof LayoutViewElement && SdkConstants.NS_RESOURCES.equals(attrName.getNamespaceKey())) { + XmlElement xmlElement = element.getXmlElement(); + String tagName = xmlElement instanceof XmlTag ? ((XmlTag)xmlElement).getName() : null; + if (!"merge".equals(tagName) && + ("layout_width".equals(attrName.getLocalName()) || "layout_height".equals(attrName.getLocalName()))) { + extension.addCustomAnnotation(new MyRequired()); + } } } }; diff --git a/plugins/android/testData/dom/layout/merge.xml b/plugins/android/testData/dom/layout/merge.xml new file mode 100644 index 000000000000..df4e0186b808 --- /dev/null +++ b/plugins/android/testData/dom/layout/merge.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/plugins/android/testData/dom/layout/tn5.xml b/plugins/android/testData/dom/layout/tn5.xml new file mode 100644 index 000000000000..3c121dce6700 --- /dev/null +++ b/plugins/android/testData/dom/layout/tn5.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/android/testData/dom/layout/tn5_after.xml b/plugins/android/testData/dom/layout/tn5_after.xml new file mode 100644 index 000000000000..3c746656268f --- /dev/null +++ b/plugins/android/testData/dom/layout/tn5_after.xml @@ -0,0 +1,3 @@ + + +