From e134bbf770ea9a82e673d9cb46f9411e6ca9f8af Mon Sep 17 00:00:00 2001 From: Vyacheslav Lukianov Date: Thu, 11 May 2006 18:03:32 +0400 Subject: [PATCH] correct registration of type definitions in context of parent element force instantiation of AntStructuredElement children rename tests added --- .../lang/ant/psi/AntStructuredElement.java | 2 + .../psi/impl/AntStructuredElementImpl.java | 14 +++ .../lang/ant/psi/impl/AntTypeDefImpl.java | 7 +- plugins/ant/tests/data/psi/rename/antCall.xml | 10 ++ .../tests/data/psi/rename/antCall.xml-after | 10 ++ .../data/psi/rename/antCallReference.xml | 10 ++ .../psi/rename/antCallReference.xml-after | 10 ++ .../tests/data/psi/rename/dependsTarget1.xml | 5 + .../data/psi/rename/dependsTarget1.xml-after | 5 + .../tests/data/psi/rename/dependsTarget2.xml | 5 + .../data/psi/rename/dependsTarget2.xml-after | 5 + .../psi/rename/dependsTargetReference1.xml | 5 + .../rename/dependsTargetReference1.xml-after | 5 + .../psi/rename/dependsTargetReference2.xml | 5 + .../rename/dependsTargetReference2.xml-after | 5 + plugins/ant/tests/data/psi/rename/param.xml | 10 ++ .../ant/tests/data/psi/rename/param.xml-after | 10 ++ .../tests/data/psi/rename/paramReference.xml | 10 ++ .../data/psi/rename/paramReference.xml-after | 10 ++ plugins/ant/tests/data/psi/rename/refid.xml | 8 ++ .../ant/tests/data/psi/rename/refid.xml-after | 8 ++ .../tests/data/psi/rename/refidReference.xml | 8 ++ .../data/psi/rename/refidReference.xml-after | 8 ++ .../tests/data/psi/rename/simpleProperty.xml | 6 + .../data/psi/rename/simpleProperty.xml-after | 6 + .../psi/rename/simplePropertyReference.xml | 6 + .../rename/simplePropertyReference.xml-after | 6 + .../tests/data/psi/rename/singleTarget.xml | 3 + .../data/psi/rename/singleTarget.xml-after | 3 + .../data/psi/rename/singleTargetReference.xml | 3 + .../rename/singleTargetReference.xml-after | 3 + .../com/intellij/lang/ant/AntRenameTest.java | 108 ++++++++++++++++++ 32 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 plugins/ant/tests/data/psi/rename/antCall.xml create mode 100644 plugins/ant/tests/data/psi/rename/antCall.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/antCallReference.xml create mode 100644 plugins/ant/tests/data/psi/rename/antCallReference.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/dependsTarget1.xml create mode 100644 plugins/ant/tests/data/psi/rename/dependsTarget1.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/dependsTarget2.xml create mode 100644 plugins/ant/tests/data/psi/rename/dependsTarget2.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml create mode 100644 plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml create mode 100644 plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/param.xml create mode 100644 plugins/ant/tests/data/psi/rename/param.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/paramReference.xml create mode 100644 plugins/ant/tests/data/psi/rename/paramReference.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/refid.xml create mode 100644 plugins/ant/tests/data/psi/rename/refid.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/refidReference.xml create mode 100644 plugins/ant/tests/data/psi/rename/refidReference.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/simpleProperty.xml create mode 100644 plugins/ant/tests/data/psi/rename/simpleProperty.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/simplePropertyReference.xml create mode 100644 plugins/ant/tests/data/psi/rename/simplePropertyReference.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/singleTarget.xml create mode 100644 plugins/ant/tests/data/psi/rename/singleTarget.xml-after create mode 100644 plugins/ant/tests/data/psi/rename/singleTargetReference.xml create mode 100644 plugins/ant/tests/data/psi/rename/singleTargetReference.xml-after create mode 100644 plugins/ant/tests/src/com/intellij/lang/ant/AntRenameTest.java diff --git a/plugins/ant/src/com/intellij/lang/ant/psi/AntStructuredElement.java b/plugins/ant/src/com/intellij/lang/ant/psi/AntStructuredElement.java index 710341111e7a..658dc4ecf8bb 100644 --- a/plugins/ant/src/com/intellij/lang/ant/psi/AntStructuredElement.java +++ b/plugins/ant/src/com/intellij/lang/ant/psi/AntStructuredElement.java @@ -13,6 +13,8 @@ public interface AntStructuredElement extends AntElement { @Nullable AntTypeDefinition getTypeDefinition(); + void registerCustomType(final AntTypeDefinition def); + void registerRefId(final String id, AntElement element); @Nullable diff --git a/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntStructuredElementImpl.java b/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntStructuredElementImpl.java index a7e200341aed..cb980e501f75 100644 --- a/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntStructuredElementImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntStructuredElementImpl.java @@ -102,6 +102,17 @@ public class AntStructuredElementImpl extends AntElementImpl implements AntStruc return myDefinition; } + public void registerCustomType(final AntTypeDefinition def) { + if (myDefinition != null) { + if (!myDefinitionCloned) { + myDefinition = new AntTypeDefinitionImpl((AntTypeDefinitionImpl) myDefinition); + myDefinitionCloned = true; + } + myDefinition.registerNestedType(def.getTypeId(), def.getClassName()); + } + getAntFile().registerCustomType(def); + } + public void registerRefId(final String id, AntElement element) { if (myReferencedElements == null) { myReferencedElements = new HashMap(); @@ -171,6 +182,9 @@ public class AntStructuredElementImpl extends AntElementImpl implements AntStruc AntElementFactory.createAntElement(this, (XmlElement) element); if (antElement != null) { children.add(antElement); + if (antElement instanceof AntStructuredElement) { + antElement.getChildren(); + } } } } diff --git a/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntTypeDefImpl.java b/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntTypeDefImpl.java index 31c7ff99d029..1180e0af5ffb 100644 --- a/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntTypeDefImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/psi/impl/AntTypeDefImpl.java @@ -1,10 +1,12 @@ package com.intellij.lang.ant.psi.impl; import com.intellij.lang.ant.psi.AntElement; +import com.intellij.lang.ant.psi.AntStructuredElement; import com.intellij.lang.ant.psi.AntTypeDef; import com.intellij.lang.ant.psi.introspection.AntTypeDefinition; import com.intellij.lang.ant.psi.introspection.AntTypeId; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlElement; import com.intellij.util.StringBuilderSpinAllocator; import org.apache.tools.ant.Task; @@ -54,7 +56,10 @@ public class AntTypeDefImpl extends AntTaskImpl implements AntTypeDef { myNewDefinition = null; } else { myNewDefinition = AntFileImpl.createTypeDefinition(id, clazz, Task.class.isAssignableFrom(clazz)); - getAntFile().registerCustomType(myNewDefinition); + final AntStructuredElement se = PsiTreeUtil.getParentOfType(this, AntStructuredElementImpl.class); + if (se != null) { + se.registerCustomType(myNewDefinition); + } } } diff --git a/plugins/ant/tests/data/psi/rename/antCall.xml b/plugins/ant/tests/data/psi/rename/antCall.xml new file mode 100644 index 000000000000..2352c92505c4 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/antCall.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/antCall.xml-after b/plugins/ant/tests/data/psi/rename/antCall.xml-after new file mode 100644 index 000000000000..01fd4f8d0d72 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/antCall.xml-after @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/antCallReference.xml b/plugins/ant/tests/data/psi/rename/antCallReference.xml new file mode 100644 index 000000000000..637d4b50ecd8 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/antCallReference.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/antCallReference.xml-after b/plugins/ant/tests/data/psi/rename/antCallReference.xml-after new file mode 100644 index 000000000000..01fd4f8d0d72 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/antCallReference.xml-after @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTarget1.xml b/plugins/ant/tests/data/psi/rename/dependsTarget1.xml new file mode 100644 index 000000000000..779accbcb5cb --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTarget1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTarget1.xml-after b/plugins/ant/tests/data/psi/rename/dependsTarget1.xml-after new file mode 100644 index 000000000000..879025714d04 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTarget1.xml-after @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTarget2.xml b/plugins/ant/tests/data/psi/rename/dependsTarget2.xml new file mode 100644 index 000000000000..019d0d9165bf --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTarget2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTarget2.xml-after b/plugins/ant/tests/data/psi/rename/dependsTarget2.xml-after new file mode 100644 index 000000000000..64b7f7381483 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTarget2.xml-after @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml b/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml new file mode 100644 index 000000000000..545ea450bad7 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml-after b/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml-after new file mode 100644 index 000000000000..879025714d04 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTargetReference1.xml-after @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml b/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml new file mode 100644 index 000000000000..ae79844b8843 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml-after b/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml-after new file mode 100644 index 000000000000..64b7f7381483 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/dependsTargetReference2.xml-after @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/param.xml b/plugins/ant/tests/data/psi/rename/param.xml new file mode 100644 index 000000000000..a62c46b995af --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/param.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/param.xml-after b/plugins/ant/tests/data/psi/rename/param.xml-after new file mode 100644 index 000000000000..543596e5b4ca --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/param.xml-after @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/paramReference.xml b/plugins/ant/tests/data/psi/rename/paramReference.xml new file mode 100644 index 000000000000..2e14b98d0b4b --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/paramReference.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/paramReference.xml-after b/plugins/ant/tests/data/psi/rename/paramReference.xml-after new file mode 100644 index 000000000000..543596e5b4ca --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/paramReference.xml-after @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/refid.xml b/plugins/ant/tests/data/psi/rename/refid.xml new file mode 100644 index 000000000000..6f353048c950 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/refid.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/refid.xml-after b/plugins/ant/tests/data/psi/rename/refid.xml-after new file mode 100644 index 000000000000..d3b575662b30 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/refid.xml-after @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/refidReference.xml b/plugins/ant/tests/data/psi/rename/refidReference.xml new file mode 100644 index 000000000000..2bb3dfe69c99 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/refidReference.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/refidReference.xml-after b/plugins/ant/tests/data/psi/rename/refidReference.xml-after new file mode 100644 index 000000000000..d3b575662b30 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/refidReference.xml-after @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/simpleProperty.xml b/plugins/ant/tests/data/psi/rename/simpleProperty.xml new file mode 100644 index 000000000000..f2d1b5cc672c --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/simpleProperty.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/simpleProperty.xml-after b/plugins/ant/tests/data/psi/rename/simpleProperty.xml-after new file mode 100644 index 000000000000..ffc0ea886fa0 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/simpleProperty.xml-after @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml b/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml new file mode 100644 index 000000000000..768521753271 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml-after b/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml-after new file mode 100644 index 000000000000..ffc0ea886fa0 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/simplePropertyReference.xml-after @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/singleTarget.xml b/plugins/ant/tests/data/psi/rename/singleTarget.xml new file mode 100644 index 000000000000..8e13cf53efc4 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/singleTarget.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/singleTarget.xml-after b/plugins/ant/tests/data/psi/rename/singleTarget.xml-after new file mode 100644 index 000000000000..c681fb9f6abc --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/singleTarget.xml-after @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/singleTargetReference.xml b/plugins/ant/tests/data/psi/rename/singleTargetReference.xml new file mode 100644 index 000000000000..e308f7366e58 --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/singleTargetReference.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/ant/tests/data/psi/rename/singleTargetReference.xml-after b/plugins/ant/tests/data/psi/rename/singleTargetReference.xml-after new file mode 100644 index 000000000000..c681fb9f6abc --- /dev/null +++ b/plugins/ant/tests/data/psi/rename/singleTargetReference.xml-after @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/plugins/ant/tests/src/com/intellij/lang/ant/AntRenameTest.java b/plugins/ant/tests/src/com/intellij/lang/ant/AntRenameTest.java new file mode 100644 index 000000000000..0f55830bca6f --- /dev/null +++ b/plugins/ant/tests/src/com/intellij/lang/ant/AntRenameTest.java @@ -0,0 +1,108 @@ +package com.intellij.lang.ant; + +import com.intellij.lang.ant.psi.AntFile; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.psi.PsiReference; +import com.intellij.refactoring.RefactoringFactory; +import com.intellij.refactoring.RenameRefactoring; +import com.intellij.testFramework.LightCodeInsightTestCase; + +public class AntRenameTest extends LightCodeInsightTestCase { + + public void testSimpleProperty() throws Exception { + doTest(); + } + + public void testSimplePropertyReference() throws Exception { + doTest(); + } + + public void testParam() throws Exception { + doTest(); + } + + public void testParamReference() throws Exception { + doTest(); + } + + public void testRefid() throws Exception { + doTest(); + } + + public void testRefidReference() throws Exception { + doTest(); + } + + public void testSingleTarget() throws Exception { + doTest(); + } + + public void testSingleTargetReference() throws Exception { + doTest(); + } + + public void testAntCall() throws Exception { + doTest(); + } + + public void testAntCallReference() throws Exception { + doTest(); + } + + public void testDependsTarget1() throws Exception { + doTest(); + } + + public void testDependsTarget2() throws Exception { + doTest(); + } + + public void testDependsTargetReference1() throws Exception { + doTest(); + } + + public void testDependsTargetReference2() throws Exception { + doTest(); + } + + protected String getTestDataPath() { + return PathManager.getHomePath().replace('\\', '/') + "/plugins/ant/tests/data/psi/rename/"; + } + + private void doTest() throws Exception { + final String filename = getTestName(true) + ".xml"; + VirtualFile vfile = VirtualFileManager.getInstance().findFileByUrl( + "file://" + getTestDataPath() + filename); + String text = FileDocumentManager.getInstance().getDocument(vfile).getText(); + int off = text.indexOf(""); + text = text.replace("", ""); + configureFromFileText(filename, text); + myFile = myFile.getViewProvider().getPsi(AntSupport.getLanguage()); + assertNotNull(myFile); + assertTrue(myFile instanceof AntFile); + PsiElement element = myFile.findElementAt(off); + final PsiReference[] refs = element.getReferences(); + if (refs.length > 0) { + int i = 0; + element = refs[0].resolve(); + while (element != null && !text.substring(off).trim().startsWith(((PsiNamedElement) element).getName())) { + element = refs[++i].resolve(); + } + } else { + element = element.getParent(); + } + assertNotNull(element); + assertTrue(element instanceof PsiNamedElement); + final RenameRefactoring rename = RefactoringFactory.getInstance(getProject()).createRename( + element, ((PsiNamedElement) element).getName() + "-after"); + rename.setSearchInComments(false); + rename.setSearchInNonJavaFiles(false); + rename.run(); + checkResultByFile(filename + "-after"); + } +}