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.resolve.java.structure.impl;
018
019 import com.intellij.psi.JavaPsiFacade;
020 import com.intellij.psi.PsiClass;
021 import com.intellij.psi.PsiCompiledElement;
022 import com.intellij.psi.PsiTypeParameter;
023 import com.intellij.util.containers.ContainerUtil;
024 import org.jetbrains.annotations.NotNull;
025 import org.jetbrains.annotations.Nullable;
026 import org.jetbrains.jet.lang.descriptors.Visibility;
027 import org.jetbrains.jet.lang.resolve.java.jetAsJava.JetJavaMirrorMarker;
028 import org.jetbrains.jet.lang.resolve.java.structure.*;
029 import org.jetbrains.jet.lang.resolve.name.FqName;
030 import org.jetbrains.jet.lang.resolve.name.Name;
031
032 import java.util.Collection;
033
034 import static org.jetbrains.jet.lang.resolve.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.*;
035
036 public class JavaClassImpl extends JavaClassifierImpl<PsiClass> implements JavaClass, JavaAnnotationOwnerImpl, JavaModifierListOwnerImpl {
037 public JavaClassImpl(@NotNull PsiClass psiClass) {
038 super(psiClass);
039 assert !(psiClass instanceof PsiTypeParameter)
040 : "PsiTypeParameter should be wrapped in JavaTypeParameter, not JavaClass: use JavaClassifier.create()";
041 }
042
043 @Override
044 @NotNull
045 public Collection<JavaClass> getInnerClasses() {
046 return classes(getPsi().getInnerClasses());
047 }
048
049 @Override
050 @Nullable
051 public FqName getFqName() {
052 String qualifiedName = getPsi().getQualifiedName();
053 return qualifiedName == null ? null : new FqName(qualifiedName);
054 }
055
056 @NotNull
057 @Override
058 public Name getName() {
059 return Name.identifier(getPsi().getName());
060 }
061
062 @Override
063 public boolean isInterface() {
064 return getPsi().isInterface();
065 }
066
067 @Override
068 public boolean isAnnotationType() {
069 return getPsi().isAnnotationType();
070 }
071
072 @Override
073 public boolean isEnum() {
074 return getPsi().isEnum();
075 }
076
077 @Override
078 @Nullable
079 public JavaClass getOuterClass() {
080 PsiClass outer = getPsi().getContainingClass();
081 return outer == null ? null : new JavaClassImpl(outer);
082 }
083
084 @NotNull
085 @Override
086 public Collection<JavaTypeParameter> getTypeParameters() {
087 return typeParameters(getPsi().getTypeParameters());
088 }
089
090 @SuppressWarnings("unchecked")
091 @Override
092 @NotNull
093 public Collection<JavaClassifierType> getSupertypes() {
094 // TODO: getPsi().getSuperTypes() ?
095 Collection<JavaClassifierType> superClasses = classifierTypes(getPsi().getExtendsListTypes());
096 Collection<JavaClassifierType> superInterfaces = classifierTypes(getPsi().getImplementsListTypes());
097 return ContainerUtil.collect(ContainerUtil.concat(superClasses, superInterfaces).iterator());
098 }
099
100 @Override
101 @NotNull
102 public Collection<JavaMethod> getMethods() {
103 return methods(getPsi().getMethods());
104 }
105
106 @Override
107 @NotNull
108 public Collection<JavaMethod> getAllMethods() {
109 return methods(getPsi().getAllMethods());
110 }
111
112 @Override
113 @NotNull
114 public Collection<JavaField> getFields() {
115 return fields(getPsi().getFields());
116 }
117
118 @Override
119 @NotNull
120 public Collection<JavaField> getAllFields() {
121 return fields(getPsi().getAllFields());
122 }
123
124 @Override
125 @NotNull
126 public Collection<JavaMethod> getConstructors() {
127 return methods(getPsi().getConstructors());
128 }
129
130 @Override
131 public boolean isAbstract() {
132 return JavaElementUtil.isAbstract(this);
133 }
134
135 @Override
136 public boolean isStatic() {
137 return JavaElementUtil.isStatic(this);
138 }
139
140 @Override
141 public boolean isFinal() {
142 return JavaElementUtil.isFinal(this);
143 }
144
145 @NotNull
146 @Override
147 public Visibility getVisibility() {
148 return JavaElementUtil.getVisibility(this);
149 }
150
151 @NotNull
152 @Override
153 public Collection<JavaAnnotation> getAnnotations() {
154 return JavaElementUtil.getAnnotations(this);
155 }
156
157 @Nullable
158 @Override
159 public JavaAnnotation findAnnotation(@NotNull FqName fqName) {
160 return JavaElementUtil.findAnnotation(this, fqName);
161 }
162
163 @Override
164 @NotNull
165 public JavaClassifierType getDefaultType() {
166 return new JavaClassifierTypeImpl(JavaPsiFacade.getElementFactory(getPsi().getProject()).createType(getPsi()));
167 }
168
169 @Override
170 @NotNull
171 public OriginKind getOriginKind() {
172 PsiClass psiClass = getPsi();
173 if (psiClass instanceof JetJavaMirrorMarker) {
174 return OriginKind.KOTLIN_LIGHT_CLASS;
175 }
176 else if (psiClass instanceof PsiCompiledElement) {
177 return OriginKind.COMPILED;
178 }
179 else {
180 return OriginKind.SOURCE;
181 }
182 }
183 }