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}