diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java index 3e1b51b06082..5cd1f6138b3d 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java @@ -9,6 +9,8 @@ import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; @@ -28,6 +30,7 @@ import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.stubs.PyClassNameIndex; import com.jetbrains.python.psi.stubs.PyFunctionNameIndex; import com.jetbrains.python.psi.stubs.PyVariableNameIndex; +import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,6 +68,11 @@ public class PythonReferenceImporter implements ReferenceImporter { @Nullable public static AutoImportQuickFix proposeImportFix(final PyElement node, PsiReference reference, String ref_text) { + // don't propose meaningless auto imports if no interpreter is configured + final Module module = ModuleUtil.findModuleForPsiElement(node); + if (module != null && PythonSdkType.findPythonSdk(module) == null) { + return null; + } PsiFile existing_import_file = null; // if there's a matching existing import, this it the file it imports AutoImportQuickFix fix = new AutoImportQuickFix(node, reference, ref_text, !PyCodeInsightSettings.getInstance().PREFER_FROM_IMPORT); Set seen_file_names = new HashSet(); // true import names diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 428bd668f674..1c3c1c77e0e2 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -6,7 +6,12 @@ import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; import com.intellij.codeInspection.ui.ListEditForm; import com.intellij.lang.ASTNode; import com.intellij.lang.annotation.HighlightSeverity; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.options.ShowSettingsUtil; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.JDOMExternalizableStringList; import com.intellij.openapi.util.Key; @@ -15,6 +20,7 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; +import com.intellij.util.PlatformUtils; import com.jetbrains.cython.CythonLanguageDialect; import com.jetbrains.cython.CythonNames; import com.jetbrains.cython.psi.CythonFile; @@ -40,6 +46,7 @@ import com.jetbrains.python.psi.resolve.ImportedResolveResult; import com.jetbrains.python.psi.resolve.PyResolveContext; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.types.*; +import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -110,6 +117,17 @@ public class PyUnresolvedReferencesInspection extends PyInspection { myIgnoredIdentifiers = ImmutableSet.copyOf(ignoredIdentifiers); } + @Override + public void visitPyFile(PyFile node) { + super.visitPyFile(node); + if (PlatformUtils.isPyCharm()) { + final Module module = ModuleUtil.findModuleForPsiElement(node); + if (module != null && PythonSdkType.findPythonSdk(module) == null && PlatformUtils.isPyCharm()) { + registerProblem(node, "No Python interpreter configured for the project", new ConfigureInterpreterFix()); + } + } + } + @Override public void visitPyTargetExpression(PyTargetExpression node) { checkSlots(node); @@ -630,4 +648,29 @@ public class PyUnresolvedReferencesInspection extends PyInspection { } } } + + private static class ConfigureInterpreterFix implements LocalQuickFix { + @NotNull + @Override + public String getName() { + return "Configure Python Interpreter"; + } + + @NotNull + @Override + public String getFamilyName() { + return "Configure Python Interpreter"; + } + + @Override + public void applyFix(@NotNull final Project project, @NotNull ProblemDescriptor descriptor) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + // outside of read action + ShowSettingsUtil.getInstance().showSettingsDialog(project, "Project Interpreter"); + } + }); + } + } }