"Surround with" uses partial body resolve

This commit is contained in:
Valentin Kipyatkov
2015-03-24 15:55:19 +03:00
parent ff6853f300
commit 4d2a34cc4e
5 changed files with 15 additions and 19 deletions
@@ -20,14 +20,9 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.JetBundle; import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils; import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils;
import org.jetbrains.kotlin.psi.JetBlockExpression; import org.jetbrains.kotlin.psi.JetBlockExpression;
import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.types.JetType;
public class KotlinSurrounderUtils { public class KotlinSurrounderUtils {
public static String SURROUND_WITH = JetBundle.message("surround.with"); public static String SURROUND_WITH = JetBundle.message("surround.with");
@@ -44,12 +39,6 @@ public class KotlinSurrounderUtils {
block.addRangeAfter(statements[0], statements[statements.length - 1], lBrace); block.addRangeAfter(statements[0], statements[statements.length - 1], lBrace);
} }
@Nullable
public static JetType getExpressionType(JetExpression expression) {
BindingContext expressionBindingContext = ResolvePackage.analyze(expression);
return expressionBindingContext.get(BindingContext.EXPRESSION_TYPE, expression);
}
public static void showErrorHint(@NotNull Project project, @NotNull Editor editor, @NotNull String message) { public static void showErrorHint(@NotNull Project project, @NotNull Editor editor, @NotNull String message) {
CodeInsightUtils.showErrorHint(project, editor, message, SURROUND_WITH, null); CodeInsightUtils.showErrorHint(project, editor, message, SURROUND_WITH, null);
} }
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.util.ShortenReferences;
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers; import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import java.util.ArrayList; import java.util.ArrayList;
@@ -116,9 +117,9 @@ public class MoveDeclarationsOutHelper {
@NotNull @NotNull
private static JetType getPropertyType(@NotNull JetProperty property) { private static JetType getPropertyType(@NotNull JetProperty property) {
BindingContext expressionBindingContext = ResolvePackage.analyze(property); BindingContext bindingContext = ResolvePackage.analyze(property, BodyResolveMode.PARTIAL);
VariableDescriptor propertyDescriptor = expressionBindingContext.get(BindingContext.VARIABLE, property); VariableDescriptor propertyDescriptor = bindingContext.get(BindingContext.VARIABLE, property);
assert propertyDescriptor != null : "Couldn't resolve property to property descriptor " + property.getText(); assert propertyDescriptor != null : "Couldn't resolve property to property descriptor " + property.getText();
return propertyDescriptor.getType(); return propertyDescriptor.getType();
} }
@@ -24,10 +24,12 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.idea.codeInsight.surroundWith.KotlinSurrounderUtils; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.psi.JetCallExpression; import org.jetbrains.kotlin.psi.JetCallExpression;
import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetQualifiedExpression; import org.jetbrains.kotlin.psi.JetQualifiedExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
public abstract class KotlinExpressionSurrounder implements Surrounder { public abstract class KotlinExpressionSurrounder implements Surrounder {
@@ -42,7 +44,7 @@ public abstract class KotlinExpressionSurrounder implements Surrounder {
if (expression instanceof JetCallExpression && expression.getParent() instanceof JetQualifiedExpression) { if (expression instanceof JetCallExpression && expression.getParent() instanceof JetQualifiedExpression) {
return false; return false;
} }
JetType type = KotlinSurrounderUtils.getExpressionType(expression); JetType type = ResolvePackage.analyze(expression, BodyResolveMode.PARTIAL).get(BindingContext.EXPRESSION_TYPE, expression);
if (type == null || type.equals(KotlinBuiltIns.getInstance().getUnitType())) { if (type == null || type.equals(KotlinBuiltIns.getInstance().getUnitType())) {
return false; return false;
} }
@@ -24,10 +24,12 @@ import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.idea.codeInsight.surroundWith.KotlinSurrounderUtils; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetParenthesizedExpression; import org.jetbrains.kotlin.psi.JetParenthesizedExpression;
import org.jetbrains.kotlin.psi.JetPrefixExpression; import org.jetbrains.kotlin.psi.JetPrefixExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory; import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory;
@@ -40,7 +42,7 @@ public class KotlinNotSurrounder extends KotlinExpressionSurrounder {
@Override @Override
public boolean isApplicable(@NotNull JetExpression expression) { public boolean isApplicable(@NotNull JetExpression expression) {
JetType type = KotlinSurrounderUtils.getExpressionType(expression); JetType type = ResolvePackage.analyze(expression, BodyResolveMode.PARTIAL).get(BindingContext.EXPRESSION_TYPE, expression);
return KotlinBuiltIns.getInstance().getBooleanType().equals(type); return KotlinBuiltIns.getInstance().getBooleanType().equals(type);
} }
@@ -26,11 +26,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.ClassKind; import org.jetbrains.kotlin.descriptors.ClassKind;
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor; import org.jetbrains.kotlin.descriptors.ClassifierDescriptor;
import org.jetbrains.kotlin.idea.JetBundle; import org.jetbrains.kotlin.idea.JetBundle;
import org.jetbrains.kotlin.idea.codeInsight.surroundWith.KotlinSurrounderUtils; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetWhenCondition; import org.jetbrains.kotlin.psi.JetWhenCondition;
import org.jetbrains.kotlin.psi.JetWhenEntry; import org.jetbrains.kotlin.psi.JetWhenEntry;
import org.jetbrains.kotlin.psi.JetWhenExpression; import org.jetbrains.kotlin.psi.JetWhenExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory; import static org.jetbrains.kotlin.psi.PsiPackage.JetPsiFactory;
@@ -68,7 +70,7 @@ public class KotlinWhenSurrounder extends KotlinExpressionSurrounder {
} }
private String getCodeTemplate(JetExpression expression) { private String getCodeTemplate(JetExpression expression) {
JetType type = KotlinSurrounderUtils.getExpressionType(expression); JetType type = ResolvePackage.analyze(expression, BodyResolveMode.PARTIAL).get(BindingContext.EXPRESSION_TYPE, expression);
if (type != null) { if (type != null) {
ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor(); ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == ClassKind.ENUM_CLASS) { if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == ClassKind.ENUM_CLASS) {