Do not remove import for iterator()

This commit is contained in:
Natalia.Ukhorskaya
2013-03-14 14:45:53 +04:00
parent 635f65e23d
commit 5bdd52c65f
5 changed files with 56 additions and 0 deletions
@@ -23,11 +23,19 @@ import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade;
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
import org.jetbrains.jet.util.QualifiedNamesUtil;
@@ -179,6 +187,21 @@ public class JetImportOptimizer implements ImportOptimizer {
super.visitReferenceExpression(expression);
}
@Override
public void visitForExpression(JetForExpression expression) {
ResolveSession resolveSession = WholeProjectAnalyzerFacade.getLazyResolveSessionForFile((JetFile) expression.getContainingFile());
BindingContext context = ResolveSessionUtils.resolveToExpression(resolveSession, expression);
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.LOOP_RANGE_ITERATOR_RESOLVED_CALL, expression.getLoopRange());
if (resolvedCall != null) {
FunctionDescriptor iteratorDescriptor = resolvedCall.getResultingDescriptor();
FqNameUnsafe name = DescriptorUtils.getFQName(iteratorDescriptor);
assert name.isSafe();
usedQualifiedNames.add(name.toSafe());
}
super.visitForExpression(expression);
}
});
return usedQualifiedNames;
@@ -0,0 +1,7 @@
import test1.MyClass
import test1.iterator
fun foo() {
val s = MyClass()
for (i in s) {}
}
@@ -0,0 +1,7 @@
import test1.MyClass
import test1.iterator
fun foo() {
val s = MyClass()
for (i in s) {}
}
@@ -0,0 +1,15 @@
package test1
public class MyClass {
}
public fun MyClass.iterator(): Iterator<MyClass> {
return object: Iterator<MyClass> {
override fun next(): MyClass {
throw Exception()
}
override fun hasNext(): Boolean {
throw Exception()
}
}
}
@@ -42,6 +42,10 @@ public class OptimizeImportsMultiFileTest extends CodeInsightTestCase {
doTest(getTestName(false) + "/main.kt", getTestName(false) + "/myClass.kt");
}
public void testIteratorFunction() throws Exception {
doTest(getTestName(false) + "/main.kt", getTestName(false) + "/myClass.kt");
}
public void doTest(String... fileNames) throws Exception {
configureByFiles(null, fileNames);
invokeFormatFile();