mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge branch 'master' of git.labs.intellij.net:idea/ultimate
Conflicts: python/src/com/jetbrains/django/run/DjangoServerRunConfiguration.java python/src/com/jetbrains/django/run/RunnerMediator.java python/src/com/jetbrains/python/run/AbstractPythonRunConfiguration.java
This commit is contained in:
+1274
-1231
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
import sys
|
||||
import os.path
|
||||
for x in sys.path:
|
||||
if x != os.path.dirname(sys.argv [0]): sys.stdout.write(x+chr(10))
|
||||
if x != os.path.dirname(sys.argv [0]) and x != '.': sys.stdout.write(x+chr(10))
|
||||
@@ -129,12 +129,17 @@ public class PyOverrideImplementUtil {
|
||||
PyFunction function = builder.addFunctionAfter(statementList, anchor);
|
||||
element = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(function);
|
||||
}
|
||||
|
||||
|
||||
PyPsiUtils.removeRedundantPass(statementList);
|
||||
final int start = element.getStatementList().getTextRange().getStartOffset();
|
||||
editor.getCaretModel().moveToOffset(start);
|
||||
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
|
||||
editor.getSelectionModel().setSelection(start, element.getTextRange().getEndOffset());
|
||||
if (element != null) {
|
||||
final PyStatementList targetStatementList = element.getStatementList();
|
||||
final int start = targetStatementList != null
|
||||
? targetStatementList.getTextRange().getStartOffset()
|
||||
: element.getTextRange().getStartOffset();
|
||||
editor.getCaretModel().moveToOffset(start);
|
||||
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
|
||||
editor.getSelectionModel().setSelection(start, element.getTextRange().getEndOffset());
|
||||
}
|
||||
}
|
||||
|
||||
private static PyFunctionBuilder buildOverriddenFunction(PyClass pyClass, PyFunction baseFunction) {
|
||||
|
||||
+37
-41
@@ -3,17 +3,18 @@ package com.jetbrains.python.configuration;
|
||||
import com.intellij.application.options.codeStyle.LanguageCodeStyleSettingsProvider;
|
||||
import com.intellij.lang.Language;
|
||||
import com.intellij.openapi.application.ApplicationBundle;
|
||||
import com.intellij.psi.codeStyle.CodeStyleCustomizationsConsumer;
|
||||
import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
|
||||
import com.jetbrains.python.PythonLanguage;
|
||||
import com.jetbrains.python.formatter.PyCodeStyleSettings;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import static com.intellij.psi.codeStyle.CodeStyleCustomizationsConsumer.*;
|
||||
import static com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable.*;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
|
||||
@NotNull
|
||||
@Override
|
||||
public Language getLanguage() {
|
||||
return PythonLanguage.getInstance();
|
||||
@@ -21,48 +22,43 @@ public class PyLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettin
|
||||
|
||||
@Override
|
||||
public String getCodeSample(@NotNull SettingsType settingsType) {
|
||||
//noinspection EnumSwitchStatementWhichMissesCases
|
||||
switch(settingsType) {
|
||||
case SPACING_SETTINGS:
|
||||
return SPACING_SETTINGS_PREVIEW;
|
||||
|
||||
case BLANK_LINE_SETTINGS:
|
||||
return BLANK_LINES_SETTINGS_PREVIEW;
|
||||
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public void customizeSpacingOptions(CodeStyleCustomizationsConsumer consumer) {
|
||||
consumer.showStandardOptions("SPACE_BEFORE_METHOD_CALL_PARENTHESES",
|
||||
"SPACE_AROUND_ASSIGNMENT_OPERATORS",
|
||||
"SPACE_AROUND_LOGICAL_OPERATORS",
|
||||
"SPACE_AROUND_EQUALITY_OPERATORS",
|
||||
"SPACE_AROUND_RELATIONAL_OPERATORS",
|
||||
"SPACE_AROUND_BITWISE_OPERATORS",
|
||||
"SPACE_AROUND_ADDITIVE_OPERATORS",
|
||||
"SPACE_AROUND_MULTIPLICATIVE_OPERATORS",
|
||||
"SPACE_AROUND_SHIFT_OPERATORS",
|
||||
"SPACE_WITHIN_METHOD_CALL_PARENTHESES",
|
||||
"SPACE_WITHIN_BRACKETS",
|
||||
"SPACE_AFTER_COMMA",
|
||||
"SPACE_BEFORE_COMMA",
|
||||
"SPACE_BEFORE_SEMICOLON");
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_LBRACKET", "Left bracket", BEFORE_PARENTHESES);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_NAMED_PARAMETER", "Around = in named parameter", AROUND_OPERATORS);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT", "Around = in keyword argument", AROUND_OPERATORS);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_WITHIN_BRACES", "Within braces", OTHER);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_COLON", ApplicationBundle.message("checkbox.spaces.before.colon"), OTHER);
|
||||
if (settingsType == SettingsType.SPACING_SETTINGS) return SPACING_SETTINGS_PREVIEW;
|
||||
if (settingsType == SettingsType.BLANK_LINES_SETTINGS) return BLANK_LINES_SETTINGS_PREVIEW;
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void customizeBlankLinesOptions(CodeStyleCustomizationsConsumer consumer) {
|
||||
consumer.showStandardOptions("BLANK_LINES_AROUND_CLASS",
|
||||
"BLANK_LINES_AROUND_METHOD",
|
||||
"BLANK_LINES_AFTER_IMPORTS",
|
||||
"KEEP_BLANK_LINES_IN_DECLARATIONS",
|
||||
"KEEP_BLANK_LINES_IN_CODE");
|
||||
public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) {
|
||||
if (settingsType == SettingsType.SPACING_SETTINGS) {
|
||||
consumer.showStandardOptions("SPACE_BEFORE_METHOD_CALL_PARENTHESES",
|
||||
"SPACE_AROUND_ASSIGNMENT_OPERATORS",
|
||||
"SPACE_AROUND_LOGICAL_OPERATORS",
|
||||
"SPACE_AROUND_EQUALITY_OPERATORS",
|
||||
"SPACE_AROUND_RELATIONAL_OPERATORS",
|
||||
"SPACE_AROUND_BITWISE_OPERATORS",
|
||||
"SPACE_AROUND_ADDITIVE_OPERATORS",
|
||||
"SPACE_AROUND_MULTIPLICATIVE_OPERATORS",
|
||||
"SPACE_AROUND_SHIFT_OPERATORS",
|
||||
"SPACE_WITHIN_METHOD_CALL_PARENTHESES",
|
||||
"SPACE_WITHIN_BRACKETS",
|
||||
"SPACE_AFTER_COMMA",
|
||||
"SPACE_BEFORE_COMMA",
|
||||
"SPACE_BEFORE_SEMICOLON");
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_LBRACKET", "Left bracket", SPACES_BEFORE_PARENTHESES);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_NAMED_PARAMETER", "Around = in named parameter",
|
||||
SPACES_AROUND_OPERATORS);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT", "Around = in keyword argument",
|
||||
SPACES_AROUND_OPERATORS);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_WITHIN_BRACES", "Within braces", SPACES_WITHIN);
|
||||
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_COLON", ApplicationBundle.message("checkbox.spaces.before.colon"), SPACES_OTHER);
|
||||
}
|
||||
else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
|
||||
consumer.showStandardOptions("BLANK_LINES_AROUND_CLASS",
|
||||
"BLANK_LINES_AROUND_METHOD",
|
||||
"BLANK_LINES_AFTER_IMPORTS",
|
||||
"KEEP_BLANK_LINES_IN_DECLARATIONS",
|
||||
"KEEP_BLANK_LINES_IN_CODE");
|
||||
}
|
||||
}
|
||||
|
||||
private static String SPACING_SETTINGS_PREVIEW = "def settings_preview(argument, key=value):\n" +
|
||||
|
||||
@@ -61,7 +61,8 @@ public class PyStatementEffectInspection extends PyInspection {
|
||||
}
|
||||
else if (expression instanceof PyBinaryExpression) {
|
||||
PyBinaryExpression binary = (PyBinaryExpression)expression;
|
||||
String method = binary.getOperator().getSpecialMethodName();
|
||||
final PyElementType operator = binary.getOperator();
|
||||
String method = operator == null ? null : operator.getSpecialMethodName();
|
||||
if (method != null) {
|
||||
// maybe the op is overridden and may produce side effects, like cout << "hello"
|
||||
PyType type = binary.getLeftExpression().getType(TypeEvalContext.fast());
|
||||
|
||||
@@ -9,9 +9,13 @@ import org.jetbrains.annotations.Nullable;
|
||||
public interface PyBinaryExpression extends PyExpression {
|
||||
PyExpression getLeftExpression();
|
||||
@Nullable PyExpression getRightExpression();
|
||||
|
||||
@Nullable
|
||||
PyElementType getOperator();
|
||||
|
||||
@Nullable
|
||||
PsiElement getPsiOperator();
|
||||
|
||||
boolean isOperator(String chars);
|
||||
|
||||
PyExpression getOppositeExpression(PyExpression expression)
|
||||
|
||||
@@ -25,6 +25,9 @@ public interface PyClass extends
|
||||
@NotNull
|
||||
PyStatementList getStatementList();
|
||||
|
||||
@Nullable
|
||||
PyArgumentList getSuperClassExpressionList();
|
||||
|
||||
@NotNull
|
||||
PyExpression[] getSuperClassExpressions();
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ public abstract class PyElementGenerator {
|
||||
* @return a newly created literal
|
||||
*/
|
||||
public abstract PyStringLiteralExpression createStringLiteralFromString(@Nullable PsiFile destination, String unescaped);
|
||||
public abstract PyStringLiteralExpression createStringLiteralFromString(String unescaped);
|
||||
public abstract PyStringLiteralExpression createStringLiteralFromString(@NotNull String unescaped);
|
||||
|
||||
public abstract PyListLiteralExpression createListLiteral();
|
||||
|
||||
|
||||
@@ -74,7 +74,13 @@ public class PyArgumentListImpl extends PyElementImpl implements PyArgumentList
|
||||
}
|
||||
}
|
||||
else {
|
||||
addArgumentLastWithoutComma(arg);
|
||||
final PyExpression[] args = getArguments();
|
||||
if (args.length > 0) {
|
||||
addArgumentAfter(arg, args [args.length-1]);
|
||||
}
|
||||
else {
|
||||
addArgumentLastWithoutComma(arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ public class PyBinaryExpressionImpl extends PyElementImpl implements PyBinaryExp
|
||||
return PsiTreeUtil.getNextSiblingOfType(getLeftExpression(), PyExpression.class);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public PyElementType getOperator() {
|
||||
final PsiElement psiOperator = getPsiOperator();
|
||||
return psiOperator != null ? (PyElementType)psiOperator.getNode().getElementType() : null;
|
||||
|
||||
@@ -106,9 +106,18 @@ public class PyClassImpl extends PyPresentableElementImpl<PyClassStub> implement
|
||||
return childToPsiNotNull(PyElementTypes.STATEMENT_LIST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PyArgumentList getSuperClassExpressionList() {
|
||||
final PyArgumentList argList = PsiTreeUtil.getChildOfType(this, PyArgumentList.class);
|
||||
if (argList != null && argList.getFirstChild() != null) {
|
||||
return argList;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PyExpression[] getSuperClassExpressions() {
|
||||
final PyArgumentList argList = PsiTreeUtil.getChildOfType(this, PyArgumentList.class);
|
||||
final PyArgumentList argList = getSuperClassExpressionList();
|
||||
if (argList != null) {
|
||||
return argList.getArguments();
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class PyStringLiteralExpressionImpl extends PyElementImpl implements PySt
|
||||
final String text = child.getText();
|
||||
TextRange textRange = getNodeTextRange(text);
|
||||
int offset = child.getTextRange().getStartOffset() - elStart + textRange.getStartOffset();
|
||||
String undecoded = text.substring(textRange.getStartOffset(), textRange.getEndOffset());
|
||||
String undecoded = textRange.substring(text);
|
||||
if (!iterateCharacterRanges(consumer, undecoded, offset, isRaw(text), isUnicode(text))) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -242,7 +242,10 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExp
|
||||
while(true) {
|
||||
PyElement parentContainer = PsiTreeUtil.getParentOfType(container, PyFunction.class, PyClass.class);
|
||||
if (parentContainer instanceof PyClass) {
|
||||
return super.getUseScope();
|
||||
if (getQualifier() != null) {
|
||||
return super.getUseScope();
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (parentContainer == null) {
|
||||
break;
|
||||
|
||||
@@ -5,7 +5,9 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
@@ -126,7 +128,18 @@ public class PyClassType implements PyType {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Key<Set<PyClassType>> CTX_VISITED = Key.create("PyClassType.Visited");
|
||||
|
||||
public Object[] getCompletionVariants(String prefix, PyExpression expressionHook, ProcessingContext context) {
|
||||
Set<PyClassType> visited = context.get(CTX_VISITED);
|
||||
if (visited == null) {
|
||||
visited = new HashSet<PyClassType>();
|
||||
context.put(CTX_VISITED, visited);
|
||||
}
|
||||
if (visited.contains(this)) {
|
||||
return ArrayUtil.EMPTY_OBJECT_ARRAY;
|
||||
}
|
||||
visited.add(this);
|
||||
Set<String> namesAlready = context.get(CTX_NAMES);
|
||||
if (namesAlready == null) {
|
||||
namesAlready = new HashSet<String>();
|
||||
|
||||
@@ -24,28 +24,37 @@ public class PyClassRefactoringUtil {
|
||||
public static void moveSuperclasses(PyClass clazz, Set<String> superClasses, PyClass superClass) {
|
||||
if (superClasses.size() == 0) return;
|
||||
final Project project = clazz.getProject();
|
||||
final List<PsiElement> toAdd = removeAndGetSuperClasses(clazz, superClasses);
|
||||
final List<PyExpression> toAdd = removeAndGetSuperClasses(clazz, superClasses);
|
||||
addSuperclasses(project, superClass, toAdd, superClasses);
|
||||
}
|
||||
|
||||
public static void addSuperclasses(Project project, PyClass superClass, Collection<PsiElement> toAdd, Collection<String> superClasses) {
|
||||
if (superClasses.size() == 0) return;
|
||||
PsiElement[] elements = superClass.getSuperClassExpressions();
|
||||
if (elements.length > 0) {
|
||||
PsiElement parent = elements[elements.length - 1].getParent();
|
||||
for (PsiElement element : toAdd) {
|
||||
PyUtil.addListNode(parent, element, parent.getLastChild().getNode(), false, true);
|
||||
public static void addSuperclasses(Project project, PyClass superClass,
|
||||
@Nullable Collection<PyExpression> superClassesAsPsi,
|
||||
Collection<String> superClassesAsStrings) {
|
||||
if (superClassesAsStrings.size() == 0) return;
|
||||
PyArgumentList argList = superClass.getSuperClassExpressionList();
|
||||
if (argList != null) {
|
||||
if (superClassesAsPsi != null) {
|
||||
for (PyExpression element : superClassesAsPsi) {
|
||||
argList.addArgument(element);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (String s : superClassesAsStrings) {
|
||||
final PyExpression expr = PyElementGenerator.getInstance(project).createExpressionFromText(s);
|
||||
argList.addArgument(expr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
addSuperclasses(project, superClass, superClasses);
|
||||
addSuperclasses(project, superClass, superClassesAsStrings);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<PsiElement> removeAndGetSuperClasses(PyClass clazz, Set<String> superClasses) {
|
||||
public static List<PyExpression> removeAndGetSuperClasses(PyClass clazz, Set<String> superClasses) {
|
||||
if (superClasses.size() == 0) return Collections.emptyList();
|
||||
final List<PsiElement> toAdd = new ArrayList<PsiElement>();
|
||||
final PsiElement[] elements = clazz.getSuperClassExpressions();
|
||||
for (PsiElement element : elements) {
|
||||
final List<PyExpression> toAdd = new ArrayList<PyExpression>();
|
||||
final PyExpression[] elements = clazz.getSuperClassExpressions();
|
||||
for (PyExpression element : elements) {
|
||||
if (superClasses.contains(element.getText())) {
|
||||
toAdd.add(element);
|
||||
PyUtil.removeListNode(element);
|
||||
|
||||
+5
@@ -67,6 +67,11 @@ public class PyExtractSuperclassDialog extends UpDirectedMembersMovingDialog {
|
||||
super.doOKAction();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComponent getPreferredFocusedComponent() {
|
||||
return myExtractedSuperNameField;
|
||||
}
|
||||
|
||||
protected JPanel createNorthPanel() {
|
||||
Box box = createBox();
|
||||
box.add(Box.createVerticalStrut(10));
|
||||
|
||||
+10
-2
@@ -17,8 +17,8 @@ import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.refactoring.RefactoringBundle;
|
||||
import com.intellij.util.PathUtil;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.PythonFileType;
|
||||
import com.jetbrains.python.PythonLanguage;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.impl.PyPsiUtils;
|
||||
import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
|
||||
@@ -48,6 +48,14 @@ public class PyExtractSuperclassHelper {
|
||||
else if (element instanceof PyClass) superClasses.add(element.getName());
|
||||
else LOG.error("unmatched member class " + element.getClass());
|
||||
}
|
||||
|
||||
// 'object' superclass is always pulled up, even if not selected explicitly
|
||||
for (PyExpression expr : clazz.getSuperClassExpressions()) {
|
||||
if (PyNames.OBJECT.equals(expr.getText()) && !superClasses.contains(PyNames.OBJECT)) {
|
||||
superClasses.add(PyNames.OBJECT);
|
||||
}
|
||||
}
|
||||
|
||||
final Project project = clazz.getProject();
|
||||
final Ref<PyClass> newClassRef = new Ref<PyClass>();
|
||||
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
|
||||
@@ -59,7 +67,7 @@ public class PyExtractSuperclassHelper {
|
||||
final PyClass newClass = PyElementGenerator.getInstance(project).createFromText(PyClass.class, text);
|
||||
newClassRef.set(newClass);
|
||||
PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, newClass);
|
||||
PyClassRefactoringUtil.addSuperclasses(project, clazz, Collections.singleton(superBaseName));
|
||||
PyClassRefactoringUtil.addSuperclasses(project, clazz, null, Collections.singleton(superBaseName));
|
||||
PyPsiUtils.removeElements(elements);
|
||||
PyClassRefactoringUtil.insertPassIfNeeded(clazz);
|
||||
placeNewClass(project, newClass, clazz, targetFile);
|
||||
|
||||
+2
-1
@@ -13,6 +13,7 @@ import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.jetbrains.python.psi.PyClass;
|
||||
import com.jetbrains.python.psi.PyElement;
|
||||
import com.jetbrains.python.psi.PyExpression;
|
||||
import com.jetbrains.python.psi.PyFunction;
|
||||
import com.jetbrains.python.psi.impl.PyPsiUtils;
|
||||
import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
|
||||
@@ -75,7 +76,7 @@ public class PyPushDownProcessor extends BaseRefactoringProcessor {
|
||||
|
||||
final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
|
||||
|
||||
final List<PsiElement> superClassesElements = PyClassRefactoringUtil.removeAndGetSuperClasses(myClass, superClasses);
|
||||
final List<PyExpression> superClassesElements = PyClassRefactoringUtil.removeAndGetSuperClasses(myClass, superClasses);
|
||||
|
||||
for (UsageInfo usage : usages) {
|
||||
final PyClass targetClass = (PyClass)usage.getElement();
|
||||
|
||||
@@ -108,28 +108,36 @@ public abstract class AbstractPythonRunConfiguration extends ModuleBasedConfigur
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
super.readExternal(element);
|
||||
myInterpreterOptions = JDOMExternalizerUtil.readField(element, "INTERPRETER_OPTIONS");
|
||||
final String parentEnvs = JDOMExternalizerUtil.readField(element, "PARENT_ENVS");
|
||||
if (parentEnvs != null) {
|
||||
myPassParentEnvs = Boolean.parseBoolean(parentEnvs);
|
||||
}
|
||||
readEnvs(element);
|
||||
mySdkHome = JDOMExternalizerUtil.readField(element, "SDK_HOME");
|
||||
myWorkingDirectory = JDOMExternalizerUtil.readField(element, "WORKING_DIRECTORY");
|
||||
myUseModuleSdk = Boolean.parseBoolean(JDOMExternalizerUtil.readField(element, "IS_MODULE_SDK"));
|
||||
getConfigurationModule().readExternal(element);
|
||||
}
|
||||
|
||||
protected void readEnvs(Element element) {
|
||||
final String parentEnvs = JDOMExternalizerUtil.readField(element, "PARENT_ENVS");
|
||||
if (parentEnvs != null) {
|
||||
myPassParentEnvs = Boolean.parseBoolean(parentEnvs);
|
||||
}
|
||||
EnvironmentVariablesComponent.readExternal(element, getEnvs());
|
||||
}
|
||||
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
super.writeExternal(element);
|
||||
JDOMExternalizerUtil.writeField(element, "INTERPRETER_OPTIONS", myInterpreterOptions);
|
||||
JDOMExternalizerUtil.writeField(element, "PARENT_ENVS", Boolean.toString(myPassParentEnvs));
|
||||
writeEnvs(element);
|
||||
JDOMExternalizerUtil.writeField(element, "SDK_HOME", mySdkHome);
|
||||
JDOMExternalizerUtil.writeField(element, "WORKING_DIRECTORY", myWorkingDirectory);
|
||||
JDOMExternalizerUtil.writeField(element, "IS_MODULE_SDK", Boolean.toString(myUseModuleSdk));
|
||||
EnvironmentVariablesComponent.writeExternal(element, getEnvs());
|
||||
getConfigurationModule().writeExternal(element);
|
||||
}
|
||||
|
||||
protected void writeEnvs(Element element) {
|
||||
JDOMExternalizerUtil.writeField(element, "PARENT_ENVS", Boolean.toString(myPassParentEnvs));
|
||||
EnvironmentVariablesComponent.writeExternal(element, getEnvs());
|
||||
}
|
||||
|
||||
public Map<String, String> getEnvs() {
|
||||
return myEnvs;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ import java.util.Map;
|
||||
}
|
||||
|
||||
public void setWorkingDirectory(String workingDirectory) {
|
||||
myWorkingDirectoryTextField.setText(FileUtil.toSystemDependentName(workingDirectory));
|
||||
myWorkingDirectoryTextField.setText(workingDirectory == null ? "" : FileUtil.toSystemDependentName(workingDirectory));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -3,8 +3,10 @@ package com.jetbrains.python.sdk;
|
||||
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
@@ -15,6 +17,27 @@ public class IronPythonSdkFlavor extends PythonSdkFlavor {
|
||||
|
||||
public static IronPythonSdkFlavor INSTANCE = new IronPythonSdkFlavor();
|
||||
|
||||
@Override
|
||||
public List<String> suggestHomePaths() {
|
||||
List<String> result = new ArrayList<String>();
|
||||
String root = System.getenv("ProgramFiles(x86)");
|
||||
if (root == null) {
|
||||
root = System.getenv("ProgramFiles");
|
||||
}
|
||||
if (root != null) {
|
||||
final File[] dirs = new File(root).listFiles();
|
||||
for (File dir : dirs) {
|
||||
if (dir.getName().startsWith("IronPython")) {
|
||||
File ipy = new File(dir, "ipy.exe");
|
||||
if (ipy.exists()) {
|
||||
result.add(ipy.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidSdkHome(String path) {
|
||||
final String name = new File(path).getName();
|
||||
|
||||
@@ -568,20 +568,13 @@ public class PythonSdkType extends SdkType {
|
||||
int cutpos = line.indexOf(' ');
|
||||
if (cutpos < 0) throw new InvalidSdkException("Bad output");
|
||||
String modname = line.substring(0, cutpos);
|
||||
String mod_fname = modname.replace(".", File.separator); // "a.b.c" -> "a/b/c", no ext
|
||||
String fname = line.substring(cutpos + 1);
|
||||
//String ext = fname.substring(fname.lastIndexOf('.')); // no way ext is absent
|
||||
// check if it's fresh
|
||||
File f_orig = new File(fname);
|
||||
File f_skel = new File(stubsRoot + File.separator + mod_fname + ".py");
|
||||
if (f_orig.lastModified() >= f_skel.lastModified()) {
|
||||
// stale skeleton, rebuild
|
||||
if (indicator != null) {
|
||||
indicator.setText2(modname);
|
||||
}
|
||||
LOG.info("Skeleton for " + modname);
|
||||
generateSkeleton(binaryPath, stubsRoot, modname, Collections.<String>emptyList());
|
||||
// stale skeleton, rebuild
|
||||
if (indicator != null) {
|
||||
indicator.setText2(modname);
|
||||
}
|
||||
LOG.info("Skeleton for " + modname);
|
||||
generateSkeleton(binaryPath, stubsRoot, modname, Collections.<String>emptyList());
|
||||
}
|
||||
}
|
||||
catch (InvalidSdkException e) {
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.List;
|
||||
public class PythonSdkUpdater implements ProjectComponent {
|
||||
private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.sdk.PythonSdkUpdater");
|
||||
|
||||
public static int SKELETONS_VERSION = 4;
|
||||
public static int SKELETONS_VERSION = 8;
|
||||
|
||||
public PythonSdkUpdater(final Project project, StartupManager startupManager) {
|
||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
class Suppa(object):
|
||||
def foo(self):
|
||||
print "bar"
|
||||
|
||||
class Foo(Suppa):
|
||||
def bar(self):
|
||||
print "foo"
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
class Foo(object):
|
||||
def bar(self):
|
||||
print "foo"
|
||||
|
||||
def foo(self):
|
||||
print "bar"
|
||||
+5
-7
@@ -1,7 +1,6 @@
|
||||
package com.jetbrains.python.refactoring.classes;
|
||||
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.jetbrains.python.PythonTestUtil;
|
||||
import com.jetbrains.python.psi.PyClass;
|
||||
import com.jetbrains.python.psi.PyElement;
|
||||
import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper;
|
||||
@@ -17,9 +16,13 @@ public class PyExtractSuperclassTest extends PyClassRefactoringTest {
|
||||
doHelperTest("Foo", "Suppa", null, ".foo");
|
||||
}
|
||||
|
||||
public void testWithSuper() throws Exception {
|
||||
doHelperTest("Foo", "Suppa", null, ".foo");
|
||||
}
|
||||
|
||||
private void doHelperTest(final String className, final String superclassName, final String expectedError, final String... membersName) throws Exception {
|
||||
try {
|
||||
String baseName = getTestName(true);
|
||||
String baseName = "/refactoring/extractsuperclass/" + getTestName(true);
|
||||
myFixture.configureByFile(baseName + ".before.py");
|
||||
final PyClass clazz = findClass(className);
|
||||
final List<PyMemberInfo> members = new ArrayList<PyMemberInfo>();
|
||||
@@ -42,9 +45,4 @@ public class PyExtractSuperclassTest extends PyClassRefactoringTest {
|
||||
assertEquals(expectedError, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTestDataPath() {
|
||||
return PythonTestUtil.getTestDataPath() + "/refactoring/extractsuperclass/";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user