EA-38789 Fix "Name is null for OBJECT_DECLARATION object"
This commit is contained in:
@@ -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;
|
if (!context.completeAnalysisNeeded(jetClass)) return;
|
||||||
final ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
|
|
||||||
final JetScope scopeForConstructor = primaryConstructor == null
|
final JetScope scopeForConstructor = primaryConstructor == null
|
||||||
? null
|
? null
|
||||||
: FunctionDescriptorUtil.getFunctionInnerScope(descriptor.getScopeForSupertypeResolution(), primaryConstructor, trace);
|
: FunctionDescriptorUtil.getFunctionInnerScope(scopeForSupertypeResolution, primaryConstructor, trace);
|
||||||
final ExpressionTypingServices typeInferrer = expressionTypingServices; // TODO : flow
|
final ExpressionTypingServices typeInferrer = expressionTypingServices; // TODO : flow
|
||||||
|
|
||||||
final Map<JetTypeReference, JetType> supertypes = Maps.newLinkedHashMap();
|
final Map<JetTypeReference, JetType> supertypes = Maps.newLinkedHashMap();
|
||||||
@@ -186,7 +195,7 @@ public class BodyResolver {
|
|||||||
JetExpression delegateExpression = specifier.getDelegateExpression();
|
JetExpression delegateExpression = specifier.getDelegateExpression();
|
||||||
if (delegateExpression != null) {
|
if (delegateExpression != null) {
|
||||||
JetScope scope = scopeForConstructor == null
|
JetScope scope = scopeForConstructor == null
|
||||||
? descriptor.getScopeForMemberResolution()
|
? scopeForMemberResolution
|
||||||
: scopeForConstructor;
|
: scopeForConstructor;
|
||||||
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, DataFlowInfo.EMPTY, trace);
|
JetType type = typeInferrer.getType(scope, delegateExpression, NO_EXPECTED_TYPE, DataFlowInfo.EMPTY, trace);
|
||||||
if (type != null && supertype != null && !JetTypeChecker.INSTANCE.isSubtypeOf(type, supertype)) {
|
if (type != null && supertype != null && !JetTypeChecker.INSTANCE.isSubtypeOf(type, supertype)) {
|
||||||
@@ -204,7 +213,7 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
JetTypeReference typeReference = call.getTypeReference();
|
JetTypeReference typeReference = call.getTypeReference();
|
||||||
if (typeReference == null) return;
|
if (typeReference == null) return;
|
||||||
if (descriptor.getUnsubstitutedPrimaryConstructor() == null) {
|
if (primaryConstructor == null) {
|
||||||
assert descriptor.getKind() == ClassKind.TRAIT;
|
assert descriptor.getKind() == ClassKind.TRAIT;
|
||||||
recordSupertype(typeReference, trace.getBindingContext().get(BindingContext.TYPE, typeReference));
|
recordSupertype(typeReference, trace.getBindingContext().get(BindingContext.TYPE, typeReference));
|
||||||
return;
|
return;
|
||||||
@@ -277,7 +286,11 @@ public class BodyResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// allowedFinalSupertypes typically contains a enum type of which supertypeOwner is an entry
|
// 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();
|
Set<TypeConstructor> typeConstructors = Sets.newHashSet();
|
||||||
boolean classAppeared = false;
|
boolean classAppeared = false;
|
||||||
for (Map.Entry<JetTypeReference, JetType> entry : supertypes.entrySet()) {
|
for (Map.Entry<JetTypeReference, JetType> entry : supertypes.entrySet()) {
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public class ResolveSessionUtils {
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
PsiElement topmostCandidateForAdditionalResolve = JetPsiUtil.getTopmostParentOfTypes(expression,
|
PsiElement topmostCandidateForAdditionalResolve = JetPsiUtil.getTopmostParentOfTypes(expression,
|
||||||
JetNamedFunction.class, JetClassInitializer.class, JetProperty.class);
|
JetNamedFunction.class, JetClassInitializer.class, JetProperty.class, JetDelegationSpecifierList.class);
|
||||||
|
|
||||||
if (topmostCandidateForAdditionalResolve != null) {
|
if (topmostCandidateForAdditionalResolve != null) {
|
||||||
if (topmostCandidateForAdditionalResolve instanceof JetNamedFunction) {
|
if (topmostCandidateForAdditionalResolve instanceof JetNamedFunction) {
|
||||||
@@ -117,6 +117,10 @@ public class ResolveSessionUtils {
|
|||||||
else if (topmostCandidateForAdditionalResolve instanceof JetProperty) {
|
else if (topmostCandidateForAdditionalResolve instanceof JetProperty) {
|
||||||
propertyAdditionalResolve(resolveSession, (JetProperty) topmostCandidateForAdditionalResolve, trace, file);
|
propertyAdditionalResolve(resolveSession, (JetProperty) topmostCandidateForAdditionalResolve, trace, file);
|
||||||
}
|
}
|
||||||
|
else if (topmostCandidateForAdditionalResolve instanceof JetDelegationSpecifierList) {
|
||||||
|
delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) topmostCandidateForAdditionalResolve,
|
||||||
|
trace, file);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
assert false : "Invalid type of the topmost parent";
|
assert false : "Invalid type of the topmost parent";
|
||||||
}
|
}
|
||||||
@@ -135,6 +139,22 @@ public class ResolveSessionUtils {
|
|||||||
return trace.getBindingContext();
|
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) {
|
private static void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, DelegatingBindingTrace trace, JetFile file) {
|
||||||
EmptyBodyResolveContext bodyResolveContext = new EmptyBodyResolveContext();
|
EmptyBodyResolveContext bodyResolveContext = new EmptyBodyResolveContext();
|
||||||
BodyResolver bodyResolver = createBodyResolver(trace, file, bodyResolveContext, resolveSession.getModuleConfiguration());
|
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();
|
doTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInObjectInDelegationSpecifier() {
|
||||||
|
doTest();
|
||||||
|
}
|
||||||
|
|
||||||
public void testInPackage() {
|
public void testInPackage() {
|
||||||
doTest();
|
doTest();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user