Resolve for receiver-properties (generic arguments are not supported)
This commit is contained in:
@@ -36,6 +36,7 @@ public class ScopeWithReceiver extends JetScopeImpl {
|
|||||||
if (functionReceiverType == null) {
|
if (functionReceiverType == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// TODO : in case of inferred type arguments, substitute the receiver type first
|
||||||
return typeChecker.isSubtypeOf(receiverTypeScope.getThisType(), functionReceiverType);
|
return typeChecker.isSubtypeOf(receiverTypeScope.getThisType(), functionReceiverType);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -50,8 +51,21 @@ public class ScopeWithReceiver extends JetScopeImpl {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VariableDescriptor getVariable(@NotNull String name) {
|
public VariableDescriptor getVariable(@NotNull String name) {
|
||||||
return receiverTypeScope.getVariable(name);
|
VariableDescriptor variable = receiverTypeScope.getVariable(name);
|
||||||
// TODO : extension properties
|
if (variable != null) {
|
||||||
|
return variable;
|
||||||
|
}
|
||||||
|
variable = outerScope.getVariable(name);
|
||||||
|
if (variable instanceof PropertyDescriptor) {
|
||||||
|
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variable;
|
||||||
|
JetType receiverType = propertyDescriptor.getReceiverType();
|
||||||
|
// TODO : in case of type arguments, substitute the receiver type first
|
||||||
|
if (receiverType != null
|
||||||
|
&& typeChecker.isSubtypeOf(receiverTypeScope.getThisType(), receiverType)) {
|
||||||
|
return variable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -583,10 +583,22 @@ public class TopDownAnalyzer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope, @NotNull PropertyDescriptor propertyDescriptor) {
|
||||||
|
WritableScopeImpl result = new WritableScopeImpl(outerScope, propertyDescriptor, trace.getErrorHandler());
|
||||||
|
for (TypeParameterDescriptor typeParameterDescriptor : propertyDescriptor.getTypeParemeters()) {
|
||||||
|
result.addTypeParameterDescriptor(typeParameterDescriptor);
|
||||||
|
}
|
||||||
|
JetType receiverType = propertyDescriptor.getReceiverType();
|
||||||
|
if (receiverType != null) {
|
||||||
|
result.setThisType(receiverType);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private void resolvePropertyAccessors(JetProperty property, PropertyDescriptor propertyDescriptor, JetScope declaringScope) {
|
private void resolvePropertyAccessors(JetProperty property, PropertyDescriptor propertyDescriptor, JetScope declaringScope) {
|
||||||
BindingTraceAdapter fieldAccessTrackingTrace = createFieldTrackingTrace(propertyDescriptor);
|
BindingTraceAdapter fieldAccessTrackingTrace = createFieldTrackingTrace(propertyDescriptor);
|
||||||
|
|
||||||
WritableScope accessorScope = new WritableScopeImpl(declaringScope, declaringScope.getContainingDeclaration(), trace.getErrorHandler());
|
WritableScope accessorScope = new WritableScopeImpl(getPropertyDeclarationInnerScope(declaringScope, propertyDescriptor), declaringScope.getContainingDeclaration(), trace.getErrorHandler());
|
||||||
accessorScope.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor);
|
accessorScope.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor);
|
||||||
|
|
||||||
JetPropertyAccessor getter = property.getGetter();
|
JetPropertyAccessor getter = property.getGetter();
|
||||||
@@ -628,7 +640,7 @@ public class TopDownAnalyzer {
|
|||||||
private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) {
|
private void resolvePropertyInitializer(JetProperty property, PropertyDescriptor propertyDescriptor, JetExpression initializer, JetScope scope) {
|
||||||
JetFlowInformationProvider flowInformationProvider = classDescriptorResolver.computeFlowData(property, initializer); // TODO : flow JET-15
|
JetFlowInformationProvider flowInformationProvider = classDescriptorResolver.computeFlowData(property, initializer); // TODO : flow JET-15
|
||||||
JetTypeInferrer typeInferrer = semanticServices.getTypeInferrer(traceForConstructors, flowInformationProvider);
|
JetTypeInferrer typeInferrer = semanticServices.getTypeInferrer(traceForConstructors, flowInformationProvider);
|
||||||
JetType type = typeInferrer.getType(scope, initializer, false);
|
JetType type = typeInferrer.getType(getPropertyDeclarationInnerScope(scope, propertyDescriptor), initializer, false);
|
||||||
|
|
||||||
JetType expectedType;
|
JetType expectedType;
|
||||||
PropertySetterDescriptor setter = propertyDescriptor.getSetter();
|
PropertySetterDescriptor setter = propertyDescriptor.getSetter();
|
||||||
|
|||||||
@@ -1730,6 +1730,11 @@ public class JetTypeInferrer {
|
|||||||
@Override
|
@Override
|
||||||
public void visitProperty(JetProperty property) {
|
public void visitProperty(JetProperty property) {
|
||||||
|
|
||||||
|
JetTypeReference receiverTypeRef = property.getReceiverTypeRef();
|
||||||
|
if (receiverTypeRef != null) {
|
||||||
|
trace.getErrorHandler().genericError(receiverTypeRef.getNode(), "Local receiver-properties are not allowed");
|
||||||
|
}
|
||||||
|
|
||||||
JetPropertyAccessor getter = property.getGetter();
|
JetPropertyAccessor getter = property.getGetter();
|
||||||
if (getter != null) {
|
if (getter != null) {
|
||||||
trace.getErrorHandler().genericError(getter.getNode(), "Local variables are not allowed to have getters");
|
trace.getErrorHandler().genericError(getter.getNode(), "Local variables are not allowed to have getters");
|
||||||
|
|||||||
@@ -18,4 +18,14 @@ fun <~T~T, ~E~E> `T`T.foo(x : `E`E, y : `A`A) : `T`T {
|
|||||||
1
|
1
|
||||||
}
|
}
|
||||||
|
|
||||||
~-~fun <T> T.minus(t : T) : Int = 1
|
~-~fun <T> T.minus(t : T) : Int = 1
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
val y = 1.`abs`abs
|
||||||
|
}
|
||||||
|
~abs~val Int.abs : Int
|
||||||
|
get() = if (this`:std::Int` > 0) this else -this`:std::Int`;
|
||||||
|
|
||||||
|
val <~TT~T> `TT`T.foo : `TT`T
|
||||||
|
|
||||||
|
fun Int.foo() = this`:std::Int`
|
||||||
Reference in New Issue
Block a user