EA-38789 Fix "Name is null for OBJECT_DECLARATION object"

This commit is contained in:
Nikolay Krasko
2012-09-12 19:56:20 +04:00
parent ba01576c41
commit 1121d9b316
4 changed files with 55 additions and 7 deletions
@@ -152,12 +152,21 @@ public class BodyResolver {
}
}
private void resolveDelegationSpecifierList(final JetClassOrObject jetClass, final MutableClassDescriptor descriptor) {
private void resolveDelegationSpecifierList(JetClassOrObject jetClass, final MutableClassDescriptor descriptor) {
resolveDelegationSpecifierList(jetClass, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForSupertypeResolution(),
descriptor.getScopeForMemberResolution());
}
public void resolveDelegationSpecifierList(@NotNull final JetClassOrObject jetClass, @NotNull final ClassDescriptor descriptor,
@Nullable final ConstructorDescriptor primaryConstructor,
@NotNull JetScope scopeForSupertypeResolution,
@NotNull final JetScope scopeForMemberResolution) {
if (!context.completeAnalysisNeeded(jetClass)) return;
final ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
final JetScope scopeForConstructor = primaryConstructor == null
? null
: FunctionDescriptorUtil.getFunctionInnerScope(descriptor.getScopeForSupertypeResolution(), primaryConstructor, trace);
: FunctionDescriptorUtil.getFunctionInnerScope(scopeForSupertypeResolution, primaryConstructor, trace);
final ExpressionTypingServices typeInferrer = expressionTypingServices; // TODO : flow
final Map<JetTypeReference, JetType> supertypes = Maps.newLinkedHashMap();
@@ -186,7 +195,7 @@ public class BodyResolver {
JetExpression delegateExpression = specifier.getDelegateExpression();
if (delegateExpression != null) {
JetScope scope = scopeForConstructor == null
? descriptor.getScopeForMemberResolution()
? scopeForMemberResolution
: scopeForConstructor;
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, DataFlowInfo.EMPTY, trace);
if (type != null && supertype != null && !JetTypeChecker.INSTANCE.isSubtypeOf(type, supertype)) {
@@ -204,7 +213,7 @@ public class BodyResolver {
}
JetTypeReference typeReference = call.getTypeReference();
if (typeReference == null) return;
if (descriptor.getUnsubstitutedPrimaryConstructor() == null) {
if (primaryConstructor == null) {
assert descriptor.getKind() == ClassKind.TRAIT;
recordSupertype(typeReference, trace.getBindingContext().get(BindingContext.TYPE, typeReference));
return;
@@ -277,7 +286,11 @@ public class BodyResolver {
}
// allowedFinalSupertypes typically contains a enum type of which supertypeOwner is an entry
private void checkSupertypeList(@NotNull MutableClassDescriptor supertypeOwner, @NotNull Map<JetTypeReference, JetType> supertypes, Set<TypeConstructor> allowedFinalSupertypes) {
private void checkSupertypeList(
@NotNull ClassDescriptor supertypeOwner,
@NotNull Map<JetTypeReference, JetType> supertypes,
@NotNull Set<TypeConstructor> allowedFinalSupertypes
) {
Set<TypeConstructor> typeConstructors = Sets.newHashSet();
boolean classAppeared = false;
for (Map.Entry<JetTypeReference, JetType> entry : supertypes.entrySet()) {
@@ -105,7 +105,7 @@ public class ResolveSessionUtils {
@SuppressWarnings("unchecked")
PsiElement topmostCandidateForAdditionalResolve = JetPsiUtil.getTopmostParentOfTypes(expression,
JetNamedFunction.class, JetClassInitializer.class, JetProperty.class);
JetNamedFunction.class, JetClassInitializer.class, JetProperty.class, JetDelegationSpecifierList.class);
if (topmostCandidateForAdditionalResolve != null) {
if (topmostCandidateForAdditionalResolve instanceof JetNamedFunction) {
@@ -117,6 +117,10 @@ public class ResolveSessionUtils {
else if (topmostCandidateForAdditionalResolve instanceof JetProperty) {
propertyAdditionalResolve(resolveSession, (JetProperty) topmostCandidateForAdditionalResolve, trace, file);
}
else if (topmostCandidateForAdditionalResolve instanceof JetDelegationSpecifierList) {
delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) topmostCandidateForAdditionalResolve,
trace, file);
}
else {
assert false : "Invalid type of the topmost parent";
}
@@ -135,6 +139,22 @@ public class ResolveSessionUtils {
return trace.getBindingContext();
}
private static void delegationSpecifierAdditionalResolve(final ResolveSession resolveSession,
final JetDelegationSpecifierList specifier, DelegatingBindingTrace trace, JetFile file) {
BodyResolver bodyResolver = createBodyResolver(trace, file, resolveSession.getModuleConfiguration());
JetClassOrObject classOrObject = (JetClassOrObject) specifier.getParent();
LazyClassDescriptor descriptor = (LazyClassDescriptor) resolveSession.resolveToDescriptor(classOrObject);
// Activate resolving of supertypes
descriptor.getTypeConstructor().getSupertypes();
bodyResolver.resolveDelegationSpecifierList(classOrObject, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForClassHeaderResolution(),
descriptor.getScopeForMemberDeclarationResolution());
}
private static void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, DelegatingBindingTrace trace, JetFile file) {
EmptyBodyResolveContext bodyResolveContext = new EmptyBodyResolveContext();
BodyResolver bodyResolver = createBodyResolver(trace, file, bodyResolveContext, resolveSession.getModuleConfiguration());
@@ -0,0 +1,11 @@
open class PageManager(a: Runnable)
class Tab
class ChromePageManager(): PageManager(object : Runnable {
public override fun run() {
val ab : Ta<caret> = null
}
}) {
}
// EXIST: Tab
@@ -128,6 +128,10 @@ public class JetBasicCompletionTest extends JetCompletionTestBase {
doTest();
}
public void testInObjectInDelegationSpecifier() {
doTest();
}
public void testInPackage() {
doTest();
}