Force activating post processing actions in order to initialize built-ins properly

This commit is contained in:
Nikolay Krasko
2013-03-22 00:05:02 +04:00
parent 53944242df
commit 70965334b1
7 changed files with 44 additions and 8 deletions
@@ -54,7 +54,7 @@ public class AddOpenModifierToClassDeclarationFix extends JetIntentionAction<Jet
PsiReference reference = referenceExpression.getReference();
if (reference != null) {
PsiElement target = reference.resolve();
if (target instanceof JetClass && target.isWritable()) {
if (target instanceof JetClass && QuickFixUtil.canModifyElement(target)) {
classDeclaration = (JetClass) target;
return !(classDeclaration.isEnum() || classDeclaration.isTrait());
}
@@ -65,7 +65,7 @@ public class MakeClassAnAnnotationClassFix extends JetIntentionAction<JetAnnotat
PsiElement target = reference.resolve();
if (target instanceof JetClass) {
annotationClass = (JetClass) target;
return annotationClass.isWritable();
return QuickFixUtil.canModifyElement(annotationClass);
}
}
@@ -34,7 +34,9 @@ import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.lexer.JetTokens.OPEN_KEYWORD;
@@ -64,7 +66,7 @@ public class MakeOverriddenMemberOpenFix extends JetIntentionAction<JetDeclarati
if (!overriddenDescriptor.getModality().isOverridable()) {
PsiElement overriddenMember =
BindingContextUtils.descriptorToDeclaration(resolveSession.getBindingContext(), overriddenDescriptor);
if (overriddenMember == null || !overriddenMember.isWritable()) {
if (overriddenMember == null || !QuickFixUtil.canModifyElement(overriddenMember)) {
return false;
}
String containingDeclarationName = overriddenDescriptor.getContainingDeclaration().getName().getName();
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
@@ -32,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.DeferredType;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver;
import static org.jetbrains.jet.plugin.project.AnalyzeSingleFileUtil.getContextForSingleFile;
@@ -88,4 +90,8 @@ public class QuickFixUtil {
}
return matchingReturnType;
}
public static boolean canModifyElement(@NotNull PsiElement element) {
return element.isWritable() && !BuiltInsReferenceResolver.isFromBuiltIns(element);
}
}
@@ -18,7 +18,10 @@ package org.jetbrains.jet.plugin.references;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Sets;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.vfs.VfsUtil;
@@ -51,9 +54,11 @@ import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class BuiltInsReferenceResolver extends AbstractProjectComponent {
private BindingContext bindingContext = null;
private Set<? extends PsiFile> builtInsSources = Sets.newHashSet();
public BuiltInsReferenceResolver(
Project project,
@@ -85,9 +90,10 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
scope.changeLockLevel(WritableScope.LockLevel.BOTH);
jetNamespace.setMemberScope(scope);
TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace,
getJetFiles("jet", Predicates.<JetFile>alwaysTrue()));
List<JetFile> jetBuiltInsFiles = getJetFiles("jet", Predicates.<JetFile>alwaysTrue());
TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, jetBuiltInsFiles);
builtInsSources = Sets.newHashSet(jetBuiltInsFiles);
bindingContext = context.getBindingContext();
}
@@ -170,9 +176,9 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
}
@NotNull
public Collection<PsiElement> resolveStandardLibrarySymbol(@NotNull BindingContext originalContext,
@Nullable JetReferenceExpression referenceExpression) {
public Collection<PsiElement> resolveStandardLibrarySymbol(@NotNull BindingContext originalContext, @Nullable JetReferenceExpression referenceExpression) {
if (bindingContext == null) {
assert DumbService.getInstance(myProject).isDumb() : "Builtins component wasn't initialized properly";
return Collections.emptyList();
}
@@ -184,6 +190,7 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
@NotNull
public Collection<PsiElement> resolveStandardLibrarySymbol(@NotNull DeclarationDescriptor declarationDescriptor) {
if (bindingContext == null) {
assert DumbService.getInstance(myProject).isDumb() : "Builtins component wasn't initialized properly";
return Collections.emptyList();
}
@@ -197,6 +204,11 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent {
return Collections.emptyList();
}
public static boolean isFromBuiltIns(@NotNull PsiElement element) {
assert ApplicationManager.getApplication().isUnitTestMode() : "In non tested mode element.isWritable() should be sufficient";
return element.getProject().getComponent(BuiltInsReferenceResolver.class).builtInsSources.contains(element.getContainingFile());
}
@Nullable
private static JetScope getMemberScope(@Nullable DeclarationDescriptor parent) {
if (parent instanceof ClassDescriptor) {
@@ -16,10 +16,12 @@
package org.jetbrains.jet.plugin.importOptimizer;
import com.intellij.ide.startup.impl.StartupManagerImpl;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.UndoConfirmationPolicy;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.testFramework.LightCodeInsightTestCase;
import org.apache.commons.lang.SystemUtils;
import org.jetbrains.jet.plugin.PluginTestCaseBase;
@@ -29,6 +31,12 @@ import org.jetbrains.jet.testing.ConfigLibraryUtil;
import java.io.File;
public class OptimizeImportsTest extends LightCodeInsightTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities();
}
public void testAlreadyOptimized() throws Exception {
doTest();
}
@@ -18,8 +18,10 @@ package org.jetbrains.jet.plugin.quickfix;
import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.ide.startup.impl.StartupManagerImpl;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Pair;
import org.apache.commons.lang.SystemUtils;
import org.jetbrains.annotations.NotNull;
@@ -31,6 +33,12 @@ import org.jetbrains.jet.testing.ConfigLibraryUtil;
import java.util.List;
public abstract class AbstractQuickFixTest extends LightQuickFixTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
((StartupManagerImpl) StartupManager.getInstance(getProject())).runPostStartupActivities();
}
protected void doTest(@NotNull String beforeFileName) throws Exception {
boolean isWithRuntime = beforeFileName.endsWith("Runtime.kt");