Merge remote-tracking branch 'origin/master'

This commit is contained in:
peter
2016-08-03 13:58:56 +02:00
29 changed files with 475 additions and 298 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 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.
@@ -22,7 +22,7 @@ import com.intellij.debugger.engine.events.DebuggerContextCommandImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.settings.UserRenderersConfigurable;
import com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer;
import com.intellij.debugger.ui.tree.render.NodeRenderer;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.options.ConfigurableBase;
@@ -83,8 +83,7 @@ public class CreateRendererAction extends AnAction {
};
SingleConfigurableEditor editor = new SingleConfigurableEditor(project, configurable);
if (name != null) {
CompoundReferenceRenderer renderer =
NodeRendererSettings.getInstance().createCompoundReferenceRenderer(name, name, null, null);
NodeRenderer renderer = NodeRendererSettings.getInstance().createCompoundTypeRenderer(name, name, null, null);
renderer.setEnabled(true);
ui.addRenderer(renderer);
}
@@ -303,7 +303,7 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV
myValueDescriptor.getLastRenderer() instanceof ToStringBasedRenderer) {
value = StringUtil.wrapWithDoubleQuote(truncateToMaxLength(myValue));
}
else if (myValueDescriptor.getLastRenderer() instanceof CompoundReferenceRenderer) {
else if (myValueDescriptor.getLastRenderer() instanceof CompoundTypeRenderer) {
value = truncateToMaxLength(myValue);
}
renderer.renderValue(value);
@@ -36,9 +36,10 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.JDOMExternalizerUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiExpression;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaParserFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.net.NetUtils;
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
import com.intellij.util.xmlb.XmlSerializer;
@@ -138,6 +139,27 @@ public class DebuggerUtilsImpl extends DebuggerUtilsEx{
return PositionUtil.getContextElement(context);
}
public static Pair<PsiClass, PsiType> getPsiClassAndType(String className, Project project) {
PsiClass contextClass;
PsiType contextType;
PsiPrimitiveType primitiveType = PsiJavaParserFacadeImpl.getPrimitiveType(className);
if (primitiveType != null) {
contextClass = JavaPsiFacade.getInstance(project).findClass(primitiveType.getBoxedTypeName(), GlobalSearchScope.allScope(project));
contextType = primitiveType;
}
else {
contextClass = findClass(className, project, GlobalSearchScope.allScope(project));
if (contextClass != null) {
contextClass = (PsiClass)contextClass.getNavigationElement();
}
if (contextClass instanceof PsiCompiledElement) {
contextClass = (PsiClass)((PsiCompiledElement)contextClass).getMirror();
}
contextType = getType(className, project);
}
return Pair.create(contextClass, contextType);
}
@Override
public PsiClass chooseClassDialog(String title, Project project) {
TreeClassChooser dialog = TreeClassChooserFactory.getInstance(project).createAllProjectScopeChooser(title);
@@ -52,8 +52,8 @@ import java.util.ArrayList;
import java.util.List;
class CompoundRendererConfigurable extends JPanel {
private CompoundReferenceRenderer myRenderer;
private CompoundReferenceRenderer myOriginalRenderer;
private CompoundTypeRenderer myRenderer;
private CompoundTypeRenderer myOriginalRenderer;
private Project myProject;
private final ClassNameEditorWithBrowseButton myClassNameField;
private final JRadioButton myRbDefaultLabel;
@@ -187,9 +187,9 @@ class CompoundRendererConfigurable extends JPanel {
}
public void setRenderer(NodeRenderer renderer) {
if (renderer instanceof CompoundReferenceRenderer) {
myRenderer = (CompoundReferenceRenderer)renderer;
myOriginalRenderer = (CompoundReferenceRenderer)renderer.clone();
if (renderer instanceof CompoundTypeRenderer) {
myRenderer = (CompoundTypeRenderer)renderer;
myOriginalRenderer = (CompoundTypeRenderer)renderer.clone();
}
else {
myRenderer = myOriginalRenderer = null;
@@ -197,7 +197,7 @@ class CompoundRendererConfigurable extends JPanel {
reset();
}
public CompoundReferenceRenderer getRenderer() {
public CompoundTypeRenderer getRenderer() {
return myRenderer;
}
@@ -300,7 +300,7 @@ class CompoundRendererConfigurable extends JPanel {
if (myRenderer == null) {
return false;
}
final CompoundReferenceRenderer cloned = (CompoundReferenceRenderer)myRenderer.clone();
final CompoundTypeRenderer cloned = (CompoundTypeRenderer)myRenderer.clone();
flushDataTo(cloned);
return !DebuggerUtilsEx.externalizableEqual(cloned, myOriginalRenderer);
}
@@ -311,10 +311,10 @@ class CompoundRendererConfigurable extends JPanel {
}
flushDataTo(myRenderer);
// update the renderer to compare with in order to find out whether we've been modified since last apply
myOriginalRenderer = (CompoundReferenceRenderer)myRenderer.clone();
myOriginalRenderer = (CompoundTypeRenderer)myRenderer.clone();
}
private void flushDataTo(final CompoundReferenceRenderer renderer) { // label
private void flushDataTo(final CompoundTypeRenderer renderer) { // label
LabelRenderer labelRenderer = null;
renderer.setShowType(myShowTypeCheckBox.isSelected());
if (myRbExpressionLabel.isSelected()) {
@@ -328,9 +328,20 @@ public class NodeRendererSettings implements PersistentStateComponent<Element> {
else if(rendererId.equals(CompoundNodeRenderer.UNIQUE_ID) || rendererId.equals(REFERENCE_RENDERER)) {
return createCompoundReferenceRenderer("unnamed", CommonClassNames.JAVA_LANG_OBJECT, null, null);
}
else if (rendererId.equals(CompoundTypeRenderer.UNIQUE_ID)) {
return createCompoundTypeRenderer("unnamed", CommonClassNames.JAVA_LANG_OBJECT, null, null);
}
return null;
}
public CompoundTypeRenderer createCompoundTypeRenderer(
@NonNls final String rendererName, @NonNls final String className, final ValueLabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer
) {
CompoundTypeRenderer renderer = new CompoundTypeRenderer(this, rendererName, labelRenderer, childrenRenderer);
renderer.setClassName(className);
return renderer;
}
public CompoundReferenceRenderer createCompoundReferenceRenderer(
@NonNls final String rendererName, @NonNls final String className, final ValueLabelRenderer labelRenderer, final ChildrenRenderer childrenRenderer
) {
@@ -16,7 +16,7 @@
package com.intellij.debugger.settings;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.ui.tree.render.CompoundNodeRenderer;
import com.intellij.debugger.ui.tree.render.CompoundTypeRenderer;
import com.intellij.debugger.ui.tree.render.NodeRenderer;
import com.intellij.ide.util.ElementsChooser;
import com.intellij.openapi.Disposable;
@@ -209,7 +209,7 @@ public final class UserRenderersConfigurable extends JPanel implements Configura
@Override
public void run(AnActionButton button) {
final NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundNodeRenderer.UNIQUE_ID);
NodeRenderer renderer = (NodeRenderer)NodeRendererSettings.getInstance().createRenderer(CompoundTypeRenderer.UNIQUE_ID);
renderer.setEnabled(true);
addRenderer(renderer);
SwingUtilities.invokeLater(myNameField::requestFocus);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 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.
@@ -21,19 +21,19 @@
package com.intellij.debugger.ui.impl.watch;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.StackFrameContext;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.impl.DebuggerUtilsImpl;
import com.intellij.debugger.ui.tree.UserExpressionDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiCodeFragment;
import com.sun.jdi.ObjectReference;
import com.intellij.psi.PsiType;
import com.sun.jdi.Type;
import com.sun.jdi.Value;
import org.jetbrains.annotations.Nullable;
public class UserExpressionDescriptorImpl extends EvaluationDescriptor implements UserExpressionDescriptor{
@@ -60,24 +60,11 @@ public class UserExpressionDescriptorImpl extends EvaluationDescriptor implement
}
protected PsiCodeFragment getEvaluationCode(final StackFrameContext context) throws EvaluateException {
Value value = myParentDescriptor.getValue();
if(value instanceof ObjectReference) {
final String typeName = value.type().name();
final PsiClass psiClass = DebuggerUtils.findClass(myTypeName, myProject, context.getDebugProcess().getSearchScope());
if (psiClass == null) {
throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.type.name", typeName));
}
return createCodeFragment(psiClass);
}
else {
throw EvaluateExceptionUtil.createEvaluateException(
DebuggerBundle.message("evaluation.error.objref.expected", myParentDescriptor.getName())
);
Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(myTypeName, myProject);
if (psiClassAndType.first == null) {
throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.invalid.type.name", myTypeName));
}
return createCodeFragment(psiClassAndType.first);
}
public ValueDescriptorImpl getParentDescriptor() {
@@ -18,9 +18,10 @@ package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.engine.evaluation.*;
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
import com.intellij.debugger.impl.DebuggerUtilsImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaParserFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.reference.SoftReference;
import org.jetbrains.annotations.Nullable;
@@ -66,31 +67,14 @@ public abstract class CachedEvaluator {
protected Cache initEvaluatorAndChildrenExpression(final Project project) {
final Cache cache = new Cache();
try {
String className = getClassName();
PsiClass contextClass;
PsiType contextType;
PsiPrimitiveType primitiveType = PsiJavaParserFacadeImpl.getPrimitiveType(className);
if (primitiveType != null) {
contextClass = JavaPsiFacade.getInstance(project).findClass(primitiveType.getBoxedTypeName(), GlobalSearchScope.allScope(project));
contextType = primitiveType;
}
else {
contextClass = DebuggerUtils.findClass(className, project, GlobalSearchScope.allScope(project));
if (contextClass != null) {
contextClass = (PsiClass)contextClass.getNavigationElement();
}
if (contextClass instanceof PsiCompiledElement) {
contextClass = (PsiClass)((PsiCompiledElement)contextClass).getMirror();
}
if (contextClass == null) {
throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
}
contextType = DebuggerUtils.getType(className, project);
Pair<PsiClass, PsiType> psiClassAndType = DebuggerUtilsImpl.getPsiClassAndType(getClassName(), project);
if (psiClassAndType.first == null) {
throw EvaluateExceptionUtil.CANNOT_FIND_SOURCE_CLASS;
}
cache.myPsiChildrenExpression = null;
JavaCodeFragment codeFragment = myDefaultFragmentFactory.createCodeFragment(myReferenceExpression, contextClass, project);
JavaCodeFragment codeFragment = myDefaultFragmentFactory.createCodeFragment(myReferenceExpression, psiClassAndType.first, project);
codeFragment.forceResolveScope(GlobalSearchScope.allScope(project));
codeFragment.setThisType(contextType);
codeFragment.setThisType(psiClassAndType.second);
DebuggerUtils.checkSyntax(codeFragment);
cache.myPsiChildrenExpression = codeFragment instanceof PsiExpressionCodeFragment ? ((PsiExpressionCodeFragment)codeFragment).getExpression() : null;
cache.myEvaluator = myDefaultFragmentFactory.getEvaluatorBuilder().build(codeFragment, null);
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 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.
@@ -15,118 +15,22 @@
*/
package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.CommonClassNames;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.search.GlobalSearchScope;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.Type;
import org.jetbrains.annotations.NotNull;
public class CompoundReferenceRenderer extends CompoundNodeRenderer{
protected static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer");
public CompoundReferenceRenderer(final NodeRendererSettings rendererSettings, String name, ValueLabelRenderer labelRenderer, ChildrenRenderer childrenRenderer) {
public class CompoundReferenceRenderer extends CompoundTypeRenderer {
public CompoundReferenceRenderer(NodeRendererSettings rendererSettings,
String name,
ValueLabelRenderer labelRenderer,
ChildrenRenderer childrenRenderer) {
super(rendererSettings, name, labelRenderer, childrenRenderer);
myProperties.setClassName(CommonClassNames.JAVA_LANG_OBJECT);
LOG.assertTrue(labelRenderer == null || labelRenderer instanceof ReferenceRenderer);
LOG.assertTrue(childrenRenderer == null || childrenRenderer instanceof ReferenceRenderer);
}
public void setLabelRenderer(ValueLabelRenderer labelRenderer) {
final ValueLabelRenderer prevRenderer = getLabelRenderer();
super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer);
final ValueLabelRenderer currentRenderer = getLabelRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public void setChildrenRenderer(ChildrenRenderer childrenRenderer) {
final ChildrenRenderer prevRenderer = getChildrenRenderer();
super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer);
final ChildrenRenderer currentRenderer = getChildrenRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public ChildrenRenderer getChildrenRenderer() {
final ChildrenRenderer childrenRenderer = super.getChildrenRenderer();
return childrenRenderer != null ? childrenRenderer : getDefaultRenderer();
}
private NodeRenderer getDefaultRenderer() {
return getClassName().endsWith("]") ? myRendererSettings.getArrayRenderer() : myRendererSettings.getClassRenderer();
}
public ValueLabelRenderer getLabelRenderer() {
final ValueLabelRenderer labelRenderer = super.getLabelRenderer();
return labelRenderer != null ? labelRenderer : getDefaultRenderer();
}
private ChildrenRenderer getRawChildrenRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ChildrenRenderer originalRenderer = super.getChildrenRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
private ValueLabelRenderer getRawLabelRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ValueLabelRenderer originalRenderer = super.getLabelRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
public boolean isApplicable(Type type) {
if(type == null || !(type instanceof ReferenceType) || !DebuggerUtils.instanceOf(type, getClassName())) {
return false;
if (type instanceof ReferenceType) {
return super.isApplicable(type);
}
return super.isApplicable(type);
}
public void setClassName(@NotNull String name) {
myProperties.setClassName(name);
if(getRawLabelRenderer() != null) {
final ValueLabelRenderer originalLabelRenderer = super.getLabelRenderer();
if (originalLabelRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)originalLabelRenderer).setClassName(name);
}
}
if(getRawChildrenRenderer() != null) {
final ChildrenRenderer originalChildrenRenderer = super.getChildrenRenderer();
if (originalChildrenRenderer instanceof ReferenceRenderer) {
((ReferenceRenderer)originalChildrenRenderer).setClassName(name);
}
}
}
public @NotNull String getClassName() {
return myProperties.getClassName();
}
protected final PsiElement getContext(Project project, DebuggerContext context) {
DebugProcess process = context.getDebugProcess();
GlobalSearchScope scope = process != null ? process.getSearchScope() : GlobalSearchScope.allScope(project);
return DebuggerUtils.findClass(getClassName(), project, scope);
}
protected final PsiElement getChildValueExpression(String text, DebuggerTreeNode node, DebuggerContext context) {
Project project = node.getProject();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
return elementFactory.createExpressionFromText(text, getContext(project, context));
return false;
}
}
@@ -0,0 +1,145 @@
/*
* Copyright 2000-2016 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 com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.engine.DebugProcess;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.debugger.settings.NodeRendererSettings;
import com.intellij.debugger.ui.tree.DebuggerTreeNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaParserFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.TypeConversionUtil;
import com.sun.jdi.Type;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
public class CompoundTypeRenderer extends CompoundNodeRenderer {
public static final @NonNls String UNIQUE_ID = "CompoundTypeRenderer";
protected static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.CompoundReferenceRenderer");
public CompoundTypeRenderer(NodeRendererSettings rendererSettings,
String name,
ValueLabelRenderer labelRenderer,
ChildrenRenderer childrenRenderer) {
super(rendererSettings, name, labelRenderer, childrenRenderer);
myProperties.setClassName(CommonClassNames.JAVA_LANG_OBJECT);
LOG.assertTrue(labelRenderer == null || labelRenderer instanceof TypeRenderer);
LOG.assertTrue(childrenRenderer == null || childrenRenderer instanceof TypeRenderer);
}
public void setLabelRenderer(ValueLabelRenderer labelRenderer) {
final ValueLabelRenderer prevRenderer = getLabelRenderer();
super.setLabelRenderer(myRendererSettings.isBase(labelRenderer) ? null : labelRenderer);
final ValueLabelRenderer currentRenderer = getLabelRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof TypeRenderer) {
((TypeRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public void setChildrenRenderer(ChildrenRenderer childrenRenderer) {
final ChildrenRenderer prevRenderer = getChildrenRenderer();
super.setChildrenRenderer(myRendererSettings.isBase(childrenRenderer) ? null : childrenRenderer);
final ChildrenRenderer currentRenderer = getChildrenRenderer();
if (prevRenderer != currentRenderer) {
if (currentRenderer instanceof TypeRenderer) {
((TypeRenderer)currentRenderer).setClassName(getClassName());
}
}
}
public ChildrenRenderer getChildrenRenderer() {
final ChildrenRenderer childrenRenderer = super.getChildrenRenderer();
return childrenRenderer != null ? childrenRenderer : getDefaultRenderer();
}
private NodeRenderer getDefaultRenderer() {
String name = getClassName();
if (TypeConversionUtil.isPrimitive(name)) {
return myRendererSettings.getPrimitiveRenderer();
}
return name.endsWith("]") ? myRendererSettings.getArrayRenderer() : myRendererSettings.getClassRenderer();
}
public ValueLabelRenderer getLabelRenderer() {
final ValueLabelRenderer labelRenderer = super.getLabelRenderer();
return labelRenderer != null ? labelRenderer : getDefaultRenderer();
}
private ChildrenRenderer getRawChildrenRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ChildrenRenderer originalRenderer = super.getChildrenRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
private ValueLabelRenderer getRawLabelRenderer() {
NodeRenderer classRenderer = getDefaultRenderer();
final ValueLabelRenderer originalRenderer = super.getLabelRenderer();
return originalRenderer == classRenderer ? null : originalRenderer;
}
public boolean isApplicable(Type type) {
if (DebuggerUtils.instanceOf(type, getClassName())) {
return super.isApplicable(type);
}
return false;
}
@Override
public String getUniqueId() {
return UNIQUE_ID;
}
public void setClassName(@NotNull String name) {
myProperties.setClassName(name);
if (getRawLabelRenderer() != null) {
final ValueLabelRenderer originalLabelRenderer = super.getLabelRenderer();
if (originalLabelRenderer instanceof TypeRenderer) {
((TypeRenderer)originalLabelRenderer).setClassName(name);
}
}
if (getRawChildrenRenderer() != null) {
final ChildrenRenderer originalChildrenRenderer = super.getChildrenRenderer();
if (originalChildrenRenderer instanceof TypeRenderer) {
((TypeRenderer)originalChildrenRenderer).setClassName(name);
}
}
}
public
@NotNull
String getClassName() {
return myProperties.getClassName();
}
protected final PsiElement getContext(Project project, DebuggerContext context) {
DebugProcess process = context.getDebugProcess();
GlobalSearchScope scope = process != null ? process.getSearchScope() : GlobalSearchScope.allScope(project);
return DebuggerUtils.findClass(getClassName(), project, scope);
}
protected final PsiElement getChildValueExpression(String text, DebuggerTreeNode node, DebuggerContext context) {
Project project = node.getProject();
PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
return elementFactory.createExpressionFromText(text, getContext(project, context));
}
}
@@ -41,7 +41,7 @@ import java.util.List;
* Date: Dec 19, 2003
* Time: 1:25:15 PM
*/
public final class EnumerationChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer{
public final class EnumerationChildrenRenderer extends TypeRenderer implements ChildrenRenderer{
public static final @NonNls String UNIQUE_ID = "EnumerationChildrenRenderer";
private boolean myAppendDefaultChildren;
@@ -50,7 +50,7 @@ import java.util.List;
* Date: Sep 17, 2003
* Time: 2:04:00 PM
*/
public class ExpressionChildrenRenderer extends ReferenceRenderer implements ChildrenRenderer {
public class ExpressionChildrenRenderer extends TypeRenderer implements ChildrenRenderer {
public static final @NonNls String UNIQUE_ID = "ExpressionChildrenRenderer";
private static final Key<Value> EXPRESSION_VALUE = new Key<>("EXPRESSION_VALUE");
private static final Key<NodeRenderer> LAST_CHILDREN_RENDERER = new Key<>("LAST_CHILDREN_RENDERER");
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 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.
@@ -28,7 +28,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.sun.jdi.PrimitiveValue;
import com.sun.jdi.Value;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -40,7 +39,7 @@ import javax.swing.*;
* Date: Sep 20, 2003
* Time: 10:27:12 PM
*/
public class LabelRenderer extends ReferenceRenderer implements ValueLabelRenderer{
public class LabelRenderer extends TypeRenderer implements ValueLabelRenderer{
public static final @NonNls String UNIQUE_ID = "LabelRenderer";
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.impl.watch.render.ClassLabelRenderer");
@@ -69,7 +68,6 @@ public class LabelRenderer extends ReferenceRenderer implements ValueLabelRender
throws EvaluateException {
final Value value = descriptor.getValue();
LOG.assertTrue(!(value instanceof PrimitiveValue));
String result;
final DebugProcess debugProcess = evaluationContext.getDebugProcess();
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
* Copyright 2000-2016 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.
@@ -16,64 +16,19 @@
package com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.CommonClassNames;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.Type;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
public abstract class ReferenceRenderer implements Renderer {
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
protected BasicRendererProperties myProperties = new BasicRendererProperties();
public abstract class ReferenceRenderer extends TypeRenderer {
protected ReferenceRenderer() {
this(CommonClassNames.JAVA_LANG_OBJECT);
}
protected ReferenceRenderer(@NotNull String className) {
myProperties.setClassName(className);
}
public String getClassName() {
return myProperties.getClassName();
}
public void setClassName(String className) {
myProperties.setClassName(className);
}
public Renderer clone() {
try {
final ReferenceRenderer cloned = (ReferenceRenderer)super.clone();
cloned.myProperties = myProperties.clone();
return cloned;
}
catch (CloneNotSupportedException e) {
LOG.error(e);
}
return null;
super(className);
}
public boolean isApplicable(Type type) {
return type != null && type instanceof ReferenceType && DebuggerUtils.instanceOf(type, getClassName());
}
public void writeExternal(Element element) throws WriteExternalException {
myProperties.writeExternal(element);
}
public void readExternal(Element element) throws InvalidDataException {
myProperties.readExternal(element);
}
protected CachedEvaluator createCachedEvaluator() {
return new CachedEvaluator() {
protected String getClassName() {
return ReferenceRenderer.this.getClassName();
}
};
return type instanceof ReferenceType && DebuggerUtils.instanceOf(type, getClassName());
}
}
@@ -0,0 +1,78 @@
/*
* Copyright 2000-2016 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 com.intellij.debugger.ui.tree.render;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.CommonClassNames;
import com.sun.jdi.Type;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
public abstract class TypeRenderer implements Renderer {
private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.ui.tree.render.ReferenceRenderer");
protected BasicRendererProperties myProperties = new BasicRendererProperties();
protected TypeRenderer() {
this(CommonClassNames.JAVA_LANG_OBJECT);
}
protected TypeRenderer(@NotNull String className) {
myProperties.setClassName(className);
}
public String getClassName() {
return myProperties.getClassName();
}
public void setClassName(String className) {
myProperties.setClassName(className);
}
public Renderer clone() {
try {
final TypeRenderer cloned = (TypeRenderer)super.clone();
cloned.myProperties = myProperties.clone();
return cloned;
}
catch (CloneNotSupportedException e) {
LOG.error(e);
}
return null;
}
public boolean isApplicable(Type type) {
return DebuggerUtils.instanceOf(type, getClassName());
}
public void writeExternal(Element element) throws WriteExternalException {
myProperties.writeExternal(element);
}
public void readExternal(Element element) throws InvalidDataException {
myProperties.readExternal(element);
}
protected CachedEvaluator createCachedEvaluator() {
return new CachedEvaluator() {
protected String getClassName() {
return TypeRenderer.this.getClassName();
}
};
}
}
@@ -15,6 +15,9 @@
*/
package com.intellij.openapi.editor.impl.view;
import com.intellij.lang.CodeDocumentationAwareCommenter;
import com.intellij.lang.Commenter;
import com.intellij.lang.LanguageCommenters;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.bidi.BidiRegionsSeparator;
@@ -23,6 +26,7 @@ import com.intellij.openapi.editor.colors.FontPreferences;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.editor.impl.ComplementaryFontsRegistry;
import com.intellij.openapi.editor.impl.FontInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.StringEscapesTokenTypes;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.BitUtil;
@@ -134,12 +138,23 @@ abstract class LineLayout {
HighlighterIterator iterator = view.getEditor().getHighlighter().createIterator(startOffsetInEditor);
int endOffsetInEditor = startOffsetInEditor + textLength;
while (!iterator.atEnd() && iterator.getStart() < endOffsetInEditor) {
int relStartOffset = Math.max(0, iterator.getStart() - startOffsetInEditor);
IElementType currentToken = iterator.getTokenType();
if (distinctTokens(lastToken, currentToken)) {
int tokenStart = Math.max(iterator.getStart(), startOffsetInEditor);
addRuns(runs, text, lastOffset - startOffsetInEditor, tokenStart - startOffsetInEditor, flags);
String lcPrefix = getLineCommentPrefix(currentToken);
if (!StringUtil.isEmpty(lcPrefix) && lcPrefix.length() <= (iterator.getEnd() - iterator.getStart()) &&
CharArrayUtil.regionMatches(text, relStartOffset, relStartOffset + lcPrefix.length(), lcPrefix)) {
addRuns(runs, text, lastOffset - startOffsetInEditor, relStartOffset, flags);
int textStartOffset = Math.min(textLength, Math.min(iterator.getEnd() - startOffsetInEditor,
CharArrayUtil.shiftForward(text, relStartOffset + lcPrefix.length(), " \t")));
lastOffset = Math.min(iterator.getEnd(), endOffsetInEditor);
lastToken = null;
addRuns(runs, text, relStartOffset, textStartOffset, flags);
addRuns(runs, text, textStartOffset, lastOffset - startOffsetInEditor, flags);
}
else if (distinctTokens(lastToken, currentToken)) {
addRuns(runs, text, lastOffset - startOffsetInEditor, relStartOffset, flags);
lastToken = currentToken;
lastOffset = tokenStart;
lastOffset = relStartOffset + startOffsetInEditor;
}
iterator.advance();
}
@@ -151,6 +166,14 @@ abstract class LineLayout {
return runs;
}
private static String getLineCommentPrefix(IElementType token) {
if (token == null) return null;
Commenter commenter = LanguageCommenters.INSTANCE.forLanguage(token.getLanguage());
return (commenter instanceof CodeDocumentationAwareCommenter) &&
token.equals(((CodeDocumentationAwareCommenter)commenter).getLineCommentTokenType()) ?
commenter.getLineCommentPrefix() : null;
}
private static boolean distinctTokens(@Nullable IElementType token1, @Nullable IElementType token2) {
if (token1 == token2) return false;
if (token1 == null || token2 == null) return true;
@@ -162,7 +185,7 @@ abstract class LineLayout {
}
private static void addRuns(List<BidiRun> runs, char[] text, int start, int end, int flags) {
if (!Bidi.requiresBidi(text, start, end)) {
if (start < end && !Bidi.requiresBidi(text, start, end)) {
addOrMergeRun(runs, new BidiRun((byte)0, start, end));
return;
}
@@ -127,6 +127,9 @@
<option name="FONT_TYPE" value="3"/>
</value>
</option>
<option name="DEFAULT_PARAMETER">
<value/>
</option>
<option name="DEFAULT_STATIC_METHOD">
<value>
<option name="FONT_TYPE" value="2"/>
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.editor.colors.impl;
import com.intellij.editor.EditorColorSchemeTestCase;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
@@ -23,23 +24,9 @@ import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.testFramework.LightPlatformCodeInsightTestCase;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jetbrains.annotations.NotNull;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.awt.*;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collections;
@@ -47,7 +34,7 @@ import static com.intellij.openapi.editor.colors.FontPreferencesTest.*;
import static java.util.Collections.singletonList;
@SuppressWarnings("Duplicates")
public class EditorColorsSchemeImplTest extends LightPlatformCodeInsightTestCase {
public class EditorColorsSchemeImplTest extends EditorColorSchemeTestCase {
EditorColorsSchemeImpl myScheme = new EditorColorsSchemeImpl(null);
public void testDefaults() {
@@ -326,46 +313,5 @@ public class EditorColorsSchemeImplTest extends LightPlatformCodeInsightTestCase
}
}
private static EditorColorsScheme loadScheme(@NotNull String docText) throws ParserConfigurationException, IOException, SAXException {
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource inputSource = new InputSource(new StringReader(docText));
org.w3c.dom.Document doc = docBuilder.parse(inputSource);
Element root = new DOMBuilder().build(doc.getDocumentElement());
EditorColorsScheme defaultScheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME);
EditorColorsScheme targetScheme = new EditorColorsSchemeImpl(defaultScheme);
targetScheme.readExternal(root);
return targetScheme;
}
@NotNull
public Pair<EditorColorsScheme,TextAttributes> doTestWriteRead(TextAttributesKey key, TextAttributes attributes)
throws WriteExternalException {
EditorColorsScheme defaultScheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME);
EditorColorsScheme sourceScheme = (EditorColorsScheme)defaultScheme.clone();
sourceScheme.setName("test");
sourceScheme.setAttributes(key, attributes);
Element root = new Element("scheme");
((AbstractColorsScheme)sourceScheme).writeExternal(root);
EditorColorsScheme targetScheme = new EditorColorsSchemeImpl(defaultScheme);
targetScheme.readExternal(root);
assertEquals("test", targetScheme.getName());
TextAttributes targetAttrs = targetScheme.getAttributes(key);
return Pair.create(targetScheme,targetAttrs);
}
private static void assertXmlOutputEquals(String expected, Element root) throws IOException {
StringWriter writer = new StringWriter();
Format format = Format.getPrettyFormat();
format.setLineSeparator("\n");
new XMLOutputter(format).output(root, writer);
String actual = writer.toString();
assertEquals(expected, actual);
}
}
@@ -594,6 +594,12 @@ public class EditorRtlTest extends AbstractEditorTest {
EditorSettingsExternalizable.getInstance().setBidiTextDirection(savedValue);
}
}
public void testLineCommentLayout() throws Exception {
prepare("<caret>// R", TestFileType.JAVA);
right();
checkResult("/<caret>/ R");
}
private void prepareText(String text) throws IOException {
prepare(text, TestFileType.TEXT);
@@ -0,0 +1,85 @@
/*
* Copyright 2000-2016 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 com.intellij.editor;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme;
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.testFramework.LightPlatformTestCase;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public abstract class EditorColorSchemeTestCase extends LightPlatformTestCase {
protected static EditorColorsScheme loadScheme(@NotNull String docText) throws ParserConfigurationException, IOException, SAXException {
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource inputSource = new InputSource(new StringReader(docText));
Document doc = docBuilder.parse(inputSource);
Element root = new DOMBuilder().build(doc.getDocumentElement());
EditorColorsScheme defaultScheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME);
EditorColorsScheme targetScheme = new EditorColorsSchemeImpl(defaultScheme);
targetScheme.readExternal(root);
return targetScheme;
}
@NotNull
protected Pair<EditorColorsScheme, TextAttributes> doTestWriteRead(TextAttributesKey key, TextAttributes attributes)
throws WriteExternalException {
EditorColorsScheme defaultScheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME);
EditorColorsScheme sourceScheme = (EditorColorsScheme)defaultScheme.clone();
sourceScheme.setName("test");
sourceScheme.setAttributes(key, attributes);
Element root = new Element("scheme");
((AbstractColorsScheme)sourceScheme).writeExternal(root);
EditorColorsScheme targetScheme = new EditorColorsSchemeImpl(defaultScheme);
targetScheme.readExternal(root);
assertEquals("test", targetScheme.getName());
TextAttributes targetAttrs = targetScheme.getAttributes(key);
return Pair.create(targetScheme, targetAttrs);
}
protected static void assertXmlOutputEquals(String expected, Element root) throws IOException {
StringWriter writer = new StringWriter();
Format format = Format.getPrettyFormat();
format.setLineSeparator("\n");
new XMLOutputter(format).output(root, writer);
String actual = writer.toString();
assertEquals(expected, actual);
}
}
@@ -478,7 +478,11 @@ public class StudyProjectGenerator {
flushCache(myCourses);
if (courseName != null && !courseName.getName().equals(unzippedName)) {
//noinspection ResultOfMethodCallIgnored
courseDir.renameTo(new File(OUR_COURSES_DIR, courseName.getName()));
File dest = new File(OUR_COURSES_DIR, courseName.getName());
if (dest.exists()) {
FileUtil.delete(dest);
}
courseDir.renameTo(dest);
//noinspection ResultOfMethodCallIgnored
courseDir.delete();
}
@@ -46,9 +46,9 @@ import javax.swing.*;
import java.awt.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.jetbrains.python.sdk.PythonEnvUtil.setPythonIOEncoding;
import static com.jetbrains.python.sdk.PythonEnvUtil.setPythonUnbuffered;
import static com.jetbrains.python.sdk.PythonEnvUtil.*;
/**
* User : catherine
@@ -165,10 +165,14 @@ public class SphinxBaseCommand {
}
}
setPythonIOEncoding(cmd.getEnvironment(), "utf-8");
setPythonUnbuffered(cmd.getEnvironment());
cmd.getEnvironment().put("PYCHARM_EP_DIST", "Sphinx");
cmd.getEnvironment().put("PYCHARM_EP_NAME", "sphinx-quickstart");
final Map<String, String> env = cmd.getEnvironment();
setPythonIOEncoding(env, "utf-8");
setPythonUnbuffered(env);
if (sdkHomePath != null) {
resetHomePathChanges(sdkHomePath, env);
}
env.put("PYCHARM_EP_DIST", "Sphinx");
env.put("PYCHARM_EP_NAME", "sphinx-quickstart");
List<String> pathList = Lists.newArrayList(PythonCommandLineState.getAddedPaths(sdk));
pathList.addAll(PythonCommandLineState.collectPythonPath(module));
@@ -144,7 +144,9 @@ public enum PythonHelper implements HelperPackage {
args.add(asParamString());
args.addAll(parameters);
final GeneralCommandLine cmd = new GeneralCommandLine(args);
addToPythonPath(cmd.getEnvironment());
final Map<String, String> env = cmd.getEnvironment();
addToPythonPath(env);
PythonEnvUtil.resetHomePathChanges(sdkPath, env);
return cmd;
}
@@ -105,6 +105,9 @@ public class PyRunCythonExtensionsFilter implements Filter {
final Map<String, String> environment = new HashMap<String, String>(System.getenv());
PythonEnvUtil.setPythonUnbuffered(environment);
PythonEnvUtil.setPythonDontWriteBytecode(environment);
if (sdkPath != null) {
PythonEnvUtil.resetHomePathChanges(sdkPath, environment);
}
GeneralCommandLine commandLine = new GeneralCommandLine(cmdline).withEnvironment(environment);
final boolean canCreate = FileUtil.ensureCanCreateFile(new File(helpersPath));
@@ -442,10 +442,11 @@ public class PyPackageManagerImpl extends PyPackageManager {
final boolean useSudo = !canCreate && !SystemInfo.isWindows && askForSudo;
try {
final Map<String, String> environment = new HashMap<>(System.getenv());
final GeneralCommandLine commandLine = new GeneralCommandLine(cmdline).withWorkDirectory(workingDir);
final Map<String, String> environment = commandLine.getEnvironment();
PythonEnvUtil.setPythonUnbuffered(environment);
PythonEnvUtil.setPythonDontWriteBytecode(environment);
final GeneralCommandLine commandLine = new GeneralCommandLine(cmdline).withWorkDirectory(workingDir).withEnvironment(environment);
PythonEnvUtil.resetHomePathChanges(homePath, environment);
final Process process;
if (useSudo) {
process = ExecUtil.sudo(commandLine, "Please enter your password to make changes in system packages: ");
@@ -289,7 +289,7 @@ public abstract class PythonCommandLineState extends CommandLineState {
env.putAll(myConfig.getEnvs());
}
addCommonEnvironmentVariables(env);
addCommonEnvironmentVariables(getInterpreterPath(project, myConfig), env);
commandLine.getEnvironment().clear();
commandLine.getEnvironment().putAll(env);
@@ -298,8 +298,11 @@ public abstract class PythonCommandLineState extends CommandLineState {
buildPythonPath(project, commandLine, myConfig, isDebug);
}
protected static void addCommonEnvironmentVariables(Map<String, String> env) {
protected static void addCommonEnvironmentVariables(@Nullable String homePath, Map<String, String> env) {
PythonEnvUtil.setPythonUnbuffered(env);
if (homePath != null) {
PythonEnvUtil.resetHomePathChanges(homePath, env);
}
env.put("PYCHARM_HOSTED", "1");
}
@@ -28,7 +28,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -191,6 +190,9 @@ public class PythonTask {
}
PythonEnvUtil.setPythonUnbuffered(env);
if (homePath != null) {
PythonEnvUtil.resetHomePathChanges(homePath, env);
}
List<String> pythonPath = setupPythonPath();
PythonCommandLineState.initPythonPath(cmd, true, pythonPath, homePath);
@@ -121,6 +121,7 @@ public class PySdkUtil {
final Map<String, String> systemEnv = System.getenv();
final Map<String, String> expandedCmdEnv = mergeEnvVariables(systemEnv, cmd.getEnvironment());
final Map<String, String> env = extraEnv != null ? mergeEnvVariables(expandedCmdEnv, extraEnv) : expandedCmdEnv;
PythonEnvUtil.resetHomePathChanges(homePath, env);
try {
final GeneralCommandLine commandLine = cmd.withWorkDirectory(homePath).withEnvironment(env);
@@ -34,6 +34,7 @@ public class PythonEnvUtil {
@SuppressWarnings("SpellCheckingInspection") public static final String PYTHONIOENCODING = "PYTHONIOENCODING";
@SuppressWarnings("SpellCheckingInspection") public static final String IPYTHONENABLE = "IPYTHONENABLE";
@SuppressWarnings("SpellCheckingInspection") public static final String PYTHONDONTWRITEBYTECODE = "PYTHONDONTWRITEBYTECODE";
@SuppressWarnings("SpellCheckingInspection") public static final String PYVENV_LAUNCHER = "__PYVENV_LAUNCHER__";
private PythonEnvUtil() { }
@@ -47,6 +48,16 @@ public class PythonEnvUtil {
return env;
}
/**
* Resets the environment variables that affect the way the Python interpreter searches for its settings and libraries.
*/
public static Map<String, String> resetHomePathChanges(@NotNull String homePath, @NotNull Map<String, String> env) {
if (System.getenv(PYVENV_LAUNCHER) != null) {
env.put(PYVENV_LAUNCHER, homePath);
}
return env;
}
/**
* Appends a value to the end os a path-like environment variable, using system-dependent path separator.
*