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
017package org.jetbrains.jet.lang.psi.stubs.impl;
018
019import com.intellij.openapi.util.text.StringUtil;
020import com.intellij.psi.stubs.StubBase;
021import com.intellij.psi.stubs.StubElement;
022import com.intellij.util.ArrayUtil;
023import com.intellij.util.io.StringRef;
024import org.jetbrains.annotations.NotNull;
025import org.jetbrains.annotations.Nullable;
026import org.jetbrains.jet.lang.psi.JetClass;
027import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
028import org.jetbrains.jet.lang.psi.stubs.elements.JetClassElementType;
029import org.jetbrains.jet.lang.resolve.name.FqName;
030
031import java.util.ArrayList;
032import java.util.List;
033
034public 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}