type inference for closures in groovy1.8
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / lang / resolve / processors / AccessorResolverProcessor.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.plugins.groovy.lang.resolve.processors;
17
18 import com.intellij.psi.PsiElement;
19 import com.intellij.psi.PsiMethod;
20 import com.intellij.psi.PsiType;
21 import com.intellij.psi.ResolveState;
22 import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
23 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
24 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
25 import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
26 import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
27
28 /**
29  * @author Maxim.Medvedev
30  */
31 public class AccessorResolverProcessor extends ResolverProcessor {
32   private final boolean mySearchForGetter;
33
34   public AccessorResolverProcessor(String name, PsiElement place, boolean searchForGetter) {
35     super(name, RESOLVE_KINDS_METHOD, place, PsiType.EMPTY_ARRAY);
36     mySearchForGetter = searchForGetter;
37   }
38
39   public boolean execute(PsiElement element, ResolveState state) {
40     final GroovyPsiElement resolveContext = state.get(RESOLVE_CONTEXT);
41     boolean usedInCategory = usedInCategory(resolveContext);
42     if (mySearchForGetter) {
43       if (element instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertyGetter((PsiMethod)element, null, usedInCategory)) {
44         return super.execute(element, state);
45       }
46     }
47     else {
48       if (element instanceof PsiMethod && GroovyPropertyUtils.isSimplePropertySetter((PsiMethod)element, null, usedInCategory)) {
49         return super.execute(element, state);
50       }
51     }
52     return true;
53   }
54
55   private static boolean usedInCategory(GroovyPsiElement resolveContext) {
56     if (resolveContext instanceof GrMethodCallExpression) {
57       final GrExpression expression = ((GrMethodCallExpression)resolveContext).getInvokedExpression();
58       if (expression instanceof GrReferenceExpression) {
59         return "use".equals(((GrReferenceExpression)expression).getName());
60       }
61     }
62     return false;
63   }
64 }