Report clashing signatures in the IDE

Expose extra diagnostics about platform signature clashes from light class data

 #KT-1 In Progress
This commit is contained in:
Andrey Breslav
2014-05-25 13:22:30 +02:00
parent 9b3f9fb70d
commit d25b2459d4
15 changed files with 210 additions and 24 deletions
@@ -52,13 +52,14 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.Diagnostics;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
public class KotlinJavaFileStubProvider<T extends WithFileStub> implements CachedValueProvider<T> {
public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostics> implements CachedValueProvider<T> {
@NotNull
public static KotlinJavaFileStubProvider<KotlinPackageLightClassData> createForPackageClass(
@@ -86,8 +87,12 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
@NotNull
@Override
public KotlinPackageLightClassData createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
return new KotlinPackageLightClassData(javaFileStub);
public KotlinPackageLightClassData createLightClassData(
PsiJavaFileStub javaFileStub,
BindingContext bindingContext,
Diagnostics extraDiagnostics
) {
return new KotlinPackageLightClassData(javaFileStub, extraDiagnostics);
}
@NotNull
@@ -134,11 +139,15 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
@NotNull
@Override
public OutermostKotlinClassLightClassData createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext) {
public OutermostKotlinClassLightClassData createLightClassData(
PsiJavaFileStub javaFileStub,
BindingContext bindingContext,
Diagnostics extraDiagnostics
) {
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject);
if (classDescriptor == null) {
return new OutermostKotlinClassLightClassData(
javaFileStub,
javaFileStub, extraDiagnostics,
"", classOrObject, null, Collections.<JetClassOrObject, InnerKotlinClassLightClassData>emptyMap()
);
}
@@ -164,6 +173,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
return new OutermostKotlinClassLightClassData(
javaFileStub,
extraDiagnostics,
jvmInternalName,
classOrObject,
classDescriptor,
@@ -264,6 +274,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
PsiJavaFileStub javaFileStub = createJavaFileStub(packageFqName, getRepresentativeVirtualFile(files));
BindingContext bindingContext;
BindingTraceContext forExtraDiagnostics = new BindingTraceContext();
try {
Stack<StubElement> stubStack = new Stack<StubElement>();
stubStack.push(javaFileStub);
@@ -280,7 +291,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
/*to generate inline flag on methods*/true,
null,
null,
new BindingTraceContext() // TODO
forExtraDiagnostics
);
state.beforeCompile();
@@ -292,7 +303,6 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
if (pop != javaFileStub) {
LOG.error("Unbalanced stack operations: " + pop);
}
}
catch (ProcessCanceledException e) {
throw e;
@@ -302,8 +312,9 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
throw e;
}
Diagnostics extraDiagnostics = forExtraDiagnostics.getBindingContext().getDiagnostics();
return Result.create(
stubGenerationStrategy.createLightClassData(javaFileStub, bindingContext),
stubGenerationStrategy.createLightClassData(javaFileStub, bindingContext, extraDiagnostics),
local ? PsiModificationTracker.MODIFICATION_COUNT : PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
);
}
@@ -362,12 +373,12 @@ public class KotlinJavaFileStubProvider<T extends WithFileStub> implements Cache
cause);
}
private interface StubGenerationStrategy<T extends WithFileStub> {
private interface StubGenerationStrategy<T extends WithFileStubAndExtraDiagnostics> {
@NotNull Collection<JetFile> getFiles();
@NotNull FqName getPackageFqName();
@NotNull LightClassConstructionContext getContext(@NotNull Collection<JetFile> files);
@NotNull T createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext);
@NotNull T createLightClassData(PsiJavaFileStub javaFileStub, BindingContext bindingContext, Diagnostics extraDiagnostics);
GenerationState.GenerateClassFilter getGenerateClassFilter();
void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files);
@@ -251,7 +251,7 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
}
@NotNull
private static OutermostKotlinClassLightClassData getLightClassData(JetClassOrObject classOrObject) {
public static OutermostKotlinClassLightClassData getLightClassData(JetClassOrObject classOrObject) {
JetClassOrObject outermostClassOrObject = getOutermostClassOrObject(classOrObject);
return CachedValuesManager.getManager(classOrObject.getProject()).getCachedValue(
outermostClassOrObject,
@@ -19,11 +19,14 @@ package org.jetbrains.jet.asJava
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.resolve.Diagnostics
trait LightClassData
trait WithFileStub {
trait WithFileStubAndExtraDiagnostics {
val javaFileStub: PsiJavaFileStub
val extraDiagnostics: Diagnostics
}
trait LightClassDataForKotlinClass: LightClassData {
@@ -33,8 +36,9 @@ trait LightClassDataForKotlinClass: LightClassData {
}
data class KotlinPackageLightClassData(
override val javaFileStub: PsiJavaFileStub
): LightClassData, WithFileStub
override val javaFileStub: PsiJavaFileStub,
override val extraDiagnostics: Diagnostics
): LightClassData, WithFileStubAndExtraDiagnostics
data class InnerKotlinClassLightClassData(
override val jvmInternalName: String,
@@ -44,8 +48,9 @@ data class InnerKotlinClassLightClassData(
data class OutermostKotlinClassLightClassData(
override val javaFileStub: PsiJavaFileStub,
override val extraDiagnostics: Diagnostics,
override val jvmInternalName: String,
override val classOrObject: JetClassOrObject,
override val descriptor: ClassDescriptor?,
val allInnerClasses: Map<JetClassOrObject, InnerKotlinClassLightClassData>
): LightClassDataForKotlinClass, WithFileStub
): LightClassDataForKotlinClass, WithFileStubAndExtraDiagnostics