From 78c3a29eef9479207f4cb770bf0945753c635ee4 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Tue, 19 Apr 2016 00:06:07 +0300 Subject: [PATCH] PY-18897: Making "PyMLTH#isAvailableOnDataContext" fast * According to contract, rename handler shall not do anything heavy in isAvailableOnDataContext, since this method is called from BaseRefactoringAction.update which can be called several times. --- .../PyMagicLiteralRenameHandler.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/python/src/com/jetbrains/python/magicLiteral/PyMagicLiteralRenameHandler.java b/python/src/com/jetbrains/python/magicLiteral/PyMagicLiteralRenameHandler.java index b7fdf465f7ea..ad938df3c173 100644 --- a/python/src/com/jetbrains/python/magicLiteral/PyMagicLiteralRenameHandler.java +++ b/python/src/com/jetbrains/python/magicLiteral/PyMagicLiteralRenameHandler.java @@ -32,22 +32,28 @@ import org.jetbrains.annotations.Nullable; /** * @author traff */ -public class PyMagicLiteralRenameHandler implements RenameHandler { - @Override - public boolean isAvailableOnDataContext(final DataContext dataContext) { +public final class PyMagicLiteralRenameHandler implements RenameHandler { + /** + * @return string literal under data context or null if not a literal. + * This method is fast, so it can safely be used at {@link #isAvailableOnDataContext(DataContext)} + */ + @Nullable + private static PyStringLiteralExpression getStringLiteral(@NotNull final DataContext dataContext) { final Editor editor = CommonDataKeys.EDITOR.getData(dataContext); if (editor == null) { - return false; + return null; } final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext); if (file == null) { - return false; + return null; } final PsiElement element = getElement(file, editor); - - return !((element == null) || !PyMagicLiteralTools.isMagicLiteral(element)); + if (element instanceof PyStringLiteralExpression) { + return (PyStringLiteralExpression)element; + } + return null; } @Nullable @@ -60,8 +66,14 @@ public class PyMagicLiteralRenameHandler implements RenameHandler { } @Override - public boolean isRenaming(DataContext dataContext) { - return isAvailableOnDataContext(dataContext); + public boolean isAvailableOnDataContext(final DataContext dataContext) { + return getStringLiteral(dataContext) != null; + } + + @Override + public boolean isRenaming(final DataContext dataContext) { + final PyStringLiteralExpression literal = getStringLiteral(dataContext); + return !((literal == null) || !PyMagicLiteralTools.isMagicLiteral(literal)); } @Override