Fix detection of constructor calls and delegates in supertype specifiers

This commit is contained in:
Alexey Sedunov
2013-10-18 15:10:00 +04:00
parent 38660dd9a8
commit cf8555349e
5 changed files with 30 additions and 9 deletions
@@ -256,6 +256,7 @@ usageType.extension.receiver.type = Extension receiver type
usageType.super.type.qualifier = Super type qualifier usageType.super.type.qualifier = Super type qualifier
usageType.receiver = Receiver usageType.receiver = Receiver
usageType.selector = Selector usageType.selector = Selector
usageType.delegate = Delegate
x.in.y={0} in {1} x.in.y={0} in {1}
x.implements.y={0} in {1} implements {2} in {3}. x.implements.y={0} in {1} implements {2} in {3}.
@@ -112,6 +112,10 @@ public class JetUsageTypeProvider() : UsageTypeProviderEx {
} }
fun getVariableUsageType(): UsageType? { fun getVariableUsageType(): UsageType? {
if (element.getParentByTypeAndBranch(javaClass<JetDelegatorByExpressionSpecifier>()) { getDelegateExpression() } != null) {
return JetUsageTypes.DELEGATE
}
val dotQualifiedExpression = element.getParentByType(javaClass<JetDotQualifiedExpression>()) val dotQualifiedExpression = element.getParentByType(javaClass<JetDotQualifiedExpression>())
return if (dotQualifiedExpression != null) { return if (dotQualifiedExpression != null) {
@@ -143,6 +147,9 @@ public class JetUsageTypeProvider() : UsageTypeProviderEx {
fun getFunctionUsageType(descriptor: FunctionDescriptor): UsageType? { fun getFunctionUsageType(descriptor: FunctionDescriptor): UsageType? {
return when { return when {
element.getParentByTypeAndBranch(javaClass<JetDelegationSpecifier>()) { getTypeReference() } != null ->
JetUsageTypes.SUPER_TYPE
descriptor is ConstructorDescriptor descriptor is ConstructorDescriptor
&& element.getParentByTypeAndBranch(javaClass<JetAnnotationEntry>()) { getTypeReference() } != null -> && element.getParentByTypeAndBranch(javaClass<JetAnnotationEntry>()) { getTypeReference() } != null ->
JetUsageTypes.ANNOTATION_TYPE JetUsageTypes.ANNOTATION_TYPE
@@ -178,6 +185,7 @@ public class JetUsageTypeProvider() : UsageTypeProviderEx {
} }
object JetUsageTypes { object JetUsageTypes {
// types
val ANNOTATION_TYPE = UsageType(JetBundle.message("usageType.annotation.type")) val ANNOTATION_TYPE = UsageType(JetBundle.message("usageType.annotation.type"))
val TYPE_CONSTRAINT = UsageType(JetBundle.message("usageType.type.constraint")) val TYPE_CONSTRAINT = UsageType(JetBundle.message("usageType.type.constraint"))
val TYPE_ARGUMENT = UsageType(JetBundle.message("usageType.type.argument")) val TYPE_ARGUMENT = UsageType(JetBundle.message("usageType.type.argument"))
@@ -192,10 +200,17 @@ object JetUsageTypes {
val CLASS_OBJECT_ACCESS = UsageType(JetBundle.message("usageType.class.object")) val CLASS_OBJECT_ACCESS = UsageType(JetBundle.message("usageType.class.object"))
val EXTENSION_RECEIVER_TYPE = UsageType(JetBundle.message("usageType.extension.receiver.type")) val EXTENSION_RECEIVER_TYPE = UsageType(JetBundle.message("usageType.extension.receiver.type"))
val SUPER_TYPE_QUALIFIER = UsageType(JetBundle.message("usageType.super.type.qualifier")) val SUPER_TYPE_QUALIFIER = UsageType(JetBundle.message("usageType.super.type.qualifier"))
// functions
val INSTANTIATION = UsageType(JetBundle.message("usageType.instantiation")) val INSTANTIATION = UsageType(JetBundle.message("usageType.instantiation"))
val FUNCTION_CALL = UsageType(JetBundle.message("usageType.function.call")) val FUNCTION_CALL = UsageType(JetBundle.message("usageType.function.call"))
// values
val RECEIVER = UsageType(JetBundle.message("usageType.receiver")) val RECEIVER = UsageType(JetBundle.message("usageType.receiver"))
val SELECTOR = UsageType(JetBundle.message("usageType.selector")) val SELECTOR = UsageType(JetBundle.message("usageType.selector"))
val DELEGATE = UsageType(JetBundle.message("usageType.delegate"))
// common usage types
val IMPORT_DIRECTIVE = UsageType(JetBundle.message("usageType.import")) val IMPORT_DIRECTIVE = UsageType(JetBundle.message("usageType.import"))
val CALLABLE_REFERENCE = UsageType(JetBundle.message("usageType.callable.reference")) val CALLABLE_REFERENCE = UsageType(JetBundle.message("usageType.callable.reference"))
} }
@@ -19,6 +19,10 @@ class Client(name: String = Server.NAME): Server() {
super<Server>.work() super<Server>.work()
println("Client") println("Client")
} }
class object: Server() {
}
} }
object ClientObject: Server() { object ClientObject: Server() {
@@ -1,15 +1,16 @@
Class/object property type (6: 21) var nextServer: Server? = new Server() Class/object property type (6: 21) var nextServer: Server? = new Server()
Function return types (14: 26) fun getNextServer(): Server? { Function return types (14: 26) fun getNextServer(): Server? {
Function return types (36: 21) fun Any.asServer(): Server? { Function return types (40: 21) fun Any.asServer(): Server? {
Import directive (3: 15) import server.Server Import directive (3: 15) import server.Server
Local variable type (10: 21) val server: Server = s Local variable type (10: 21) val server: Server = s
Nested class/object (28: 28) fun Client.bar(s: Server = Server.NAME) { Nested class/object (32: 28) fun Client.bar(s: Server = Server.NAME) {
Nested class/object (5: 29) class Client(name: String = Server.NAME): Server() { Nested class/object (5: 29) class Client(name: String = Server.NAME): Server() {
Nested class/object (7: 16) val name = Server.NAME Nested class/object (7: 16) val name = Server.NAME
Parameter type (28: 19) fun Client.bar(s: Server = Server.NAME) { Parameter type (32: 19) fun Client.bar(s: Server = Server.NAME) {
Parameter type (9: 16) fun foo(s: Server) { Parameter type (9: 16) fun foo(s: Server) {
Super type qualifier (19: 15) super<Server>.work() Super type qualifier (19: 15) super<Server>.work()
Target type of 'as' operation (37: 40) return if (this is Server) this as Server else null Supertype (23: 19) class object: Server() {
Target type of 'is' operation (37: 24) return if (this is Server) this as Server else null Supertype (28: 22) object ClientObject: Server() {
Unclassified usage (24: 22) object ClientObject: Server() { Supertype (5: 43) class Client(name: String = Server.NAME): Server() {
Unclassified usage (5: 43) class Client(name: String = Server.NAME): Server() { Target type of 'as' operation (41: 40) return if (this is Server) this as Server else null
Target type of 'is' operation (41: 24) return if (this is Server) this as Server else null
@@ -1,2 +1,2 @@
Unclassified usage (24: 22) object ClientObject: Server() { Supertype (24: 22) object ClientObject: Server() {
Unclassified usage (5: 15) class Client: Server() { Supertype (5: 15) class Client: Server() {