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    }