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:
+21
-10
@@ -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);
|
||||
|
||||
+1
-1
@@ -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
|
||||
Reference in New Issue
Block a user