Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit c817ff2

Browse files
author
John Messerly
committed
use cli_utils to get SDK dir
also a small cleanup to make it easier to construct TypeResolver (fixes a TODO) and fix a couple of typos [email protected] Review URL: https://chromereviews.googleplex.com/145437014
1 parent 796252b commit c817ff2

File tree

9 files changed

+47
-91
lines changed

9 files changed

+47
-91
lines changed

bin/devc.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ library ddc.bin.checker;
66
import 'dart:io';
77

88
import 'package:args/args.dart';
9+
import 'package:cli_util/cli_util.dart' show getSdkDir;
910
import 'package:logging/logging.dart' show Logger, Level;
1011

1112
import 'package:ddc/devc.dart';
12-
import 'package:ddc/src/checker/dart_sdk.dart'
13-
show dartSdkDirectory, mockSdkSources;
13+
import 'package:ddc/src/checker/dart_sdk.dart' show mockSdkSources;
1414
import 'package:ddc/src/checker/resolver.dart' show TypeResolver;
1515

1616
final ArgParser argParser = new ArgParser()
@@ -55,13 +55,13 @@ void main(List<String> argv) {
5555
bool shouldMockSdk = args['mock-sdk'];
5656
String dartSdkPath;
5757
if (!shouldMockSdk) {
58-
dartSdkPath = args['dart-sdk'];
59-
if (dartSdkPath == null) dartSdkPath = dartSdkDirectory;
60-
if (dartSdkPath == null) {
58+
var sdkDir = getSdkDir(argv);
59+
if (sdkDir == null) {
6160
print('Could not automatically find dart sdk path.');
6261
print('Please pass in explicitly: --dart-sdk <path>');
6362
exit(1);
6463
}
64+
dartSdkPath = sdkDir.path;
6565
}
6666

6767
if (args.rest.length == 0) {
@@ -75,9 +75,9 @@ void main(List<String> argv) {
7575
var useColors = stdioType(stdout) == StdioType.TERMINAL;
7676
if (!args['dump-info']) setupLogger(level, print);
7777

78-
var typeResolver = new TypeResolver(shouldMockSdk
79-
? TypeResolver.sdkResolverFromMock(mockSdkSources)
80-
: TypeResolver.sdkResolverFromDir(dartSdkPath));
78+
var typeResolver = shouldMockSdk
79+
? new TypeResolver.fromMock(mockSdkSources)
80+
: new TypeResolver.fromDir(dartSdkPath);
8181

8282
var filename = args.rest.first;
8383
var result = compile(filename, typeResolver,

bin/edit_files.dart

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ import 'dart:io';
1111
import 'dart:convert';
1212

1313
import 'package:args/args.dart';
14-
import 'package:ddc/src/report.dart';
14+
import 'package:cli_util/cli_util.dart' show getSdkDir;
1515
import 'package:source_maps/refactor.dart';
1616
import 'package:source_span/source_span.dart';
1717

18-
import 'package:ddc/src/checker/dart_sdk.dart'
19-
show dartSdkDirectory, mockSdkSources;
18+
import 'package:ddc/src/report.dart';
2019
import 'package:ddc/src/checker/resolver.dart' show TypeResolver;
2120

2221
final ArgParser argParser = new ArgParser()
@@ -31,6 +30,7 @@ final ArgParser argParser = new ArgParser()
3130
help: 'regular expression of file names to include', defaultsTo: null)
3231
..addOption('exclude-pattern',
3332
help: 'regular expression of file names to exclude', defaultsTo: null)
33+
..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null)
3434
..addFlag('help', abbr: 'h', help: 'Display this message');
3535

3636
void _showUsageAndExit() {
@@ -88,8 +88,8 @@ class EditFileSummaryVisitor extends RecursiveSummaryVisitor {
8888
Process.runSync(
8989
checkoutFilesExecutable, [checkoutFilesArg]..addAll(_files.keys));
9090
}
91-
_files.forEach((name, transacation) {
92-
var nestedPrinter = transacation.commit()..build(name);
91+
_files.forEach((name, transaction) {
92+
var nestedPrinter = transaction.commit()..build(name);
9393
new File(name).writeAsStringSync(nestedPrinter.text, flush: true);
9494
});
9595
}
@@ -104,9 +104,15 @@ void main(List<String> argv) {
104104
_showUsageAndExit();
105105
}
106106

107+
var sdkDir = getSdkDir(argv);
108+
if (sdkDir == null) {
109+
print('Could not automatically find dart sdk path.');
110+
print('Please pass in explicitly: --dart-sdk <path>');
111+
exit(1);
112+
}
113+
107114
var filename = args.rest.first;
108-
var typeResolver =
109-
new TypeResolver(TypeResolver.sdkResolverFromDir(dartSdkDirectory));
115+
var typeResolver = new TypeResolver.fromDir(sdkDir.path);
110116

111117
Map json = JSON.decode(new File(filename).readAsStringSync());
112118
var summary = GlobalSummary.parse(json);

lib/src/checker/dart_sdk.dart

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,54 +3,10 @@
33
/// definitions to provide mock sdks.
44
library ddc.src.checker.dart_sdk;
55

6-
import 'dart:convert' as convert;
7-
import 'dart:io' show File, Link, Platform, Process;
8-
import 'package:path/path.dart' as path;
96
import 'package:analyzer/src/generated/engine.dart';
107
import 'package:analyzer/src/generated/sdk.dart';
118
import 'package:analyzer/src/generated/source.dart';
129

13-
/// Attempts to provide the current Dart SDK directory. Returns null if the SDK
14-
/// cannot be found.
15-
final String dartSdkDirectory = () {
16-
bool isSdkDir(String dirname) =>
17-
new File(path.join(dirname, 'lib', '_internal', 'libraries.dart'))
18-
.existsSync();
19-
20-
String executable = Platform.executable;
21-
if (path.split(executable).length == 1) {
22-
// TODO(sigmund,blois): make this cross-platform.
23-
// HACK: A single part, hope it's on the path.
24-
executable = Process.runSync('which', ['dart'],
25-
stdoutEncoding: convert.UTF8).stdout.trim();
26-
// In case Dart is symlinked (e.g. homebrew on Mac) follow symbolic links.
27-
var link = new Link(executable);
28-
if (link.existsSync()) {
29-
executable = link.resolveSymbolicLinksSync();
30-
}
31-
var sdkDir = path.dirname(path.dirname(executable));
32-
if (isSdkDir(sdkDir)) return sdkDir;
33-
}
34-
35-
var dartDir = path.dirname(path.absolute(executable));
36-
// If there's a sub-dir named dart-sdk then we're most likely executing from
37-
// a dart enlistment build directory.
38-
if (isSdkDir(path.join(dartDir, 'dart-sdk'))) {
39-
return path.join(dartDir, 'dart-sdk');
40-
}
41-
// If we can find libraries.dart then it's the root of the SDK.
42-
if (isSdkDir(dartDir)) return dartDir;
43-
44-
var parts = path.split(dartDir);
45-
// If the dart executable is within the sdk dir then get the root.
46-
if (parts.contains('dart-sdk')) {
47-
var dartSdkDir = path.joinAll(parts.take(parts.indexOf('dart-sdk') + 1));
48-
if (isSdkDir(dartSdkDir)) return dartSdkDir;
49-
}
50-
51-
return null;
52-
}();
53-
5410
/// Dart SDK which contains a mock implementation of the SDK libraries. May be
5511
/// used to speed up execution when most of the core libraries is not needed.
5612
class MockDartSdk implements DartSdk {

lib/src/checker/resolver.dart

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ class TypeResolver {
4343
context.sourceFactory = new SourceFactory(resolvers);
4444
}
4545

46+
/// Creates a [TypeResolver] that uses a mock 'dart:' library contents.
47+
TypeResolver.fromMock(Map<String, String> mockSources, [List otherResolvers])
48+
: this(new MockDartSdk(mockSources, reportMissing: true).resolver,
49+
otherResolvers);
50+
51+
/// Creates a [TypeResolver] that uses the SDK at the given [sdkPath].
52+
TypeResolver.fromDir(String sdkPath, [List otherResolvers]) : this(
53+
new DartUriResolver(
54+
new DirectoryBasedDartSdk(new JavaFile(sdkPath))));
55+
4656
/// Find the corresponding [Source] for [uri].
4757
Source findSource(Uri uri) {
4858
var source = _sources[uri];
@@ -67,21 +77,6 @@ class TypeResolver {
6777
}
6878
return failure;
6979
}
70-
71-
// TODO(jmesserly): in practice these are passed to `new TypeResolver` so
72-
// that makes me think these should just be named constructors, rather than
73-
// `new TypeResolver(TypeResolver.sdkResolverFromDir((...)) which repeats
74-
// the name twice.
75-
76-
/// Creates a [DartUriResolver] that uses the SDK at the given [sdkPath].
77-
static DartUriResolver sdkResolverFromDir(String sdkPath) =>
78-
new DartUriResolver(new DirectoryBasedDartSdk(new JavaFile(sdkPath)));
79-
80-
/// Creates a [DartUriResolver] that uses a mock 'dart:' library contents.
81-
static DartUriResolver sdkResolverFromMock(
82-
Map<String, String> mockSdkSources) {
83-
return new MockDartSdk(mockSdkSources, reportMissing: true).resolver;
84-
}
8580
}
8681

8782
/// Creates an analysis context that contains our restricted typing rules.

lib/src/testing.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import 'package:ddc/devc.dart' show compile;
3030
/// logging level were the error would be reported at, and `Type` is the
3131
/// concrete subclass of [StaticInfo] that denotes the error.
3232
///
33-
/// For example, to check that an assigment produces a warning about a boxing
33+
/// For example, to check that an assignment produces a warning about a boxing
3434
/// conversion, you can describe the test as follows:
3535
///
3636
/// testChecker({
@@ -41,17 +41,16 @@ import 'package:ddc/devc.dart' show compile;
4141
/// '''
4242
/// });
4343
///
44-
CheckerResults testChecker(Map<String, String> testFiles, {bool mockSdk: true,
44+
CheckerResults testChecker(Map<String, String> testFiles, {String sdkDir,
4545
CheckerReporter reporter, covariantGenerics: true, relaxedCasts: true}) {
4646
expect(testFiles.containsKey('/main.dart'), isTrue,
4747
reason: '`/main.dart` is missing in testFiles');
4848

4949
// Create a resolver that can load test files from memory.
50-
var dartUriResolver = mockSdk
51-
? TypeResolver.sdkResolverFromMock(mockSdkSources)
52-
: TypeResolver.sdkResolverFromDir(dartSdkDirectory);
5350
var testUriResolver = new _TestUriResolver(testFiles);
54-
var resolver = new TypeResolver(dartUriResolver, [testUriResolver]);
51+
var resolver = sdkDir == null
52+
? new TypeResolver.fromMock(mockSdkSources, [testUriResolver])
53+
: new TypeResolver.fromDir(sdkDir, [testUriResolver]);
5554

5655
// Run the checker on /main.dart.
5756
var mainFile = new Uri.file('/main.dart');

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ dependencies:
66
url: http://github.com/dart-lang/analyzer-for-ddc.git
77
ref: master
88
args: ^0.12.1
9+
cli_util: ^0.0.1
910
dart_style:
1011
git:
1112
url: http://github.com/dart-lang/dart_style.git

test/checker/self_host_test.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22
library ddc.test.end_to_end;
33

44
import 'dart:io';
5+
import 'package:cli_util/cli_util.dart' show getSdkDir;
56
import 'package:ddc/devc.dart' show compile;
67
import 'package:ddc/src/report.dart';
7-
import 'package:ddc/src/checker/dart_sdk.dart' show dartSdkDirectory;
88
import 'package:ddc/src/checker/resolver.dart' show TypeResolver;
99
import 'package:path/path.dart' as path;
1010
import 'package:unittest/compact_vm_config.dart';
1111
import 'package:unittest/unittest.dart';
1212

13-
main() {
13+
main(args) {
1414
useCompactVMConfiguration();
15-
var realSdk =
16-
new TypeResolver(TypeResolver.sdkResolverFromDir(dartSdkDirectory));
1715

16+
var realSdk = new TypeResolver.fromDir(getSdkDir(args).path);
1817
var testDir = path.absolute(path.dirname(Platform.script.path));
1918

2019
test('checker can run on itself ', () {

test/codegen_test.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ library ddc.test.codegen_test;
55

66
import 'dart:io';
77
import 'package:args/args.dart';
8+
import 'package:cli_util/cli_util.dart' show getSdkDir;
89
import 'package:ddc/devc.dart';
9-
import 'package:ddc/src/checker/dart_sdk.dart' show dartSdkDirectory;
1010
import 'package:ddc/src/checker/resolver.dart' show TypeResolver;
1111
import 'package:logging/logging.dart' show Level;
1212
import 'package:path/path.dart' as path;
1313
import 'package:unittest/unittest.dart';
1414

1515
final ArgParser argParser = new ArgParser()
16+
..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null)
1617
..addFlag('dart-gen',
1718
abbr: 'd', help: 'Generate dart output', defaultsTo: false);
1819

@@ -48,8 +49,7 @@ main(arguments) {
4849
.map((f) => f.path)
4950
.where((p) => p.endsWith('.dart') && filePattern.hasMatch(p));
5051

51-
var realSdk =
52-
new TypeResolver(TypeResolver.sdkResolverFromDir(dartSdkDirectory));
52+
var realSdk = new TypeResolver.fromDir(getSdkDir(arguments).path);
5353

5454
// Validate that old output is gone before running.
5555
// TODO(jmesserly): it'd be nice to do all cleanup here, including removing
@@ -86,10 +86,11 @@ main(arguments) {
8686
}
8787

8888
test('devc dart:core', () {
89+
// Get the test SDK. We use a checked in copy so test expectations can be
90+
// generated against a specific SDK version.
8991
// TODO(jmesserly): eventually we should track compiler messages.
9092
// For now we're just trying to get decent code generation.
91-
var testSdk = new TypeResolver(
92-
TypeResolver.sdkResolverFromDir(path.join(testDir, 'sdk')));
93+
var testSdk = new TypeResolver.fromDir(path.join(testDir, 'sdk'));
9394

9495
var result = compile('dart:core', testSdk,
9596
outputDir: actualDir,

test/end_to_end_test.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import 'package:path/path.dart' as path;
1111
import 'package:unittest/unittest.dart';
1212

1313
main() {
14-
var mockSdk =
15-
new TypeResolver(TypeResolver.sdkResolverFromMock(mockSdkSources));
14+
var mockSdk = new TypeResolver.fromMock(mockSdkSources);
1615

1716
var testDir = path.absolute(path.dirname(Platform.script.path));
1817

0 commit comments

Comments
 (0)