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.lang.psi.stubs.impl;
018    
019    import com.intellij.openapi.util.text.StringUtil;
020    import com.intellij.psi.stubs.StubBase;
021    import com.intellij.psi.stubs.StubElement;
022    import com.intellij.util.ArrayUtil;
023    import com.intellij.util.io.StringRef;
024    import org.jetbrains.annotations.NotNull;
025    import org.jetbrains.annotations.Nullable;
026    import org.jetbrains.jet.lang.psi.JetClass;
027    import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
028    import org.jetbrains.jet.lang.psi.stubs.elements.JetClassElementType;
029    import org.jetbrains.jet.lang.resolve.name.FqName;
030    
031    import java.util.ArrayList;
032    import java.util.List;
033    
034    public class PsiJetClassStubImpl extends StubBase<JetClass> implements PsiJetClassStub {
035        private final StringRef qualifiedName;
036        private final StringRef name;
037        private final StringRef[] superNames;
038        private final boolean isTrait;
039        private final boolean isEnumClass;
040        private final boolean isEnumEntry;
041        private final boolean isAnnotation;
042        private final boolean isInner;
043        private final boolean isLocal;
044    
045        public PsiJetClassStubImpl(
046                JetClassElementType type,
047                StubElement parent,
048                @Nullable String qualifiedName,
049                String name,
050                List<String> superNames,
051                boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner, boolean isLocal) {
052            this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames),
053                 isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner, isLocal);
054        }
055    
056        public PsiJetClassStubImpl(
057                JetClassElementType type,
058                StubElement parent,
059                StringRef qualifiedName,
060                StringRef name,
061                StringRef[] superNames,
062                boolean isTrait,
063                boolean isEnumClass,
064                boolean isEnumEntry,
065                boolean isAnnotation,
066                boolean isInner,
067                boolean isLocal) {
068            super(parent, type);
069            this.qualifiedName = qualifiedName;
070            this.name = name;
071            this.superNames = superNames;
072            this.isTrait = isTrait;
073            this.isEnumClass = isEnumClass;
074            this.isEnumEntry = isEnumEntry;
075            this.isAnnotation = isAnnotation;
076            this.isInner = isInner;
077            this.isLocal = isLocal;
078        }
079    
080        private static StringRef[] wrapStrings(List<String> names) {
081            StringRef[] refs = new StringRef[names.size()];
082            for (int i = 0; i < names.size(); i++) {
083                refs[i] = StringRef.fromString(names.get(i));
084            }
085            return refs;
086        }
087    
088        @Override
089        public FqName getFqName() {
090            String stringRef = StringRef.toString(qualifiedName);
091            if (stringRef == null) {
092                return null;
093            }
094            return new FqName(stringRef);
095        }
096    
097        @Override
098        public boolean isTrait() {
099            return isTrait;
100        }
101    
102        @Override
103        public boolean isAnnotation() {
104            return isAnnotation;
105        }
106    
107        @Override
108        public boolean isEnumClass() {
109            return isEnumClass;
110        }
111    
112        @Override
113        public boolean isEnumEntry() {
114            return isEnumEntry;
115        }
116        
117        @Override
118        public boolean isInner() {
119            return isInner;
120        }
121    
122        @Override
123        public boolean isLocal() {
124            return isLocal;
125        }
126    
127        @Override
128        public String getName() {
129            return StringRef.toString(name);
130        }
131    
132        @NotNull
133        @Override
134        public List<String> getSuperNames() {
135            List<String> result = new ArrayList<String>();
136            for (StringRef ref : superNames) {
137                result.add(ref.toString());
138            }
139            return result;
140        }
141    
142        @Override
143        public String toString() {
144            StringBuilder builder = new StringBuilder();
145            builder.append("PsiJetClassStubImpl[");
146    
147            if (isEnumClass()) {
148                builder.append("enumClass ");
149            }
150    
151            if (isEnumEntry()) {
152                builder.append("enumEntry ");
153            }
154    
155            if (isTrait()) {
156                builder.append("trait ");
157            }
158    
159            if (isAnnotation()) {
160                builder.append("isAnnotation ");
161            }
162    
163            if (isInner()) {
164                builder.append("inner ");
165            }
166    
167            if (isLocal()) {
168                builder.append("local ");
169            }
170    
171            builder.append("name=").append(getName());
172            builder.append(" fqn=").append(getFqName());
173            builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]");
174    
175            builder.append("]");
176    
177            return builder.toString();
178        }
179    }