Changed scope for initializer of extension property /*not to resolve things like val List.length = size() */

This commit is contained in:
Svetlana Isakova
2012-03-28 13:14:35 +04:00
parent 4e7070d2b1
commit cd6f3139f0
6 changed files with 40 additions and 10 deletions
@@ -23,7 +23,6 @@ import com.intellij.util.containers.Queue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.calls.BasicResolutionContext;
import org.jetbrains.jet.lang.resolve.calls.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults;
@@ -463,7 +462,7 @@ public class BodyResolver {
JetScope declaringScope = context.getDeclaringScopes().get(accessor);
JetScope propertyDeclarationInnerScope = descriptorResolver.getPropertyDeclarationInnerScope(
declaringScope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace);
declaringScope, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace);
WritableScope accessorScope = new WritableScopeImpl(propertyDeclarationInnerScope, declaringScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(trace)).setDebugName("Accessor scope");
accessorScope.changeLockLevel(WritableScope.LockLevel.READING);
@@ -508,7 +507,8 @@ public class BodyResolver {
private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) {
//JetFlowInformationProvider flowInformationProvider = context.getDescriptorResolver().computeFlowData(property, initializer); // TODO : flow JET-15
JetType expectedTypeForInitializer = property.getPropertyTypeRef() != null ? propertyDescriptor.getType() : NO_EXPECTED_TYPE;
JetType type = expressionTypingServices.getType(descriptorResolver.getPropertyDeclarationInnerScope(scope, propertyDescriptor, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace), initializer, expectedTypeForInitializer, trace);
JetScope propertyDeclarationInnerScope = descriptorResolver.getPropertyDeclarationInnerScope(scope, propertyDescriptor.getTypeParameters(), ReceiverDescriptor.NO_RECEIVER, trace);
JetType type = expressionTypingServices.getType(propertyDeclarationInnerScope, initializer, expectedTypeForInitializer, trace);
//
// JetType expectedType = propertyDescriptor.getInType();
// if (expectedType == null) {
@@ -517,9 +517,8 @@ public class DescriptorResolver {
return variableDescriptor;
}
public JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope,
@NotNull PropertyDescriptor propertyDescriptor, List<TypeParameterDescriptor> typeParameters,
ReceiverDescriptor receiver, BindingTrace trace) {
public JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope, @NotNull List<TypeParameterDescriptor> typeParameters,
@NotNull ReceiverDescriptor receiver, BindingTrace trace) {
WritableScopeImpl result = new WritableScopeImpl(outerScope, outerScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope");
for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) {
result.addTypeParameterDescriptor(typeParameterDescriptor);
@@ -578,7 +577,7 @@ public class DescriptorResolver {
? ReceiverDescriptor.NO_RECEIVER
: new ExtensionReceiver(propertyDescriptor, receiverType);
JetScope propertyScope = getPropertyDeclarationInnerScope(scope, propertyDescriptor, typeParameterDescriptors, receiverDescriptor, trace);
JetScope propertyScope = getPropertyDeclarationInnerScope(scope, typeParameterDescriptors, ReceiverDescriptor.NO_RECEIVER, trace);
JetType type = getVariableType(propertyScope, property, DataFlowInfo.EMPTY, true, trace);
@@ -30,7 +30,7 @@ package closures
val x = this@B : B
val y = this@A : A
val z = this : B
val Int.xx = this : Int
val Int.xx : Int get() = this : Int
fun Char.xx() : Any {
this : Char
val <!UNUSED_VARIABLE!>a<!> = {Double.() -> this : Double + this@xx : Char}
@@ -0,0 +1,31 @@
package i
import java.util.List
val <T> List<T>.length = <!UNRESOLVED_REFERENCE!>size<!>()
val <T> List<T>.length1 : Int get() = size()
val String.bd = <!NO_THIS!>this<!> + "!"
val String.bd1 : String get() = this + "!"
class A {
val ii : Int = 1
}
val A.foo = <!UNRESOLVED_REFERENCE!>ii<!>
val A.foo1 : Int get() = ii
class C {
class D {}
}
val C.foo : C.D = <!UNRESOLVED_REFERENCE!>D<!>()
val C.bar : C.D = C().D()
val C.foo1 : C.D get() = D()
+1 -1
View File
@@ -5,7 +5,7 @@ package qualified_this {
val x = `qtB`this`qtB`@B
val y = `qtA`this`qtA`@A
val z = `qtB`this
~xx~val Int.xx = `xx`this : Int
~xx~val Int.xx get() = `xx`this : Int
~xx()~fun Int.xx() {
`xx()`this : Int
val a = {Int.() -> `xx()`this`xx()`@xx + this}
@@ -4,7 +4,7 @@
val x = this@B : B
val y = this@A : A
val z = this : B
val Int.xx = this : Int
val Int.xx : Int get() = this : Int
fun Char.xx() : Any {
this : Char
val <warning>a</warning> = {Double.() -> this : Double + this@xx : Char}