diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java index bb65ff6fd75..df8d50a52f7 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java @@ -56,18 +56,18 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; -public class KotlinJavaFileStubProvider implements CachedValueProvider { +public class KotlinJavaFileStubProvider implements CachedValueProvider { @NotNull - public static KotlinJavaFileStubProvider createForPackageClass( + public static KotlinJavaFileStubProvider createForPackageClass( @NotNull final Project project, @NotNull final FqName packageFqName, @NotNull final GlobalSearchScope searchScope ) { - return new KotlinJavaFileStubProvider( + return new KotlinJavaFileStubProvider( project, false, - new StubGenerationStrategy.NoDeclaredClasses() { + new StubGenerationStrategy.NoDeclaredClasses() { @NotNull @Override public LightClassConstructionContext getContext(@NotNull Collection files) { @@ -84,8 +84,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider createForDeclaredClass(@NotNull final JetClassOrObject classOrObject) { + return new KotlinJavaFileStubProvider( classOrObject.getProject(), JetPsiUtil.isLocal(classOrObject), - new StubGenerationStrategy.WithDeclaredClasses() { + new StubGenerationStrategy.WithDeclaredClasses() { private JetFile getFile() { return (JetFile) classOrObject.getContainingFile(); } @@ -122,19 +122,19 @@ public class KotlinJavaFileStubProvider implements CachedValueProvideremptyMap()) + "", classOrObject, null, Collections.emptyMap() ); } String jvmInternalName = CodegenBinding.getJvmInternalName(bindingContext, classDescriptor); Collection allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor); - Map innerClassesMap = ContainerUtil.newHashMap(); + Map innerClassesMap = ContainerUtil.newHashMap(); for (ClassDescriptor innerClassDescriptor : allInnerClasses) { JetClassOrObject innerClass = (JetClassOrObject) BindingContextUtils.descriptorToDeclaration( bindingContext, innerClassDescriptor @@ -146,12 +146,16 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider stubGenerationStrategy; private final boolean local; private KotlinJavaFileStubProvider( @NotNull Project project, boolean local, - @NotNull StubGenerationStrategy stubGenerationStrategy + @NotNull StubGenerationStrategy stubGenerationStrategy ) { this.project = project; this.stubGenerationStrategy = stubGenerationStrategy; @@ -195,7 +199,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider compute() { + public Result compute() { FqName packageFqName = stubGenerationStrategy.getPackageFqName(); Collection files = stubGenerationStrategy.getFiles(); @@ -242,8 +246,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvidercreate( - 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 { @NotNull Collection getFiles(); @NotNull FqName getPackageFqName(); @NotNull LightClassConstructionContext getContext(@NotNull Collection files); - @NotNull LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext); + @NotNull T createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext); boolean generateDeclaredClasses(); void generate(@NotNull GenerationState state, @NotNull Collection files); - abstract class NoDeclaredClasses implements StubGenerationStrategy { + abstract class NoDeclaredClasses implements StubGenerationStrategy { @Override public boolean generateDeclaredClasses() { return false; @@ -324,7 +328,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider implements StubGenerationStrategy { @Override public boolean generateDeclaredClasses() { return true; diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java index 21c77dfc234..be2f3de3d04 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java @@ -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> JAVA_API_STUB = Key.create("JAVA_API_STUB"); + private final static Key> 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); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java index d5697585b32..efe0aca100e 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForPackage.java @@ -48,7 +48,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme private final GlobalSearchScope searchScope; private final Collection files; private final int hashCode; - private final CachedValue javaFileStub; + private final CachedValue 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 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); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt index 175f274fdae..7bc3df8b3fd 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/LightClassStubWithData.kt @@ -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 -): LightClassDataForKotlinClass - -data class LightClassStubWithData( - val javaFileStub: PsiJavaFileStub, - val classData: LightClassData -) \ No newline at end of file + val allInnerClasses: Map +): LightClassDataForKotlinClass, WithFileStub \ No newline at end of file