a908b49b64b6fa5cbb5457587a79b88840e695f1
[idea/javafx-plugin.git] / src / org / jetbrains / javafx / lang / psi / impl / JavaFxVariableDeclarationImpl.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;
17
18 import com.intellij.lang.ASTNode;
19 import com.intellij.psi.PsiElement;
20 import com.intellij.psi.PsiType;
21 import com.intellij.psi.ResolveState;
22 import com.intellij.psi.scope.PsiScopeProcessor;
23 import com.intellij.psi.stubs.StubElement;
24 import com.intellij.psi.util.PsiTreeUtil;
25 import com.intellij.util.Icons;
26 import com.intellij.util.IncorrectOperationException;
27 import org.jetbrains.annotations.NonNls;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30 import org.jetbrains.javafx.lang.lexer.JavaFxTokenTypes;
31 import org.jetbrains.javafx.lang.parser.JavaFxElementTypes;
32 import org.jetbrains.javafx.lang.psi.*;
33 import org.jetbrains.javafx.lang.psi.impl.types.JavaFxTypeUtil;
34 import org.jetbrains.javafx.lang.psi.stubs.JavaFxClassStub;
35 import org.jetbrains.javafx.lang.psi.stubs.JavaFxVariableStub;
36
37 import javax.swing.*;
38
39 /**
40  * Created by IntelliJ IDEA.
41  * Author: Alexey.Ivanov
42  * Date:   12.05.2010
43  * Time:   16:21:57
44  */
45 public class JavaFxVariableDeclarationImpl extends JavaFxPresentableElementImpl<JavaFxVariableStub> implements JavaFxVariableDeclaration {
46   public JavaFxVariableDeclarationImpl(@NotNull ASTNode node) {
47     super(node);
48   }
49
50   public JavaFxVariableDeclarationImpl(JavaFxVariableStub stub) {
51     super(stub, JavaFxElementTypes.VARIABLE_DECLARATION);
52   }
53
54   @Override
55   public String getName() {
56     final JavaFxVariableStub stub = getStub();
57     if (stub != null) {
58       return stub.getName();
59     }
60     return super.getName();
61   }
62
63   @Override
64   protected void acceptJavaFxVisitor(@NotNull JavaFxElementVisitor visitor) {
65     visitor.visitVariableDeclaration(this);
66   }
67
68   @Override
69   public Icon getIcon(int flags) {
70     return Icons.VARIABLE_ICON;
71   }
72
73   @Nullable
74   public JavaFxExpression getInitializer() {
75     final ASTNode child = getNode().findChildByType(JavaFxTokenTypes.EQ);
76     if (child != null) {
77       final JavaFxExpression element = PsiTreeUtil.getNextSiblingOfType(child.getPsi(), JavaFxExpression.class);
78       if (element != null) {
79         return element;
80       }
81     }
82     return null;
83   }
84
85   @Override
86   public JavaFxTypeElement getTypeElement() {
87     return childToPsi(JavaFxElementTypes.TYPE_ELEMENTS);
88   }
89
90   @Override
91   protected String getLocationString() {
92     final String locationString = super.getLocationString();
93     final JavaFxVariableStub stub = getStub();
94     if (stub != null) {
95       final StubElement parentStub = stub.getParentStub();
96       if (parentStub instanceof JavaFxClassStub) {
97         return ((JavaFxClassStub)parentStub).getName() + " in " + locationString;
98       }
99     }
100     else {
101       final PsiElement parent = getParent();
102       if (parent instanceof JavaFxClassDefinition) {
103         return ((JavaFxClassDefinition)parent).getName() + " in " + locationString;
104       }
105     }
106     return locationString;
107   }
108
109   public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
110     throw new IncorrectOperationException();
111   }
112
113   @Override
114   public JavaFxQualifiedName getQualifiedName() {
115     final JavaFxVariableStub stub = getStub();
116     if (stub != null) {
117       return stub.getQualifiedName();
118     }
119     return (getParent() instanceof JavaFxFile) ? JavaFxPsiUtil.getQName(this) : null;
120   }
121
122   @Override
123   public PsiType getType() {
124     final JavaFxTypeElement typeElement = getTypeElement();
125     if (typeElement != null) {
126       return typeElement.getType();
127     }
128     final JavaFxExpression initializer = getInitializer();
129     if (initializer != null) {
130       return initializer.getType();
131     }
132     return JavaFxTypeUtil.getObjectClassType(getProject());
133   }
134
135   @Override
136   public boolean processDeclarations(@NotNull final PsiScopeProcessor processor,
137                                      @NotNull final ResolveState state,
138                                      final PsiElement lastParent,
139                                      @NotNull final PsiElement place) {
140     return processor.execute(this, state);
141   }
142 }