From daf5f6d258a99428cc4dc9ff17645a33e4e4bebd Mon Sep 17 00:00:00 2001 From: Leaf Petersen Date: Wed, 2 Dec 2015 13:07:46 -0800 Subject: [PATCH] Hide inference hints. Fixes #24563. BUG= R=jmesserly@google.com Review URL: https://codereview.chromium.org/1498573002 . --- pkg/analyzer/lib/src/context/context.dart | 6 +++ pkg/analyzer/lib/src/generated/engine.dart | 20 ++++++++ pkg/analyzer/lib/src/generated/resolver.dart | 20 ++++++-- .../test/generated/resolver_test.dart | 50 ++++++++++++------- .../src/task/strong/strong_test_helper.dart | 1 + 5 files changed, 73 insertions(+), 24 deletions(-) diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart index ee06547f051..4d3651b122b 100644 --- a/pkg/analyzer/lib/src/context/context.dart +++ b/pkg/analyzer/lib/src/context/context.dart @@ -267,6 +267,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { (this._options.lint && !options.lint) || this._options.preserveComments != options.preserveComments || this._options.strongMode != options.strongMode || + ((options is AnalysisOptionsImpl) + ? this._options.strongModeHints != options.strongModeHints + : false) || this._options.enableStrictCallChecks != options.enableStrictCallChecks || this._options.enableGenericMethods != options.enableGenericMethods || @@ -290,6 +293,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { this._options.lint = options.lint; this._options.preserveComments = options.preserveComments; this._options.strongMode = options.strongMode; + if (options is AnalysisOptionsImpl) { + this._options.strongModeHints = options.strongModeHints; + } if (needsRecompute) { for (WorkManager workManager in workManagers) { workManager.onAnalysisOptionsChanged(); diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart index 9be1f2d74a8..fbb98254188 100644 --- a/pkg/analyzer/lib/src/generated/engine.dart +++ b/pkg/analyzer/lib/src/generated/engine.dart @@ -1170,6 +1170,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments || this._options.strongMode != options.strongMode || + ((options is AnalysisOptionsImpl) + ? this._options.strongModeHints != options.strongModeHints + : false) || this._options.enableStrictCallChecks != options.enableStrictCallChecks || this._options.enableSuperMixins != options.enableSuperMixins; @@ -1206,6 +1209,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { this._options.lint = options.lint; this._options.preserveComments = options.preserveComments; this._options.strongMode = options.strongMode; + if (options is AnalysisOptionsImpl) { + this._options.strongModeHints = options.strongModeHints; + } _generateImplicitErrors = options.generateImplicitErrors; _generateSdkErrors = options.generateSdkErrors; if (needsRecompute) { @@ -6461,6 +6467,14 @@ class AnalysisOptionsImpl implements AnalysisOptions { */ bool strongMode = false; + /** + * A flag indicating whether strong-mode inference hints should be + * used. This flag is not exposed in the interface, and should be + * replaced by something more general. + */ + // TODO(leafp): replace this with something more general + bool strongModeHints = false; + /** * Initialize a newly created set of analysis options to have their default * values. @@ -6488,6 +6502,9 @@ class AnalysisOptionsImpl implements AnalysisOptions { lint = options.lint; preserveComments = options.preserveComments; strongMode = options.strongMode; + if (options is AnalysisOptionsImpl) { + strongModeHints = options.strongModeHints; + } } /** @@ -6510,6 +6527,9 @@ class AnalysisOptionsImpl implements AnalysisOptions { lint = options.lint; preserveComments = options.preserveComments; strongMode = options.strongMode; + if (options is AnalysisOptionsImpl) { + strongModeHints = options.strongModeHints; + } } bool get analyzeFunctionBodies { diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 8ded6fd4c37..b80ed5a2dea 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -5771,6 +5771,11 @@ class InferenceContext { */ final AnalysisErrorListener _errorListener; + /** + * If true, emit hints when types are inferred + */ + final bool _inferenceHints; + /** * Type provider, needed for type matching. */ @@ -5792,8 +5797,8 @@ class InferenceContext { */ List _returnStack = []; - InferenceContext._( - this._errorListener, TypeProvider typeProvider, this._typeSystem) + InferenceContext._(this._errorListener, TypeProvider typeProvider, + this._typeSystem, this._inferenceHints) : _typeProvider = typeProvider, _rules = new TypeRules(typeProvider); @@ -5837,7 +5842,7 @@ class InferenceContext { */ void recordInference(Expression node, DartType type) { StaticInfo info = InferredType.create(_rules, node, type); - if (info == null) { + if (!_inferenceHints || info == null) { return; } AnalysisError error = info.toAnalysisError(); @@ -10695,8 +10700,13 @@ class ResolverVisitor extends ScopedVisitor { } this.elementResolver = new ElementResolver(this); this.typeSystem = definingLibrary.context.typeSystem; - this.inferenceContext = - new InferenceContext._(errorListener, typeProvider, typeSystem); + bool strongModeHints = false; + AnalysisOptions options = definingLibrary.context.analysisOptions; + if (options is AnalysisOptionsImpl) { + strongModeHints = options.strongModeHints; + } + this.inferenceContext = new InferenceContext._( + errorListener, typeProvider, typeSystem, strongModeHints); if (typeAnalyzerFactory == null) { this.typeAnalyzer = new StaticTypeAnalyzer(this); } else { diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart index 7d26753550f..83533078df2 100644 --- a/pkg/analyzer/test/generated/resolver_test.dart +++ b/pkg/analyzer/test/generated/resolver_test.dart @@ -12587,6 +12587,18 @@ class StrongModeDownwardsInferenceTest extends ResolverTestCase { expect(functionReturnValue(4).staticType, typeProvider.stringType); } + void test_inference_hints() { + Source source = addSource(r''' + void main () { + var x = 3; + List l0 = []; + } + '''); + LibraryElement library = resolve2(source); + assertNoErrors(source); + verify([source]); + } + void test_instanceCreation() { String code = r''' class A { @@ -13819,25 +13831,6 @@ class TypeOverrideManagerTest extends EngineTestCase { @reflectiveTest class TypePropagationTest extends ResolverTestCase { - void test_invocation_target_prefixed() { - addNamedSource( - '/helper.dart', - ''' -library helper; -int max(int x, int y) => 0; -'''); - String code = ''' -import 'helper.dart' as helper; -main() { - helper.max(10, 10); // marker -}'''; - SimpleIdentifier methodName = - _findMarkedIdentifier(code, "(10, 10); // marker"); - MethodInvocation methodInvoke = methodName.parent; - expect(methodInvoke.methodName.staticElement, isNotNull); - expect(methodInvoke.methodName.propagatedElement, isNull); - } - void fail_mergePropagatedTypesAtJoinPoint_1() { // https://code.google.com/p/dart/issues/detail?id=19929 _assertTypeOfMarkedExpression( @@ -14657,6 +14650,25 @@ main() { } } + void test_invocation_target_prefixed() { + addNamedSource( + '/helper.dart', + ''' +library helper; +int max(int x, int y) => 0; +'''); + String code = ''' +import 'helper.dart' as helper; +main() { + helper.max(10, 10); // marker +}'''; + SimpleIdentifier methodName = + _findMarkedIdentifier(code, "(10, 10); // marker"); + MethodInvocation methodInvoke = methodName.parent; + expect(methodInvoke.methodName.staticElement, isNotNull); + expect(methodInvoke.methodName.propagatedElement, isNull); + } + void test_is_conditional() { Source source = addSource(r''' class A {} diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart index 604d561c351..ea5c52e1da8 100644 --- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart +++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart @@ -63,6 +63,7 @@ void testChecker(String name, Map testFiles) { AnalysisEngine.instance.useTaskModel = true; var context = AnalysisEngine.instance.createAnalysisContext(); context.analysisOptions.strongMode = true; + context.analysisOptions.strongModeHints = true; context.sourceFactory = new SourceFactory([ new MockDartSdk(mockSdkSources, reportMissing: true).resolver,