b930f94425d28a93568988b9298c2983761301d7
[idea/javafx-plugin.git] / src / org / jetbrains / javafx / lang / psi / impl / JavaFxFunctionDefinitionImpl.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.util.Icons;
25 import com.intellij.util.IncorrectOperationException;
26 import org.jetbrains.annotations.NonNls;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29 import org.jetbrains.javafx.lang.parser.JavaFxElementTypes;
30 import org.jetbrains.javafx.lang.psi.*;
31 import org.jetbrains.javafx.lang.psi.stubs.JavaFxClassStub;
32 import org.jetbrains.javafx.lang.psi.stubs.JavaFxFunctionStub;
33
34 import javax.swing.*;
35
36 /**
37  * Created by IntelliJ IDEA.
38  * Author: Alexey.Ivanov
39  * Date:   12.05.2010
40  * Time:   16:21:57
41  */
42 public class JavaFxFunctionDefinitionImpl extends JavaFxPresentableElementImpl<JavaFxFunctionStub> implements JavaFxFunctionDefinition {
43   public JavaFxFunctionDefinitionImpl(@NotNull ASTNode node) {
44     super(node);
45   }
46
47   public JavaFxFunctionDefinitionImpl(@NotNull JavaFxFunctionStub stub) {
48     super(stub, JavaFxElementTypes.FUNCTION_DEFINITION);
49   }
50
51   @Nullable
52   @Override
53   public JavaFxSignature getSignature() {
54     return getStubOrPsiChild(JavaFxElementTypes.FUNCTION_SIGNATURE);
55   }
56
57   @Override
58   public String getName() {
59     final JavaFxFunctionStub stub = getStub();
60     if (stub != null) {
61       return stub.getName();
62     }
63     return super.getName();
64   }
65
66   @Override
67   public PsiType getReturnType() {
68     final JavaFxSignature signature = getSignature();
69     if (signature != null) {
70       final PsiType resultType = signature.getReturnType();
71       if (resultType != null) {
72         return resultType;
73       }
74     }
75     return getCodeBlock().getType();
76   }
77
78   @Nullable
79   @Override
80   public JavaFxBlockExpression getCodeBlock() {
81     return (JavaFxBlockExpression)childToPsi(JavaFxElementTypes.BLOCK_EXPRESSION);
82   }
83
84   @Nullable
85   public JavaFxClassDefinition getContainingClass() {
86     final JavaFxFunctionStub stub = getStub();
87     if (stub != null) {
88       final StubElement parentStub = stub.getParentStub();
89       if (parentStub instanceof JavaFxClassStub) {
90         return ((JavaFxClassStub)parentStub).getPsi();
91       }
92       return null;
93     }
94
95     final PsiElement parent = getParent();
96     if (parent instanceof JavaFxClassDefinition) {
97       return (JavaFxClassDefinition)parent;
98     }
99     return null;
100   }
101
102   public void acceptJavaFxVisitor(@NotNull JavaFxElementVisitor visitor) {
103     visitor.visitFunctionDefinition(this);
104   }
105
106   @Override
107   public Icon getIcon(int flags) {
108     return Icons.METHOD_ICON;
109   }
110
111   @Override
112   protected String getLocationString() {
113     final String locationString = super.getLocationString();
114     final JavaFxClassDefinition containingClass = getContainingClass();
115     if (containingClass != null) {
116       return containingClass.getName() + " in " + locationString;
117     }
118     return locationString;
119   }
120
121 // TODO: !!!
122
123   public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
124     throw new IncorrectOperationException();
125   }
126
127   @Override
128   @Nullable
129   public JavaFxQualifiedName getQualifiedName() {
130     final JavaFxFunctionStub stub = getStub();
131     if (stub != null) {
132       return stub.getQualifiedName();
133     }
134     return (getContainingClass() == null) ? JavaFxPsiUtil.getQName(this) : null;
135   }
136
137   @Override
138   public boolean processDeclarations(@NotNull final PsiScopeProcessor processor,
139                                      @NotNull final ResolveState state,
140                                      final PsiElement lastParent,
141                                      @NotNull final PsiElement place) {
142     final JavaFxSignature signature = getSignature();
143     if (signature != null && signature != lastParent && !signature.processDeclarations(processor, state, lastParent, place)) {
144       return false;
145     }
146     return processor.execute(this, state);
147   }
148 }