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