Frontend: don't resolve default parameters value when not need complete analysis.

This commit is contained in:
Zalim Bashorov
2014-01-27 15:31:36 +04:00
parent d032b5589c
commit bc26c66bc7
3 changed files with 14 additions and 8 deletions
@@ -400,7 +400,7 @@ public class BodyResolver {
if (unsubstitutedPrimaryConstructor != null) { if (unsubstitutedPrimaryConstructor != null) {
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForSupertypeResolution(), unsubstitutedPrimaryConstructor); WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForSupertypeResolution(), unsubstitutedPrimaryConstructor);
expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(), expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
parameterScope, context.getOuterDataFlowInfo(), trace); parameterScope, context.getOuterDataFlowInfo(), trace, context.completeAnalysisNeeded(klass));
} }
} }
} }
@@ -616,9 +616,12 @@ public class BodyResolver {
List<JetParameter> valueParameters = function.getValueParameters(); List<JetParameter> valueParameters = function.getValueParameters();
List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters(); List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters();
expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, functionInnerScope, context.getOuterDataFlowInfo(), trace); boolean needCompleteAnalysis = context.completeAnalysisNeeded(function);
if (!context.completeAnalysisNeeded(function)) return; expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, functionInnerScope,
context.getOuterDataFlowInfo(), trace, needCompleteAnalysis);
if (!needCompleteAnalysis) return;
JetExpression bodyExpression = function.getBodyExpression(); JetExpression bodyExpression = function.getBodyExpression();
if (bodyExpression != null) { if (bodyExpression != null) {
@@ -641,7 +644,8 @@ public class BodyResolver {
JetScope scope = getPrimaryConstructorParametersScope(declaringScope, constructorDescriptor); JetScope scope = getPrimaryConstructorParametersScope(declaringScope, constructorDescriptor);
expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, scope, context.getOuterDataFlowInfo(), trace); expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, scope,
context.getOuterDataFlowInfo(), trace, /* needCompleteAnalysis = */ true);
} }
private void resolveAnnotationArguments(@NotNull JetScope scope, @NotNull JetModifierListOwner owner) { private void resolveAnnotationArguments(@NotNull JetScope scope, @NotNull JetModifierListOwner owner) {
@@ -36,7 +36,6 @@ 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.ResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
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;
@@ -372,7 +371,8 @@ public class ExpressionTypingServices {
@NotNull List<ValueParameterDescriptor> valueParameterDescriptors, @NotNull List<ValueParameterDescriptor> valueParameterDescriptors,
@NotNull JetScope declaringScope, @NotNull JetScope declaringScope,
@NotNull DataFlowInfo dataFlowInfo, @NotNull DataFlowInfo dataFlowInfo,
@NotNull BindingTrace trace @NotNull BindingTrace trace,
boolean needCompleteAnalysis
) { ) {
for (int i = 0; i < valueParameters.size(); i++) { for (int i = 0; i < valueParameters.size(); i++) {
ValueParameterDescriptor valueParameterDescriptor = valueParameterDescriptors.get(i); ValueParameterDescriptor valueParameterDescriptor = valueParameterDescriptors.get(i);
@@ -380,6 +380,8 @@ public class ExpressionTypingServices {
annotationResolver.resolveAnnotationsArguments(declaringScope, jetParameter.getModifierList(), trace); annotationResolver.resolveAnnotationsArguments(declaringScope, jetParameter.getModifierList(), trace);
if (!needCompleteAnalysis) continue;
resolveDefaultValue(declaringScope, valueParameterDescriptor, jetParameter, dataFlowInfo, trace); resolveDefaultValue(declaringScope, valueParameterDescriptor, jetParameter, dataFlowInfo, trace);
} }
} }
@@ -167,8 +167,8 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace); JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace);
context.expressionTypingServices.checkFunctionReturnType(functionInnerScope, function, functionDescriptor, context.dataFlowInfo, null, context.trace); context.expressionTypingServices.checkFunctionReturnType(functionInnerScope, function, functionDescriptor, context.dataFlowInfo, null, context.trace);
context.expressionTypingServices.resolveValueParameters( context.expressionTypingServices.resolveValueParameters(function.getValueParameters(), functionDescriptor.getValueParameters(),
function.getValueParameters(), functionDescriptor.getValueParameters(), scope, context.dataFlowInfo, context.trace); scope, context.dataFlowInfo, context.trace, /* needCompleteAnalysis = */ true);
ModifiersChecker.create(context.trace).checkModifiersForLocalDeclaration(function); ModifiersChecker.create(context.trace).checkModifiersForLocalDeclaration(function);
return DataFlowUtils.checkStatementType(function, context, context.dataFlowInfo); return DataFlowUtils.checkStatementType(function, context, context.dataFlowInfo);