From 45f148640bd2fa09c4d51d57d58b504531f5eecf Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Wed, 16 Aug 2017 17:21:33 +0300 Subject: [PATCH] [groovy] disallow Convert Closure to Method intention from reference This is needed to prevent loading AST during intention pass as the predicate queries target property initializer which is not stored in stubs. --- .../ConvertClosureToMethodIntention.java | 40 +++++-------------- .../ConvertMethodToClosureTest.java | 4 -- .../ClosureFromReference.groovy | 10 ----- .../ClosureFromReference_after.groovy | 10 ----- 4 files changed, 9 insertions(+), 55 deletions(-) delete mode 100644 plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference.groovy delete mode 100644 plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference_after.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java index bcdd2795e55a..70d3aa706f6f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/conversions/ConvertClosureToMethodIntention.java @@ -70,21 +70,10 @@ public class ConvertClosureToMethodIntention extends Intention { @Override protected void processIntention(@NotNull PsiElement element, @NotNull Project project, Editor editor) throws IncorrectOperationException { - final GrField field; - if (element.getParent() instanceof GrField) { - field = (GrField)element.getParent(); - } - else { - final PsiReference ref = element.getReference(); - LOG.assertTrue(ref != null); - PsiElement resolved = ref.resolve(); - if (resolved instanceof GrAccessorMethod) { - resolved = ((GrAccessorMethod)resolved).getProperty(); - } - LOG.assertTrue(resolved instanceof GrField); - field = (GrField)resolved; - } + final PsiElement parent = element.getParent(); + if (!(parent instanceof GrField)) return; + final GrField field = (GrField)parent; final HashSet usages = new HashSet<>(); usages.addAll(ReferencesSearch.search(field).findAll()); final GrAccessorMethod[] getters = field.getGetters(); @@ -97,7 +86,6 @@ public class ConvertClosureToMethodIntention extends Intention { } final String fieldName = field.getName(); - LOG.assertTrue(fieldName != null); final Collection fieldUsages = new HashSet<>(); MultiMap conflicts = new MultiMap<>(); for (PsiReference usage : usages) { @@ -215,22 +203,12 @@ public class ConvertClosureToMethodIntention extends Intention { @Override public boolean satisfiedBy(@NotNull PsiElement element) { if (element.getLanguage() != GroovyLanguage.INSTANCE) return false; - final PsiReference ref = element.getReference(); - GrField field; - if (ref != null) { - PsiElement resolved = ref.resolve(); - if (resolved instanceof GrAccessorMethod) { - resolved = ((GrAccessorMethod)resolved).getProperty(); - } - if (!(resolved instanceof GrField)) return false; - field = (GrField)resolved; - } - else { - final PsiElement parent = element.getParent(); - if (!(parent instanceof GrField)) return false; - field = (GrField)parent; - if (field.getNameIdentifierGroovy() != element) return false; - } + + final PsiElement parent = element.getParent(); + if (!(parent instanceof GrField)) return false; + + final GrField field = (GrField)parent; + if (field.getNameIdentifierGroovy() != element) return false; final PsiElement varDeclaration = field.getParent(); if (!(varDeclaration instanceof GrVariableDeclaration)) return false; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertMethodToClosureTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertMethodToClosureTest.java index 48a5c0fd8513..286d6e79a494 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertMethodToClosureTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/intentions/ConvertMethodToClosureTest.java @@ -59,10 +59,6 @@ public class ConvertMethodToClosureTest extends GrIntentionTestCase { doMethodToClosureTest(); } - public void testClosureFromReference() { - doClosureToMethodTest(); - } - public void testConstructorToClosure() { doMethodToClosureTest(false); } public void testInvalidMethodName() {doMethodToClosureTest(false);} diff --git a/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference.groovy b/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference.groovy deleted file mode 100644 index 59cff41d1449..000000000000 --- a/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference.groovy +++ /dev/null @@ -1,10 +0,0 @@ -class X{ - def a; - - static private final def foo = {def x, def y -> - print x + a; - print y; - } -} - -X.foo(2, 3) \ No newline at end of file diff --git a/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference_after.groovy b/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference_after.groovy deleted file mode 100644 index 536d4d2cdec7..000000000000 --- a/plugins/groovy/testdata/intentions/convertMethodToClosure/ClosureFromReference_after.groovy +++ /dev/null @@ -1,10 +0,0 @@ -class X{ - def a; - - static private final def foo(def x, def y) { - print x + a; - print y; - } -} - -X.foo(2, 3) \ No newline at end of file