Refactoring: remove LightClassStubWithData, use generics for KotlinJavaFileStubProvider
This commit is contained in:
+28
-24
@@ -56,18 +56,18 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClassStubWithData> {
|
||||
public class KotlinJavaFileStubProvider<T extends WithFileStub> implements CachedValueProvider<T> {
|
||||
|
||||
@NotNull
|
||||
public static KotlinJavaFileStubProvider createForPackageClass(
|
||||
public static KotlinJavaFileStubProvider<KotlinPackageLightClassData> createForPackageClass(
|
||||
@NotNull final Project project,
|
||||
@NotNull final FqName packageFqName,
|
||||
@NotNull final GlobalSearchScope searchScope
|
||||
) {
|
||||
return new KotlinJavaFileStubProvider(
|
||||
return new KotlinJavaFileStubProvider<KotlinPackageLightClassData>(
|
||||
project,
|
||||
false,
|
||||
new StubGenerationStrategy.NoDeclaredClasses() {
|
||||
new StubGenerationStrategy.NoDeclaredClasses<KotlinPackageLightClassData>() {
|
||||
@NotNull
|
||||
@Override
|
||||
public LightClassConstructionContext getContext(@NotNull Collection<JetFile> files) {
|
||||
@@ -84,8 +84,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
||||
return new LightClassStubWithData(javaFileStub, KotlinPackageLightClassData.instance$);
|
||||
public KotlinPackageLightClassData createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
||||
return new KotlinPackageLightClassData(javaFileStub);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -105,11 +105,11 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static KotlinJavaFileStubProvider createForDeclaredClass(@NotNull final JetClassOrObject classOrObject) {
|
||||
return new KotlinJavaFileStubProvider(
|
||||
public static KotlinJavaFileStubProvider<OutermostKotlinClassLightClassData> createForDeclaredClass(@NotNull final JetClassOrObject classOrObject) {
|
||||
return new KotlinJavaFileStubProvider<OutermostKotlinClassLightClassData>(
|
||||
classOrObject.getProject(),
|
||||
JetPsiUtil.isLocal(classOrObject),
|
||||
new StubGenerationStrategy.WithDeclaredClasses() {
|
||||
new StubGenerationStrategy.WithDeclaredClasses<OutermostKotlinClassLightClassData>() {
|
||||
private JetFile getFile() {
|
||||
return (JetFile) classOrObject.getContainingFile();
|
||||
}
|
||||
@@ -122,19 +122,19 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
||||
public OutermostKotlinClassLightClassData createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
|
||||
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject);
|
||||
if (classDescriptor == null) {
|
||||
return new LightClassStubWithData(
|
||||
return new OutermostKotlinClassLightClassData(
|
||||
javaFileStub,
|
||||
new OutermostKotlinClassLightClassData("", classOrObject, null, Collections.<JetClassOrObject, LightClassDataForKotlinClass>emptyMap())
|
||||
"", classOrObject, null, Collections.<JetClassOrObject, InnerKotlinClassLightClassData>emptyMap()
|
||||
);
|
||||
}
|
||||
|
||||
String jvmInternalName = CodegenBinding.getJvmInternalName(bindingContext, classDescriptor);
|
||||
Collection<ClassDescriptor> allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor);
|
||||
|
||||
Map<JetClassOrObject, LightClassDataForKotlinClass> innerClassesMap = ContainerUtil.newHashMap();
|
||||
Map<JetClassOrObject, InnerKotlinClassLightClassData> innerClassesMap = ContainerUtil.newHashMap();
|
||||
for (ClassDescriptor innerClassDescriptor : allInnerClasses) {
|
||||
JetClassOrObject innerClass = (JetClassOrObject) BindingContextUtils.descriptorToDeclaration(
|
||||
bindingContext, innerClassDescriptor
|
||||
@@ -146,12 +146,16 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
innerClass,
|
||||
innerClassDescriptor
|
||||
);
|
||||
|
||||
innerClassesMap.put(innerClass, innerLightClassData);
|
||||
}
|
||||
|
||||
return new LightClassStubWithData(
|
||||
return new OutermostKotlinClassLightClassData(
|
||||
javaFileStub,
|
||||
new OutermostKotlinClassLightClassData(jvmInternalName, classOrObject, classDescriptor, innerClassesMap)
|
||||
jvmInternalName,
|
||||
classOrObject,
|
||||
classDescriptor,
|
||||
innerClassesMap
|
||||
);
|
||||
}
|
||||
|
||||
@@ -180,13 +184,13 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
private static final Logger LOG = Logger.getInstance(KotlinJavaFileStubProvider.class);
|
||||
|
||||
private final Project project;
|
||||
private final StubGenerationStrategy stubGenerationStrategy;
|
||||
private final StubGenerationStrategy<T> stubGenerationStrategy;
|
||||
private final boolean local;
|
||||
|
||||
private KotlinJavaFileStubProvider(
|
||||
@NotNull Project project,
|
||||
boolean local,
|
||||
@NotNull StubGenerationStrategy stubGenerationStrategy
|
||||
@NotNull StubGenerationStrategy<T> stubGenerationStrategy
|
||||
) {
|
||||
this.project = project;
|
||||
this.stubGenerationStrategy = stubGenerationStrategy;
|
||||
@@ -195,7 +199,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Result<LightClassStubWithData> compute() {
|
||||
public Result<T> compute() {
|
||||
FqName packageFqName = stubGenerationStrategy.getPackageFqName();
|
||||
Collection<JetFile> files = stubGenerationStrategy.getFiles();
|
||||
|
||||
@@ -242,8 +246,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
throw e;
|
||||
}
|
||||
|
||||
return Result.<LightClassStubWithData>create(
|
||||
stubGenerationStrategy.createLightClassStubWithData(javaFileStub, bindingContext),
|
||||
return Result.create(
|
||||
stubGenerationStrategy.createLightClassData(javaFileStub, bindingContext),
|
||||
local ? PsiModificationTracker.MODIFICATION_COUNT : PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
|
||||
);
|
||||
}
|
||||
@@ -302,16 +306,16 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
cause);
|
||||
}
|
||||
|
||||
private interface StubGenerationStrategy {
|
||||
private interface StubGenerationStrategy<T extends WithFileStub> {
|
||||
@NotNull Collection<JetFile> getFiles();
|
||||
@NotNull FqName getPackageFqName();
|
||||
@NotNull LightClassConstructionContext getContext(@NotNull Collection<JetFile> files);
|
||||
@NotNull LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext);
|
||||
@NotNull T createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext);
|
||||
|
||||
boolean generateDeclaredClasses();
|
||||
void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files);
|
||||
|
||||
abstract class NoDeclaredClasses implements StubGenerationStrategy {
|
||||
abstract class NoDeclaredClasses<U extends WithFileStub> implements StubGenerationStrategy<U> {
|
||||
@Override
|
||||
public boolean generateDeclaredClasses() {
|
||||
return false;
|
||||
@@ -324,7 +328,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
|
||||
}
|
||||
}
|
||||
|
||||
abstract class WithDeclaredClasses implements StubGenerationStrategy {
|
||||
abstract class WithDeclaredClasses<U extends WithFileStub> implements StubGenerationStrategy<U> {
|
||||
@Override
|
||||
public boolean generateDeclaredClasses() {
|
||||
return true;
|
||||
|
||||
+6
-7
@@ -62,7 +62,7 @@ import java.util.List;
|
||||
import static org.jetbrains.jet.lexer.JetTokens.*;
|
||||
|
||||
public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightClass implements KotlinLightClass, JetJavaMirrorMarker {
|
||||
private final static Key<CachedValue<LightClassStubWithData>> JAVA_API_STUB = Key.create("JAVA_API_STUB");
|
||||
private final static Key<CachedValue<OutermostKotlinClassLightClassData>> JAVA_API_STUB = Key.create("JAVA_API_STUB");
|
||||
|
||||
@Nullable
|
||||
public static KotlinLightClassForExplicitDeclaration create(@NotNull PsiManager manager, @NotNull JetClassOrObject classOrObject) {
|
||||
@@ -236,7 +236,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
||||
|
||||
@NotNull
|
||||
private PsiJavaFileStub getJavaFileStub() {
|
||||
return getLightClassStubWithData().getJavaFileStub();
|
||||
return getLightClassData().getJavaFileStub();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -246,12 +246,12 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private LightClassStubWithData getLightClassStubWithData() {
|
||||
return getLightClassStubWithData(classOrObject);
|
||||
private OutermostKotlinClassLightClassData getLightClassData() {
|
||||
return getLightClassData(classOrObject);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static LightClassStubWithData getLightClassStubWithData(JetClassOrObject classOrObject) {
|
||||
private static OutermostKotlinClassLightClassData getLightClassData(JetClassOrObject classOrObject) {
|
||||
JetClassOrObject outermostClassOrObject = getOutermostClassOrObject(classOrObject);
|
||||
return CachedValuesManager.getManager(classOrObject.getProject()).getCachedValue(
|
||||
outermostClassOrObject,
|
||||
@@ -263,8 +263,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
|
||||
|
||||
@Nullable
|
||||
private static LightClassDataForKotlinClass getLightClassDataExactly(JetClassOrObject classOrObject) {
|
||||
OutermostKotlinClassLightClassData data =
|
||||
(OutermostKotlinClassLightClassData) getLightClassStubWithData(classOrObject).getClassData();
|
||||
OutermostKotlinClassLightClassData data = getLightClassData(classOrObject);
|
||||
return data.getClassOrObject().equals(classOrObject) ? data : data.getAllInnerClasses().get(classOrObject);
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -48,7 +48,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
||||
private final GlobalSearchScope searchScope;
|
||||
private final Collection<JetFile> files;
|
||||
private final int hashCode;
|
||||
private final CachedValue<LightClassStubWithData> javaFileStub;
|
||||
private final CachedValue<KotlinPackageLightClassData> lightClassDataCache;
|
||||
private final PsiModifierList modifierList;
|
||||
private final LightEmptyImplementsList implementsList;
|
||||
|
||||
@@ -67,9 +67,9 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
||||
assert !files.isEmpty() : "No files for package " + packageFqName;
|
||||
this.files = Sets.newHashSet(files); // needed for hashCode
|
||||
this.hashCode = computeHashCode();
|
||||
KotlinJavaFileStubProvider stubProvider =
|
||||
KotlinJavaFileStubProvider<KotlinPackageLightClassData> stubProvider =
|
||||
KotlinJavaFileStubProvider.createForPackageClass(getProject(), packageFqName, searchScope);
|
||||
this.javaFileStub = CachedValuesManager.getManager(getProject()).createCachedValue(stubProvider, /*trackValue = */false);
|
||||
this.lightClassDataCache = CachedValuesManager.getManager(getProject()).createCachedValue(stubProvider, /*trackValue = */false);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -272,7 +272,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
|
||||
@NotNull
|
||||
@Override
|
||||
public PsiClass getDelegate() {
|
||||
PsiClass psiClass = LightClassUtil.findClass(packageClassFqName, javaFileStub.getValue().getJavaFileStub());
|
||||
PsiClass psiClass = LightClassUtil.findClass(packageClassFqName, lightClassDataCache.getValue().getJavaFileStub());
|
||||
if (psiClass == null) {
|
||||
throw new IllegalStateException("Package class was not found " + packageFqName);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2013 JetBrains s.r.o.
|
||||
* Copyright 2010-2014 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -22,13 +22,19 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject
|
||||
|
||||
trait LightClassData
|
||||
|
||||
trait WithFileStub {
|
||||
val javaFileStub: PsiJavaFileStub
|
||||
}
|
||||
|
||||
trait LightClassDataForKotlinClass: LightClassData {
|
||||
val classOrObject: JetClassOrObject
|
||||
val descriptor: ClassDescriptor?
|
||||
val jvmInternalName: String
|
||||
}
|
||||
|
||||
object KotlinPackageLightClassData: LightClassData
|
||||
data class KotlinPackageLightClassData(
|
||||
override val javaFileStub: PsiJavaFileStub
|
||||
): LightClassData, WithFileStub
|
||||
|
||||
data class InnerKotlinClassLightClassData(
|
||||
override val jvmInternalName: String,
|
||||
@@ -37,13 +43,9 @@ data class InnerKotlinClassLightClassData(
|
||||
): LightClassDataForKotlinClass
|
||||
|
||||
data class OutermostKotlinClassLightClassData(
|
||||
override val javaFileStub: PsiJavaFileStub,
|
||||
override val jvmInternalName: String,
|
||||
override val classOrObject: JetClassOrObject,
|
||||
override val descriptor: ClassDescriptor?,
|
||||
val allInnerClasses: Map<JetClassOrObject, LightClassDataForKotlinClass>
|
||||
): LightClassDataForKotlinClass
|
||||
|
||||
data class LightClassStubWithData(
|
||||
val javaFileStub: PsiJavaFileStub,
|
||||
val classData: LightClassData
|
||||
)
|
||||
val allInnerClasses: Map<JetClassOrObject, InnerKotlinClassLightClassData>
|
||||
): LightClassDataForKotlinClass, WithFileStub
|
||||
Reference in New Issue
Block a user