Removing unnecessary uses of analyzeFully

This commit is contained in:
Valentin Kipyatkov
2015-06-01 19:49:10 +03:00
parent cd68cefba1
commit 4169a78e6f
17 changed files with 39 additions and 71 deletions
@@ -44,6 +44,7 @@ public fun JetFile.resolveImportReference(fqName: FqName, isDefaultImport: Boole
// analyze - see ResolveSessionForBodies, ResolveElementCache // analyze - see ResolveSessionForBodies, ResolveElementCache
// analyzeFully - see KotlinResolveCache, KotlinResolveDataProvider // analyzeFully - see KotlinResolveCache, KotlinResolveDataProvider
// In the future these two approaches should be unified // In the future these two approaches should be unified
@jvmOverloads
public fun JetElement.analyze(bodyResolveMode: BodyResolveMode = BodyResolveMode.FULL): BindingContext { public fun JetElement.analyze(bodyResolveMode: BodyResolveMode = BodyResolveMode.FULL): BindingContext {
return getResolutionFacade().analyze(this, bodyResolveMode) return getResolutionFacade().analyze(this, bodyResolveMode)
} }
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
@@ -62,8 +61,7 @@ public class QuickFixUtil {
public static JetType getDeclarationReturnType(JetNamedDeclaration declaration) { public static JetType getDeclarationReturnType(JetNamedDeclaration declaration) {
PsiFile file = declaration.getContainingFile(); PsiFile file = declaration.getContainingFile();
if (!(file instanceof JetFile)) return null; if (!(file instanceof JetFile)) return null;
BindingContext bindingContext = ResolvePackage.analyzeFully((JetFile) file); DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(declaration);
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
if (!(descriptor instanceof CallableDescriptor)) return null; if (!(descriptor instanceof CallableDescriptor)) return null;
JetType type = ((CallableDescriptor) descriptor).getReturnType(); JetType type = ((CallableDescriptor) descriptor).getReturnType();
if (type instanceof DeferredType) { if (type instanceof DeferredType) {
@@ -73,12 +71,7 @@ public class QuickFixUtil {
} }
@Nullable @Nullable
public static JetType findLowerBoundOfOverriddenCallablesReturnTypes(BindingContext context, JetDeclaration callable) { public static JetType findLowerBoundOfOverriddenCallablesReturnTypes(@NotNull CallableDescriptor descriptor) {
DeclarationDescriptor descriptor = context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, callable);
if (!(descriptor instanceof CallableDescriptor)) {
return null;
}
JetType matchingReturnType = null; JetType matchingReturnType = null;
for (CallableDescriptor overriddenDescriptor : ((CallableDescriptor) descriptor).getOverriddenDescriptors()) { for (CallableDescriptor overriddenDescriptor : ((CallableDescriptor) descriptor).getOverriddenDescriptors()) {
JetType overriddenReturnType = overriddenDescriptor.getReturnType(); JetType overriddenReturnType = overriddenDescriptor.getReturnType();
@@ -32,8 +32,7 @@ public class JetTypeDeclarationProvider implements TypeDeclarationProvider {
@Override @Override
public PsiElement[] getSymbolTypeDeclarations(PsiElement symbol) { public PsiElement[] getSymbolTypeDeclarations(PsiElement symbol) {
if (symbol instanceof JetElement && symbol.getContainingFile() instanceof JetFile) { if (symbol instanceof JetElement && symbol.getContainingFile() instanceof JetFile) {
BindingContext bindingContext = BindingContext bindingContext = ResolvePackage.analyze((JetElement)symbol);
ResolvePackage.analyzeFully((JetFile) symbol.getContainingFile());
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, symbol); DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, symbol);
if (descriptor instanceof CallableDescriptor) { if (descriptor instanceof CallableDescriptor) {
JetType type = ((CallableDescriptor) descriptor).getReturnType(); JetType type = ((CallableDescriptor) descriptor).getReturnType();
@@ -29,20 +29,16 @@ import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.util.ProgressWindowWithNotification import com.intellij.openapi.progress.util.ProgressWindowWithNotification
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.psi.JetCodeFragment import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinRuntimeTypeEvaluator import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinRuntimeTypeEvaluator
import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.JetBinaryExpressionWithTypeRHS
import org.jetbrains.kotlin.idea.util.ShortenReferences import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.psi.JetParenthesizedExpression import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.checker.JetTypeChecker import org.jetbrains.kotlin.types.checker.JetTypeChecker
import org.jetbrains.kotlin.idea.JetBundle
public class KotlinRuntimeTypeCastSurrounder: KotlinExpressionSurrounder() { public class KotlinRuntimeTypeCastSurrounder: KotlinExpressionSurrounder() {
@@ -51,9 +47,7 @@ public class KotlinRuntimeTypeCastSurrounder: KotlinExpressionSurrounder() {
val file = expression.getContainingFile() val file = expression.getContainingFile()
if (file !is JetCodeFragment) return false if (file !is JetCodeFragment) return false
val context = file.analyzeFully() val type = expression.analyze(BodyResolveMode.PARTIAL).getType(expression) ?: return false
val type = context.getType(expression)
if (type == null) return false
return TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, type) return TypeUtils.canHaveSubtypes(JetTypeChecker.DEFAULT, type)
} }
@@ -69,7 +69,7 @@ public class KotlinTypeHierarchyProvider extends JavaTypeHierarchyProvider {
else if (target instanceof JetNamedFunction) { else if (target instanceof JetNamedFunction) {
JetNamedFunction function = (JetNamedFunction) target; JetNamedFunction function = (JetNamedFunction) target;
String functionName = function.getName(); String functionName = function.getName();
FunctionDescriptor functionDescriptor = ResolvePackage.analyzeFully(function) FunctionDescriptor functionDescriptor = ResolvePackage.analyze(function)
.get(BindingContext.FUNCTION, target); .get(BindingContext.FUNCTION, target);
if (functionDescriptor != null) { if (functionDescriptor != null) {
JetType type = functionDescriptor.getReturnType(); JetType type = functionDescriptor.getReturnType();
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.codeInsight.intention.LowPriorityAction
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
import org.jetbrains.kotlin.idea.core.moveInsideParentheses import org.jetbrains.kotlin.idea.core.moveInsideParentheses
import org.jetbrains.kotlin.psi.JetFunctionLiteralArgument import org.jetbrains.kotlin.psi.JetFunctionLiteralArgument
@@ -29,7 +30,7 @@ public class MoveLambdaInsideParenthesesIntention : JetSelfTargetingIntention<Je
} }
override fun applyTo(element: JetFunctionLiteralArgument, editor: Editor) { override fun applyTo(element: JetFunctionLiteralArgument, editor: Editor) {
element.moveInsideParentheses(element.analyzeFully()) element.moveInsideParentheses(element.analyze())
} }
} }
@@ -63,8 +63,8 @@ public class SpecifyTypeExplicitlyIntention : JetSelfTargetingIntention<JetCalla
} }
private fun hasPublicMemberDiagnostic(declaration: JetNamedDeclaration): Boolean { private fun hasPublicMemberDiagnostic(declaration: JetNamedDeclaration): Boolean {
return declaration.getContainingJetFile().analyzeFully().getDiagnostics() return declaration.analyze().getDiagnostics().forElement(declaration)
.any { Errors.PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE == it.getFactory() && declaration == it.getPsiElement() } .any { it.getFactory() == Errors.PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE }
} }
override fun applyTo(element: JetCallableDeclaration, editor: Editor) { override fun applyTo(element: JetCallableDeclaration, editor: Editor) {
@@ -71,7 +71,7 @@ public class AddNameToArgumentFix extends JetIntentionAction<JetValueArgument> {
JetCallElement callElement = PsiTreeUtil.getParentOfType(argument, JetCallElement.class); JetCallElement callElement = PsiTreeUtil.getParentOfType(argument, JetCallElement.class);
assert callElement != null : "The argument has to be inside a function or constructor call"; assert callElement != null : "The argument has to be inside a function or constructor call";
BindingContext context = ResolvePackage.analyzeFully(argument.getContainingJetFile()); BindingContext context = ResolvePackage.analyze(argument);
ResolvedCall<?> resolvedCall = CallUtilPackage.getResolvedCall(callElement, context); ResolvedCall<?> resolvedCall = CallUtilPackage.getResolvedCall(callElement, context);
if (resolvedCall == null) return Collections.emptyList(); if (resolvedCall == null) return Collections.emptyList();
@@ -28,10 +28,9 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2;
import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.diagnostics.Errors;
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.caches.resolve.ResolvePackage;
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.idea.util.ShortenReferences;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.checker.JetTypeChecker; import org.jetbrains.kotlin.types.checker.JetTypeChecker;
@@ -64,8 +63,7 @@ public class CastExpressionFix extends JetIntentionAction<JetExpression> {
@Override @Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
if (!super.isAvailable(project, editor, file)) return false; if (!super.isAvailable(project, editor, file)) return false;
BindingContext context = ResolvePackage.analyzeFully((JetFile) file); JetType expressionType = ResolvePackage.analyze(element).getType(element);
JetType expressionType = context.getType(element);
return expressionType != null && JetTypeChecker.DEFAULT.isSubtypeOf(type, expressionType); return expressionType != null && JetTypeChecker.DEFAULT.isSubtypeOf(type, expressionType);
} }
@@ -27,7 +27,6 @@ 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.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.Diagnostic;
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.caches.resolve.ResolvePackage;
@@ -138,7 +137,7 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
@Override @Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) { public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
JetMultiDeclarationEntry entry = getMultiDeclarationEntryThatTypeMismatchComponentFunction(diagnostic); JetMultiDeclarationEntry entry = getMultiDeclarationEntryThatTypeMismatchComponentFunction(diagnostic);
BindingContext context = ResolvePackage.analyzeFully((JetFile) entry.getContainingFile().getContainingFile()); BindingContext context = ResolvePackage.analyze(entry);
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry); ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry);
if (resolvedCall == null) return null; if (resolvedCall == null) return null;
JetFunction componentFunction = (JetFunction) DescriptorToSourceUtils JetFunction componentFunction = (JetFunction) DescriptorToSourceUtils
@@ -160,7 +159,7 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
public IntentionAction createAction(@NotNull Diagnostic diagnostic) { public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
JetExpression expression = QuickFixUtil.getParentElementOfType(diagnostic, JetExpression.class); JetExpression expression = QuickFixUtil.getParentElementOfType(diagnostic, JetExpression.class);
assert expression != null : "HAS_NEXT_FUNCTION_TYPE_MISMATCH reported on element that is not within any expression"; assert expression != null : "HAS_NEXT_FUNCTION_TYPE_MISMATCH reported on element that is not within any expression";
BindingContext context = ResolvePackage.analyzeFully(expression.getContainingJetFile()); BindingContext context = ResolvePackage.analyze(expression);
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.LOOP_RANGE_HAS_NEXT_RESOLVED_CALL, expression); ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.LOOP_RANGE_HAS_NEXT_RESOLVED_CALL, expression);
if (resolvedCall == null) return null; if (resolvedCall == null) return null;
JetFunction hasNextFunction = (JetFunction) DescriptorToSourceUtils JetFunction hasNextFunction = (JetFunction) DescriptorToSourceUtils
@@ -181,7 +180,7 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
public IntentionAction createAction(@NotNull Diagnostic diagnostic) { public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
JetBinaryExpression expression = QuickFixUtil.getParentElementOfType(diagnostic, JetBinaryExpression.class); JetBinaryExpression expression = QuickFixUtil.getParentElementOfType(diagnostic, JetBinaryExpression.class);
assert expression != null : "COMPARE_TO_TYPE_MISMATCH reported on element that is not within any expression"; assert expression != null : "COMPARE_TO_TYPE_MISMATCH reported on element that is not within any expression";
BindingContext context = ResolvePackage.analyzeFully(expression.getContainingJetFile()); BindingContext context = ResolvePackage.analyze(expression);
ResolvedCall<?> resolvedCall = CallUtilPackage.getResolvedCall(expression, context); ResolvedCall<?> resolvedCall = CallUtilPackage.getResolvedCall(expression, context);
if (resolvedCall == null) return null; if (resolvedCall == null) return null;
PsiElement compareTo = DescriptorToSourceUtils.descriptorToDeclaration(resolvedCall.getCandidateDescriptor()); PsiElement compareTo = DescriptorToSourceUtils.descriptorToDeclaration(resolvedCall.getCandidateDescriptor());
@@ -201,14 +200,13 @@ public class ChangeFunctionReturnTypeFix extends JetIntentionAction<JetFunction>
JetFunction function = QuickFixUtil.getParentElementOfType(diagnostic, JetFunction.class); JetFunction function = QuickFixUtil.getParentElementOfType(diagnostic, JetFunction.class);
if (function != null) { if (function != null) {
BindingContext context = ResolvePackage.analyzeFully(function); FunctionDescriptor descriptor = (FunctionDescriptor)ResolvePackage.resolveToDescriptor(function);
JetType matchingReturnType = QuickFixUtil.findLowerBoundOfOverriddenCallablesReturnTypes(context, function);
JetType matchingReturnType = QuickFixUtil.findLowerBoundOfOverriddenCallablesReturnTypes(descriptor);
if (matchingReturnType != null) { if (matchingReturnType != null) {
actions.add(new ChangeFunctionReturnTypeFix(function, matchingReturnType)); actions.add(new ChangeFunctionReturnTypeFix(function, matchingReturnType));
} }
SimpleFunctionDescriptor descriptor = context.get(BindingContext.FUNCTION, function);
if (descriptor == null) return actions;
JetType functionType = descriptor.getReturnType(); JetType functionType = descriptor.getReturnType();
if (functionType == null) return actions; if (functionType == null) return actions;
@@ -172,9 +172,7 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
DiagnosticWithParameters2<JetFunction, Integer, List<JetType>> diagnosticWithParameters = DiagnosticWithParameters2<JetFunction, Integer, List<JetType>> diagnosticWithParameters =
EXPECTED_PARAMETERS_NUMBER_MISMATCH.cast(diagnostic); EXPECTED_PARAMETERS_NUMBER_MISMATCH.cast(diagnostic);
JetFunction functionLiteral = diagnosticWithParameters.getPsiElement(); JetFunction functionLiteral = diagnosticWithParameters.getPsiElement();
BindingContext bindingContext = DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(functionLiteral);
ResolvePackage.analyzeFully(functionLiteral.getContainingJetFile());
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, functionLiteral);
if (descriptor instanceof FunctionDescriptor && functionLiteral instanceof JetFunctionLiteral) { if (descriptor instanceof FunctionDescriptor && functionLiteral instanceof JetFunctionLiteral) {
return new ChangeFunctionLiteralSignatureFix((JetFunctionLiteral) functionLiteral, (FunctionDescriptor) descriptor, return new ChangeFunctionLiteralSignatureFix((JetFunctionLiteral) functionLiteral, (FunctionDescriptor) descriptor,
@@ -227,8 +225,6 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
return null; return null;
} }
BindingContext bindingContext =
ResolvePackage.analyzeFully((JetFile) context.getContainingFile());
if (descriptor instanceof ValueParameterDescriptor) { if (descriptor instanceof ValueParameterDescriptor) {
return new RemoveFunctionParametersFix(context, functionDescriptor, (ValueParameterDescriptor) descriptor); return new RemoveFunctionParametersFix(context, functionDescriptor, (ValueParameterDescriptor) descriptor);
} }
@@ -237,6 +233,7 @@ public abstract class ChangeFunctionSignatureFix extends JetIntentionAction<PsiE
List<? extends ValueArgument> arguments = callElement.getValueArguments(); List<? extends ValueArgument> arguments = callElement.getValueArguments();
if (arguments.size() > parameters.size()) { if (arguments.size() > parameters.size()) {
BindingContext bindingContext = ResolvePackage.analyze(callElement);
boolean hasTypeMismatches = hasTypeMismatches(parameters, arguments, bindingContext); boolean hasTypeMismatches = hasTypeMismatches(parameters, arguments, bindingContext);
return new AddFunctionParametersFix(callElement, functionDescriptor, hasTypeMismatches); return new AddFunctionParametersFix(callElement, functionDescriptor, hasTypeMismatches);
} }
@@ -48,7 +48,6 @@ import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder; import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder;
import org.jetbrains.kotlin.renderer.NameShortness; import org.jetbrains.kotlin.renderer.NameShortness;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.FunctionDescriptorUtil; import org.jetbrains.kotlin.resolve.FunctionDescriptorUtil;
import org.jetbrains.kotlin.resolve.VisibilityUtil; import org.jetbrains.kotlin.resolve.VisibilityUtil;
import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.resolve.scopes.JetScope;
@@ -118,9 +117,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction<JetNamedFunc
return Collections.emptyList(); return Collections.emptyList();
} }
BindingContext context = ResolvePackage.analyzeFully(functionElement); FunctionDescriptor functionDescriptor = (FunctionDescriptor) ResolvePackage.resolveToDescriptor(functionElement);
FunctionDescriptor functionDescriptor = context.get(BindingContext.FUNCTION, functionElement);
if (functionDescriptor == null) return Lists.newArrayList();
List<FunctionDescriptor> superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor); List<FunctionDescriptor> superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor);
final Map<String, FunctionDescriptor> possibleSignatures = Maps.newHashMap(); final Map<String, FunctionDescriptor> possibleSignatures = Maps.newHashMap();
for (FunctionDescriptor superFunction : superFunctions) { for (FunctionDescriptor superFunction : superFunctions) {
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers;
import org.jetbrains.kotlin.idea.util.ShortenReferences; import org.jetbrains.kotlin.idea.util.ShortenReferences;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
@@ -117,7 +116,7 @@ public class ChangeVariableTypeFix extends JetIntentionAction<JetVariableDeclara
@Override @Override
public IntentionAction createAction(@NotNull Diagnostic diagnostic) { public IntentionAction createAction(@NotNull Diagnostic diagnostic) {
JetMultiDeclarationEntry entry = ChangeFunctionReturnTypeFix.getMultiDeclarationEntryThatTypeMismatchComponentFunction(diagnostic); JetMultiDeclarationEntry entry = ChangeFunctionReturnTypeFix.getMultiDeclarationEntryThatTypeMismatchComponentFunction(diagnostic);
BindingContext context = ResolvePackage.analyzeFully(entry.getContainingJetFile()); BindingContext context = ResolvePackage.analyze(entry);
ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry); ResolvedCall<FunctionDescriptor> resolvedCall = context.get(BindingContext.COMPONENT_RESOLVED_CALL, entry);
if (resolvedCall == null) return null; if (resolvedCall == null) return null;
JetFunction componentFunction = (JetFunction) DescriptorToSourceUtils JetFunction componentFunction = (JetFunction) DescriptorToSourceUtils
@@ -139,18 +138,12 @@ public class ChangeVariableTypeFix extends JetIntentionAction<JetVariableDeclara
if (diagnostic.getPsiElement() instanceof JetProperty) { if (diagnostic.getPsiElement() instanceof JetProperty) {
JetProperty property = (JetProperty) diagnostic.getPsiElement(); JetProperty property = (JetProperty) diagnostic.getPsiElement();
BindingContext context = ResolvePackage.analyzeFully(property.getContainingJetFile()); DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(property);
JetType lowerBoundOfOverriddenPropertiesTypes = QuickFixUtil.findLowerBoundOfOverriddenCallablesReturnTypes(context, property); if (!(descriptor instanceof PropertyDescriptor)) return actions;
DeclarationDescriptor descriptor = context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
if (!(descriptor instanceof PropertyDescriptor)) {
// Probably can happen in incomplete code.
LOG.error("Property descriptor is expected: " + PsiUtilPackage.getElementTextWithContext(property));
return actions;
}
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
JetType lowerBoundOfOverriddenPropertiesTypes = QuickFixUtil.findLowerBoundOfOverriddenCallablesReturnTypes(propertyDescriptor);
JetType propertyType = propertyDescriptor.getReturnType(); JetType propertyType = propertyDescriptor.getReturnType();
assert propertyType != null : "Property type cannot be null if it mismatch something"; assert propertyType != null : "Property type cannot be null if it mismatch something";
@@ -73,7 +73,7 @@ public class ChangeVisibilityModifierFix extends JetIntentionAction<JetModifierL
@Nullable @Nullable
private JetModifierKeywordToken findVisibilityChangeTo(JetFile file) { private JetModifierKeywordToken findVisibilityChangeTo(JetFile file) {
BindingContext bindingContext = ResolvePackage.analyzeFully(file); BindingContext bindingContext = ResolvePackage.analyze(element);
DeclarationDescriptor descriptor; DeclarationDescriptor descriptor;
if (element instanceof JetParameter) { if (element instanceof JetParameter) {
descriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, element); descriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, element);
@@ -23,7 +23,8 @@ import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.JetBundle import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.quickfix.quickfixUtil.createIntentionForFirstParentOfType import org.jetbrains.kotlin.idea.quickfix.quickfixUtil.createIntentionForFirstParentOfType
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.psi.JetClass import org.jetbrains.kotlin.psi.JetClass
@@ -43,9 +44,8 @@ public class InsertDelegationCallQuickfix(val isThis: Boolean, element: JetSecon
override fun invoke(project: Project, editor: Editor?, file: JetFile?) { override fun invoke(project: Project, editor: Editor?, file: JetFile?) {
val newDelegationCall = element.replaceImplicitDelegationCallWithExplicit(isThis) val newDelegationCall = element.replaceImplicitDelegationCallWithExplicit(isThis)
val context = element.analyzeFully() val resolvedCall = newDelegationCall.getResolvedCall(newDelegationCall.analyze())
val resolvedCall = newDelegationCall.getResolvedCall(context) val descriptor = element.resolveToDescriptor()
val descriptor = element.descriptor
// if empty call is ok and it's resolved to another constructor, do not move caret // if empty call is ok and it's resolved to another constructor, do not move caret
if (resolvedCall?.getStatus()?.isSuccess() ?: false && resolvedCall!!.getCandidateDescriptor().getOriginal() != descriptor) return if (resolvedCall?.getStatus()?.isSuccess() ?: false && resolvedCall!!.getCandidateDescriptor().getOriginal() != descriptor) return
@@ -194,10 +194,7 @@ public class MapPlatformClassToKotlinFix extends JetIntentionAction<JetReference
JetReferenceExpression typeExpr = getImportOrUsageFromDiagnostic(diagnostic); JetReferenceExpression typeExpr = getImportOrUsageFromDiagnostic(diagnostic);
if (typeExpr == null) return null; if (typeExpr == null) return null;
PsiFile psiFile = diagnostic.getPsiFile(); BindingContext context = ResolvePackage.analyze(typeExpr);
if (!(psiFile instanceof JetFile)) return null;
BindingContext context = ResolvePackage.analyzeFully((JetFile) psiFile);
ClassDescriptor platformClass = resolveToClass(typeExpr, context); ClassDescriptor platformClass = resolveToClass(typeExpr, context);
if (platformClass == null) return null; if (platformClass == null) return null;
@@ -49,7 +49,7 @@ public class RenameParameterToMatchOverriddenMethodFix extends JetIntentionActio
return false; return false;
} }
BindingContext context = ResolvePackage.analyzeFully(parameter); BindingContext context = ResolvePackage.analyze(parameter);
VariableDescriptor parameterDescriptor = context.get(BindingContext.VALUE_PARAMETER, parameter); VariableDescriptor parameterDescriptor = context.get(BindingContext.VALUE_PARAMETER, parameter);
if (parameterDescriptor == null) { if (parameterDescriptor == null) {
return false; return false;