Added cached calculation of extensions
This commit is contained in:
@@ -209,7 +209,7 @@ public class BodyResolver {
|
|||||||
if (type != null && supertype != null) {
|
if (type != null && supertype != null) {
|
||||||
SimpleResolutionContext simpleResolutionContext = new SimpleResolutionContext(
|
SimpleResolutionContext simpleResolutionContext = new SimpleResolutionContext(
|
||||||
trace, scope, supertype, context.getOuterDataFlowInfo(), ExpressionPosition.FREE, ContextDependency.INDEPENDENT,
|
trace, scope, supertype, context.getOuterDataFlowInfo(), ExpressionPosition.FREE, ContextDependency.INDEPENDENT,
|
||||||
ResolutionResultsCacheImpl.create(), LabelResolver.create(), expressionTypingServices.getDefaultExtension());
|
ResolutionResultsCacheImpl.create(), LabelResolver.create(), expressionTypingServices.createExtension(scope));
|
||||||
DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext);
|
DataFlowUtils.checkType(type, delegateExpression, simpleResolutionContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,9 +71,6 @@ public class CallResolver {
|
|||||||
private CandidateResolver candidateResolver;
|
private CandidateResolver candidateResolver;
|
||||||
@NotNull
|
@NotNull
|
||||||
private ArgumentTypeResolver argumentTypeResolver;
|
private ArgumentTypeResolver argumentTypeResolver;
|
||||||
@Nullable
|
|
||||||
private CallResolverExtension extension;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setExpressionTypingServices(@NotNull ExpressionTypingServices expressionTypingServices) {
|
public void setExpressionTypingServices(@NotNull ExpressionTypingServices expressionTypingServices) {
|
||||||
this.expressionTypingServices = expressionTypingServices;
|
this.expressionTypingServices = expressionTypingServices;
|
||||||
@@ -94,11 +91,6 @@ public class CallResolver {
|
|||||||
this.argumentTypeResolver = argumentTypeResolver;
|
this.argumentTypeResolver = argumentTypeResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
|
||||||
public void setExtension(@NotNull CallResolverExtension extension) {
|
|
||||||
this.extension = extension;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public OverloadResolutionResults<VariableDescriptor> resolveSimpleProperty(@NotNull BasicCallResolutionContext context) {
|
public OverloadResolutionResults<VariableDescriptor> resolveSimpleProperty(@NotNull BasicCallResolutionContext context) {
|
||||||
JetExpression calleeExpression = context.call.getCalleeExpression();
|
JetExpression calleeExpression = context.call.getCalleeExpression();
|
||||||
@@ -141,7 +133,7 @@ public class CallResolver {
|
|||||||
) {
|
) {
|
||||||
return resolveFunctionCall(BasicCallResolutionContext.create(
|
return resolveFunctionCall(BasicCallResolutionContext.create(
|
||||||
trace, scope, call, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckValueArgumentsMode.ENABLED,
|
trace, scope, call, expectedType, dataFlowInfo, ContextDependency.INDEPENDENT, CheckValueArgumentsMode.ENABLED,
|
||||||
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create(), LabelResolver.create(), null, expressionTypingServices.getDefaultExtension()));
|
ExpressionPosition.FREE, ResolutionResultsCacheImpl.create(), LabelResolver.create(), null, expressionTypingServices.createExtension(scope)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -322,9 +314,7 @@ public class CallResolver {
|
|||||||
results = completeTypeInferenceDependentOnExpectedType(context, results, tracing);
|
results = completeTypeInferenceDependentOnExpectedType(context, results, tracing);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extension != null) {
|
context.callResolverExtension.run(results, context);
|
||||||
extension.run(results, context);
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.lang.resolve.calls;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class CallResolverExtensionProvider {
|
||||||
|
|
||||||
|
private final static CompositeExtension DEFAULT =
|
||||||
|
new CompositeExtension(Arrays.asList(new NeedSyntheticCallResolverExtension(), new TypeParameterAsReifiedCheck()));
|
||||||
|
|
||||||
|
private WeakReference<Map<DeclarationDescriptor, List<CallResolverExtension>>> extensionsCache;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public CallResolverExtension createExtension(@Nullable DeclarationDescriptor descriptor) {
|
||||||
|
if (descriptor == null) {
|
||||||
|
return DEFAULT;
|
||||||
|
}
|
||||||
|
return new CompositeExtension(createExtensions(descriptor));
|
||||||
|
}
|
||||||
|
|
||||||
|
// create extension list with default one at the end
|
||||||
|
@NotNull
|
||||||
|
private List<CallResolverExtension> createExtensions(@NotNull DeclarationDescriptor declaration) {
|
||||||
|
Map<DeclarationDescriptor, List<CallResolverExtension>> map;
|
||||||
|
if (extensionsCache == null || (map = extensionsCache.get()) == null) {
|
||||||
|
map = new HashMap<DeclarationDescriptor, List<CallResolverExtension>>();
|
||||||
|
extensionsCache = new WeakReference<Map<DeclarationDescriptor, List<CallResolverExtension>>>(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CallResolverExtension> extensions = map.get(declaration);
|
||||||
|
if (extensions != null) {
|
||||||
|
return extensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
extensions = new ArrayList<CallResolverExtension>();
|
||||||
|
|
||||||
|
DeclarationDescriptor parent = declaration.getContainingDeclaration();
|
||||||
|
if (parent != null) {
|
||||||
|
extensions.addAll(createExtensions(parent));
|
||||||
|
extensions.remove(extensions.size() - 1);//remove default from parent list
|
||||||
|
}
|
||||||
|
|
||||||
|
appendExtensionsFor(declaration, extensions);
|
||||||
|
|
||||||
|
List<CallResolverExtension> immutableResult = Collections.unmodifiableList(extensions);
|
||||||
|
map.put(declaration, immutableResult);
|
||||||
|
|
||||||
|
return immutableResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// with default one at the end
|
||||||
|
private void appendExtensionsFor(DeclarationDescriptor declarationDescriptor, List<CallResolverExtension> extensions) {
|
||||||
|
// add your extensions here
|
||||||
|
extensions.add(DEFAULT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,17 +5,23 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext;
|
import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl;
|
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class CompositeExtension implements CallResolverExtension {
|
public class CompositeExtension implements CallResolverExtension {
|
||||||
private final CallResolverExtension[] delegates = new CallResolverExtension[]{
|
|
||||||
new NeedSyntheticCallResolverExtension(), new TypeParameterAsReifiedCheck()};
|
private final List<CallResolverExtension> extensions;
|
||||||
|
|
||||||
|
public CompositeExtension(@NotNull List<CallResolverExtension> extensions) {
|
||||||
|
this.extensions = extensions;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <F extends CallableDescriptor> void run(
|
public <F extends CallableDescriptor> void run(
|
||||||
@NotNull OverloadResolutionResultsImpl<F> results,
|
@NotNull OverloadResolutionResultsImpl<F> results,
|
||||||
@NotNull BasicCallResolutionContext context
|
@NotNull BasicCallResolutionContext context
|
||||||
) {
|
) {
|
||||||
for (CallResolverExtension delegate : delegates) {
|
for (CallResolverExtension resolverExtension : extensions) {
|
||||||
delegate.run(results, context);
|
resolverExtension.run(results, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ public class ExpressionTypingContext extends ResolutionContext<ExpressionTypingC
|
|||||||
) {
|
) {
|
||||||
return newContext(expressionTypingServices, trace, scope, dataFlowInfo, expectedType, expressionPosition,
|
return newContext(expressionTypingServices, trace, scope, dataFlowInfo, expectedType, expressionPosition,
|
||||||
ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create(), LabelResolver.create(),
|
ContextDependency.INDEPENDENT, ResolutionResultsCacheImpl.create(), LabelResolver.create(),
|
||||||
expressionTypingServices.getDefaultExtension());
|
expressionTypingServices.createExtension(scope));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
+9
-8
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.*;
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
|
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
|
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtension;
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
|
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
|
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
|
||||||
@@ -72,7 +73,7 @@ public class ExpressionTypingServices {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private PlatformToKotlinClassMap platformToKotlinClassMap;
|
private PlatformToKotlinClassMap platformToKotlinClassMap;
|
||||||
@NotNull
|
@NotNull
|
||||||
private CallResolverExtension defaultExtension;
|
private CallResolverExtensionProvider extensionProvider;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
@@ -146,13 +147,8 @@ public class ExpressionTypingServices {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public void setDefaultExtension(@NotNull CallResolverExtension extension) {
|
public void setExtensionProvider(@NotNull CallResolverExtensionProvider extensionProvider) {
|
||||||
this.defaultExtension = extension;
|
this.extensionProvider = extensionProvider;
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public CallResolverExtension getDefaultExtension() {
|
|
||||||
return defaultExtension;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -412,4 +408,9 @@ public class ExpressionTypingServices {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public CallResolverExtension createExtension(@NotNull JetScope scope) {
|
||||||
|
return extensionProvider.createExtension(scope == JetScope.EMPTY ? null : scope.getContainingDeclaration());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user