OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library engine.resolver_test; | 5 library engine.resolver_test; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
| 9 import 'package:analyzer/src/context/context.dart' as newContext; |
9 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
10 import 'package:analyzer/src/generated/element.dart'; | 11 import 'package:analyzer/src/generated/element.dart'; |
11 import 'package:analyzer/src/generated/element_resolver.dart'; | 12 import 'package:analyzer/src/generated/element_resolver.dart'; |
12 import 'package:analyzer/src/generated/engine.dart'; | 13 import 'package:analyzer/src/generated/engine.dart'; |
13 import 'package:analyzer/src/generated/error.dart'; | 14 import 'package:analyzer/src/generated/error.dart'; |
14 import 'package:analyzer/src/generated/java_core.dart'; | 15 import 'package:analyzer/src/generated/java_core.dart'; |
15 import 'package:analyzer/src/generated/java_engine.dart'; | 16 import 'package:analyzer/src/generated/java_engine.dart'; |
16 import 'package:analyzer/src/generated/java_engine_io.dart'; | 17 import 'package:analyzer/src/generated/java_engine_io.dart'; |
17 import 'package:analyzer/src/generated/java_io.dart'; | 18 import 'package:analyzer/src/generated/java_io.dart'; |
18 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode; | 19 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 */ | 69 */ |
69 class AnalysisContextFactory { | 70 class AnalysisContextFactory { |
70 static String _DART_MATH = "dart:math"; | 71 static String _DART_MATH = "dart:math"; |
71 | 72 |
72 static String _DART_INTERCEPTORS = "dart:_interceptors"; | 73 static String _DART_INTERCEPTORS = "dart:_interceptors"; |
73 | 74 |
74 static String _DART_JS_HELPER = "dart:_js_helper"; | 75 static String _DART_JS_HELPER = "dart:_js_helper"; |
75 | 76 |
76 /** | 77 /** |
77 * Create an analysis context that has a fake core library already resolved. | 78 * Create an analysis context that has a fake core library already resolved. |
78 * | 79 * Return the context that was created. |
79 * @return the analysis context that was created | |
80 */ | 80 */ |
81 static AnalysisContextImpl contextWithCore() { | 81 static InternalAnalysisContext contextWithCore() { |
| 82 if (AnalysisEngine.instance.useTaskModel) { |
| 83 NewAnalysisContextForTests context = new NewAnalysisContextForTests(); |
| 84 return initContextWithCore(context); |
| 85 } |
82 AnalysisContextForTests context = new AnalysisContextForTests(); | 86 AnalysisContextForTests context = new AnalysisContextForTests(); |
83 return initContextWithCore(context); | 87 return initContextWithCore(context); |
84 } | 88 } |
85 | 89 |
86 /** | 90 /** |
87 * Create an analysis context that uses the given options and has a fake core
library already | 91 * Create an analysis context that uses the given [options] and has a fake |
88 * resolved. | 92 * core library already resolved. Return the context that was created. |
89 * | |
90 * @param options the options to be applied to the context | |
91 * @return the analysis context that was created | |
92 */ | 93 */ |
93 static AnalysisContextImpl contextWithCoreAndOptions( | 94 static InternalAnalysisContext contextWithCoreAndOptions( |
94 AnalysisOptions options) { | 95 AnalysisOptions options) { |
| 96 if (AnalysisEngine.instance.useTaskModel) { |
| 97 NewAnalysisContextForTests context = new NewAnalysisContextForTests(); |
| 98 context._internalSetAnalysisOptions(options); |
| 99 return initContextWithCore(context); |
| 100 } |
95 AnalysisContextForTests context = new AnalysisContextForTests(); | 101 AnalysisContextForTests context = new AnalysisContextForTests(); |
96 context._internalSetAnalysisOptions(options); | 102 context._internalSetAnalysisOptions(options); |
97 return initContextWithCore(context); | 103 return initContextWithCore(context); |
98 } | 104 } |
99 | 105 |
100 /** | 106 /** |
101 * Initialize the given analysis context with a fake core library already reso
lved. | 107 * Initialize the given analysis context with a fake core library already reso
lved. |
102 * | 108 * |
103 * @param context the context to be initialized (not `null`) | 109 * @param context the context to be initialized (not `null`) |
104 * @return the analysis context that was created | 110 * @return the analysis context that was created |
105 */ | 111 */ |
106 static AnalysisContextImpl initContextWithCore(AnalysisContextImpl context) { | 112 static InternalAnalysisContext initContextWithCore( |
| 113 InternalAnalysisContext context) { |
107 DirectoryBasedDartSdk sdk = new _AnalysisContextFactory_initContextWithCore( | 114 DirectoryBasedDartSdk sdk = new _AnalysisContextFactory_initContextWithCore( |
108 new JavaFile("/fake/sdk")); | 115 new JavaFile("/fake/sdk")); |
109 SourceFactory sourceFactory = | 116 SourceFactory sourceFactory = |
110 new SourceFactory([new DartUriResolver(sdk), new FileUriResolver()]); | 117 new SourceFactory([new DartUriResolver(sdk), new FileUriResolver()]); |
111 context.sourceFactory = sourceFactory; | 118 context.sourceFactory = sourceFactory; |
112 AnalysisContext coreContext = sdk.context; | 119 AnalysisContext coreContext = sdk.context; |
113 // | 120 // |
114 // dart:core | 121 // dart:core |
115 // | 122 // |
116 TestTypeProvider provider = new TestTypeProvider(); | 123 TestTypeProvider provider = new TestTypeProvider(); |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 // | 346 // |
340 HashMap<Source, LibraryElement> elementMap = | 347 HashMap<Source, LibraryElement> elementMap = |
341 new HashMap<Source, LibraryElement>(); | 348 new HashMap<Source, LibraryElement>(); |
342 elementMap[coreSource] = coreLibrary; | 349 elementMap[coreSource] = coreLibrary; |
343 elementMap[asyncSource] = asyncLibrary; | 350 elementMap[asyncSource] = asyncLibrary; |
344 elementMap[htmlSource] = htmlLibrary; | 351 elementMap[htmlSource] = htmlLibrary; |
345 elementMap[mathSource] = mathLibrary; | 352 elementMap[mathSource] = mathLibrary; |
346 context.recordLibraryElements(elementMap); | 353 context.recordLibraryElements(elementMap); |
347 return context; | 354 return context; |
348 } | 355 } |
| 356 |
| 357 /** |
| 358 * Create an analysis context that has a fake core library already resolved. |
| 359 * Return the context that was created. |
| 360 */ |
| 361 static AnalysisContextImpl oldContextWithCore() { |
| 362 AnalysisContextForTests context = new AnalysisContextForTests(); |
| 363 return initContextWithCore(context); |
| 364 } |
| 365 |
| 366 /** |
| 367 * Create an analysis context that uses the given [options] and has a fake |
| 368 * core library already resolved. Return the context that was created. |
| 369 */ |
| 370 static AnalysisContextImpl oldContextWithCoreAndOptions( |
| 371 AnalysisOptions options) { |
| 372 AnalysisContextForTests context = new AnalysisContextForTests(); |
| 373 context._internalSetAnalysisOptions(options); |
| 374 return initContextWithCore(context); |
| 375 } |
349 } | 376 } |
350 | 377 |
351 /** | 378 /** |
352 * Instances of the class `AnalysisContextForTests` implement an analysis contex
t that has a | 379 * Instances of the class `AnalysisContextForTests` implement an analysis contex
t that has a |
353 * fake SDK that is much smaller and faster for testing purposes. | 380 * fake SDK that is much smaller and faster for testing purposes. |
354 */ | 381 */ |
355 class AnalysisContextForTests extends AnalysisContextImpl { | 382 class AnalysisContextForTests extends AnalysisContextImpl { |
356 @override | 383 @override |
357 void set analysisOptions(AnalysisOptions options) { | 384 void set analysisOptions(AnalysisOptions options) { |
358 AnalysisOptions currentOptions = analysisOptions; | 385 AnalysisOptions currentOptions = analysisOptions; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 } | 432 } |
406 } | 433 } |
407 | 434 |
408 /** | 435 /** |
409 * Helper for creating and managing single [AnalysisContext]. | 436 * Helper for creating and managing single [AnalysisContext]. |
410 */ | 437 */ |
411 class AnalysisContextHelper { | 438 class AnalysisContextHelper { |
412 AnalysisContext context; | 439 AnalysisContext context; |
413 | 440 |
414 /** | 441 /** |
415 * Creates new [AnalysisContext] using [AnalysisContextFactory.contextWithCore
]. | 442 * Creates new [AnalysisContext] using [AnalysisContextFactory]. |
416 */ | 443 */ |
417 AnalysisContextHelper([AnalysisOptionsImpl options]) { | 444 AnalysisContextHelper([AnalysisOptionsImpl options]) { |
418 if (options == null) { | 445 if (options == null) { |
419 options = new AnalysisOptionsImpl(); | 446 options = new AnalysisOptionsImpl(); |
420 } | 447 } |
421 options.cacheSize = 256; | 448 options.cacheSize = 256; |
422 context = AnalysisContextFactory.contextWithCoreAndOptions(options); | 449 context = AnalysisContextFactory.contextWithCoreAndOptions(options); |
423 } | 450 } |
424 | 451 |
425 Source addSource(String path, String code) { | 452 Source addSource(String path, String code) { |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1881 0] as NamedExpression).name.label.staticElement, same(parameter)); | 1908 0] as NamedExpression).name.label.staticElement, same(parameter)); |
1882 _listener.assertNoErrors(); | 1909 _listener.assertNoErrors(); |
1883 } | 1910 } |
1884 | 1911 |
1885 /** | 1912 /** |
1886 * Create the resolver used by the tests. | 1913 * Create the resolver used by the tests. |
1887 * | 1914 * |
1888 * @return the resolver that was created | 1915 * @return the resolver that was created |
1889 */ | 1916 */ |
1890 ElementResolver _createResolver() { | 1917 ElementResolver _createResolver() { |
1891 AnalysisContextImpl context = new AnalysisContextImpl(); | 1918 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(); |
1892 SourceFactory sourceFactory = new SourceFactory( | |
1893 [new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]); | |
1894 context.sourceFactory = sourceFactory; | |
1895 FileBasedSource source = | 1919 FileBasedSource source = |
1896 new FileBasedSource(FileUtilities2.createFile("/test.dart")); | 1920 new FileBasedSource(FileUtilities2.createFile("/test.dart")); |
1897 CompilationUnitElementImpl definingCompilationUnit = | 1921 CompilationUnitElementImpl definingCompilationUnit = |
1898 new CompilationUnitElementImpl("test.dart"); | 1922 new CompilationUnitElementImpl("test.dart"); |
1899 definingCompilationUnit.librarySource = | 1923 definingCompilationUnit.librarySource = |
1900 definingCompilationUnit.source = source; | 1924 definingCompilationUnit.source = source; |
1901 _definingLibrary = ElementFactory.library(context, "test"); | 1925 _definingLibrary = ElementFactory.library(context, "test"); |
1902 _definingLibrary.definingCompilationUnit = definingCompilationUnit; | 1926 _definingLibrary.definingCompilationUnit = definingCompilationUnit; |
1903 Library library = new Library(context, _listener, source); | 1927 Library library = new Library(context, _listener, source); |
1904 library.libraryElement = _definingLibrary; | 1928 library.libraryElement = _definingLibrary; |
(...skipping 3797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5702 void _assertNoErrors(ClassElement classElt) { | 5726 void _assertNoErrors(ClassElement classElt) { |
5703 _assertErrors(classElt); | 5727 _assertErrors(classElt); |
5704 } | 5728 } |
5705 | 5729 |
5706 /** | 5730 /** |
5707 * Create the inheritance manager used by the tests. | 5731 * Create the inheritance manager used by the tests. |
5708 * | 5732 * |
5709 * @return the inheritance manager that was created | 5733 * @return the inheritance manager that was created |
5710 */ | 5734 */ |
5711 InheritanceManager _createInheritanceManager() { | 5735 InheritanceManager _createInheritanceManager() { |
5712 AnalysisContextImpl context = AnalysisContextFactory.contextWithCore(); | 5736 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
5713 FileBasedSource source = | 5737 FileBasedSource source = |
5714 new FileBasedSource(FileUtilities2.createFile("/test.dart")); | 5738 new FileBasedSource(FileUtilities2.createFile("/test.dart")); |
5715 CompilationUnitElementImpl definingCompilationUnit = | 5739 CompilationUnitElementImpl definingCompilationUnit = |
5716 new CompilationUnitElementImpl("test.dart"); | 5740 new CompilationUnitElementImpl("test.dart"); |
5717 definingCompilationUnit.librarySource = | 5741 definingCompilationUnit.librarySource = |
5718 definingCompilationUnit.source = source; | 5742 definingCompilationUnit.source = source; |
5719 _definingLibrary = ElementFactory.library(context, "test"); | 5743 _definingLibrary = ElementFactory.library(context, "test"); |
5720 _definingLibrary.definingCompilationUnit = definingCompilationUnit; | 5744 _definingLibrary.definingCompilationUnit = definingCompilationUnit; |
5721 return new InheritanceManager(_definingLibrary); | 5745 return new InheritanceManager(_definingLibrary); |
5722 } | 5746 } |
5723 } | 5747 } |
5724 | 5748 |
5725 @reflectiveTest | 5749 @reflectiveTest |
5726 class LibraryElementBuilderTest extends EngineTestCase { | 5750 class LibraryElementBuilderTest extends EngineTestCase { |
5727 /** | 5751 /** |
5728 * The analysis context used to analyze sources. | 5752 * The analysis context used to analyze sources. |
5729 */ | 5753 */ |
5730 AnalysisContextImpl _context; | 5754 InternalAnalysisContext _context; |
5731 | 5755 |
5732 /** | 5756 /** |
5733 * Add a source file to the content provider. The file path should be absolute
. | 5757 * Add a source file to the content provider. The file path should be absolute
. |
5734 * | 5758 * |
5735 * @param filePath the path of the file being added | 5759 * @param filePath the path of the file being added |
5736 * @param contents the contents to be returned by the content provider for the
specified file | 5760 * @param contents the contents to be returned by the content provider for the
specified file |
5737 * @return the source object representing the added file | 5761 * @return the source object representing the added file |
5738 */ | 5762 */ |
5739 Source addSource(String filePath, String contents) { | 5763 Source addSource(String filePath, String contents) { |
5740 Source source = new FileBasedSource(FileUtilities2.createFile(filePath)); | 5764 Source source = new FileBasedSource(FileUtilities2.createFile(filePath)); |
5741 _context.setContents(source, contents); | 5765 _context.setContents(source, contents); |
5742 return source; | 5766 return source; |
5743 } | 5767 } |
5744 | 5768 |
5745 @override | 5769 @override |
5746 void setUp() { | 5770 void setUp() { |
5747 SourceFactory sourceFactory = new SourceFactory([ | 5771 _context = AnalysisContextFactory.contextWithCore(); |
5748 new DartUriResolver(DirectoryBasedDartSdk.defaultSdk), | |
5749 new FileUriResolver() | |
5750 ]); | |
5751 _context = new AnalysisContextImpl(); | |
5752 _context.sourceFactory = sourceFactory; | |
5753 } | 5772 } |
5754 | 5773 |
5755 @override | 5774 @override |
5756 void tearDown() { | 5775 void tearDown() { |
5757 _context = null; | 5776 _context = null; |
5758 super.tearDown(); | 5777 super.tearDown(); |
5759 } | 5778 } |
5760 | 5779 |
5761 void test_accessorsAcrossFiles() { | 5780 void test_accessorsAcrossFiles() { |
5762 Source librarySource = addSource("/lib.dart", r''' | 5781 Source librarySource = addSource("/lib.dart", r''' |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5902 GatheringErrorListener listener = new GatheringErrorListener(); | 5921 GatheringErrorListener listener = new GatheringErrorListener(); |
5903 listener.addAll2(resolver.errorListener); | 5922 listener.addAll2(resolver.errorListener); |
5904 listener.assertErrorsWithCodes(expectedErrorCodes); | 5923 listener.assertErrorsWithCodes(expectedErrorCodes); |
5905 return element; | 5924 return element; |
5906 } | 5925 } |
5907 } | 5926 } |
5908 | 5927 |
5909 @reflectiveTest | 5928 @reflectiveTest |
5910 class LibraryImportScopeTest extends ResolverTestCase { | 5929 class LibraryImportScopeTest extends ResolverTestCase { |
5911 void test_conflictingImports() { | 5930 void test_conflictingImports() { |
5912 AnalysisContext context = new AnalysisContextImpl(); | 5931 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
5913 context.sourceFactory = new SourceFactory([]); | |
5914 String typeNameA = "A"; | 5932 String typeNameA = "A"; |
5915 String typeNameB = "B"; | 5933 String typeNameB = "B"; |
5916 String typeNameC = "C"; | 5934 String typeNameC = "C"; |
5917 ClassElement typeA = ElementFactory.classElement2(typeNameA); | 5935 ClassElement typeA = ElementFactory.classElement2(typeNameA); |
5918 ClassElement typeB1 = ElementFactory.classElement2(typeNameB); | 5936 ClassElement typeB1 = ElementFactory.classElement2(typeNameB); |
5919 ClassElement typeB2 = ElementFactory.classElement2(typeNameB); | 5937 ClassElement typeB2 = ElementFactory.classElement2(typeNameB); |
5920 ClassElement typeC = ElementFactory.classElement2(typeNameC); | 5938 ClassElement typeC = ElementFactory.classElement2(typeNameC); |
5921 LibraryElement importedLibrary1 = createTestLibrary(context, "imported1"); | 5939 LibraryElement importedLibrary1 = createTestLibrary(context, "imported1"); |
5922 (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).typ
es = | 5940 (importedLibrary1.definingCompilationUnit as CompilationUnitElementImpl).typ
es = |
5923 <ClassElement>[typeA, typeB1]; | 5941 <ClassElement>[typeA, typeB1]; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5969 } | 5987 } |
5970 } | 5988 } |
5971 | 5989 |
5972 void test_creation_empty() { | 5990 void test_creation_empty() { |
5973 LibraryElement definingLibrary = createDefaultTestLibrary(); | 5991 LibraryElement definingLibrary = createDefaultTestLibrary(); |
5974 GatheringErrorListener errorListener = new GatheringErrorListener(); | 5992 GatheringErrorListener errorListener = new GatheringErrorListener(); |
5975 new LibraryImportScope(definingLibrary, errorListener); | 5993 new LibraryImportScope(definingLibrary, errorListener); |
5976 } | 5994 } |
5977 | 5995 |
5978 void test_creation_nonEmpty() { | 5996 void test_creation_nonEmpty() { |
5979 AnalysisContext context = new AnalysisContextImpl(); | 5997 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
5980 context.sourceFactory = new SourceFactory([]); | |
5981 String importedTypeName = "A"; | 5998 String importedTypeName = "A"; |
5982 ClassElement importedType = | 5999 ClassElement importedType = |
5983 new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName)); | 6000 new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName)); |
5984 LibraryElement importedLibrary = createTestLibrary(context, "imported"); | 6001 LibraryElement importedLibrary = createTestLibrary(context, "imported"); |
5985 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = | 6002 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = |
5986 <ClassElement>[importedType]; | 6003 <ClassElement>[importedType]; |
5987 LibraryElementImpl definingLibrary = | 6004 LibraryElementImpl definingLibrary = |
5988 createTestLibrary(context, "importing"); | 6005 createTestLibrary(context, "importing"); |
5989 ImportElementImpl importElement = new ImportElementImpl(0); | 6006 ImportElementImpl importElement = new ImportElementImpl(0); |
5990 importElement.importedLibrary = importedLibrary; | 6007 importElement.importedLibrary = importedLibrary; |
(...skipping 30 matching lines...) Expand all Loading... |
6021 importingLibrary.imports = <ImportElement>[importCore, importLib]; | 6038 importingLibrary.imports = <ImportElement>[importCore, importLib]; |
6022 GatheringErrorListener errorListener = new GatheringErrorListener(); | 6039 GatheringErrorListener errorListener = new GatheringErrorListener(); |
6023 Scope scope = new LibraryImportScope(importingLibrary, errorListener); | 6040 Scope scope = new LibraryImportScope(importingLibrary, errorListener); |
6024 expect( | 6041 expect( |
6025 scope.lookup(AstFactory.identifier3(typeName), importingLibrary), type); | 6042 scope.lookup(AstFactory.identifier3(typeName), importingLibrary), type); |
6026 errorListener | 6043 errorListener |
6027 .assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]); | 6044 .assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]); |
6028 } | 6045 } |
6029 | 6046 |
6030 void test_nonConflictingImports_sameElement() { | 6047 void test_nonConflictingImports_sameElement() { |
6031 AnalysisContext context = new AnalysisContextImpl(); | 6048 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
6032 context.sourceFactory = new SourceFactory([]); | |
6033 String typeNameA = "A"; | 6049 String typeNameA = "A"; |
6034 String typeNameB = "B"; | 6050 String typeNameB = "B"; |
6035 ClassElement typeA = ElementFactory.classElement2(typeNameA); | 6051 ClassElement typeA = ElementFactory.classElement2(typeNameA); |
6036 ClassElement typeB = ElementFactory.classElement2(typeNameB); | 6052 ClassElement typeB = ElementFactory.classElement2(typeNameB); |
6037 LibraryElement importedLibrary = createTestLibrary(context, "imported"); | 6053 LibraryElement importedLibrary = createTestLibrary(context, "imported"); |
6038 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = | 6054 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = |
6039 <ClassElement>[typeA, typeB]; | 6055 <ClassElement>[typeA, typeB]; |
6040 ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null); | 6056 ImportElementImpl import1 = ElementFactory.importFor(importedLibrary, null); |
6041 ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null); | 6057 ImportElementImpl import2 = ElementFactory.importFor(importedLibrary, null); |
6042 LibraryElementImpl importingLibrary = | 6058 LibraryElementImpl importingLibrary = |
6043 createTestLibrary(context, "importing"); | 6059 createTestLibrary(context, "importing"); |
6044 importingLibrary.imports = <ImportElement>[import1, import2]; | 6060 importingLibrary.imports = <ImportElement>[import1, import2]; |
6045 GatheringErrorListener errorListener = new GatheringErrorListener(); | 6061 GatheringErrorListener errorListener = new GatheringErrorListener(); |
6046 Scope scope = new LibraryImportScope(importingLibrary, errorListener); | 6062 Scope scope = new LibraryImportScope(importingLibrary, errorListener); |
6047 expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary), | 6063 expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary), |
6048 typeA); | 6064 typeA); |
6049 errorListener.assertNoErrors(); | 6065 errorListener.assertNoErrors(); |
6050 expect(scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary), | 6066 expect(scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary), |
6051 typeB); | 6067 typeB); |
6052 errorListener.assertNoErrors(); | 6068 errorListener.assertNoErrors(); |
6053 } | 6069 } |
6054 | 6070 |
6055 void test_prefixedAndNonPrefixed() { | 6071 void test_prefixedAndNonPrefixed() { |
6056 AnalysisContext context = new AnalysisContextImpl(); | 6072 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
6057 context.sourceFactory = new SourceFactory([]); | |
6058 String typeName = "C"; | 6073 String typeName = "C"; |
6059 String prefixName = "p"; | 6074 String prefixName = "p"; |
6060 ClassElement prefixedType = ElementFactory.classElement2(typeName); | 6075 ClassElement prefixedType = ElementFactory.classElement2(typeName); |
6061 ClassElement nonPrefixedType = ElementFactory.classElement2(typeName); | 6076 ClassElement nonPrefixedType = ElementFactory.classElement2(typeName); |
6062 LibraryElement prefixedLibrary = | 6077 LibraryElement prefixedLibrary = |
6063 createTestLibrary(context, "import.prefixed"); | 6078 createTestLibrary(context, "import.prefixed"); |
6064 (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = | 6079 (prefixedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = |
6065 <ClassElement>[prefixedType]; | 6080 <ClassElement>[prefixedType]; |
6066 ImportElementImpl prefixedImport = ElementFactory.importFor( | 6081 ImportElementImpl prefixedImport = ElementFactory.importFor( |
6067 prefixedLibrary, ElementFactory.prefix(prefixName)); | 6082 prefixedLibrary, ElementFactory.prefix(prefixName)); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6188 | 6203 |
6189 @reflectiveTest | 6204 @reflectiveTest |
6190 class LibraryScopeTest extends ResolverTestCase { | 6205 class LibraryScopeTest extends ResolverTestCase { |
6191 void test_creation_empty() { | 6206 void test_creation_empty() { |
6192 LibraryElement definingLibrary = createDefaultTestLibrary(); | 6207 LibraryElement definingLibrary = createDefaultTestLibrary(); |
6193 GatheringErrorListener errorListener = new GatheringErrorListener(); | 6208 GatheringErrorListener errorListener = new GatheringErrorListener(); |
6194 new LibraryScope(definingLibrary, errorListener); | 6209 new LibraryScope(definingLibrary, errorListener); |
6195 } | 6210 } |
6196 | 6211 |
6197 void test_creation_nonEmpty() { | 6212 void test_creation_nonEmpty() { |
6198 AnalysisContext context = new AnalysisContextImpl(); | 6213 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
6199 context.sourceFactory = new SourceFactory([]); | |
6200 String importedTypeName = "A"; | 6214 String importedTypeName = "A"; |
6201 ClassElement importedType = | 6215 ClassElement importedType = |
6202 new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName)); | 6216 new ClassElementImpl.forNode(AstFactory.identifier3(importedTypeName)); |
6203 LibraryElement importedLibrary = createTestLibrary(context, "imported"); | 6217 LibraryElement importedLibrary = createTestLibrary(context, "imported"); |
6204 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = | 6218 (importedLibrary.definingCompilationUnit as CompilationUnitElementImpl).type
s = |
6205 <ClassElement>[importedType]; | 6219 <ClassElement>[importedType]; |
6206 LibraryElementImpl definingLibrary = | 6220 LibraryElementImpl definingLibrary = |
6207 createTestLibrary(context, "importing"); | 6221 createTestLibrary(context, "importing"); |
6208 ImportElementImpl importElement = new ImportElementImpl(0); | 6222 ImportElementImpl importElement = new ImportElementImpl(0); |
6209 importElement.importedLibrary = importedLibrary; | 6223 importElement.importedLibrary = importedLibrary; |
(...skipping 14 matching lines...) Expand all Loading... |
6224 } | 6238 } |
6225 | 6239 |
6226 @reflectiveTest | 6240 @reflectiveTest |
6227 class LibraryTest extends EngineTestCase { | 6241 class LibraryTest extends EngineTestCase { |
6228 /** | 6242 /** |
6229 * The error listener to which all errors will be reported. | 6243 * The error listener to which all errors will be reported. |
6230 */ | 6244 */ |
6231 GatheringErrorListener _errorListener; | 6245 GatheringErrorListener _errorListener; |
6232 | 6246 |
6233 /** | 6247 /** |
6234 * The source factory used to create libraries. | |
6235 */ | |
6236 SourceFactory _sourceFactory; | |
6237 | |
6238 /** | |
6239 * The analysis context to pass in to all libraries created by the tests. | 6248 * The analysis context to pass in to all libraries created by the tests. |
6240 */ | 6249 */ |
6241 AnalysisContextImpl _analysisContext; | 6250 InternalAnalysisContext _analysisContext; |
6242 | 6251 |
6243 /** | 6252 /** |
6244 * The library used by the tests. | 6253 * The library used by the tests. |
6245 */ | 6254 */ |
6246 Library _library; | 6255 Library _library; |
6247 | 6256 |
6248 @override | 6257 @override |
6249 void setUp() { | 6258 void setUp() { |
6250 _sourceFactory = new SourceFactory([new FileUriResolver()]); | 6259 _analysisContext = AnalysisContextFactory.contextWithCore(); |
6251 _analysisContext = new AnalysisContextImpl(); | |
6252 _analysisContext.sourceFactory = _sourceFactory; | |
6253 _errorListener = new GatheringErrorListener(); | 6260 _errorListener = new GatheringErrorListener(); |
6254 _library = _createLibrary("/lib.dart"); | 6261 _library = _createLibrary("/lib.dart"); |
6255 } | 6262 } |
6256 | 6263 |
6257 @override | 6264 @override |
6258 void tearDown() { | 6265 void tearDown() { |
6259 _errorListener = null; | 6266 _errorListener = null; |
6260 _sourceFactory = null; | |
6261 _analysisContext = null; | 6267 _analysisContext = null; |
6262 _library = null; | 6268 _library = null; |
6263 super.tearDown(); | 6269 super.tearDown(); |
6264 } | 6270 } |
6265 | 6271 |
6266 void test_getExplicitlyImportsCore() { | 6272 void test_getExplicitlyImportsCore() { |
6267 expect(_library.explicitlyImportsCore, isFalse); | 6273 expect(_library.explicitlyImportsCore, isFalse); |
6268 _errorListener.assertNoErrors(); | 6274 _errorListener.assertNoErrors(); |
6269 } | 6275 } |
6270 | 6276 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6374 void test_MemberMap_put() { | 6380 void test_MemberMap_put() { |
6375 MethodElement m1 = ElementFactory.methodElement("m1", _nullType); | 6381 MethodElement m1 = ElementFactory.methodElement("m1", _nullType); |
6376 MemberMap map = new MemberMap(); | 6382 MemberMap map = new MemberMap(); |
6377 expect(map.size, 0); | 6383 expect(map.size, 0); |
6378 map.put(m1.name, m1); | 6384 map.put(m1.name, m1); |
6379 expect(map.size, 1); | 6385 expect(map.size, 1); |
6380 expect(map.get("m1"), m1); | 6386 expect(map.get("m1"), m1); |
6381 } | 6387 } |
6382 } | 6388 } |
6383 | 6389 |
| 6390 /** |
| 6391 * An analysis context that has a fake SDK that is much smaller and faster for |
| 6392 * testing purposes. |
| 6393 */ |
| 6394 class NewAnalysisContextForTests extends newContext.AnalysisContextImpl { |
| 6395 @override |
| 6396 void set analysisOptions(AnalysisOptions options) { |
| 6397 AnalysisOptions currentOptions = analysisOptions; |
| 6398 bool needsRecompute = currentOptions.analyzeFunctionBodiesPredicate != |
| 6399 options.analyzeFunctionBodiesPredicate || |
| 6400 currentOptions.generateImplicitErrors != |
| 6401 options.generateImplicitErrors || |
| 6402 currentOptions.generateSdkErrors != options.generateSdkErrors || |
| 6403 currentOptions.dart2jsHint != options.dart2jsHint || |
| 6404 (currentOptions.hint && !options.hint) || |
| 6405 currentOptions.preserveComments != options.preserveComments || |
| 6406 currentOptions.enableNullAwareOperators != |
| 6407 options.enableNullAwareOperators || |
| 6408 currentOptions.enableStrictCallChecks != options.enableStrictCallChecks; |
| 6409 if (needsRecompute) { |
| 6410 fail( |
| 6411 "Cannot set options that cause the sources to be reanalyzed in a test
context"); |
| 6412 } |
| 6413 super.analysisOptions = options; |
| 6414 } |
| 6415 |
| 6416 @override |
| 6417 bool exists(Source source) => |
| 6418 super.exists(source) || sourceFactory.dartSdk.context.exists(source); |
| 6419 |
| 6420 @override |
| 6421 TimestampedData<String> getContents(Source source) { |
| 6422 if (source.isInSystemLibrary) { |
| 6423 return sourceFactory.dartSdk.context.getContents(source); |
| 6424 } |
| 6425 return super.getContents(source); |
| 6426 } |
| 6427 |
| 6428 @override |
| 6429 int getModificationStamp(Source source) { |
| 6430 if (source.isInSystemLibrary) { |
| 6431 return sourceFactory.dartSdk.context.getModificationStamp(source); |
| 6432 } |
| 6433 return super.getModificationStamp(source); |
| 6434 } |
| 6435 |
| 6436 /** |
| 6437 * Set the analysis options, even if they would force re-analysis. This method
should only be |
| 6438 * invoked before the fake SDK is initialized. |
| 6439 * |
| 6440 * @param options the analysis options to be set |
| 6441 */ |
| 6442 void _internalSetAnalysisOptions(AnalysisOptions options) { |
| 6443 super.analysisOptions = options; |
| 6444 } |
| 6445 } |
| 6446 |
6384 @reflectiveTest | 6447 @reflectiveTest |
6385 class NonHintCodeTest extends ResolverTestCase { | 6448 class NonHintCodeTest extends ResolverTestCase { |
6386 void test_deadCode_deadBlock_conditionalElse_debugConst() { | 6449 void test_deadCode_deadBlock_conditionalElse_debugConst() { |
6387 Source source = addSource(r''' | 6450 Source source = addSource(r''' |
6388 const bool DEBUG = true; | 6451 const bool DEBUG = true; |
6389 f() { | 6452 f() { |
6390 DEBUG ? 1 : 2; | 6453 DEBUG ? 1 : 2; |
6391 }'''); | 6454 }'''); |
6392 resolve(source); | 6455 resolve(source); |
6393 assertNoErrors(source); | 6456 assertNoErrors(source); |
(...skipping 1260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7654 buffer.write(identifier.offset); | 7717 buffer.write(identifier.offset); |
7655 buffer.writeln(")"); | 7718 buffer.writeln(")"); |
7656 } | 7719 } |
7657 } | 7720 } |
7658 } | 7721 } |
7659 | 7722 |
7660 class ResolverTestCase extends EngineTestCase { | 7723 class ResolverTestCase extends EngineTestCase { |
7661 /** | 7724 /** |
7662 * The analysis context used to parse the compilation units being resolved. | 7725 * The analysis context used to parse the compilation units being resolved. |
7663 */ | 7726 */ |
7664 AnalysisContextImpl analysisContext2; | 7727 InternalAnalysisContext analysisContext2; |
7665 | 7728 |
7666 /** | 7729 /** |
7667 * Specifies if [assertErrors] should check for [HintCode.UNUSED_ELEMENT] and | 7730 * Specifies if [assertErrors] should check for [HintCode.UNUSED_ELEMENT] and |
7668 * [HintCode.UNUSED_FIELD]. | 7731 * [HintCode.UNUSED_FIELD]. |
7669 */ | 7732 */ |
7670 bool enableUnusedElement = false; | 7733 bool enableUnusedElement = false; |
7671 | 7734 |
7672 /** | 7735 /** |
7673 * Specifies if [assertErrors] should check for [HintCode.UNUSED_LOCAL_VARIABL
E]. | 7736 * Specifies if [assertErrors] should check for [HintCode.UNUSED_LOCAL_VARIABL
E]. |
7674 */ | 7737 */ |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7764 return source; | 7827 return source; |
7765 } | 7828 } |
7766 | 7829 |
7767 /** | 7830 /** |
7768 * Create a library element that represents a library named `"test"` containin
g a single | 7831 * Create a library element that represents a library named `"test"` containin
g a single |
7769 * empty compilation unit. | 7832 * empty compilation unit. |
7770 * | 7833 * |
7771 * @return the library element that was created | 7834 * @return the library element that was created |
7772 */ | 7835 */ |
7773 LibraryElementImpl createDefaultTestLibrary() => | 7836 LibraryElementImpl createDefaultTestLibrary() => |
7774 createTestLibrary(new AnalysisContextImpl(), "test"); | 7837 createTestLibrary(AnalysisContextFactory.contextWithCore(), "test"); |
7775 | 7838 |
7776 /** | 7839 /** |
7777 * Create a library element that represents a library with the given name cont
aining a single | 7840 * Create a library element that represents a library with the given name cont
aining a single |
7778 * empty compilation unit. | 7841 * empty compilation unit. |
7779 * | 7842 * |
7780 * @param libraryName the name of the library to be created | 7843 * @param libraryName the name of the library to be created |
7781 * @return the library element that was created | 7844 * @return the library element that was created |
7782 */ | 7845 */ |
7783 LibraryElementImpl createTestLibrary( | 7846 LibraryElementImpl createTestLibrary( |
7784 AnalysisContext context, String libraryName, [List<String> typeNames]) { | 7847 AnalysisContext context, String libraryName, [List<String> typeNames]) { |
(...skipping 3202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10987 // TODO(brianwilkerson) Compare other kinds of types then make this a shared | 11050 // TODO(brianwilkerson) Compare other kinds of types then make this a shared |
10988 // utility method. | 11051 // utility method. |
10989 } | 11052 } |
10990 | 11053 |
10991 /** | 11054 /** |
10992 * Create the analyzer used by the tests. | 11055 * Create the analyzer used by the tests. |
10993 * | 11056 * |
10994 * @return the analyzer to be used by the tests | 11057 * @return the analyzer to be used by the tests |
10995 */ | 11058 */ |
10996 StaticTypeAnalyzer _createAnalyzer() { | 11059 StaticTypeAnalyzer _createAnalyzer() { |
10997 AnalysisContextImpl context = new AnalysisContextImpl(); | 11060 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(); |
10998 SourceFactory sourceFactory = new SourceFactory( | |
10999 [new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]); | |
11000 context.sourceFactory = sourceFactory; | |
11001 FileBasedSource source = | 11061 FileBasedSource source = |
11002 new FileBasedSource(FileUtilities2.createFile("/lib.dart")); | 11062 new FileBasedSource(FileUtilities2.createFile("/lib.dart")); |
11003 CompilationUnitElementImpl definingCompilationUnit = | 11063 CompilationUnitElementImpl definingCompilationUnit = |
11004 new CompilationUnitElementImpl("lib.dart"); | 11064 new CompilationUnitElementImpl("lib.dart"); |
11005 definingCompilationUnit.librarySource = | 11065 definingCompilationUnit.librarySource = |
11006 definingCompilationUnit.source = source; | 11066 definingCompilationUnit.source = source; |
11007 LibraryElementImpl definingLibrary = | 11067 LibraryElementImpl definingLibrary = |
11008 new LibraryElementImpl.forNode(context, null); | 11068 new LibraryElementImpl.forNode(context, null); |
11009 definingLibrary.definingCompilationUnit = definingCompilationUnit; | 11069 definingLibrary.definingCompilationUnit = definingCompilationUnit; |
11010 Library library = new Library(context, _listener, source); | 11070 Library library = new Library(context, _listener, source); |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11495 SubtypeManager _subtypeManager; | 11555 SubtypeManager _subtypeManager; |
11496 | 11556 |
11497 /** | 11557 /** |
11498 * The compilation unit element containing all of the types setup in each test
. | 11558 * The compilation unit element containing all of the types setup in each test
. |
11499 */ | 11559 */ |
11500 CompilationUnitElementImpl _definingCompilationUnit; | 11560 CompilationUnitElementImpl _definingCompilationUnit; |
11501 | 11561 |
11502 @override | 11562 @override |
11503 void setUp() { | 11563 void setUp() { |
11504 super.setUp(); | 11564 super.setUp(); |
11505 AnalysisContextImpl context = AnalysisContextFactory.contextWithCore(); | 11565 AnalysisContext context = AnalysisContextFactory.contextWithCore(); |
11506 FileBasedSource source = | 11566 FileBasedSource source = |
11507 new FileBasedSource(FileUtilities2.createFile("/test.dart")); | 11567 new FileBasedSource(FileUtilities2.createFile("/test.dart")); |
11508 _definingCompilationUnit = new CompilationUnitElementImpl("test.dart"); | 11568 _definingCompilationUnit = new CompilationUnitElementImpl("test.dart"); |
11509 _definingCompilationUnit.librarySource = | 11569 _definingCompilationUnit.librarySource = |
11510 _definingCompilationUnit.source = source; | 11570 _definingCompilationUnit.source = source; |
11511 LibraryElementImpl definingLibrary = | 11571 LibraryElementImpl definingLibrary = |
11512 ElementFactory.library(context, "test"); | 11572 ElementFactory.library(context, "test"); |
11513 definingLibrary.definingCompilationUnit = _definingCompilationUnit; | 11573 definingLibrary.definingCompilationUnit = _definingCompilationUnit; |
11514 _subtypeManager = new SubtypeManager(); | 11574 _subtypeManager = new SubtypeManager(); |
11515 } | 11575 } |
(...skipping 1687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13203 mapType.element, | 13263 mapType.element, |
13204 objectType.element, | 13264 objectType.element, |
13205 stackTraceType.element, | 13265 stackTraceType.element, |
13206 stringType.element, | 13266 stringType.element, |
13207 symbolType.element, | 13267 symbolType.element, |
13208 typeType.element | 13268 typeType.element |
13209 ]; | 13269 ]; |
13210 CompilationUnitElementImpl asyncUnit = | 13270 CompilationUnitElementImpl asyncUnit = |
13211 new CompilationUnitElementImpl("async.dart"); | 13271 new CompilationUnitElementImpl("async.dart"); |
13212 asyncUnit.types = <ClassElement>[futureType.element, streamType.element]; | 13272 asyncUnit.types = <ClassElement>[futureType.element, streamType.element]; |
13213 AnalysisContextImpl context = new AnalysisContextImpl(); | 13273 AnalysisContext context = AnalysisEngine.instance.createAnalysisContext(); |
13214 LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode( | 13274 LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode( |
13215 context, AstFactory.libraryIdentifier2(["dart.core"])); | 13275 context, AstFactory.libraryIdentifier2(["dart.core"])); |
13216 coreLibrary.definingCompilationUnit = coreUnit; | 13276 coreLibrary.definingCompilationUnit = coreUnit; |
13217 LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode( | 13277 LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode( |
13218 context, AstFactory.libraryIdentifier2(["dart.async"])); | 13278 context, AstFactory.libraryIdentifier2(["dart.async"])); |
13219 asyncLibrary.definingCompilationUnit = asyncUnit; | 13279 asyncLibrary.definingCompilationUnit = asyncUnit; |
13220 // | 13280 // |
13221 // Create a type provider and ensure that it can return the expected types. | 13281 // Create a type provider and ensure that it can return the expected types. |
13222 // | 13282 // |
13223 TypeProviderImpl provider = new TypeProviderImpl(coreLibrary, asyncLibrary); | 13283 TypeProviderImpl provider = new TypeProviderImpl(coreLibrary, asyncLibrary); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13326 VariableDeclaration node = AstFactory.variableDeclaration("a"); | 13386 VariableDeclaration node = AstFactory.variableDeclaration("a"); |
13327 AstFactory.variableDeclarationList(null, AstFactory.typeName(type), [node]); | 13387 AstFactory.variableDeclarationList(null, AstFactory.typeName(type), [node]); |
13328 //resolve(node); | 13388 //resolve(node); |
13329 expect(node.name.staticType, same(type.type)); | 13389 expect(node.name.staticType, same(type.type)); |
13330 _listener.assertNoErrors(); | 13390 _listener.assertNoErrors(); |
13331 } | 13391 } |
13332 | 13392 |
13333 @override | 13393 @override |
13334 void setUp() { | 13394 void setUp() { |
13335 _listener = new GatheringErrorListener(); | 13395 _listener = new GatheringErrorListener(); |
13336 SourceFactory factory = new SourceFactory([new FileUriResolver()]); | 13396 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(); |
13337 AnalysisContextImpl context = new AnalysisContextImpl(); | |
13338 context.sourceFactory = factory; | |
13339 Source librarySource = | 13397 Source librarySource = |
13340 new FileBasedSource(FileUtilities2.createFile("/lib.dart")); | 13398 new FileBasedSource(FileUtilities2.createFile("/lib.dart")); |
13341 _library = new Library(context, _listener, librarySource); | 13399 _library = new Library(context, _listener, librarySource); |
13342 LibraryElementImpl element = new LibraryElementImpl.forNode( | 13400 LibraryElementImpl element = new LibraryElementImpl.forNode( |
13343 context, AstFactory.libraryIdentifier2(["lib"])); | 13401 context, AstFactory.libraryIdentifier2(["lib"])); |
13344 element.definingCompilationUnit = | 13402 element.definingCompilationUnit = |
13345 new CompilationUnitElementImpl("lib.dart"); | 13403 new CompilationUnitElementImpl("lib.dart"); |
13346 _library.libraryElement = element; | 13404 _library.libraryElement = element; |
13347 _typeProvider = new TestTypeProvider(); | 13405 _typeProvider = new TestTypeProvider(); |
13348 _visitor = | 13406 _visitor = |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13811 // check propagated type | 13869 // check propagated type |
13812 FunctionType propagatedType = node.propagatedType as FunctionType; | 13870 FunctionType propagatedType = node.propagatedType as FunctionType; |
13813 expect(propagatedType.returnType, test.typeProvider.stringType); | 13871 expect(propagatedType.returnType, test.typeProvider.stringType); |
13814 } on AnalysisException catch (e, stackTrace) { | 13872 } on AnalysisException catch (e, stackTrace) { |
13815 thrownException[0] = new CaughtException(e, stackTrace); | 13873 thrownException[0] = new CaughtException(e, stackTrace); |
13816 } | 13874 } |
13817 } | 13875 } |
13818 return null; | 13876 return null; |
13819 } | 13877 } |
13820 } | 13878 } |
OLD | NEW |