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; 018 019 import com.intellij.openapi.project.Project; 020 import com.intellij.openapi.vfs.VirtualFile; 021 import com.intellij.psi.PsiClass; 022 import com.intellij.psi.PsiPackage; 023 import com.intellij.psi.search.DelegatingGlobalSearchScope; 024 import com.intellij.psi.search.GlobalSearchScope; 025 import org.jetbrains.annotations.NotNull; 026 import org.jetbrains.annotations.Nullable; 027 import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; 028 import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; 029 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl; 030 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaPackageImpl; 031 import org.jetbrains.jet.lang.resolve.name.ClassId; 032 import org.jetbrains.jet.lang.resolve.name.FqName; 033 import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; 034 import org.jetbrains.jet.plugin.JetFileType; 035 036 import javax.annotation.PostConstruct; 037 import javax.inject.Inject; 038 039 public class JavaClassFinderImpl implements JavaClassFinder { 040 private Project project; 041 private GlobalSearchScope baseScope; 042 043 private GlobalSearchScope javaSearchScope; 044 private JavaPsiFacadeKotlinHacks javaFacade; 045 046 @Inject 047 public void setProject(@NotNull Project project) { 048 this.project = project; 049 } 050 051 @Inject 052 public void setScope(@NotNull GlobalSearchScope scope) { 053 this.baseScope = scope; 054 } 055 056 @PostConstruct 057 public void initialize() { 058 javaSearchScope = new DelegatingGlobalSearchScope(baseScope) { 059 @Override 060 public boolean contains(@NotNull VirtualFile file) { 061 return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE; 062 } 063 064 //NOTE: expected by class finder to be not null 065 @NotNull 066 @Override 067 public Project getProject() { 068 return project; 069 } 070 }; 071 javaFacade = new JavaPsiFacadeKotlinHacks(project); 072 } 073 074 @Nullable 075 @Override 076 public JavaClass findClass(@NotNull ClassId classId) { 077 FqNameUnsafe fqName = classId.asSingleFqName(); 078 079 PsiClass psiClass = javaFacade.findClass(fqName.asString(), javaSearchScope); 080 if (psiClass == null) return null; 081 082 JavaClassImpl javaClass = new JavaClassImpl(psiClass); 083 084 if (!fqName.equalsTo(javaClass.getFqName())) { 085 throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName()); 086 } 087 088 if (javaClass.getOriginKind() == JavaClass.OriginKind.KOTLIN_LIGHT_CLASS) { 089 throw new IllegalStateException("Kotlin light classes should not be found by JavaPsiFacade, resolving: " + fqName); 090 } 091 092 return javaClass; 093 } 094 095 @Nullable 096 @Override 097 public JavaPackage findPackage(@NotNull FqName fqName) { 098 PsiPackage psiPackage = javaFacade.findPackage(fqName.asString()); 099 return psiPackage == null ? null : new JavaPackageImpl(psiPackage, javaSearchScope); 100 } 101 }