kill redeclaration handler in ClassDescriptor
This commit is contained in:
+2
-1
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
|
|||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.TraceBasedRedeclarationHandler;
|
import org.jetbrains.jet.lang.resolve.TraceBasedRedeclarationHandler;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver;
|
||||||
@@ -57,7 +58,7 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
|
|||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
TraceBasedRedeclarationHandler redeclarationHandler = new TraceBasedRedeclarationHandler(trace);
|
RedeclarationHandler redeclarationHandler = RedeclarationHandler.DO_NOTHING;
|
||||||
|
|
||||||
setScopeForMemberLookup(new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler).setDebugName("MemberLookup").changeLockLevel(WritableScope.LockLevel.BOTH));
|
setScopeForMemberLookup(new WritableScopeImpl(JetScope.EMPTY, this, redeclarationHandler).setDebugName("MemberLookup").changeLockLevel(WritableScope.LockLevel.BOTH));
|
||||||
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler).setDebugName("SupertypeResolution").changeLockLevel(WritableScope.LockLevel.BOTH);
|
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler).setDebugName("SupertypeResolution").changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public class OverloadResolver {
|
|||||||
|
|
||||||
private void checkOverloadsInANamespace(MultiMap<Key, ConstructorDescriptor> inNamespaces) {
|
private void checkOverloadsInANamespace(MultiMap<Key, ConstructorDescriptor> inNamespaces) {
|
||||||
|
|
||||||
MultiMap<Key, FunctionDescriptor> functionsByName = MultiMap.create();
|
MultiMap<Key, CallableMemberDescriptor> functionsByName = MultiMap.create();
|
||||||
|
|
||||||
for (NamedFunctionDescriptor function : context.getFunctions().values()) {
|
for (NamedFunctionDescriptor function : context.getFunctions().values()) {
|
||||||
DeclarationDescriptor containingDeclaration = function.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = function.getContainingDeclaration();
|
||||||
@@ -113,11 +113,19 @@ public class OverloadResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (PropertyDescriptor property : context.getProperties().values()) {
|
||||||
|
DeclarationDescriptor containingDeclaration = property.getContainingDeclaration();
|
||||||
|
if (containingDeclaration instanceof NamespaceDescriptor) {
|
||||||
|
NamespaceDescriptor namespaceDescriptor = (NamespaceDescriptor) containingDeclaration;
|
||||||
|
functionsByName.putValue(new Key(namespaceDescriptor, property.getName()), property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (Map.Entry<Key, Collection<ConstructorDescriptor>> entry : inNamespaces.entrySet()) {
|
for (Map.Entry<Key, Collection<ConstructorDescriptor>> entry : inNamespaces.entrySet()) {
|
||||||
functionsByName.putValues(entry.getKey(), entry.getValue());
|
functionsByName.putValues(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<Key, Collection<FunctionDescriptor>> e : functionsByName.entrySet()) {
|
for (Map.Entry<Key, Collection<CallableMemberDescriptor>> e : functionsByName.entrySet()) {
|
||||||
checkOverloadsWithSameName(e.getKey().getFunctionName(), e.getValue(), e.getKey().getNamespace());
|
checkOverloadsWithSameName(e.getKey().getFunctionName(), e.getValue(), e.getKey().getNamespace());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,17 +148,21 @@ public class OverloadResolver {
|
|||||||
MutableClassDescriptor classDescriptor, JetClassOrObject klass,
|
MutableClassDescriptor classDescriptor, JetClassOrObject klass,
|
||||||
Collection<ConstructorDescriptor> nestedClassConstructors)
|
Collection<ConstructorDescriptor> nestedClassConstructors)
|
||||||
{
|
{
|
||||||
MultiMap<String, FunctionDescriptor> functionsByName = MultiMap.create();
|
MultiMap<String, CallableMemberDescriptor> functionsByName = MultiMap.create();
|
||||||
|
|
||||||
for (FunctionDescriptor function : classDescriptor.getFunctions()) {
|
for (FunctionDescriptor function : classDescriptor.getFunctions()) {
|
||||||
functionsByName.putValue(function.getName(), function);
|
functionsByName.putValue(function.getName(), function);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (PropertyDescriptor property : classDescriptor.getProperties()) {
|
||||||
|
functionsByName.putValue(property.getName(), property);
|
||||||
|
}
|
||||||
|
|
||||||
for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) {
|
for (ConstructorDescriptor nestedClassConstructor : nestedClassConstructors) {
|
||||||
functionsByName.putValue(nestedClassConstructor.getContainingDeclaration().getName(), nestedClassConstructor);
|
functionsByName.putValue(nestedClassConstructor.getContainingDeclaration().getName(), nestedClassConstructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<String, Collection<FunctionDescriptor>> e : functionsByName.entrySet()) {
|
for (Map.Entry<String, Collection<CallableMemberDescriptor>> e : functionsByName.entrySet()) {
|
||||||
checkOverloadsWithSameName(e.getKey(), e.getValue(), nameForErrorMessage(classDescriptor, klass));
|
checkOverloadsWithSameName(e.getKey(), e.getValue(), nameForErrorMessage(classDescriptor, klass));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,14 +172,14 @@ public class OverloadResolver {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkOverloadsWithSameName(String name, Collection<FunctionDescriptor> functions, @NotNull String functionContainer) {
|
private void checkOverloadsWithSameName(String name, Collection<CallableMemberDescriptor> functions, @NotNull String functionContainer) {
|
||||||
if (functions.size() == 1) {
|
if (functions.size() == 1) {
|
||||||
// microoptimization
|
// microoptimization
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (FunctionDescriptor function : functions) {
|
for (CallableMemberDescriptor function : functions) {
|
||||||
for (FunctionDescriptor function2 : functions) {
|
for (CallableMemberDescriptor function2 : functions) {
|
||||||
if (function == function2) {
|
if (function == function2) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -180,7 +192,11 @@ public class OverloadResolver {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, functionContainer));
|
if (function instanceof PropertyDescriptor) {
|
||||||
|
context.getTrace().report(Errors.REDECLARATION.on(function, context.getTrace().getBindingContext()));
|
||||||
|
} else {
|
||||||
|
context.getTrace().report(Errors.CONFLICTING_OVERLOADS.on(member, function, functionContainer));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.resolve;
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Stepan Koltsov
|
* @author Stepan Koltsov
|
||||||
@@ -26,18 +29,37 @@ public class OverloadUtil {
|
|||||||
/**
|
/**
|
||||||
* Does not check names.
|
* Does not check names.
|
||||||
*/
|
*/
|
||||||
public static OverloadCompatibilityInfo isOverloadble(FunctionDescriptor a, FunctionDescriptor b) {
|
public static OverloadCompatibilityInfo isOverloadble(CallableDescriptor a, CallableDescriptor b) {
|
||||||
|
int abc = braceCount(a);
|
||||||
|
int bbc = braceCount(b);
|
||||||
|
|
||||||
|
if (abc != bbc) {
|
||||||
|
return OverloadCompatibilityInfo.success();
|
||||||
|
}
|
||||||
|
|
||||||
OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.isOverridableByImpl(a, b, false);
|
OverridingUtil.OverrideCompatibilityInfo overrideCompatibilityInfo = OverridingUtil.isOverridableByImpl(a, b, false);
|
||||||
switch (overrideCompatibilityInfo.isOverridable()) {
|
switch (overrideCompatibilityInfo.isOverridable()) {
|
||||||
case OVERRIDABLE:
|
case OVERRIDABLE:
|
||||||
return OverloadCompatibilityInfo.someError();
|
|
||||||
case CONFLICT:
|
case CONFLICT:
|
||||||
|
return OverloadCompatibilityInfo.someError();
|
||||||
case INCOMPATIBLE:
|
case INCOMPATIBLE:
|
||||||
return OverloadCompatibilityInfo.success();
|
return OverloadCompatibilityInfo.success();
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int braceCount(CallableDescriptor a) {
|
||||||
|
if (a instanceof PropertyDescriptor) {
|
||||||
|
return 0;
|
||||||
|
} else if (a instanceof NamedFunctionDescriptor) {
|
||||||
|
return 1;
|
||||||
|
} else if (a instanceof ConstructorDescriptor) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class OverloadCompatibilityInfo {
|
public static class OverloadCompatibilityInfo {
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ public class OverridingUtil {
|
|||||||
if (superDescriptor instanceof PropertyDescriptor) {
|
if (superDescriptor instanceof PropertyDescriptor) {
|
||||||
if (subDescriptor instanceof FunctionDescriptor) return OverrideCompatibilityInfo.memberKindMismatch();
|
if (subDescriptor instanceof FunctionDescriptor) return OverrideCompatibilityInfo.memberKindMismatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: check outside of this method
|
||||||
if (!superDescriptor.getName().equals(subDescriptor.getName())) {
|
if (!superDescriptor.getName().equals(subDescriptor.getName())) {
|
||||||
return OverrideCompatibilityInfo.nameMismatch();
|
return OverrideCompatibilityInfo.nameMismatch();
|
||||||
}
|
}
|
||||||
@@ -191,9 +193,11 @@ public class OverridingUtil {
|
|||||||
JetType subValueParameterType = getUpperBound(subValueParameters.get(i));
|
JetType subValueParameterType = getUpperBound(subValueParameters.get(i));
|
||||||
// TODO: compare erasure
|
// TODO: compare erasure
|
||||||
if (!JetTypeChecker.INSTANCE.equalTypes(superValueParameterType, subValueParameterType)) {
|
if (!JetTypeChecker.INSTANCE.equalTypes(superValueParameterType, subValueParameterType)) {
|
||||||
return OverrideCompatibilityInfo.valueParameterTypeMismatch(superValueParameterType, subValueParameterType, OverrideCompatibilityInfo.ErrorKind.CONFLICT);
|
return OverrideCompatibilityInfo.valueParameterTypeMismatch(superValueParameterType, subValueParameterType, OverrideCompatibilityInfo.ErrorKind.INCOMPATIBLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OverrideCompatibilityInfo.success();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
class Aaa() {
|
class Aaa() {
|
||||||
val <!REDECLARATION, REDECLARATION!>a<!> = 1
|
val <!REDECLARATION!>a<!> = 1
|
||||||
val <!REDECLARATION, REDECLARATION!>a<!> = 1
|
val <!REDECLARATION!>a<!> = 1
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
class Aaa() {
|
class Aaa() {
|
||||||
val <!REDECLARATION, REDECLARATION!>a<!> = 1
|
val <!REDECLARATION!>a<!> = 1
|
||||||
val <!REDECLARATION, REDECLARATION!>a<!> = ""
|
val <!REDECLARATION!>a<!> = ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package override.generics
|
package override.generics
|
||||||
|
|
||||||
abstract class MyAbstractClass<T> {
|
abstract class MyAbstractClass<T> {
|
||||||
abstract val <!REDECLARATION!>pr<!> : T
|
abstract val pr : T
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class MyLegalAbstractClass2<T>(t : T) : MyAbstractClass<Int>() {
|
abstract class MyLegalAbstractClass2<T>(t : T) : MyAbstractClass<Int>() {
|
||||||
<!CONFLICTING_OVERLOADS!>val <R> <!REDECLARATION!>pr<!> : T = t<!>
|
<!CONFLICTING_OVERLOADS!>val <R> pr : T = t<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
open class Aaa() {
|
open class Aaa() {
|
||||||
val <!REDECLARATION!>bar<!> = 1
|
val bar = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
open class Bbb() : Aaa() {
|
open class Bbb() : Aaa() {
|
||||||
<!CONFLICTING_OVERLOADS!>val <T> <!REDECLARATION!>bar<!> = "aa"<!>
|
<!CONFLICTING_OVERLOADS!>val <T> bar = "aa"<!>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ trait MyTrait<T> {
|
|||||||
|
|
||||||
abstract class MyAbstractClass<T> {
|
abstract class MyAbstractClass<T> {
|
||||||
abstract fun bar(t: T) : T
|
abstract fun bar(t: T) : T
|
||||||
abstract val <!REDECLARATION, REDECLARATION, REDECLARATION!>pr<!> : T
|
abstract val pr : T
|
||||||
}
|
}
|
||||||
|
|
||||||
trait MyProps<T> {
|
trait MyProps<T> {
|
||||||
@@ -43,7 +43,7 @@ abstract class MyAbstractClass1 : MyTrait<Int>, MyAbstractClass<String>() {
|
|||||||
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalGenericClass1<!><T> : MyTrait<T>, MyAbstractClass<T>() {}
|
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalGenericClass1<!><T> : MyTrait<T>, MyAbstractClass<T>() {}
|
||||||
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalGenericClass2<!><T, R>(r : R) : MyTrait<T>, MyAbstractClass<R>() {
|
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalGenericClass2<!><T, R>(r : R) : MyTrait<T>, MyAbstractClass<R>() {
|
||||||
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(r: R) = r
|
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(r: R) = r
|
||||||
<!CONFLICTING_OVERLOADS!><!NOTHING_TO_OVERRIDE!>override<!> val <T> <!REDECLARATION!>pr<!> : R = r<!>
|
<!CONFLICTING_OVERLOADS!><!NOTHING_TO_OVERRIDE!>override<!> val <T> pr : R = r<!>
|
||||||
}
|
}
|
||||||
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalClass1<!> : MyTrait<Int>, MyAbstractClass<String>() {}
|
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalClass1<!> : MyTrait<Int>, MyAbstractClass<String>() {}
|
||||||
abstract class MyLegalAbstractClass1 : MyTrait<Int>, MyAbstractClass<String>() {}
|
abstract class MyLegalAbstractClass1 : MyTrait<Int>, MyAbstractClass<String>() {}
|
||||||
@@ -51,10 +51,10 @@ abstract class MyLegalAbstractClass1 : MyTrait<Int>, MyAbstractClass<String>() {
|
|||||||
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalClass2<!><T>(t : T) : MyTrait<Int>, MyAbstractClass<Int>() {
|
class <!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>MyIllegalClass2<!><T>(t : T) : MyTrait<Int>, MyAbstractClass<Int>() {
|
||||||
fun foo(t: T) = t
|
fun foo(t: T) = t
|
||||||
fun bar(t: T) = t
|
fun bar(t: T) = t
|
||||||
<!CONFLICTING_OVERLOADS!>val <R> <!REDECLARATION!>pr<!> : T = t<!>
|
<!CONFLICTING_OVERLOADS!>val <R> pr : T = t<!>
|
||||||
}
|
}
|
||||||
abstract class MyLegalAbstractClass2<T>(t : T) : MyTrait<Int>, MyAbstractClass<Int>() {
|
abstract class MyLegalAbstractClass2<T>(t : T) : MyTrait<Int>, MyAbstractClass<Int>() {
|
||||||
fun foo(t: T) = t
|
fun foo(t: T) = t
|
||||||
fun bar(t: T) = t
|
fun bar(t: T) = t
|
||||||
<!CONFLICTING_OVERLOADS!>val <R> <!REDECLARATION!>pr<!> : T = t<!>
|
<!CONFLICTING_OVERLOADS!>val <R> pr : T = t<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user