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    
044        public PsiJetClassStubImpl(
045                JetClassElementType type,
046                StubElement parent,
047                @Nullable String qualifiedName,
048                String name,
049                List<String> superNames,
050                boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner) {
051            this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames),
052                 isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner);
053        }
054    
055        public PsiJetClassStubImpl(
056                JetClassElementType type,
057                StubElement parent,
058                StringRef qualifiedName,
059                StringRef name,
060                StringRef[] superNames,
061                boolean isTrait,
062                boolean isEnumClass,
063                boolean isEnumEntry,
064                boolean isAnnotation,
065                boolean isInner) {
066            super(parent, type);
067            this.qualifiedName = qualifiedName;
068            this.name = name;
069            this.superNames = superNames;
070            this.isTrait = isTrait;
071            this.isEnumClass = isEnumClass;
072            this.isEnumEntry = isEnumEntry;
073            this.isAnnotation = isAnnotation;
074            this.isInner = isInner;
075        }
076    
077        private static StringRef[] wrapStrings(List<String> names) {
078            StringRef[] refs = new StringRef[names.size()];
079            for (int i = 0; i < names.size(); i++) {
080                refs[i] = StringRef.fromString(names.get(i));
081            }
082            return refs;
083        }
084    
085        @Override
086        public FqName getFqName() {
087            String stringRef = StringRef.toString(qualifiedName);
088            if (stringRef == null) {
089                return null;
090            }
091            return new FqName(stringRef);
092        }
093    
094        @Override
095        public boolean isTrait() {
096            return isTrait;
097        }
098    
099        @Override
100        public boolean isAnnotation() {
101            return isAnnotation;
102        }
103    
104        @Override
105        public boolean isEnumClass() {
106            return isEnumClass;
107        }
108    
109        @Override
110        public boolean isEnumEntry() {
111            return isEnumEntry;
112        }
113        
114        @Override
115        public boolean isInner() {
116            return isInner;
117        }
118    
119        @Override
120        public String getName() {
121            return StringRef.toString(name);
122        }
123    
124        @NotNull
125        @Override
126        public List<String> getSuperNames() {
127            List<String> result = new ArrayList<String>();
128            for (StringRef ref : superNames) {
129                result.add(ref.toString());
130            }
131            return result;
132        }
133    
134        @Override
135        public String toString() {
136            StringBuilder builder = new StringBuilder();
137            builder.append("PsiJetClassStubImpl[");
138    
139            if (isEnumClass()) {
140                builder.append("enumClass ");
141            }
142    
143            if (isEnumEntry()) {
144                builder.append("enumEntry ");
145            }
146    
147            if (isTrait()) {
148                builder.append("trait ");
149            }
150    
151            if (isAnnotation()) {
152                builder.append("isAnnotation ");
153            }
154    
155            if (isInner()) {
156                builder.append("inner ");
157            }
158    
159            builder.append("name=").append(getName());
160            builder.append(" fqn=").append(getFqName());
161            builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]");
162    
163            builder.append("]");
164    
165            return builder.toString();
166        }
167    }