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    }