Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: pkg/dev_compiler/test/codegen_test.dart

Issue 2503803004: fix #27784 and fix #27785, fromEnvironment constants in DDC (Closed)
Patch Set: allow trailing opts Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 /// Tests code generation. 5 /// Tests code generation.
6 /// 6 ///
7 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks 7 /// Runs Dart Dev Compiler on all input in the `codegen` directory and checks
8 /// that the output is what we expected. 8 /// that the output is what we expected.
9 library dev_compiler.test.codegen_test; 9 library dev_compiler.test.codegen_test;
10 10
11 // TODO(rnystrom): This doesn't actually run any tests any more. It just 11 // TODO(rnystrom): This doesn't actually run any tests any more. It just
12 // compiles stuff. This should be changed to not use unittest and just be a 12 // compiles stuff. This should be changed to not use unittest and just be a
13 // regular program that outputs files. 13 // regular program that outputs files.
14 14
15 import 'dart:io' show Directory, File, Platform; 15 import 'dart:io' show Directory, File, Platform;
16 import 'package:analyzer/analyzer.dart' 16 import 'package:analyzer/analyzer.dart'
17 show 17 show
18 ExportDirective, 18 ExportDirective,
19 ImportDirective, 19 ImportDirective,
20 StringLiteral, 20 StringLiteral,
21 UriBasedDirective, 21 UriBasedDirective,
22 parseDirectives; 22 parseDirectives;
23 import 'package:analyzer/src/generated/source.dart' show Source; 23 import 'package:analyzer/src/generated/source.dart' show Source;
24 import 'package:args/args.dart' show ArgParser, ArgResults; 24 import 'package:args/args.dart' show ArgParser, ArgResults;
25 import 'package:dev_compiler/src/analyzer/context.dart' show AnalyzerOptions; 25 import 'package:dev_compiler/src/analyzer/context.dart'
26 show AnalyzerOptions, parseDeclaredVariables;
26 import 'package:dev_compiler/src/compiler/compiler.dart' 27 import 'package:dev_compiler/src/compiler/compiler.dart'
27 show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler; 28 show BuildUnit, CompilerOptions, JSModuleFile, ModuleCompiler;
28 import 'package:dev_compiler/src/compiler/module_builder.dart' 29 import 'package:dev_compiler/src/compiler/module_builder.dart'
29 show ModuleFormat, addModuleFormatOptions, parseModuleFormatOption; 30 show ModuleFormat, addModuleFormatOptions, parseModuleFormatOption;
30 import 'package:path/path.dart' as path; 31 import 'package:path/path.dart' as path;
31 import 'package:test/test.dart' show expect, isFalse, isTrue, test; 32 import 'package:test/test.dart' show expect, isFalse, isTrue, test;
32 33
33 import '../tool/build_sdk.dart' as build_sdk; 34 import '../tool/build_sdk.dart' as build_sdk;
34 import 'testing.dart' show repoDirectory, testDirectory; 35 import 'testing.dart' show repoDirectory, testDirectory;
35 import 'multitest.dart' show extractTestsFromMultitest, isMultiTest; 36 import 'multitest.dart' show extractTestsFromMultitest, isMultiTest;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk'); 70 var sdkDir = path.join(repoDirectory, 'gen', 'patched_sdk');
70 var sdkSummaryFile = 71 var sdkSummaryFile =
71 path.join(testDirectory, '..', 'lib', 'sdk', 'ddc_sdk.sum'); 72 path.join(testDirectory, '..', 'lib', 'sdk', 'ddc_sdk.sum');
72 73
73 var summaryPaths = new Directory(path.join(codegenOutputDir, 'pkg')) 74 var summaryPaths = new Directory(path.join(codegenOutputDir, 'pkg'))
74 .listSync() 75 .listSync()
75 .map((e) => e.path) 76 .map((e) => e.path)
76 .where((p) => p.endsWith('.sum')) 77 .where((p) => p.endsWith('.sum'))
77 .toList(); 78 .toList();
78 79
79 var analyzerOptions = new AnalyzerOptions( 80 var sharedCompiler = new ModuleCompiler(new AnalyzerOptions(
80 dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths); 81 dartSdkSummaryPath: sdkSummaryFile, summaryPaths: summaryPaths));
81 var compiler = new ModuleCompiler(analyzerOptions);
82 82
83 var testDirs = [ 83 var testDirs = [
84 'language', 84 'language',
85 'corelib', 85 'corelib',
86 path.join('corelib', 'regexp'), 86 path.join('corelib', 'regexp'),
87 path.join('lib', 'convert'), 87 path.join('lib', 'convert'),
88 path.join('lib', 'html'), 88 path.join('lib', 'html'),
89 // TODO(vsm): Fix these - they import files from a different directory 89 // TODO(vsm): Fix these - they import files from a different directory
90 // - this triggers an invalid library root build error. 90 // - this triggers an invalid library root build error.
91 // path.join('lib', 'html', 'custom'), 91 // path.join('lib', 'html', 'custom'),
92 path.join('lib', 'math'), 92 path.join('lib', 'math'),
93 path.join('lib', 'mirrors'), 93 path.join('lib', 'mirrors'),
94 path.join('lib', 'typed_data'), 94 path.join('lib', 'typed_data'),
95 ]; 95 ];
96 96
97 // Copy all of the test files and expanded multitest files to 97 // Copy all of the test files and expanded multitest files to
98 // gen/codegen_tests. We'll compile from there. 98 // gen/codegen_tests. We'll compile from there.
99 var testFiles = _setUpTests(testDirs); 99 var testFiles = _setUpTests(testDirs);
100 100
101 // Our default compiler options. Individual tests can override these. 101 // Our default compiler options. Individual tests can override these.
102 var defaultOptions = ['--no-source-map', '--no-summarize']; 102 var defaultOptions = ['--no-source-map', '--no-summarize'];
103 var compilerArgParser = new ArgParser(); 103 var compileArgParser = new ArgParser();
104 CompilerOptions.addArguments(compilerArgParser); 104 CompilerOptions.addArguments(compileArgParser);
105 addModuleFormatOptions(compilerArgParser); 105 addModuleFormatOptions(compileArgParser);
106
107 var testFileOptionsMatcher =
108 new RegExp(r'// (compile options: |SharedOptions=)(.*)', multiLine: true);
109
110 // Ignore dart2js options that we don't support in DDC.
111 var ignoreOptions = [
112 '--enable-enum',
113 '--experimental-trust-js-interop-type-annotations',
114 '--trust-type-annotations',
115 '--supermixin'
116 ];
106 117
107 // Compile each test file to JS and put the result in gen/codegen_output. 118 // Compile each test file to JS and put the result in gen/codegen_output.
108 for (var testFile in testFiles) { 119 for (var testFile in testFiles) {
109 var relativePath = path.relative(testFile, from: codegenTestDir); 120 var relativePath = path.relative(testFile, from: codegenTestDir);
110 121
111 // Only compile the top-level files for generating coverage. 122 // Only compile the top-level files for generating coverage.
112 bool isTopLevelTest = path.dirname(relativePath) == "."; 123 bool isTopLevelTest = path.dirname(relativePath) == ".";
113 if (codeCoverage && !isTopLevelTest) continue; 124 if (codeCoverage && !isTopLevelTest) continue;
114 125
115 var name = path.withoutExtension(relativePath); 126 var name = path.withoutExtension(relativePath);
116 test('dartdevc $name', () { 127 test('dartdevc $name', () {
117 // Check if we need to use special compile options. 128 // Check if we need to use special compile options.
118 var contents = new File(testFile).readAsStringSync(); 129 var contents = new File(testFile).readAsStringSync();
119 var match = 130 var match = testFileOptionsMatcher.firstMatch(contents);
120 new RegExp(r'// compile options: (.*)').matchAsPrefix(contents);
121 131
122 var args = defaultOptions.toList(); 132 var args = defaultOptions.toList();
123 if (match != null) { 133 if (match != null) {
124 args.addAll(match.group(1).split(' ')); 134 var matchedArgs = match.group(2).split(' ');
135 args.addAll(matchedArgs.where((s) => !ignoreOptions.contains(s)));
125 } 136 }
126 137
127 var argResults = compilerArgParser.parse(args); 138 var declaredVars = <String, String>{};
139 var argResults =
140 compileArgParser.parse(parseDeclaredVariables(args, declaredVars));
128 var options = new CompilerOptions.fromArguments(argResults); 141 var options = new CompilerOptions.fromArguments(argResults);
129 var moduleFormat = parseModuleFormatOption(argResults).first; 142 var moduleFormat = parseModuleFormatOption(argResults).first;
130 143
131 // Collect any other files we've imported. 144 // Collect any other files we've imported.
132 var files = new Set<String>(); 145 var files = new Set<String>();
133 _collectTransitiveImports(contents, files, from: testFile); 146 _collectTransitiveImports(contents, files, from: testFile);
134 var unit = new BuildUnit( 147 var unit = new BuildUnit(
135 name, path.dirname(testFile), files.toList(), _moduleForLibrary); 148 name, path.dirname(testFile), files.toList(), _moduleForLibrary);
149
150 var compiler = sharedCompiler;
151 if (declaredVars.isNotEmpty) {
152 compiler = new ModuleCompiler(new AnalyzerOptions(
153 dartSdkSummaryPath: sdkSummaryFile,
154 summaryPaths: summaryPaths,
155 declaredVariables: declaredVars));
156 }
136 var module = compiler.compile(unit, options); 157 var module = compiler.compile(unit, options);
137 158
138 bool notStrong = notYetStrongTests.contains(name); 159 bool notStrong = notYetStrongTests.contains(name);
139 if (module.isValid) { 160 if (module.isValid) {
140 _writeModule( 161 _writeModule(
141 path.join(codegenOutputDir, name), 162 path.join(codegenOutputDir, name),
142 isTopLevelTest ? path.join(codegenExpectDir, name) : null, 163 isTopLevelTest ? path.join(codegenExpectDir, name) : null,
143 moduleFormat, 164 moduleFormat,
144 module); 165 module);
145 166
146 expect(notStrong, isFalse, 167 expect(notStrong, isFalse,
147 reason: "test $name expected strong mode errors, but compiled."); 168 reason: "test $name expected strong mode errors, but compiled.");
148 } else { 169 } else {
149 expect(notStrong, isTrue, 170 expect(notStrong, isTrue,
150 reason: "test $name failed to compile due to strong mode errors:" 171 reason: "test $name failed to compile due to strong mode errors:"
151 "\n\n${module.errors.join('\n')}."); 172 "\n\n${module.errors.join('\n')}.");
152 } 173 }
153 }); 174 });
154 } 175 }
155 176
156 if (filePattern.hasMatch('sunflower')) { 177 if (filePattern.hasMatch('sunflower')) {
157 test('sunflower', () { 178 test('sunflower', () {
158 _buildSunflower(compiler, codegenOutputDir, codegenExpectDir); 179 _buildSunflower(sharedCompiler, codegenOutputDir, codegenExpectDir);
159 }); 180 });
160 } 181 }
161 182
162 if (codeCoverage) { 183 if (codeCoverage) {
163 test('build_sdk code coverage', () { 184 test('build_sdk code coverage', () {
164 return build_sdk.main(['--dart-sdk', sdkDir, '-o', codegenOutputDir]); 185 return build_sdk.main(['--dart-sdk', sdkDir, '-o', codegenOutputDir]);
165 }); 186 });
166 } 187 }
167 } 188 }
168 189
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 /// Simplified from ParseDartTask.resolveDirective. 346 /// Simplified from ParseDartTask.resolveDirective.
326 String _resolveDirective(UriBasedDirective directive) { 347 String _resolveDirective(UriBasedDirective directive) {
327 StringLiteral uriLiteral = directive.uri; 348 StringLiteral uriLiteral = directive.uri;
328 String uriContent = uriLiteral.stringValue; 349 String uriContent = uriLiteral.stringValue;
329 if (uriContent != null) { 350 if (uriContent != null) {
330 uriContent = uriContent.trim(); 351 uriContent = uriContent.trim();
331 directive.uriContent = uriContent; 352 directive.uriContent = uriContent;
332 } 353 }
333 return directive.validate() == null ? uriContent : null; 354 return directive.validate() == null ? uriContent : null;
334 } 355 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698