KT-3016 Exception during analyze when some function has no name

#KT-3016 Fixed
This commit is contained in:
Andrey Breslav
2012-11-19 13:36:04 +04:00
parent be7989af36
commit 636deb6a09
9 changed files with 74 additions and 21 deletions
@@ -30,6 +30,8 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -216,15 +218,15 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) { for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) {
if (declaration instanceof JetEnumEntry) { if (declaration instanceof JetEnumEntry) {
JetEnumEntry jetEnumEntry = (JetEnumEntry) declaration; JetEnumEntry jetEnumEntry = (JetEnumEntry) declaration;
Name name = jetEnumEntry.getNameAsName(); Name name = safeNameForLazyResolve(jetEnumEntry);
if (name != null) { if (name != null) {
getProperties(name); getProperties(name);
getObjectDescriptor(name); getObjectDescriptor(name);
} }
} }
else if (declaration instanceof JetObjectDeclaration) { else if (declaration instanceof JetObjectDeclaration) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration; JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) declaration;
Name name = classOrObject.getNameAsName(); Name name = safeNameForLazyResolve(objectDeclaration.getNameAsDeclaration());
if (name != null) { if (name != null) {
getProperties(name); getProperties(name);
getObjectDescriptor(name); getObjectDescriptor(name);
@@ -232,25 +234,23 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
} }
else if (declaration instanceof JetClassOrObject) { else if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration; JetClassOrObject classOrObject = (JetClassOrObject) declaration;
Name name = classOrObject.getNameAsName(); Name name = safeNameForLazyResolve(classOrObject.getNameAsName());
if (name != null) { if (name != null) {
getClassifier(name); getClassifier(name);
} }
} }
else if (declaration instanceof JetFunction) { else if (declaration instanceof JetFunction) {
JetFunction function = (JetFunction) declaration; JetFunction function = (JetFunction) declaration;
getFunctions(function.getNameAsSafeName()); getFunctions(safeNameForLazyResolve(function));
} }
else if (declaration instanceof JetProperty) { else if (declaration instanceof JetProperty) {
JetProperty property = (JetProperty) declaration; JetProperty property = (JetProperty) declaration;
getProperties(property.getNameAsSafeName()); getProperties(safeNameForLazyResolve(property));
} }
else if (declaration instanceof JetParameter) { else if (declaration instanceof JetParameter) {
JetParameter parameter = (JetParameter) declaration; JetParameter parameter = (JetParameter) declaration;
Name name = parameter.getNameAsName(); Name name = safeNameForLazyResolve(parameter);
if (name != null) { getProperties(name);
getProperties(name);
}
} }
else if (declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) { else if (declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) {
// Do nothing for typedefs as they are not supported. // Do nothing for typedefs as they are not supported.
@@ -27,6 +27,8 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -54,15 +56,15 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
allDeclarations.add(declaration); allDeclarations.add(declaration);
if (declaration instanceof JetNamedFunction) { if (declaration instanceof JetNamedFunction) {
JetNamedFunction namedFunction = (JetNamedFunction) declaration; JetNamedFunction namedFunction = (JetNamedFunction) declaration;
functions.put(namedFunction.getNameAsName(), namedFunction); functions.put(safeNameForLazyResolve(namedFunction), namedFunction);
} }
else if (declaration instanceof JetProperty) { else if (declaration instanceof JetProperty) {
JetProperty property = (JetProperty) declaration; JetProperty property = (JetProperty) declaration;
properties.put(property.getNameAsName(), property); properties.put(safeNameForLazyResolve(property), property);
} }
else if (declaration instanceof JetClassOrObject) { else if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration; JetClassOrObject classOrObject = (JetClassOrObject) declaration;
classesAndObjects.put(classOrObject.getNameAsName(), classOrObject); classesAndObjects.put(safeNameForLazyResolve(classOrObject.getNameAsName()), classOrObject);
} }
else if (declaration instanceof JetParameter || declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) { else if (declaration instanceof JetParameter || declaration instanceof JetTypedef || declaration instanceof JetMultiDeclaration) {
// Do nothing, just put it into allDeclarations is enough // Do nothing, just put it into allDeclarations is enough
@@ -36,6 +36,8 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import java.util.List; import java.util.List;
import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameForLazyResolve;
/** /**
* @author abreslav * @author abreslav
*/ */
@@ -153,8 +155,7 @@ public class ResolveSession {
return getClassObjectDescriptor((JetClassObject) classOrObject.getParent()); return getClassObjectDescriptor((JetClassObject) classOrObject.getParent());
} }
JetScope resolutionScope = getInjector().getScopeProvider().getResolutionScopeForDeclaration(classOrObject); JetScope resolutionScope = getInjector().getScopeProvider().getResolutionScopeForDeclaration(classOrObject);
Name name = classOrObject.getNameAsName(); Name name = safeNameForLazyResolve(classOrObject.getNameAsName());
assert name != null : "Name is null for " + classOrObject + " " + classOrObject.getText();
// Why not use the result here. Because it may be that there is a redeclaration: // Why not use the result here. Because it may be that there is a redeclaration:
// class A {} class A { fun foo(): A<completion here>} // class A {} class A { fun foo(): A<completion here>}
@@ -252,7 +253,7 @@ public class ResolveSession {
@Override @Override
public DeclarationDescriptor visitNamedFunction(JetNamedFunction function, Void data) { public DeclarationDescriptor visitNamedFunction(JetNamedFunction function, Void data) {
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(function); JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(function);
scopeForDeclaration.getFunctions(function.getNameAsName()); scopeForDeclaration.getFunctions(safeNameForLazyResolve(function));
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function); return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function);
} }
@@ -263,7 +264,7 @@ public class ResolveSession {
JetClass jetClass = (JetClass) grandFather; JetClass jetClass = (JetClass) grandFather;
// This is a primary constructor parameter // This is a primary constructor parameter
if (parameter.getValOrVarNode() != null) { if (parameter.getValOrVarNode() != null) {
getClassDescriptor(jetClass).getDefaultType().getMemberScope().getProperties(parameter.getNameAsName()); getClassDescriptor(jetClass).getDefaultType().getMemberScope().getProperties(safeNameForLazyResolve(parameter));
return getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter); return getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter);
} }
} }
@@ -273,15 +274,14 @@ public class ResolveSession {
@Override @Override
public DeclarationDescriptor visitProperty(JetProperty property, Void data) { public DeclarationDescriptor visitProperty(JetProperty property, Void data) {
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(property); JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(property);
scopeForDeclaration.getProperties(property.getNameAsName()); scopeForDeclaration.getProperties(safeNameForLazyResolve(property));
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property); return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
} }
@Override @Override
public DeclarationDescriptor visitObjectDeclarationName(JetObjectDeclarationName declarationName, Void data) { public DeclarationDescriptor visitObjectDeclarationName(JetObjectDeclarationName declarationName, Void data) {
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration( JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(declarationName.getParent());
(JetDeclaration) declarationName.getParent()); scopeForDeclaration.getProperties(safeNameForLazyResolve(declarationName));
scopeForDeclaration.getProperties(declarationName.getNameAsName());
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, declarationName); return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, declarationName);
} }
@@ -24,6 +24,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.di.InjectorForBodyResolve; import org.jetbrains.jet.di.InjectorForBodyResolve;
import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
@@ -42,6 +43,12 @@ import java.util.*;
*/ */
public class ResolveSessionUtils { public class ResolveSessionUtils {
// This name is used as a key for the case when something has no name _due to a syntactic error_
// Example: fun (x: Int) = 5
// There's no name for this function in the PSI
// The name contains a GUID to avoid clashes, if a clash happens, it's not a big deal: the code does not compile anyway
public static final Name NO_NAME_FOR_LAZY_RESOLVE = Name.identifier("no_name_in_PSI_for_lazy_resolve_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40");
private ResolveSessionUtils() { private ResolveSessionUtils() {
} }
@@ -392,4 +399,15 @@ public class ResolveSessionUtils {
return resultClassifierDescriptors; return resultClassifierDescriptors;
} }
@NotNull
public static Name safeNameForLazyResolve(@NotNull JetNamed named) {
Name name = named.getNameAsName();
return safeNameForLazyResolve(name);
}
@NotNull
public static Name safeNameForLazyResolve(@Nullable Name name) {
return name != null ? name : NO_NAME_FOR_LAZY_RESOLVE;
}
} }
@@ -0,0 +1,6 @@
// "Import Class" "false"
// ERROR: Unresolved reference: TTT
class {
val t: TTT = null
}
@@ -0,0 +1,6 @@
// "Import Class" "false"
// ERROR: Unresolved reference: TTTTT
fun () {
val tttt : TTTTT = null
}
@@ -0,0 +1,6 @@
// "Import Class" "false"
// ERROR: Unresolved reference: TTT
object {
val t : TTT = null
}
@@ -0,0 +1,7 @@
// "Import Class" "false"
// ERROR: Function 'f' must have a body
// ERROR: Unresolved reference: TTT
fun f(: Int) {
val t: TTT = null
}
@@ -0,0 +1,8 @@
// "Import Class" "false"
// ERROR: Unresolved reference: TTT
val : Int
get() {
val t : TTT = null
return 1
}