Index: pkg/analysis_server/test/context_manager_test.dart |
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart |
index 9f5136860a7b0049cbc7ea0484fd13099adc23df..b1d7dfdb134b6c87947c9fd68a285b4faa5393c3 100644 |
--- a/pkg/analysis_server/test/context_manager_test.dart |
+++ b/pkg/analysis_server/test/context_manager_test.dart |
@@ -15,8 +15,12 @@ import 'package:analyzer/src/generated/engine.dart'; |
import 'package:analyzer/src/generated/error.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/generated/source_io.dart'; |
+import 'package:analyzer/src/services/lint.dart'; |
+import 'package:linter/src/plugin/linter_plugin.dart'; |
+import 'package:linter/src/rules/avoid_as.dart'; |
import 'package:package_config/packages.dart'; |
import 'package:path/path.dart'; |
+import 'package:plugin/plugin.dart'; |
import 'package:test_reflective_loader/test_reflective_loader.dart'; |
import 'package:unittest/unittest.dart'; |
@@ -67,6 +71,34 @@ class AbstractContextManagerTest { |
String projPath = '/my/proj'; |
+ AnalysisError missing_return = |
+ new AnalysisError(new TestSource(), 0, 1, HintCode.MISSING_RETURN, [ |
+ ['x'] |
+ ]); |
+ |
+ AnalysisError invalid_assignment_error = |
+ new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [ |
+ ['x'], |
+ ['y'] |
+ ]); |
+ |
+ AnalysisError unused_local_variable = new AnalysisError( |
+ new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
+ ['x'] |
+ ]); |
+ |
+ List<ErrorFilter> get errorFilters => |
+ callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
+ |
+ List<Linter> get lints => getLints(callbacks.currentContext); |
+ |
+ AnalysisOptions get options => callbacks.currentContext.analysisOptions; |
+ |
+ void deleteFile(List<String> pathComponents) { |
+ String filePath = posix.joinAll(pathComponents); |
+ resourceProvider.deleteFile(filePath); |
+ } |
+ |
String newFile(List<String> pathComponents, [String content = '']) { |
String filePath = posix.joinAll(pathComponents); |
resourceProvider.newFile(filePath, content); |
@@ -84,6 +116,14 @@ class AbstractContextManagerTest { |
} |
void setUp() { |
+ List<Plugin> plugins = <Plugin>[]; |
+ plugins.add(linterPlugin); |
+ |
+ // Defer to the extension manager in AE for plugin registration. |
+ AnalysisEngine.instance.userDefinedPlugins = plugins; |
+ // Force registration. |
+ AnalysisEngine.instance.taskManager; |
+ |
resourceProvider = new MemoryResourceProvider(); |
packageMapProvider = new MockPackageMapProvider(); |
manager = new ContextManagerImpl(resourceProvider, providePackageResolver, |
@@ -93,6 +133,99 @@ class AbstractContextManagerTest { |
resourceProvider.newFolder(projPath); |
} |
+ test_analysis_options_file_delete() async { |
+ // Setup .analysis_options |
+ newFile( |
+ [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
+ r''' |
+embedder_libs: |
+ "dart:foobar": "../sdk_ext/entry.dart" |
+analyzer: |
+ language: |
+ enableGenericMethods: true |
+ errors: |
+ unused_local_variable: false |
+linter: |
+ rules: |
+ - camel_case_types |
+'''); |
+ |
+ // Setup context. |
+ manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
+ await pumpEventQueue(); |
+ |
+ // Verify options were set. |
+ expect(errorFilters, hasLength(1)); |
+ expect(lints, hasLength(1)); |
+ expect(options.enableGenericMethods, isTrue); |
+ |
+ // Remove options. |
+ deleteFile([projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE]); |
+ await pumpEventQueue(); |
+ |
+ // Verify defaults restored. |
+ expect(errorFilters, isEmpty); |
+ expect(lints, isEmpty); |
+ expect(options.enableGenericMethods, isFalse); |
+ } |
+ |
+ test_analysis_options_file_delete_with_embedder() async { |
+ // Setup _embedder.yaml. |
+ String libPath = newFolder([projPath, LIB_NAME]); |
+ newFile( |
+ [libPath, '_embedder.yaml'], |
+ r''' |
+analyzer: |
+ strong-mode: true |
+ errors: |
+ missing_return: false |
+linter: |
+ rules: |
+ - avoid_as |
+'''); |
+ |
+ // Setup .packages file |
+ newFile( |
+ [projPath, '.packages'], |
+ r''' |
+test_pack:lib/'''); |
+ |
+ // Setup .analysis_options |
+ newFile( |
+ [projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE], |
+ r''' |
+analyzer: |
+ language: |
+ enableGenericMethods: true |
+ errors: |
+ unused_local_variable: false |
+linter: |
+ rules: |
+ - camel_case_types |
+'''); |
+ |
+ // Setup context. |
+ manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
+ await pumpEventQueue(); |
+ |
+ // Verify options were set. |
+ expect(options.enableGenericMethods, isTrue); |
+ expect(options.strongMode, isTrue); |
+ expect(errorFilters, hasLength(2)); |
+ expect(lints, hasLength(2)); |
+ |
+ // Remove options. |
+ deleteFile([projPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE]); |
+ await pumpEventQueue(); |
+ |
+ // Verify defaults restored. |
+ expect(options.enableGenericMethods, isFalse); |
+ expect(lints, hasLength(1)); |
+ expect(lints.first, new isInstanceOf<AvoidAs>()); |
+ expect(errorFilters, hasLength(1)); |
+ expect(errorFilters.first(missing_return), isTrue); |
+ } |
+ |
test_analysis_options_parse_failure() async { |
// Create files. |
String libPath = newFolder([projPath, LIB_NAME]); |
@@ -154,6 +287,11 @@ analyzer: |
strong-mode: true |
language: |
enableSuperMixins: true |
+ errors: |
+ missing_return: false |
+linter: |
+ rules: |
+ - avoid_as |
'''); |
// Setup .packages file |
newFile( |
@@ -172,6 +310,9 @@ analyzer: |
enableGenericMethods: true |
errors: |
unused_local_variable: false |
+linter: |
+ rules: |
+ - camel_case_types |
'''); |
// Setup context. |
@@ -186,25 +327,31 @@ analyzer: |
var context = contexts[0]; |
// Verify options. |
- // * from `_embedder.yaml`: |
+ // * from `_embedder.yaml`: |
expect(context.analysisOptions.strongMode, isTrue); |
expect(context.analysisOptions.enableSuperMixins, isTrue); |
- // * from `.analysis_options`: |
+ // * from `.analysis_options`: |
expect(context.analysisOptions.enableGenericMethods, isTrue); |
- // verify tests are excluded |
+ // * verify tests are excluded |
expect(callbacks.currentContextFilePaths[projPath].keys, |
['/my/proj/sdk_ext/entry.dart']); |
// Verify filter setup. |
- List<ErrorFilter> filters = |
- callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
- expect(filters, hasLength(1)); |
+ expect(errorFilters, hasLength(2)); |
+ |
+ // * (embedder.) |
+ expect(errorFilters.any((f) => f(missing_return)), isTrue); |
+ |
+ // * (options.) |
+ expect(errorFilters.any((f) => f(unused_local_variable)), isTrue); |
+ |
+ // Verify lints. |
+ var lintNames = lints.map((lint) => lint.name); |
+ |
expect( |
- filters.first(new AnalysisError( |
- new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
- ['x'] |
- ])), |
- isTrue); |
+ lintNames, |
+ unorderedEquals( |
+ ['avoid_as' /* embedder */, 'camel_case_types' /* options */])); |
// Sanity check embedder libs. |
var source = context.sourceFactory.forUri('dart:foobar'); |
@@ -268,16 +415,9 @@ analyzer: |
manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
// Verify filter setup. |
- List<ErrorFilter> filters = |
- callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
- expect(filters, isNotNull); |
- expect(filters, hasLength(1)); |
- expect( |
- filters.first(new AnalysisError( |
- new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
- ['x'] |
- ])), |
- isTrue); |
+ expect(errorFilters, isNotNull); |
+ expect(errorFilters, hasLength(1)); |
+ expect(errorFilters.first(unused_local_variable), isTrue); |
} |
test_error_filter_analysis_option_multiple_filters() async { |
@@ -294,24 +434,12 @@ analyzer: |
manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
// Verify filter setup. |
- List<ErrorFilter> filters = |
- callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
- expect(filters, isNotNull); |
- expect(filters, hasLength(2)); |
- |
- var unused_error = new AnalysisError( |
- new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [ |
- ['x'] |
- ]); |
+ expect(errorFilters, isNotNull); |
+ expect(errorFilters, hasLength(2)); |
- var invalid_assignment_error = |
- new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [ |
- ['x'], |
- ['y'] |
- ]); |
- |
- expect(filters.any((filter) => filter(unused_error)), isTrue); |
- expect(filters.any((filter) => filter(invalid_assignment_error)), isTrue); |
+ expect(errorFilters.any((filter) => filter(unused_local_variable)), isTrue); |
+ expect( |
+ errorFilters.any((filter) => filter(invalid_assignment_error)), isTrue); |
} |
test_error_filter_analysis_option_synonyms() async { |
@@ -328,10 +456,8 @@ analyzer: |
manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
// Verify filter setup. |
- List<ErrorFilter> filters = |
- callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
- expect(filters, isNotNull); |
- expect(filters, hasLength(2)); |
+ expect(errorFilters, isNotNull); |
+ expect(errorFilters, hasLength(2)); |
} |
test_error_filter_analysis_option_unpsecified() async { |
@@ -347,9 +473,7 @@ analyzer: |
manager.setRoots(<String>[projPath], <String>[], <String, String>{}); |
// Verify filter setup. |
- List<ErrorFilter> filters = |
- callbacks.currentContext.getConfigurationData(CONFIGURED_ERROR_FILTERS); |
- expect(filters, isEmpty); |
+ expect(errorFilters, isEmpty); |
} |
test_ignoreFilesInPackagesFolder() { |