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.asJava;
018
019 import com.intellij.openapi.components.ServiceManager;
020 import com.intellij.openapi.project.Project;
021 import com.intellij.psi.PsiClass;
022 import com.intellij.psi.search.GlobalSearchScope;
023 import org.jetbrains.annotations.NotNull;
024 import org.jetbrains.annotations.Nullable;
025 import org.jetbrains.jet.lang.psi.JetClassOrObject;
026 import org.jetbrains.jet.lang.psi.JetFile;
027 import org.jetbrains.jet.lang.resolve.name.FqName;
028
029 import java.util.Collection;
030 import java.util.List;
031
032 public abstract class LightClassGenerationSupport {
033
034 @NotNull
035 public static LightClassGenerationSupport getInstance(@NotNull Project project) {
036 return ServiceManager.getService(project, LightClassGenerationSupport.class);
037 }
038
039 @NotNull
040 public abstract LightClassConstructionContext getContextForPackage(@NotNull Collection<JetFile> files);
041
042 @NotNull
043 public abstract LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject);
044
045 @NotNull
046 public abstract Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope);
047
048 /*
049 * Finds files whose package declaration is exactly {@code fqName}. For example, if a file declares
050 * package a.b.c
051 * it will not be returned for fqName "a.b"
052 *
053 * If the resulting collection is empty, it means that this package has not other declarations than sub-packages
054 */
055 @NotNull
056 public abstract Collection<JetFile> findFilesForPackage(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope);
057
058 @NotNull
059 public abstract List<KotlinLightPackageClassInfo> findPackageClassesInfos(
060 @NotNull FqName fqName,
061 @NotNull GlobalSearchScope wholeScope
062 );
063
064 // Returns only immediately declared classes/objects, package classes are not included (they have no declarations)
065 @NotNull
066 public abstract Collection<JetClassOrObject> findClassOrObjectDeclarationsInPackage(
067 @NotNull FqName packageFqName,
068 @NotNull GlobalSearchScope searchScope
069 );
070
071 public abstract boolean packageExists(@NotNull FqName fqName, @NotNull GlobalSearchScope scope);
072
073 @NotNull
074 public abstract Collection<FqName> getSubPackages(@NotNull FqName fqn, @NotNull GlobalSearchScope scope);
075
076 @Nullable
077 public abstract PsiClass getPsiClass(@NotNull JetClassOrObject classOrObject);
078
079 public final class KotlinLightPackageClassInfo {
080 private final Collection<JetFile> files;
081 private final GlobalSearchScope scope;
082
083 public KotlinLightPackageClassInfo(@NotNull Collection<JetFile> files, @NotNull GlobalSearchScope scope) {
084 this.files = files;
085 this.scope = scope;
086 }
087
088 @NotNull
089 public Collection<JetFile> getFiles() {
090 return files;
091 }
092
093 @NotNull
094 public GlobalSearchScope getScope() {
095 return scope;
096 }
097 }
098 }