@Nullable private JetType getVariableType( @NotNull JetSimpleNameExpression nameExpression, @NotNull ReceiverValue receiver, @Nullable ASTNode callOperationNode, @NotNull ResolutionContext context, @NotNull boolean[] result) { TemporaryBindingTrace traceForVariable = TemporaryBindingTrace.create( context.trace, "trace to resolve as local variable or property", nameExpression); CallResolver callResolver = expressionTypingServices.getCallResolver(); Call call = CallMaker.makePropertyCall(receiver, callOperationNode, nameExpression); OverloadResolutionResults<VariableDescriptor> resolutionResult = callResolver.resolveSimpleProperty( BasicCallResolutionContext.create( context.replaceBindingTrace(traceForVariable), call, ResolveMode.TOP_LEVEL_CALL, ResolutionResultsCache.create())); if (!resolutionResult.isNothing()) { traceForVariable.commit(); checkSuper(receiver, resolutionResult, context.trace, nameExpression); result[0] = true; return resolutionResult.isSingleResult() ? resolutionResult.getResultingDescriptor().getReturnType() : null; } ResolutionContext newContext = receiver.exists() ? context.replaceScope(receiver.getType().getMemberScope()) : context; TemporaryBindingTrace traceForNamespaceOrClassObject = TemporaryBindingTrace.create( context.trace, "trace to resolve as namespace or class object", nameExpression); JetType jetType = lookupNamespaceOrClassObject( nameExpression, newContext.replaceBindingTrace(traceForNamespaceOrClassObject)); if (jetType != null) { traceForNamespaceOrClassObject.commit(); // Uncommitted changes in temp context context.trace.record(RESOLUTION_SCOPE, nameExpression, context.scope); if (context.dataFlowInfo.hasTypeInfoConstraints()) { context.trace.record( NON_DEFAULT_EXPRESSION_DATA_FLOW, nameExpression, context.dataFlowInfo); } result[0] = true; return jetType; } result[0] = false; return null; }
@NotNull private static DeclarationDescriptor getDeclarationDescriptorForReceiver( @NotNull ReceiverValue receiverParameter) { if (receiverParameter instanceof ThisReceiver) { DeclarationDescriptor declarationDescriptor = ((ThisReceiver) receiverParameter).getDeclarationDescriptor(); return declarationDescriptor.getOriginal(); } throw new UnsupportedOperationException( "Unsupported receiver type: " + receiverParameter.getClass() + ", receiverParameter = " + receiverParameter); }