KT-4043 "Find usages ignores class names usages as class objects"

This commit is contained in:
Alexey Sedunov
2013-10-16 17:59:13 +04:00
parent 45b07c0e18
commit 12a460a145
6 changed files with 69 additions and 14 deletions
@@ -377,18 +377,29 @@ public class BodyResolver {
annotationResolver.resolveAnnotationsArguments(classDescriptor.getScopeForSupertypeResolution(), klass.getPrimaryConstructorModifierList(), trace);
if (unsubstitutedPrimaryConstructor != null) {
WritableScope parameterScope = new WritableScopeImpl(classDescriptor.getScopeForSupertypeResolution(), unsubstitutedPrimaryConstructor,
RedeclarationHandler.DO_NOTHING, "Scope with value parameters of a constructor");
for (ValueParameterDescriptor valueParameterDescriptor : unsubstitutedPrimaryConstructor.getValueParameters()) {
parameterScope.addVariableDescriptor(valueParameterDescriptor);
}
parameterScope.changeLockLevel(WritableScope.LockLevel.READING);
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForSupertypeResolution(), unsubstitutedPrimaryConstructor);
expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
parameterScope, context.getOuterDataFlowInfo(), trace);
}
}
}
private static WritableScope getPrimaryConstructorParametersScope(
JetScope originalScope,
ConstructorDescriptor unsubstitutedPrimaryConstructor
) {
WritableScope parameterScope = new WritableScopeImpl(
originalScope,
unsubstitutedPrimaryConstructor,
RedeclarationHandler.DO_NOTHING, "Scope with value parameters of a constructor"
);
for (ValueParameterDescriptor valueParameterDescriptor : unsubstitutedPrimaryConstructor.getValueParameters()) {
parameterScope.addVariableDescriptor(valueParameterDescriptor);
}
parameterScope.changeLockLevel(WritableScope.LockLevel.READING);
return parameterScope;
}
private void resolvePropertyDeclarationBodies() {
// Member properties
@@ -595,6 +606,22 @@ public class BodyResolver {
assert functionDescriptor.getReturnType() != null;
}
public void resolveConstructorParameterDefaultValuesAndAnnotations(
@NotNull BindingTrace trace,
@NotNull JetClass klass,
@NotNull ConstructorDescriptor constructorDescriptor,
@NotNull JetScope declaringScope
) {
if (!context.completeAnalysisNeeded(klass)) return;
List<JetParameter> valueParameters = klass.getPrimaryConstructorParameters();
List<ValueParameterDescriptor> valueParameterDescriptors = constructorDescriptor.getValueParameters();
JetScope scope = getPrimaryConstructorParametersScope(declaringScope, constructorDescriptor);
expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, scope, context.getOuterDataFlowInfo(), trace);
}
private void resolveAnnotationArguments(@NotNull JetScope scope, @NotNull JetModifierListOwner owner) {
annotationResolver.resolveAnnotationsArguments(scope, owner.getModifierList(), trace);
}
@@ -105,6 +105,11 @@ public class ResolveElementCache {
JetParameter parameter = PsiTreeUtil.getTopmostParentOfType(jetElement, JetParameter.class);
if (parameter != null) {
JetClass klass = PsiTreeUtil.getParentOfType(parameter, JetClass.class);
if (klass != null && parameter.getParent() == klass.getPrimaryConstructorParameterList()) {
return additionalResolveCache.getValue().invoke(klass);
}
// Parameters for function literal could be met inside other parameters. We can't make resolveToDescriptors for internal elements.
jetElement = parameter;
}
@@ -148,6 +153,9 @@ public class ResolveElementCache {
else if (resolveElement instanceof JetAnnotationEntry) {
annotationAdditionalResolve(resolveSession, (JetAnnotationEntry) resolveElement);
}
else if (resolveElement instanceof JetClass) {
constructorAdditionalResolve(resolveSession, (JetClass) resolveElement, trace, file);
}
else if (resolveElement instanceof JetTypeParameter) {
typeParameterAdditionalResolve(resolveSession, (JetTypeParameter) resolveElement);
}
@@ -276,6 +284,22 @@ public class ResolveElementCache {
bodyResolver.resolveFunctionBody(trace, namedFunction, functionDescriptor, scope);
}
private static void constructorAdditionalResolve(
ResolveSession resolveSession,
JetClass klass,
BindingTrace trace,
JetFile file
) {
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getRootModuleDescriptor());
JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(klass);
ClassDescriptor classDescriptor = (ClassDescriptor) resolveSession.resolveToDescriptor(klass);
ConstructorDescriptor constructorDescriptor = classDescriptor.getUnsubstitutedPrimaryConstructor();
assert constructorDescriptor != null;
bodyResolver.resolveConstructorParameterDefaultValuesAndAnnotations(trace, klass, constructorDescriptor, scope);
}
private static boolean initializerAdditionalResolve(
KotlinCodeAnalyzer analyzer,
JetClassInitializer classInitializer,
@@ -2,7 +2,7 @@ package client
import server.Server
class Client: Server() {
class Client(name: String = Server.NAME): Server() {
var nextServer: Server? = new Server()
val name = Server.NAME
@@ -25,7 +25,7 @@ object ClientObject: Server() {
}
fun Client.bar(s: Server) {
fun Client.bar(s: Server = Server.NAME) {
foo(s)
}
@@ -3,11 +3,13 @@ Function return types (14: 26) fun getNextServer(): Server? {
Function return types (36: 21) fun Any.asServer(): Server? {
Import directive (3: 15) import server.Server
Local variable type (10: 21) val server: Server = s
Nested class/object (28: 28) fun Client.bar(s: Server = Server.NAME) {
Nested class/object (5: 29) class Client(name: String = Server.NAME): Server() {
Nested class/object (7: 16) val name = Server.NAME
Parameter type (28: 19) fun Client.bar(s: Server) {
Parameter type (28: 19) fun Client.bar(s: Server = Server.NAME) {
Parameter type (9: 16) fun foo(s: Server) {
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
Target type of 'is' operation (37: 24) return if (this is Server) this as Server else null
Unclassified usage (24: 22) object ClientObject: Server() {
Unclassified usage (5: 15) class Client: Server() {
Unclassified usage (5: 43) class Client(name: String = Server.NAME): Server() {
@@ -2,7 +2,7 @@ package client
import server.Server
class Client: Server() {
class Client(name: String = Server.NAME): Server() {
var nextServer: Server? = new Server()
val name = Server.NAME
@@ -25,7 +25,7 @@ object ClientObject: Server() {
}
fun Client.bar(s: Server) {
fun Client.bar(s: Server = Server.NAME) {
foo(s)
}
@@ -3,9 +3,11 @@ Function return types (14: 26) fun getNextServer(): Server? {
Function return types (36: 21) fun Any.asServer(): Server? {
Import directive (3: 15) import server.Server
Local variable type (10: 21) val server: Server = s
Nested class/object (28: 28) fun Client.bar(s: Server = Server.NAME) {
Nested class/object (5: 29) class Client(name: String = Server.NAME): Server() {
Nested class/object (7: 16) val name = Server.NAME
Parameter type (28: 19) fun Client.bar(s: Server) {
Parameter type (28: 19) fun Client.bar(s: Server = Server.NAME) {
Parameter type (9: 16) fun foo(s: Server) {
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
Target type of 'is' operation (37: 24) return if (this is Server) this as Server else null
Target type of 'is' operation (37: 24) return if (this is Server) this as Server else null