dd765b4ae64cc4528b77ff8e1ad73704edfde162
[idea/javafx-plugin.git] / src / org / jetbrains / javafx / lang / psi / impl / resolve / JavaFxReference.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.javafx.lang.psi.impl.resolve;
17
18 import com.intellij.psi.PsiElement;
19 import com.intellij.psi.PsiPolyVariantReferenceBase;
20 import com.intellij.psi.ResolveResult;
21 import com.intellij.psi.impl.PsiManagerEx;
22 import com.intellij.psi.impl.source.resolve.ResolveCache;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.javafx.lang.psi.JavaFxCallExpression;
25 import org.jetbrains.javafx.lang.psi.JavaFxNewExpression;
26 import org.jetbrains.javafx.lang.psi.JavaFxReferenceElement;
27
28 /**
29  * Created by IntelliJ IDEA.
30  *
31  * @author: Alexey.Ivanov
32  */
33 public class JavaFxReference extends PsiPolyVariantReferenceBase<JavaFxReferenceElement> {
34   private static final ResolveCache.PolyVariantResolver<JavaFxReference> ourResolver =
35     new ResolveCache.PolyVariantResolver<JavaFxReference>() {
36       @Override
37       public ResolveResult[] resolve(final JavaFxReference javaFxReference, final boolean incompleteCode) {
38         return javaFxReference.multiResolveInner(incompleteCode);
39       }
40     };
41
42   public JavaFxReference(final JavaFxReferenceElement psiElement) {
43     super(psiElement, true);
44   }
45
46   @NotNull
47   @Override
48   public ResolveResult[] multiResolve(final boolean incompleteCode) {
49     final ResolveResult[] results =
50       ((PsiManagerEx)myElement.getManager()).getResolveCache().resolveWithCaching(this, ourResolver, true, incompleteCode);
51     if (results.length == 0) {
52       return ResolveResult.EMPTY_ARRAY;
53     }
54     return results;
55   }
56
57   protected ResolveResult[] multiResolveInner(final boolean incompleteCode) {
58     final String name = myElement.getName();
59     if (name != null) {
60       final JavaFxResolveProcessor resolveProcessor = createResolveProcessor(name);
61       if (!JavaFxResolveUtil.treeWalkUp(myElement, resolveProcessor)) {
62         return JavaFxResolveUtil.createResolveResult(resolveProcessor.getResult());
63       }
64     }
65     return ResolveResult.EMPTY_ARRAY;
66   }
67
68   protected JavaFxResolveProcessor createResolveProcessor(final String name) {
69     final PsiElement parent = myElement.getParent();
70     if (parent instanceof JavaFxCallExpression || parent instanceof JavaFxNewExpression) {
71       return new JavaFxResolveProcessor(name, true);
72     }
73     return new JavaFxResolveProcessor(name);
74   }
75
76   @NotNull
77   @Override
78   public Object[] getVariants() {
79     return new Object[0];  //To change body of implemented methods use File | Settings | File Templates.
80   }
81 }