001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.asJava.light;
018
019 import com.intellij.lang.Language;
020 import com.intellij.lang.java.JavaLanguage;
021 import com.intellij.navigation.NavigationItem;
022 import com.intellij.psi.*;
023 import com.intellij.psi.impl.ElementPresentationUtil;
024 import com.intellij.psi.impl.light.LightElement;
025 import com.intellij.psi.impl.light.LightModifierList;
026 import com.intellij.ui.RowIcon;
027 import com.intellij.util.IncorrectOperationException;
028 import com.intellij.util.PlatformIcons;
029 import org.jetbrains.annotations.NonNls;
030 import org.jetbrains.annotations.NotNull;
031 import org.jetbrains.annotations.Nullable;
032
033 import javax.swing.*;
034
035 // Based on com.intellij.psi.impl.light.LightVariableBuilder
036 public class LightVariableBuilder<T extends LightVariableBuilder> extends LightElement implements PsiVariable, NavigationItem {
037 private final String myName;
038 private final PsiType myType;
039 private volatile LightModifierList myModifierList;
040 private volatile Icon myBaseIcon = PlatformIcons.VARIABLE_ICON;
041 private String myOriginInfo;
042
043 public LightVariableBuilder(@NotNull String name, @NotNull String type, @NotNull PsiElement navigationElement) {
044 this(name, JavaPsiFacade.getElementFactory(navigationElement.getProject()).createTypeFromText(type, navigationElement), navigationElement);
045 }
046
047 public LightVariableBuilder(@NotNull String name, @NotNull PsiType type, @NotNull PsiElement navigationElement) {
048 this(navigationElement.getManager(), name, type, JavaLanguage.INSTANCE);
049 setNavigationElement(navigationElement);
050 }
051
052 public LightVariableBuilder(PsiManager manager, @NotNull String name, @NotNull PsiType type, Language language) {
053 super(manager, language);
054 myName = name;
055 myType = type;
056 myModifierList = new LightModifierList(manager);
057 }
058
059 @Override
060 public String toString() {
061 return "LightVariableBuilder:" + getName();
062 }
063
064 @NotNull
065 @Override
066 public PsiType getType() {
067 return myType;
068 }
069
070 @Override
071 @NotNull
072 public PsiModifierList getModifierList() {
073 return myModifierList;
074 }
075
076 public T setModifiers(String... modifiers) {
077 myModifierList = new LightModifierList(getManager(), getLanguage(), modifiers);
078 return (T)this;
079 }
080
081 @Override
082 public boolean hasModifierProperty(@NonNls @NotNull String name) {
083 return myModifierList.hasModifierProperty(name);
084 }
085
086 @NotNull
087 @Override
088 public String getName() {
089 return myName;
090 }
091
092 @Override
093 public PsiTypeElement getTypeElement() {
094 return null;
095 }
096
097 @Override
098 public PsiExpression getInitializer() {
099 return null;
100 }
101
102 @Override
103 public boolean hasInitializer() {
104 return false;
105 }
106
107 @Override
108 public void normalizeDeclaration() throws IncorrectOperationException {
109 }
110
111 @Override
112 public Object computeConstantValue() {
113 return null;
114 }
115
116 @Override
117 public PsiIdentifier getNameIdentifier() {
118 return null;
119 }
120
121 @Override
122 public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
123 throw new UnsupportedOperationException("setName is not implemented yet in org.jetbrains.jet.asJava.light.LightVariableBuilder");
124 }
125
126 @Override
127 protected boolean isVisibilitySupported() {
128 return true;
129 }
130
131 @Override
132 public Icon getElementIcon(final int flags) {
133 final RowIcon baseIcon = ElementPresentationUtil.createLayeredIcon(myBaseIcon, this, false);
134 return ElementPresentationUtil.addVisibilityIcon(this, flags, baseIcon);
135 }
136
137 public T setBaseIcon(Icon baseIcon) {
138 myBaseIcon = baseIcon;
139 return (T)this;
140 }
141
142 //@Nullable
143 //@Override
144 //public String getOriginInfo() {
145 // return myOriginInfo;
146 //}
147
148 public void setOriginInfo(@Nullable String originInfo) {
149 myOriginInfo = originInfo;
150 }
151 }