diff --git a/python/openapi/src/com/jetbrains/python/psi/FileReferenceWithOneContext.java b/python/openapi/src/com/jetbrains/python/psi/FileReferenceWithOneContext.java index 32fc7881f9e4..167db43a126b 100644 --- a/python/openapi/src/com/jetbrains/python/psi/FileReferenceWithOneContext.java +++ b/python/openapi/src/com/jetbrains/python/psi/FileReferenceWithOneContext.java @@ -17,11 +17,15 @@ package com.jetbrains.python.psi; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFileSystemItem; +import com.intellij.psi.impl.source.resolve.reference.impl.CachingReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceHelper; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -46,4 +50,15 @@ public class FileReferenceWithOneContext extends FileReference { protected Collection getContextsForBindToElement(VirtualFile curVFile, Project project, FileReferenceHelper helper) { return getContexts(); } + + @Override + protected PsiElement rename(final String newName) throws IncorrectOperationException { + if (FileUtil.isAbsolutePlatformIndependent(newName)) { + return super.rename(newName); + } + else { + PsiElement element = getElement(); + return CachingReference.getManipulator(element).handleContentChange(element, getRangeInElement(), newName); + } + } } diff --git a/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java b/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java index 6dce0f0ad5b8..1a1c733f535b 100644 --- a/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java +++ b/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java @@ -82,7 +82,7 @@ public class TemplateFileReference extends WeakFileReference { dstItem = _dstItem; } - final Collection contexts = getFileReferenceSet().getDefaultContexts(); + final Collection contexts = getContexts(); switch (contexts.size()) { case 0: break; diff --git a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java index 559c20ba52d3..1de88c7712d9 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java +++ b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java @@ -51,11 +51,12 @@ public class PyPathEvaluator { if (argValue == null) { return null; } - if (FileUtil.isAbsolute(argValue)) { + if (FileUtil.isAbsolutePlatformIndependent(argValue)) { return argValue; } else { - return new File(new File(containingFilePath).getParent(), argValue).getPath(); + String path = new File(new File(containingFilePath).getParent(), argValue).getPath(); + return path.replace("\\", "/"); } } else if (call.isCalleeText(PyNames.REPLACE) && args.length == 2) { @@ -98,13 +99,18 @@ public class PyPathEvaluator { } public static String evaluatePathInJoin(String containingFilePath, PyExpression[] args, int endElement, Set visited) { - String result = containingFilePath; + String result = null; for (int i = 0; i < endElement; i++) { - String arg = evaluate(args[i], result, visited); + String arg = evaluate(args[i], containingFilePath, visited); if (arg == null) { return null; } - result = arg; + if (result == null) { + result = arg; + } + else { + result = new File(result, arg).getPath().replace("\\", "/"); + } } return result; }