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.resolve.java.resolver; 018 019import com.intellij.psi.PsiClass; 020import org.jetbrains.annotations.NotNull; 021import org.jetbrains.jet.lang.descriptors.ClassDescriptor; 022import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; 023import org.jetbrains.jet.lang.resolve.java.JvmAbi; 024import org.jetbrains.jet.lang.resolve.java.kt.JetClassObjectAnnotation; 025import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; 026import org.jetbrains.jet.lang.resolve.name.FqName; 027 028import javax.inject.Inject; 029import java.util.ArrayList; 030import java.util.Collections; 031import java.util.List; 032 033public final class JavaInnerClassResolver { 034 035 private JavaClassResolver classResolver; 036 037 public JavaInnerClassResolver() { 038 } 039 040 @Inject 041 public void setClassResolver(JavaClassResolver classResolver) { 042 this.classResolver = classResolver; 043 } 044 045 @NotNull 046 public List<ClassDescriptor> resolveInnerClasses(@NotNull ClassPsiDeclarationProvider declarationProvider) { 047 if (declarationProvider.isStaticMembers()) { 048 return Collections.emptyList(); 049 } 050 051 return resolveInnerClasses(declarationProvider.getPsiClass()); 052 } 053 054 @NotNull 055 private List<ClassDescriptor> resolveInnerClasses(@NotNull PsiClass psiClass) { 056 PsiClass[] innerPsiClasses = psiClass.getInnerClasses(); 057 List<ClassDescriptor> result = new ArrayList<ClassDescriptor>(innerPsiClasses.length); 058 for (PsiClass innerPsiClass : innerPsiClasses) { 059 if (shouldBeIgnored(innerPsiClass)) { 060 continue; 061 } 062 ClassDescriptor classDescriptor = resolveInnerClass(innerPsiClass); 063 result.add(classDescriptor); 064 } 065 return result; 066 } 067 068 private static boolean shouldBeIgnored(PsiClass innerPsiClass) { 069 return JetClassObjectAnnotation.get(innerPsiClass).isDefined(); 070 } 071 072 @NotNull 073 private ClassDescriptor resolveInnerClass(@NotNull PsiClass innerPsiClass) { 074 String name = innerPsiClass.getQualifiedName(); 075 assert name != null : "Inner class has no qualified name"; 076 ClassDescriptor classDescriptor = classResolver.resolveClass(new FqName(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN); 077 assert classDescriptor != null : "Couldn't resolve class " + name; 078 return classDescriptor; 079 } 080}