Create from usage: Fixed a bug where extension methods could not be added properly.

This commit is contained in:
Jack Zhou
2013-04-11 02:18:36 -04:00
parent dfced1ef74
commit c0bbb7b2cc
@@ -502,9 +502,12 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase {
ownerClassDescriptor = (ClassDescriptor) ownerTypeDescriptor;
receiverType = ownerClassDescriptor.getDefaultType();
PsiElement typeDeclaration = BindingContextUtils.classDescriptorToDeclaration(currentFileContext, ownerClassDescriptor);
assert typeDeclaration != null;
ownerClass = (JetClass) typeDeclaration;
isExtension = !ownerClass.isWritable();
if (typeDeclaration != null && typeDeclaration instanceof JetClass) {
ownerClass = (JetClass) typeDeclaration;
isExtension = !ownerClass.isWritable();
} else {
isExtension = true;
}
isUnit = returnType.isType() && isUnit(returnType.getType());
// figure out type substitutions for type parameters
@@ -565,7 +568,15 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase {
BindingContext containingFileContext = currentFile.equals(containingFile)
? currentFileContext
: AnalyzerFacadeWithCache.analyzeFileWithCache(containingFile).getBindingContext();
JetScope scope = getScope(isExtension ? containingFile : ownerClass, containingFileContext);
JetScope scope;
if (isExtension) {
NamespaceDescriptor namespaceDescriptor = currentFileContext.get(BindingContext.FILE_TO_NAMESPACE, containingFile);
assert namespaceDescriptor != null;
scope = namespaceDescriptor.getMemberScope();
} else {
assert ownerClassDescriptor instanceof MutableClassDescriptor;
scope = ((MutableClassDescriptor) ownerClassDescriptor).getScopeForMemberResolution();
}
// build templates
PsiDocumentManager.getInstance(project).commitAllDocuments();
@@ -851,20 +862,6 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase {
return newTypes;
}
@NotNull
private static JetScope getScope(@NotNull PsiElement owner, @NotNull BindingContext context) {
DeclarationDescriptor ownerDescriptor = context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, owner);
assert ownerDescriptor != null;
if (ownerDescriptor instanceof NamespaceDescriptor) {
NamespaceDescriptor namespaceDescriptor = (NamespaceDescriptor) ownerDescriptor;
return namespaceDescriptor.getMemberScope();
} else {
assert ownerDescriptor instanceof MutableClassDescriptor;
MutableClassDescriptor classDescriptor = (MutableClassDescriptor) ownerDescriptor;
return classDescriptor.getScopeForMemberResolution();
}
}
@NotNull
private static String renderTypeShort(JetType type) {
return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(type);