Fix disappearing of Python repository from settings after Clion restart (CPP-7743)

Python plugin stored the interpreter setting as a module sdk, which was wiped out with it's order entries by Clion.
The fix is to store the interpreter setting in a facet and reinitialize it after Clion model clearing.
This commit is contained in:
Dmitry Trofimov
2017-02-15 16:03:33 +01:00
parent 298ccc4901
commit 30d86b98da
16 changed files with 466 additions and 95 deletions

View File

@@ -3,7 +3,7 @@
both Community and Professional versions. -->
<extensions defaultExtensionNs="com.intellij">
<moduleType id="PYTHON_MODULE" implementationClass="com.jetbrains.python.module.PythonModuleType"/>
<facetType implementation="com.jetbrains.python.facet.PythonFacetType"/>
<framework.detector implementation="com.jetbrains.python.facet.PythonFacetType$PythonFrameworkDetector"/>
<frameworkSupport implementation="com.jetbrains.python.facet.PythonFrameworkSupportProvider"/>
<projectStructureDetector implementation="com.jetbrains.python.module.PyProjectStructureDetector"/>
@@ -20,10 +20,4 @@
<pySuperMethodsSearch implementation="com.jetbrains.python.psi.impl.PyJavaSuperMethodsSearchExecutor"/>
<importCandidateProvider implementation="com.jetbrains.python.psi.impl.PyJavaImportCandidateProvider"/>
</extensions>
<application-components>
<component>
<implementation-class>com.jetbrains.python.facet.PythonSdkTableListener</implementation-class>
</component>
</application-components>
</idea-plugin>

View File

@@ -18,12 +18,7 @@ package com.jetbrains.python.facet;
import com.intellij.facet.Facet;
import com.intellij.facet.FacetType;
import com.intellij.facet.FacetTypeId;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import org.jetbrains.annotations.NotNull;
/**
@@ -32,81 +27,20 @@ import org.jetbrains.annotations.NotNull;
public class PythonFacet extends LibraryContributingFacet<PythonFacetConfiguration> {
public static final FacetTypeId<PythonFacet> ID = new FacetTypeId<>("python");
public PythonFacet(@NotNull final FacetType facetType, @NotNull final Module module, final @NotNull String name, @NotNull final PythonFacetConfiguration configuration,
public PythonFacet(@NotNull final FacetType facetType,
@NotNull final Module module,
final @NotNull String name,
@NotNull final PythonFacetConfiguration configuration,
Facet underlyingFacet) {
super(facetType, module, name, configuration, underlyingFacet);
}
public void updateLibrary() {
ApplicationManager.getApplication().runWriteAction(() -> {
final Module module = getModule();
final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
final ModifiableRootModel model = rootManager.getModifiableModel();
boolean modelChanged = false;
try {
// Just remove all old facet libraries except one, that is necessary
final Sdk sdk = getConfiguration().getSdk();
final String name = (sdk != null) ? getFacetLibraryName(sdk.getName()) : null;
boolean librarySeen = false;
for (OrderEntry entry : model.getOrderEntries()) {
if (entry instanceof LibraryOrderEntry) {
final String libraryName = ((LibraryOrderEntry)entry).getLibraryName();
if (name != null && name.equals(libraryName)) {
librarySeen = true;
continue;
}
if (libraryName != null && libraryName.endsWith(PYTHON_FACET_LIBRARY_NAME_SUFFIX)) {
model.removeOrderEntry(entry);
modelChanged = true;
}
}
}
if (name != null) {
final ModifiableModelsProvider provider = ModifiableModelsProvider.SERVICE.getInstance();
final LibraryTable.ModifiableModel libraryTableModifiableModel = provider.getLibraryTableModifiableModel();
Library library = libraryTableModifiableModel.getLibraryByName(name);
provider.disposeLibraryTableModifiableModel(libraryTableModifiableModel);
if (library == null) {
// we just create new project library
library = PythonSdkTableListener.addLibrary(sdk);
}
if (!librarySeen) {
model.addLibraryEntry(library);
modelChanged = true;
}
}
}
finally {
if (modelChanged){
model.commit();
}
else {
model.dispose();
}
}
});
PythonFacetUtil.updateLibrary(getModule(), getConfiguration());
}
public void removeLibrary() {
ApplicationManager.getApplication().runWriteAction(() -> {
final Module module = getModule();
final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
final ModifiableRootModel model = rootManager.getModifiableModel();
// Just remove all old facet libraries
for (OrderEntry entry : model.getOrderEntries()) {
if (entry instanceof LibraryOrderEntry) {
final Library library = ((LibraryOrderEntry)entry).getLibrary();
if (library != null) {
final String libraryName = library.getName();
if (libraryName!=null && libraryName.endsWith(PYTHON_FACET_LIBRARY_NAME_SUFFIX)) {
model.removeOrderEntry(entry);
//PyBuiltinCache.clearInstanceCache();
}
}
}
}
model.commit();
});
PythonFacetUtil.removeLibrary(getModule());
}
public static String getFacetLibraryName(final String sdkName) {

View File

@@ -15,5 +15,6 @@
<orderEntry type="module" module-name="java-psi-api" />
<orderEntry type="module" module-name="java-indexing-api" />
<orderEntry type="module" module-name="idea-ui" />
<orderEntry type="module" module-name="python-community-plugin-core" />
</component>
</module>