diff --git a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.jar b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.jar new file mode 100644 index 00000000000..e1192002b8b Binary files /dev/null and b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.jar differ diff --git a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt new file mode 100644 index 00000000000..eac94bd74e7 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt @@ -0,0 +1,11 @@ +package test + +import dependency.A + +public open class B() : A() { + +} + +public open class C() : B() { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after new file mode 100644 index 00000000000..6f252b469c0 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after @@ -0,0 +1,14 @@ +package test + +import dependency.A + +public open class B() : A() { + +} + +public open class C() : B() { + + override fun foo() { + super.foo() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java new file mode 100644 index 00000000000..e4f5c4f756c --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java @@ -0,0 +1,162 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.codeInsight; + +import com.intellij.openapi.application.Result; +import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.plugin.JetLightProjectDescriptor; +import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Set; + +public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixtureTestCase { + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JetLightProjectDescriptor.INSTANCE; + } + + protected void doImplementFileTest() { + doFileTest(new ImplementMethodsHandler()); + } + + protected void doOverrideFileTest() { + doFileTest(new OverrideMethodsHandler()); + } + + protected void doMultiImplementFileTest() { + doMultiFileTest(new ImplementMethodsHandler()); + } + + protected void doMultiOverrideFileTest() { + doMultiFileTest(new OverrideMethodsHandler()); + } + + protected void doImplementDirectoryTest() { + doDirectoryTest(new ImplementMethodsHandler()); + } + + protected void doOverrideDirectoryTest(@Nullable String memberToImplement) { + doDirectoryTest(new OverrideMethodsHandler(), memberToImplement); + } + + private void doFileTest(OverrideImplementMethodsHandler handler) { + myFixture.configureByFile(getTestName(true) + ".kt"); + doOverrideImplement(handler, null); + myFixture.checkResultByFile(getTestName(true) + ".kt.after"); + } + + private void doMultiFileTest(OverrideImplementMethodsHandler handler) { + myFixture.configureByFile(getTestName(true) + ".kt"); + doMultiOverrideImplement(handler); + myFixture.checkResultByFile(getTestName(true) + ".kt.after"); + } + + protected void doDirectoryTest(OverrideImplementMethodsHandler handler) { + doDirectoryTest(handler, null); + } + + private void doDirectoryTest(OverrideImplementMethodsHandler handler, @Nullable String memberToOverride) { + myFixture.copyDirectoryToProject(getTestName(true), ""); + myFixture.configureFromTempProjectFile("foo/Impl.kt"); + doOverrideImplement(handler, memberToOverride); + myFixture.checkResultByFile(getTestName(true) + "/foo/Impl.kt.after"); + } + + private void doOverrideImplement(OverrideImplementMethodsHandler handler, @Nullable String memberToOverride) { + PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); + final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); + assertNotNull("Caret should be inside class or object", classOrObject); + + final JetFile jetFile = (JetFile) classOrObject.getContainingFile(); + final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile) + .getBindingContext(); + Set descriptors = handler.collectMethodsToGenerate(classOrObject, bindingContext); + + final CallableMemberDescriptor singleToOverride; + if (memberToOverride == null) { + assertEquals("Invalid number of available descriptors for override", 1, descriptors.size()); + singleToOverride = descriptors.iterator().next(); + } + else { + CallableMemberDescriptor candidateToOverride = null; + for (CallableMemberDescriptor callable : descriptors) { + if (callable.getName().asString().equals(memberToOverride)) { + if (candidateToOverride != null) { + throw new IllegalStateException("more then one descriptor with name " + memberToOverride); + } + candidateToOverride = callable; + } + } + if (candidateToOverride == null) { + throw new IllegalStateException("no descriptors to override with name " + memberToOverride + " found"); + } + singleToOverride = candidateToOverride; + } + + new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { + @Override + protected void run(Result result) throws Throwable { + OverrideImplementMethodsHandler.generateMethods( + myFixture.getEditor(), classOrObject, + OverrideImplementMethodsHandler + .membersFromDescriptors(jetFile, Collections.singletonList(singleToOverride), bindingContext)); + } + }.execute(); + } + + private void doMultiOverrideImplement(OverrideImplementMethodsHandler handler) { + PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); + final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); + assertNotNull("Caret should be inside class or object", classOrObject); + + final JetFile jetFile = (JetFile) classOrObject.getContainingFile(); + final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile) + .getBindingContext(); + Set descriptors = handler.collectMethodsToGenerate(classOrObject, bindingContext); + + final ArrayList descriptorsList = new ArrayList(descriptors); + Collections.sort(descriptorsList, new Comparator() { + @Override + public int compare(@NotNull CallableMemberDescriptor desc1, @NotNull CallableMemberDescriptor desc2) { + return desc1.getName().compareTo(desc2.getName()); + } + }); + + new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { + @Override + protected void run(Result result) throws Throwable { + OverrideImplementMethodsHandler.generateMethods( + myFixture.getEditor(), classOrObject, + OverrideImplementMethodsHandler.membersFromDescriptors(jetFile, descriptorsList, bindingContext)); + } + }.execute(); + } +} diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index 952db3a7981..eaeaab69b82 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -16,33 +16,9 @@ package org.jetbrains.jet.plugin.codeInsight; -import com.intellij.openapi.application.Result; -import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.testFramework.LightProjectDescriptor; -import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; -import org.jetbrains.jet.lang.psi.JetClassOrObject; -import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.PluginTestCaseBase; -import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Set; - -public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { - @NotNull - @Override - protected LightProjectDescriptor getProjectDescriptor() { - return JetLightProjectDescriptor.INSTANCE; - } +public final class OverrideImplementTest extends AbstractOverrideImplementTest { @Override public void setUp() throws Exception { @@ -162,124 +138,7 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { doOverrideDirectoryTest("foo"); } - private void doImplementFileTest() { - doFileTest(new ImplementMethodsHandler()); - } - - private void doOverrideFileTest() { - doFileTest(new OverrideMethodsHandler()); - } - - private void doMultiImplementFileTest() { - doMultiFileTest(new ImplementMethodsHandler()); - } - - private void doMultiOverrideFileTest() { - doMultiFileTest(new OverrideMethodsHandler()); - } - - private void doImplementDirectoryTest() { - doDirectoryTest(new ImplementMethodsHandler()); - } - - private void doOverrideDirectoryTest(@Nullable String memberToImplement) { - doDirectoryTest(new OverrideMethodsHandler(), memberToImplement); - } - public void testSameTypeName() { doDirectoryTest(new OverrideMethodsHandler()); } - - private void doFileTest(OverrideImplementMethodsHandler handler) { - myFixture.configureByFile(getTestName(true) + ".kt"); - doOverrideImplement(handler, null); - myFixture.checkResultByFile(getTestName(true) + ".kt.after"); - } - - private void doMultiFileTest(OverrideImplementMethodsHandler handler) { - myFixture.configureByFile(getTestName(true) + ".kt"); - doMultiOverrideImplement(handler); - myFixture.checkResultByFile(getTestName(true) + ".kt.after"); - } - - private void doDirectoryTest(OverrideImplementMethodsHandler handler) { - doDirectoryTest(handler, null); - } - - private void doDirectoryTest(OverrideImplementMethodsHandler handler, @Nullable String memberToOverride) { - myFixture.copyDirectoryToProject(getTestName(true), ""); - myFixture.configureFromTempProjectFile("foo/Impl.kt"); - doOverrideImplement(handler, memberToOverride); - myFixture.checkResultByFile(getTestName(true) + "/foo/Impl.kt.after"); - } - - private void doOverrideImplement(OverrideImplementMethodsHandler handler, @Nullable String memberToOverride) { - PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); - final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); - assertNotNull("Caret should be inside class or object", classOrObject); - - final JetFile jetFile = (JetFile) classOrObject.getContainingFile(); - final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile) - .getBindingContext(); - Set descriptors = handler.collectMethodsToGenerate(classOrObject, bindingContext); - - final CallableMemberDescriptor singleToOverride; - if (memberToOverride == null) { - assertEquals("Invalid number of available descriptors for override", 1, descriptors.size()); - singleToOverride = descriptors.iterator().next(); - } - else { - CallableMemberDescriptor candidateToOverride = null; - for (CallableMemberDescriptor callable : descriptors) { - if (callable.getName().asString().equals(memberToOverride)) { - if (candidateToOverride != null) { - throw new IllegalStateException("more then one descriptor with name " + memberToOverride); - } - candidateToOverride = callable; - } - } - if (candidateToOverride == null) { - throw new IllegalStateException("no descriptors to override with name " + memberToOverride + " found"); - } - singleToOverride = candidateToOverride; - } - - new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { - @Override - protected void run(Result result) throws Throwable { - OverrideImplementMethodsHandler.generateMethods( - myFixture.getEditor(), classOrObject, - OverrideImplementMethodsHandler - .membersFromDescriptors(jetFile, Collections.singletonList(singleToOverride), bindingContext)); - } - }.execute(); - } - - private void doMultiOverrideImplement(OverrideImplementMethodsHandler handler) { - PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); - final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); - assertNotNull("Caret should be inside class or object", classOrObject); - - final JetFile jetFile = (JetFile) classOrObject.getContainingFile(); - final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile) - .getBindingContext(); - Set descriptors = handler.collectMethodsToGenerate(classOrObject, bindingContext); - - final ArrayList descriptorsList = new ArrayList(descriptors); - Collections.sort(descriptorsList, new Comparator() { - @Override - public int compare(CallableMemberDescriptor desc1, CallableMemberDescriptor desc2) { - return desc1.getName().compareTo(desc2.getName()); - } - }); - - new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { - @Override - protected void run(Result result) throws Throwable { - OverrideImplementMethodsHandler.generateMethods( - myFixture.getEditor(), classOrObject, - OverrideImplementMethodsHandler.membersFromDescriptors(jetFile, descriptorsList, bindingContext)); - } - }.execute(); - } } diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementWithLibTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementWithLibTest.java new file mode 100644 index 00000000000..9bf1a57c1f9 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementWithLibTest.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.codeInsight; + +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEditor; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; +import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.testing.ConfigLibraryUtil; + +import java.io.File; + +public final class OverrideImplementWithLibTest extends AbstractOverrideImplementTest { + + private static final String TEST_PATH = PluginTestCaseBase.getTestDataPathBase() + "/codeInsight/overrideImplement/withLib"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(TEST_PATH); + } + + public void doTestWithLib() { + File dependency = new File(TEST_PATH + "/" + getTestName(true) + ".jar"); + assert dependency.exists(); + NewLibraryEditor editor = new NewLibraryEditor(); + editor.setName("dependency"); + editor.addRoot(VfsUtil.getUrlForLibraryRoot(dependency), OrderRootType.CLASSES); + + try { + ConfigLibraryUtil.configureLibrary(myModule, getProjectDescriptor().getSdk(), editor); + CodeInsightTestFixtureImpl.ensureIndexesUpToDate(getProject()); + doOverrideFileTest(); + } + finally { + ConfigLibraryUtil.unConfigureLibrary(myModule, getProjectDescriptor().getSdk(), editor.getName()); + } + } + + public void testFakeOverride() throws Exception { + doTestWithLib(); + } +}