When building light classes don't resolve irrelevant declarations in the same package

This commit is contained in:
Andrey Breslav
2013-09-26 18:57:00 -07:00
committed by Nikolay Krasko
parent 783258d91a
commit 623b169d71
5 changed files with 62 additions and 42 deletions
@@ -103,22 +103,23 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
module = null;
}
private LightClassConstructionContext analyzeRelevantCode() {
@NotNull
@Override
public LightClassConstructionContext getContextForPackage(@NotNull Collection<JetFile> files) {
return getContext();
}
@NotNull
@Override
public LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject) {
return getContext();
}
@NotNull
private LightClassConstructionContext getContext() {
return new LightClassConstructionContext(getTrace().getBindingContext(), null);
}
@NotNull
@Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection<JetFile> files) {
return analyzeRelevantCode();
}
@NotNull
@Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) {
return analyzeRelevantCode();
}
@NotNull
@Override
public Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope) {
@@ -70,8 +70,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
new StubGenerationStrategy.NoDeclaredClasses() {
@NotNull
@Override
public LightClassConstructionContext createLightClassConstructionContext(@NotNull Collection<JetFile> files) {
return LightClassGenerationSupport.getInstance(project).analyzeRelevantCode(files);
public LightClassConstructionContext getContext(@NotNull Collection<JetFile> files) {
return LightClassGenerationSupport.getInstance(project).getContextForPackage(files);
}
@NotNull
@@ -116,8 +116,8 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
@NotNull
@Override
public LightClassConstructionContext createLightClassConstructionContext(@NotNull Collection<JetFile> files) {
return LightClassGenerationSupport.getInstance(classOrObject.getProject()).analyzeRelevantCode(classOrObject);
public LightClassConstructionContext getContext(@NotNull Collection<JetFile> files) {
return LightClassGenerationSupport.getInstance(classOrObject.getProject()).getContextForClassOrObject(classOrObject);
}
@NotNull
@@ -201,7 +201,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
checkForBuiltIns(packageFqName, files);
LightClassConstructionContext context = stubGenerationStrategy.createLightClassConstructionContext(files);
LightClassConstructionContext context = stubGenerationStrategy.getContext(files);
Throwable error = context.getError();
if (error != null) {
throw new IllegalStateException("failed to analyze: " + error, error);
@@ -242,7 +242,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
throw e;
}
return Result.create(
return Result.<LightClassStubWithData>create(
stubGenerationStrategy.createLightClassStubWithData(javaFileStub, bindingContext),
local ? PsiModificationTracker.MODIFICATION_COUNT : PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
);
@@ -303,11 +303,11 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<LightClas
}
private interface StubGenerationStrategy {
@NotNull LightClassConstructionContext createLightClassConstructionContext(@NotNull Collection<JetFile> files);
@NotNull
LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext);
@NotNull Collection<JetFile> getFiles();
@NotNull FqName getPackageFqName();
@NotNull LightClassConstructionContext getContext(@NotNull Collection<JetFile> files);
@NotNull LightClassStubWithData createLightClassStubWithData(PsiJavaFileStub javaFileStub, BindingContext bindingContext);
boolean generateDeclaredClasses();
void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files);
@@ -36,10 +36,10 @@ public abstract class LightClassGenerationSupport {
}
@NotNull
public abstract LightClassConstructionContext analyzeRelevantCode(@NotNull Collection<JetFile> files);
public abstract LightClassConstructionContext getContextForPackage(@NotNull Collection<JetFile> files);
@NotNull
public abstract LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject);
public abstract LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject);
@NotNull
public abstract Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope);
@@ -97,9 +97,7 @@ public class ModuleDescriptorImpl extends DeclarationDescriptorImpl implements M
@Override
public PackageViewDescriptor getPackage(@NotNull FqName fqName) {
List<PackageFragmentDescriptor> fragments = packageFragmentProvider.getPackageFragments(fqName);
return !fragments.isEmpty()
? new PackageViewDescriptorImpl(this, fqName, fragments)
: null;
return !fragments.isEmpty() ? new PackageViewDescriptorImpl(this, fqName, fragments) : null;
}
@NotNull
@@ -85,7 +85,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
@NotNull
@Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull Collection<JetFile> files) {
public LightClassConstructionContext getContextForPackage(@NotNull Collection<JetFile> files) {
if (files.isEmpty()) {
return new LightClassConstructionContext(BindingContext.EMPTY, null);
}
@@ -97,7 +97,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
try {
if (USE_LAZY) {
ResolveSessionForBodies session = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(sortedFiles.get(0));
forceResolveRelevantDeclarations(files, session);
forceResolvePackageDeclarations(files, session);
return new LightClassConstructionContext(session.getBindingContext(), null);
}
else {
@@ -111,7 +111,36 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
}
}
private static void forceResolveRelevantDeclarations(@NotNull Collection<JetFile> files, @NotNull KotlinCodeAnalyzer session) {
@NotNull
@Override
public LightClassConstructionContext getContextForClassOrObject(@NotNull JetClassOrObject classOrObject) {
Profiler p = Profiler.create((USE_LAZY ? "lazy" : "eager") + " analyze", LOG).start();
try {
if (USE_LAZY) {
ResolveSessionForBodies session = AnalyzerFacadeWithCache.getLazyResolveSessionForFile((JetFile) classOrObject.getContainingFile());
if (JetPsiUtil.isLocal(classOrObject)) {
BindingContext bindingContext = session.resolveToElement(classOrObject);
forceResolveAllContents(bindingContext.get(BindingContext.CLASS, classOrObject));
return new LightClassConstructionContext(bindingContext, null);
}
forceResolveAllContents(session.getClassDescriptor(classOrObject));
return new LightClassConstructionContext(session.getBindingContext(), null);
}
else {
KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project);
return new LightClassConstructionContext(cacheManager.getLightClassContextCache().getLightClassContext(classOrObject), null);
}
}
finally {
p.end();
}
}
private static void forceResolvePackageDeclarations(@NotNull Collection<JetFile> files, @NotNull KotlinCodeAnalyzer session) {
for (JetFile file : files) {
// Scripts are not supported
if (file.isScript()) continue;
@@ -127,11 +156,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
}
for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetClassOrObject) {
ClassDescriptor descriptor = session.getClassDescriptor((JetClassOrObject) declaration);
forceResolveAllContents(descriptor);
}
else if (declaration instanceof JetFunction) {
if (declaration instanceof JetFunction) {
JetFunction jetFunction = (JetFunction) declaration;
Name name = jetFunction.getNameAsSafeName();
Collection<FunctionDescriptor> functions = packageDescriptor.getMemberScope().getFunctions(name);
@@ -147,6 +172,9 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
forceResolveAllContents(descriptor);
}
}
else if (declaration instanceof JetClassOrObject) {
// Do nothing: we are not interested in classes
}
else {
LOG.error("Unsupported declaration kind: " + declaration + " in file " + file.getName() + "\n" + file.getText());
}
@@ -161,13 +189,6 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
}
}
@NotNull
@Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) {
KotlinCacheManager cacheManager = KotlinCacheManager.getInstance(project);
return new LightClassConstructionContext(cacheManager.getLightClassContextCache().getLightClassContext(classOrObject), null);
}
@NotNull
@Override
public Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope) {