diff options
Diffstat (limited to 'plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java')
-rw-r--r-- | plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java index 4bedf1db1185..535729946558 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ClosureMissingMethodContributor.java @@ -16,10 +16,13 @@ package org.jetbrains.plugins.groovy.lang.resolve; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.GrReferenceExpressionImpl; +import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint; /** * @author Sergey Evdokimov @@ -28,6 +31,20 @@ public abstract class ClosureMissingMethodContributor { public static final ExtensionPointName<ClosureMissingMethodContributor> EP_NAME = ExtensionPointName.create("org.intellij.groovy.closureMissingMethodContributor"); + public static boolean processMethodsFromClosures(GrReferenceExpressionImpl ref, PsiScopeProcessor processor) { + for (PsiElement e = ref.getContext(); e != null; e = e.getContext()) { + if (e instanceof GrClosableBlock) { + ResolveState state = ResolveState.initial().put(ClassHint.RESOLVE_CONTEXT, e); + for (ClosureMissingMethodContributor contributor : EP_NAME.getExtensions()) { + if (!contributor.processMembers((GrClosableBlock)e, processor, ref, state)) { + return false; + } + } + } + } + return true; + } + public abstract boolean processMembers(GrClosableBlock closure, PsiScopeProcessor processor, GrReferenceExpression refExpr, ResolveState state); } |