Version 2.15.0-25.0.dev
Merge commit '099c5a5c939280c30a3de79c1432846a75bf7011' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index e70c308..fe960e4 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -220,7 +220,7 @@
"name": "dart2js_tools",
"rootUri": "../pkg/dart2js_tools",
"packageUri": "lib/",
- "languageVersion": "2.3"
+ "languageVersion": "2.12"
},
{
"name": "dart2native",
@@ -812,4 +812,4 @@
"languageVersion": "2.12"
}
]
-}
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 8a8f918..cccab31 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -805,7 +805,6 @@
);
var generatedContent = generatedFile.readAsStringSync();
- // TODO(scheglov) Improve macro to be more formatted.
expect(generatedContent, r'''
import 'macro_annotations.dart';
@@ -813,12 +812,12 @@
@observable
int _foo = 0;
-int get foo => _foo;
+ int get foo => _foo;
-set foo(int val) {
- print('Setting foo to ${val}');
- _foo = val;
-}
+ set foo(int val) {
+ print('Setting foo to ${val}');
+ _foo = val;
+ }
}
void f(A a) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index d8b80ca..80e7594 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
/// TODO(scheglov) Clean up the list of implicitly analyzed files.
class AnalysisDriver implements AnalysisDriverGeneric {
/// The version of data format, should be incremented on every format change.
- static const int DATA_VERSION = 169;
+ static const int DATA_VERSION = 170;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/macro/builders/data_class.dart b/pkg/analyzer/lib/src/macro/builders/data_class.dart
index 664f5d8..a4a0393 100644
--- a/pkg/analyzer/lib/src/macro/builders/data_class.dart
+++ b/pkg/analyzer/lib/src/macro/builders/data_class.dart
@@ -39,6 +39,20 @@
}
}
+class DataClassMacro implements ClassDeclarationMacro {
+ const DataClassMacro();
+
+ @override
+ void visitClassDeclaration(
+ ast.ClassDeclaration declaration,
+ ClassDeclarationBuilder builder,
+ ) {
+ const AutoConstructorMacro().visitClassDeclaration(declaration, builder);
+ const HashCodeMacro().visitClassDeclaration(declaration, builder);
+ const ToStringMacro().visitClassDeclaration(declaration, builder);
+ }
+}
+
class HashCodeMacro implements ClassDeclarationMacro {
const HashCodeMacro();
@@ -52,8 +66,9 @@
.join(' ^ ');
builder.addToClass(
Declaration('''
-@override
-int get hashCode => $expression;'''),
+ @override
+ int get hashCode => $expression;
+'''),
);
}
}
@@ -73,8 +88,9 @@
}).join(', ');
builder.addToClass(
Declaration('''
-@override
-String toString() => '${classElement.name}($fieldsCode)';'''),
+ @override
+ String toString() => '${classElement.name}($fieldsCode)';
+'''),
);
}
}
diff --git a/pkg/analyzer/lib/src/macro/builders/observable.dart b/pkg/analyzer/lib/src/macro/builders/observable.dart
index 6857d34..dac5565 100644
--- a/pkg/analyzer/lib/src/macro/builders/observable.dart
+++ b/pkg/analyzer/lib/src/macro/builders/observable.dart
@@ -33,15 +33,16 @@
var publicName = name.substring(1);
var getter = Declaration(
- '$typeCode get $publicName => $name;',
+ ' $typeCode get $publicName => $name;',
);
builder.addToClass(getter);
var setter = Declaration('''
-set $publicName($typeCode val) {
- print('Setting $publicName to \${val}');
- $name = val;
-}''');
+ set $publicName($typeCode val) {
+ print('Setting $publicName to \${val}');
+ $name = val;
+ }
+''');
builder.addToClass(setter);
}
}
diff --git a/pkg/analyzer/lib/src/macro/impl/macro.dart b/pkg/analyzer/lib/src/macro/impl/macro.dart
index 989bdb4..5974840 100644
--- a/pkg/analyzer/lib/src/macro/impl/macro.dart
+++ b/pkg/analyzer/lib/src/macro/impl/macro.dart
@@ -114,7 +114,7 @@
return a.data.id - b.data.id;
});
- const classMemberCodePrefix = '\n';
+ const classMemberCodePrefix = '\n ';
const classMemberCodeSuffix = '\n';
// TODO(scheglov) make it required?
var generatedContent = linkingUnit.input.sourceContent!;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index f513e75..0136b19 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -669,7 +669,7 @@
) {
var macroGenerationDataList = unitElement.macroGenerationDataList;
if (macroGenerationDataList != null) {
- const classMemberCodePrefix = '\n';
+ const classMemberCodePrefix = '\n ';
const classMemberCodeSuffix = '\n';
var generatedContent = unitInfoData.content;
var shift = 0;
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 661ba7d..8cadf5b 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -248,6 +248,12 @@
classBuilder,
);
}
+ if (hasMacroAnnotation(declaration, 'dataClass')) {
+ macro.DataClassMacro().visitClassDeclaration(
+ declaration,
+ classBuilder,
+ );
+ }
if (hasMacroAnnotation(declaration, 'hashCode')) {
macro.HashCodeMacro().visitClassDeclaration(
declaration,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 74fe439..e434353 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -21282,11 +21282,11 @@
final b @88
type: int?
constructors
- @92
+ @94
parameters
- requiredName final this.a @109
+ requiredName final this.a @111
type: int
- optionalNamed final this.b @117
+ optionalNamed final this.b @119
type: int?
accessors
synthetic get a @-1
@@ -21300,7 +21300,93 @@
final int a;
final int? b;
-A({required this.a, this.b});
+ A({required this.a, this.b});
+}
+''');
+ }
+
+ test_macro_dataClass() async {
+ addLibrarySource('/macro_annotations.dart', r'''
+library analyzer.macro.annotations;
+const dataClass = 0;
+''');
+ var library = await checkLibrary(r'''
+import 'macro_annotations.dart';
+@dataClass
+class A {
+ final int a;
+ final int b;
+}
+''');
+ checkElementText(library, r'''
+library
+ imports
+ macro_annotations.dart
+ definingUnit
+ classes
+ class A @50
+ metadata
+ Annotation
+ atSign: @ @33
+ element: macro_annotations.dart::@getter::dataClass
+ name: SimpleIdentifier
+ staticElement: macro_annotations.dart::@getter::dataClass
+ staticType: null
+ token: dataClass @34
+ fields
+ final a @66
+ type: int
+ final b @81
+ type: int
+ synthetic hashCode @-1
+ type: int
+ constructors
+ @87
+ parameters
+ requiredName final this.a @104
+ type: int
+ requiredName final this.b @121
+ type: int
+ accessors
+ synthetic get a @-1
+ returnType: int
+ synthetic get b @-1
+ returnType: int
+ get hashCode @149
+ metadata
+ Annotation
+ atSign: @ @129
+ element: dart:core::@getter::override
+ name: SimpleIdentifier
+ staticElement: dart:core::@getter::override
+ staticType: null
+ token: override @130
+ returnType: int
+ methods
+ toString @208
+ metadata
+ Annotation
+ atSign: @ @189
+ element: dart:core::@getter::override
+ name: SimpleIdentifier
+ staticElement: dart:core::@getter::override
+ staticType: null
+ token: override @190
+ returnType: String
+ macroGeneratedContent
+import 'macro_annotations.dart';
+@dataClass
+class A {
+ final int a;
+ final int b;
+
+ A({required this.a, required this.b});
+
+ @override
+ int get hashCode => a.hashCode ^ b.hashCode;
+
+ @override
+ String toString() => 'A(a: $a, b: $b)';
}
''');
}
@@ -21335,7 +21421,7 @@
returnType: int
synthetic get b @-1
returnType: int
- get hashCode @102
+ get hashCode @106
metadata
Annotation
atSign: @ @0
@@ -21352,8 +21438,8 @@
final int a;
final int b;
-@override
-int get hashCode => a.hashCode ^ b.hashCode;
+ @override
+ int get hashCode => a.hashCode ^ b.hashCode;
}
''');
}
@@ -21410,15 +21496,15 @@
accessors
synthetic get b @-1
returnType: int
- get hashCode @126
+ get hashCode @130
metadata
Annotation
- atSign: @ @108
+ atSign: @ @110
element: dart:core::@getter::override
name: SimpleIdentifier
staticElement: dart:core::@getter::override
staticType: null
- token: override @109
+ token: override @111
returnType: int
macroGeneratedContent
import 'macro_annotations.dart';
@@ -21431,8 +21517,8 @@
class B extends A {
final int b;
-@override
-int get hashCode => b.hashCode ^ a.hashCode;
+ @override
+ int get hashCode => b.hashCode ^ a.hashCode;
}
''');
}
@@ -21479,11 +21565,11 @@
requiredPositional __f @-1
type: int
returnType: void
- get f @80
+ get f @82
returnType: int
- set f @94
+ set f @98
parameters
- requiredPositional val @100
+ requiredPositional val @104
type: int
returnType: void
macroGeneratedContent
@@ -21492,12 +21578,12 @@
@observable
int _f = 0;
-int get f => _f;
+ int get f => _f;
-set f(int val) {
- print('Setting f to ${val}');
- _f = val;
-}
+ set f(int val) {
+ print('Setting f to ${val}');
+ _f = val;
+ }
}
''');
}
@@ -21547,11 +21633,11 @@
requiredPositional __f @-1
type: T
returnType: void
- get f @75
+ get f @77
returnType: T
- set f @89
+ set f @93
parameters
- requiredPositional val @93
+ requiredPositional val @97
type: T
returnType: void
macroGeneratedContent
@@ -21560,12 +21646,12 @@
@observable
T _f;
-T get f => _f;
+ T get f => _f;
-set f(T val) {
- print('Setting f to ${val}');
- _f = val;
-}
+ set f(T val) {
+ print('Setting f to ${val}');
+ _f = val;
+ }
}
''');
}
@@ -21611,15 +21697,15 @@
synthetic get b @-1
returnType: int
methods
- toString @101
+ toString @105
metadata
Annotation
- atSign: @ @84
+ atSign: @ @86
element: dart:core::@getter::override
name: SimpleIdentifier
staticElement: dart:core::@getter::override
staticType: null
- token: override @85
+ token: override @87
returnType: String
macroGeneratedContent
import 'macro_annotations.dart';
@@ -21628,8 +21714,8 @@
final int a;
final int b;
-@override
-String toString() => 'A(a: $a, b: $b)';
+ @override
+ String toString() => 'A(a: $a, b: $b)';
}
''');
}
diff --git a/pkg/dart2js_tools/bin/deobfuscate.dart b/pkg/dart2js_tools/bin/deobfuscate.dart
index d6ba837..adecc1b 100644
--- a/pkg/dart2js_tools/bin/deobfuscate.dart
+++ b/pkg/dart2js_tools/bin/deobfuscate.dart
@@ -47,24 +47,24 @@
var sb = new StringBuffer();
try {
String obfuscatedTrace = new File(args[0]).readAsStringSync();
- String error = extractErrorMessage(obfuscatedTrace);
+ String? error = extractErrorMessage(obfuscatedTrace);
var provider = new CachingFileProvider(logger: Logger());
StackDeobfuscationResult result =
deobfuscateStack(obfuscatedTrace, provider);
Frame firstFrame = result.original.frames.first;
- String translatedError =
+ String? translatedError =
translate(error, provider.mappingFor(firstFrame.uri));
if (translatedError == null) translatedError = '<no error message found>';
printPadded(translatedError, error, sb);
int longest =
- result.deobfuscated.frames.fold(0, (m, f) => max(f.member.length, m));
+ result.deobfuscated.frames.fold(0, (m, f) => max(f.member!.length, m));
for (var originalFrame in result.original.frames) {
var deobfuscatedFrames = result.frameMap[originalFrame];
if (deobfuscatedFrames == null) {
printPadded('no mapping', '${originalFrame.location}', sb);
} else {
for (var frame in deobfuscatedFrames) {
- printPadded('${frame.member.padRight(longest)} ${frame.location}',
+ printPadded('${frame.member!.padRight(longest)} ${frame.location}',
'${originalFrame.location}', sb);
}
}
@@ -77,7 +77,7 @@
final green = stdout.hasTerminal ? '\x1b[32m' : '';
final none = stdout.hasTerminal ? '\x1b[0m' : '';
-printPadded(String mapping, String original, sb) {
+printPadded(String mapping, String? original, sb) {
var len = mapping.length;
var s = mapping.indexOf('\n');
if (s >= 0) len -= s + 1;
diff --git a/pkg/dart2js_tools/bin/lookup_name.dart b/pkg/dart2js_tools/bin/lookup_name.dart
index f2d5c1b..b0fbfe9 100644
--- a/pkg/dart2js_tools/bin/lookup_name.dart
+++ b/pkg/dart2js_tools/bin/lookup_name.dart
@@ -2,6 +2,7 @@
import 'dart:convert';
import 'package:source_maps/source_maps.dart';
import 'package:dart2js_tools/src/dart2js_mapping.dart';
+import 'package:dart2js_tools/src/util.dart';
main(List<String> args) {
if (args.length < 2) {
@@ -16,7 +17,7 @@
exit(1);
}
var json = jsonDecode(sourcemapFile.readAsStringSync());
- Dart2jsMapping mapping = Dart2jsMapping(parseJson(json), json);
+ Dart2jsMapping mapping = Dart2jsMapping(parseSingleMapping(json), json);
var global = mapping.globalNames[name];
if (global != null) print('$name => $global (a global name)');
var instance = mapping.instanceNames[name];
diff --git a/pkg/dart2js_tools/bin/show_inline_data.dart b/pkg/dart2js_tools/bin/show_inline_data.dart
index cc3d5f0..a83531f 100644
--- a/pkg/dart2js_tools/bin/show_inline_data.dart
+++ b/pkg/dart2js_tools/bin/show_inline_data.dart
@@ -26,7 +26,7 @@
var offsets = frames.keys.toList()..sort();
var sb = new StringBuffer();
int depth = 0;
- int lastFunctionStart = null;
+ int? lastFunctionStart = null;
for (var offset in offsets) {
int functionStart = nextFunctionStart(starts, offset, lastFunctionStart);
if (lastFunctionStart == null || functionStart > lastFunctionStart) {
@@ -43,7 +43,7 @@
var pad = ' ' * offsetPrefix.length;
sb.write(offsetPrefix);
bool first = true;
- for (var frame in frames[offset]) {
+ for (var frame in frames[offset]!) {
if (!first) sb.write('$pad');
sb.write(' $frame\n');
first = false;
@@ -75,7 +75,7 @@
return result;
}
-int nextFunctionStart(List<int> starts, int offset, int last) {
+int nextFunctionStart(List<int> starts, int offset, int? last) {
int j = last ?? 0;
for (; j < starts.length && starts[j] <= offset; j++);
return j - 1;
diff --git a/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart b/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
index 29a209e..f93d751 100644
--- a/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
+++ b/pkg/dart2js_tools/lib/deobfuscate_stack_trace.dart
@@ -27,7 +27,7 @@
/// `//# sourceMappingURL=` line at the end, and load the corresponding
/// source-map file.
String deobfuscateStackTrace(String obfuscatedTrace) {
- String error = extractErrorMessage(obfuscatedTrace);
+ String? error = extractErrorMessage(obfuscatedTrace);
var provider = CachingFileProvider();
StackDeobfuscationResult result = deobfuscateStack(obfuscatedTrace, provider);
Frame firstFrame = result.original.frames.first;
@@ -38,13 +38,13 @@
var sb = StringBuffer();
sb.writeln(translatedError);
- maxMemberLengthHelper(int m, Frame f) => max(f.member.length, m);
+ maxMemberLengthHelper(int m, Frame f) => max(f.member!.length, m);
int longest = result.deobfuscated.frames.fold(0, maxMemberLengthHelper);
longest = result.original.frames.fold(longest, maxMemberLengthHelper);
for (var originalFrame in result.original.frames) {
var deobfuscatedFrames = result.frameMap[originalFrame];
if (deobfuscatedFrames == null) {
- var name = originalFrame.member;
+ var name = originalFrame.member!;
sb.writeln(' at ${name.padRight(longest)} ${originalFrame.location}');
} else {
for (var frame in deobfuscatedFrames) {
@@ -53,7 +53,7 @@
// client, we can start encoding the function name and remove this
// workaround.
if (name == '<unknown>') name = originalFrame.member;
- sb.writeln(' at ${name.padRight(longest)} ${frame.location}');
+ sb.writeln(' at ${name!.padRight(longest)} ${frame.location}');
}
}
}
diff --git a/pkg/dart2js_tools/lib/src/dart2js_mapping.dart b/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
index ac6b9d7..8f67882 100644
--- a/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
+++ b/pkg/dart2js_tools/lib/src/dart2js_mapping.dart
@@ -23,15 +23,9 @@
final Map<String, String> globalNames = {};
final Map<String, String> instanceNames = {};
final Map<int, List<FrameEntry>> frames = {};
- List<int> _frameIndex;
- List<int> get frameIndex {
- if (_frameIndex == null) {
- _frameIndex = frames.keys.toList()..sort();
- }
- return _frameIndex;
- }
+ late final List<int>? frameIndex = frames.keys.toList()..sort();
- Dart2jsMapping(this.sourceMap, Map json, {Logger logger}) {
+ Dart2jsMapping(this.sourceMap, Map json, {Logger? logger}) {
var extensions = json['x_org_dartlang_dart2js'];
if (extensions == null) return;
var minifiedNames = extensions['minified_names'];
@@ -41,20 +35,20 @@
_extractMinifedNames(
minifiedNames['instance'], sourceMap, instanceNames, logger);
}
- String jsonFrames = extensions['frames'];
+ String? jsonFrames = extensions['frames'];
if (jsonFrames != null) {
new _FrameDecoder(jsonFrames).parseFrames(frames, sourceMap);
}
}
- Dart2jsMapping.json(Map json) : this(parseJson(json), json);
+ Dart2jsMapping.json(Map json) : this(parseSingleMapping(json), json);
}
class FrameEntry {
- final String callUri;
- final int callLine;
- final int callColumn;
- final String inlinedMethodName;
+ final String? callUri;
+ final int? callLine;
+ final int? callColumn;
+ final String? inlinedMethodName;
final bool isEmpty;
FrameEntry.push(
this.callUri, this.callLine, this.callColumn, this.inlinedMethodName)
@@ -76,7 +70,7 @@
}
const _marker = "\n//# sourceMappingURL=";
-Dart2jsMapping parseMappingFor(Uri uri, {Logger logger}) {
+Dart2jsMapping? parseMappingFor(Uri uri, {Logger? logger}) {
var file = new File.fromUri(uri);
if (!file.existsSync()) {
logger?.log('Error: no such file: $uri');
@@ -100,7 +94,7 @@
return null;
}
var json = jsonDecode(sourcemapFile.readAsStringSync());
- return new Dart2jsMapping(parseJson(json), json, logger: logger);
+ return new Dart2jsMapping(parseSingleMapping(json), json, logger: logger);
}
class _FrameDecoder implements Iterator<String> {
@@ -112,8 +106,9 @@
// Iterator API is used by decodeVlq to consume VLQ entries.
bool moveNext() => ++index < _length;
- String get current =>
- (index >= 0 && index < _length) ? _internal[index] : null;
+ String get current => (index >= 0 && index < _length)
+ ? _internal[index]
+ : throw StateError('No current value available.');
bool get hasTokens => index < _length - 1 && _length > 0;
@@ -151,7 +146,7 @@
}
_extractMinifedNames(String encodedInput, SingleMapping sourceMap,
- Map<String, String> minifiedNames, Logger logger) {
+ Map<String, String> minifiedNames, Logger? logger) {
if (encodedInput.isEmpty) return;
List<String> input = encodedInput.split(',');
if (input.length % 2 != 0) {
@@ -159,7 +154,7 @@
}
for (int i = 0; i < input.length; i += 2) {
String minifiedName = input[i];
- int id = int.tryParse(input[i + 1]);
+ int id = int.tryParse(input[i + 1])!;
minifiedNames[minifiedName] = sourceMap.names[id];
}
}
diff --git a/pkg/dart2js_tools/lib/src/name_decoder.dart b/pkg/dart2js_tools/lib/src/name_decoder.dart
index 306bead..458fd60 100644
--- a/pkg/dart2js_tools/lib/src/name_decoder.dart
+++ b/pkg/dart2js_tools/lib/src/name_decoder.dart
@@ -9,8 +9,8 @@
import 'dart2js_mapping.dart';
import 'trace.dart';
-String translate(String error, Dart2jsMapping mapping,
- [StackTraceLine line, TargetEntry entry]) {
+String? translate(String? error, Dart2jsMapping mapping,
+ [StackTraceLine? line, TargetEntry? entry]) {
for (var decoder in _errorMapDecoders) {
var result = decoder.decode(error, mapping, line, entry);
// More than one decoder might be applied on a single error message. This
@@ -30,10 +30,10 @@
/// Decode [error] that was reported in [line] and has a corresponding [entry]
/// in the source-map file. The provided [mapping] includes additional
/// minification data that may be used to decode the error message.
- String decode(String error, Dart2jsMapping mapping, StackTraceLine line,
- TargetEntry entry) {
+ String? decode(String? error, Dart2jsMapping mapping, StackTraceLine? line,
+ TargetEntry? entry) {
if (error == null) return null;
- Match lastMatch = null;
+ Match? lastMatch = null;
var result = new StringBuffer();
for (var match in _matcher.allMatches(error)) {
var decodedMatch = _decodeInternal(match, mapping, line, entry);
@@ -49,8 +49,8 @@
return '$result';
}
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry);
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry);
}
typedef String ErrorDecoder(Match match, Dart2jsMapping mapping,
@@ -59,28 +59,28 @@
class MinifiedNameDecoder extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("minified:([a-zA-Z0-9_\$]*)");
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry) {
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry) {
var minifiedName = match.group(1);
- return mapping.globalNames[minifiedName];
+ return mapping.globalNames[minifiedName!];
}
}
class CannotReadPropertyDecoder extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("Cannot read property '([^']*)' of");
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry) {
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry) {
var minifiedName = match.group(1);
- var name = mapping.instanceNames[minifiedName];
+ var name = mapping.instanceNames[minifiedName!];
if (name == null) return null;
return "Cannot read property '$name' of";
}
}
abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
- String _translateMinifiedName(Dart2jsMapping mapping, String minifiedName) {
- var name = mapping.instanceNames[minifiedName];
+ String? _translateMinifiedName(Dart2jsMapping mapping, String? minifiedName) {
+ var name = mapping.instanceNames[minifiedName!];
if (name != null) return "'$name'";
if (minifiedName.startsWith(new RegExp(r'(call)?\$[0-9]'))) {
int first$ = minifiedName.indexOf(r'$');
@@ -89,15 +89,15 @@
return null;
}
- String _expandCallSignature(String callSignature) {
+ String? _expandCallSignature(String callSignature) {
// Minified names are one of these forms:
// $0 // positional arguments only
// $1$2 // type parameters and positional arguments
// $3$name // positional and named arguments
// $1$3$name // type parameters and positional and named args
var signature = callSignature.split(r'$');
- var typeArgs = null;
- var totalArgs = null;
+ int? typeArgs = null;
+ int? totalArgs = null;
var namedArgs = <String>[];
for (var arg in signature) {
if (arg == "") continue;
@@ -115,6 +115,7 @@
namedArgs.add(arg);
}
}
+ if (totalArgs == null) return null;
var sb = new StringBuffer();
sb.write("'call'");
sb.write(" (with ");
@@ -136,8 +137,8 @@
final RegExp _matcher = new RegExp(
"NoSuchMethodError: method not found: '([^']*)'( on [^\\(]*)? \\(.*\\)");
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry) {
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry) {
var minifiedName = match.group(1);
var suffix = match.group(2) ?? '';
var name = _translateMinifiedName(mapping, minifiedName);
@@ -150,8 +151,8 @@
final RegExp _matcher =
new RegExp("NoSuchMethodError: method not found: '([^']*)'");
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry) {
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry) {
var minifiedName = match.group(1);
var name = _translateMinifiedName(mapping, minifiedName);
if (name == null) return null;
@@ -162,10 +163,10 @@
class UnhandledNotAFunctionError extends ErrorMapDecoder {
final RegExp _matcher = new RegExp("Error: ([^']*) is not a function");
- String _decodeInternal(Match match, Dart2jsMapping mapping,
- StackTraceLine line, TargetEntry entry) {
+ String? _decodeInternal(Match match, Dart2jsMapping mapping,
+ StackTraceLine? line, TargetEntry? entry) {
var minifiedName = match.group(1);
- var name = mapping.instanceNames[minifiedName];
+ var name = mapping.instanceNames[minifiedName!];
if (name == null) return null;
return "Error: $name is not a function";
}
diff --git a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
index 68ffd94..87b0c40 100644
--- a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
+++ b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
@@ -10,7 +10,7 @@
/// Search backwards in [sources] for a function declaration that includes the
/// [start] offset.
-TargetEntry findEnclosingFunction(FileProvider provider, Uri uri, int start) {
+TargetEntry? findEnclosingFunction(FileProvider provider, Uri uri, int start) {
String sources = provider.sourcesFor(uri);
if (sources == null) return null;
SourceFile file = provider.fileFor(uri);
@@ -22,7 +22,7 @@
var line = file.getLine(index);
var lineEntry = findLine(mapping, line);
var column = file.getColumn(index);
- TargetEntry result = findColumn(line, column, lineEntry);
+ TargetEntry? result = findColumn(line, column, lineEntry);
// If the name entry doesn't start exactly at the column corresponding to
// `index`, we must be in the middle of a string or code that uses the word
// "function", but that doesn't have a corresponding mapping. In those
@@ -61,7 +61,7 @@
/// number is lower or equal to [line].
///
/// Copied from [SingleMapping._findLine].
-TargetLineEntry findLine(SingleMapping sourceMap, int line) {
+TargetLineEntry? findLine(SingleMapping sourceMap, int line) {
int index = binarySearch(sourceMap.lines, (e) => e.line > line);
return (index <= 0) ? null : sourceMap.lines[index - 1];
}
@@ -73,7 +73,7 @@
/// the very last entry on that line.
///
/// Copied from [SingleMapping._findColumn].
-TargetEntry findColumn(int line, int column, TargetLineEntry lineEntry) {
+TargetEntry? findColumn(int line, int column, TargetLineEntry? lineEntry) {
if (lineEntry == null || lineEntry.entries.length == 0) return null;
if (lineEntry.line != line) return lineEntry.entries.last;
var entries = lineEntry.entries;
diff --git a/pkg/dart2js_tools/lib/src/trace.dart b/pkg/dart2js_tools/lib/src/trace.dart
index 846af16..07bdb1e 100644
--- a/pkg/dart2js_tools/lib/src/trace.dart
+++ b/pkg/dart2js_tools/lib/src/trace.dart
@@ -14,10 +14,10 @@
/// Represents a stack trace line.
class StackTraceLine {
- String methodName;
- String fileName;
- int lineNo;
- int columnNo;
+ final String? methodName;
+ final String fileName;
+ final int? lineNo;
+ final int columnNo;
StackTraceLine(this.methodName, this.fileName, this.lineNo, this.columnNo);
@@ -31,11 +31,11 @@
/// at <fileName>:<lineNo>
/// at <fileName>
///
- factory StackTraceLine.fromText(String text, {Logger logger}) {
+ factory StackTraceLine.fromText(String text, {Logger? logger}) {
text = text.trim();
assert(text.startsWith('at '));
text = text.substring('at '.length);
- String methodName;
+ String? methodName;
int endParen = text.indexOf(')');
if (endParen > 0) {
int nameEnd = text.indexOf('(');
@@ -46,16 +46,16 @@
logger?.log('Missing left-paren in: $text');
}
}
- int lineNo;
- int columnNo;
+ int? lineNo;
+ int? columnNo;
String fileName;
int lastColon = text.lastIndexOf(':');
if (lastColon != -1) {
- int lastValue = int.tryParse(text.substring(lastColon + 1));
+ int? lastValue = int.tryParse(text.substring(lastColon + 1));
if (lastValue != null) {
int secondToLastColon = text.lastIndexOf(':', lastColon - 1);
if (secondToLastColon != -1) {
- int secondToLastValue =
+ int? secondToLastValue =
int.tryParse(text.substring(secondToLastColon + 1, lastColon));
if (secondToLastValue != null) {
lineNo = secondToLastValue;
@@ -84,14 +84,14 @@
if (methodName != null) {
sb.write(methodName);
sb.write(' (');
- sb.write(fileName ?? '?');
+ sb.write(fileName);
sb.write(':');
sb.write(lineNo);
sb.write(':');
sb.write(columnNo);
sb.write(')');
} else {
- sb.write(fileName ?? '?');
+ sb.write(fileName);
sb.write(':');
sb.write(lineNo);
sb.write(':');
@@ -103,27 +103,27 @@
String get inlineString {
StringBuffer sb = new StringBuffer();
var padding = 20;
- if (methodName != null) {
- sb.write(methodName);
- padding -= (methodName.length);
+ var lineMethodName = methodName;
+ if (lineMethodName != null) {
+ sb.write(lineMethodName);
+ padding -= (lineMethodName.length);
if (padding <= 0) {
sb.write('\n');
padding = 20;
}
}
sb.write(' ' * padding);
- if (fileName != null) {
- sb.write(p.url.basename(fileName));
- sb.write(' ');
- sb.write(lineNo);
- sb.write(':');
- sb.write(columnNo);
- }
+ sb.write(p.url.basename(fileName));
+ sb.write(' ');
+ sb.write(lineNo);
+ sb.write(':');
+ sb.write(columnNo);
+
return sb.toString();
}
}
-List<StackTraceLine> parseStackTrace(String trace, {Logger logger}) {
+List<StackTraceLine> parseStackTrace(String trace, {Logger? logger}) {
List<String> lines = trace.split(new RegExp(r'(\r|\n|\r\n)'));
List<StackTraceLine> jsStackTrace = <StackTraceLine>[];
for (String line in lines) {
@@ -138,7 +138,7 @@
/// Returns the portion of the output that corresponds to the error message.
///
/// Note: some errors can span multiple lines.
-String extractErrorMessage(String trace) {
+String? extractErrorMessage(String trace) {
var firstStackFrame = trace.indexOf(new RegExp('\n +at'));
if (firstStackFrame == -1) return null;
var errorMarker = trace.indexOf('^') + 1;
diff --git a/pkg/dart2js_tools/lib/src/trace_decoder.dart b/pkg/dart2js_tools/lib/src/trace_decoder.dart
index 7ac12aa..5699423 100644
--- a/pkg/dart2js_tools/lib/src/trace_decoder.dart
+++ b/pkg/dart2js_tools/lib/src/trace_decoder.dart
@@ -49,8 +49,8 @@
// Subtract 1 because stack traces use 1-indexed lines and columns and
// source maps uses 0-indexed.
- SourceSpan span = mapping.sourceMap
- .spanFor(frame.line - 1, column - 1, uri: frame.uri?.toString());
+ SourceSpan? span = mapping.sourceMap
+ .spanFor(frame.line! - 1, column - 1, uri: frame.uri.toString());
// If we can't find a source span, ignore the frame. It's probably something
// internal that the user doesn't care about.
@@ -59,11 +59,11 @@
List<Frame> mappedFrames = frameMap[frame] = [];
SourceFile jsFile = provider.fileFor(frame.uri);
- int offset = jsFile.getOffset(frame.line - 1, column - 1);
+ int offset = jsFile.getOffset(frame.line! - 1, column - 1);
String nameOf(id) =>
_normalizeName(id >= 0 ? mapping.sourceMap.names[id] : null);
- Uri fileName = span.sourceUrl;
+ Uri? fileName = span.sourceUrl;
int targetLine = span.start.line + 1;
int targetColumn = span.start.column + 1;
@@ -73,18 +73,18 @@
// of the caller frame until we reach the actual function that dart2js
// inlined all the code into.
Map<int, List<FrameEntry>> frames = mapping.frames;
- List<int> index = mapping.frameIndex;
+ List<int> index = mapping.frameIndex!;
int key = binarySearch(index, (i) => i > offset) - 1;
int depth = 0;
outer:
while (key >= 0) {
- for (var frame in frames[index[key]].reversed) {
+ for (var frame in frames[index[key]]!.reversed) {
if (frame.isEmpty) break outer;
if (frame.isPush) {
if (depth <= 0) {
- mappedFrames.add(new Frame(fileName, targetLine, targetColumn,
+ mappedFrames.add(new Frame(fileName!, targetLine, targetColumn,
_normalizeName(frame.inlinedMethodName) + "(inlined)"));
- fileName = Uri.parse(frame.callUri);
+ fileName = Uri.parse(frame.callUri!);
targetLine = (frame.callLine ?? 0) + 1;
targetColumn = (frame.callColumn ?? 0) + 1;
} else {
@@ -100,7 +100,8 @@
var functionEntry = findEnclosingFunction(provider, frame.uri, offset);
String methodName = nameOf(functionEntry?.sourceNameId ?? -1);
- mappedFrames.add(new Frame(fileName, targetLine, targetColumn, methodName));
+ mappedFrames
+ .add(new Frame(fileName!, targetLine, targetColumn, methodName));
deobfuscatedFrames.addAll(mappedFrames);
}
return new StackDeobfuscationResult(
@@ -109,6 +110,6 @@
/// Ensure we don't use spaces in method names. At this time, they are only
/// introduced by `<anonymous function>`.
-_normalizeName(String methodName) =>
+_normalizeName(String? methodName) =>
methodName?.replaceAll("<anonymous function>", "<anonymous>") ??
'<unknown>';
diff --git a/pkg/dart2js_tools/lib/src/util.dart b/pkg/dart2js_tools/lib/src/util.dart
index 433ac5a..3bd0ab9 100644
--- a/pkg/dart2js_tools/lib/src/util.dart
+++ b/pkg/dart2js_tools/lib/src/util.dart
@@ -1,4 +1,5 @@
import 'dart:io';
+import 'package:source_maps/parser.dart';
import 'package:source_span/source_span.dart';
import 'dart2js_mapping.dart';
@@ -12,7 +13,7 @@
final Map<Uri, String> _sources = {};
final Map<Uri, SourceFile> _files = {};
final Map<Uri, Dart2jsMapping> _mappings = {};
- final Logger logger;
+ final Logger? logger;
CachingFileProvider({this.logger});
@@ -23,7 +24,7 @@
_files[uri] ??= new SourceFile.fromString(sourcesFor(uri));
Dart2jsMapping mappingFor(Uri uri) =>
- _mappings[uri] ??= parseMappingFor(uri, logger: logger);
+ _mappings[uri] ??= parseMappingFor(uri, logger: logger)!;
}
/// A provider that converts `http:` URLs to a `file:` URI assuming that all
@@ -57,3 +58,5 @@
}
var logger = Logger();
+
+SingleMapping parseSingleMapping(Map json) => parseJson(json) as SingleMapping;
diff --git a/pkg/dart2js_tools/pubspec.yaml b/pkg/dart2js_tools/pubspec.yaml
index 0d28868..e7f1642 100644
--- a/pkg/dart2js_tools/pubspec.yaml
+++ b/pkg/dart2js_tools/pubspec.yaml
@@ -10,4 +10,4 @@
source_span: any
stack_trace: ^1.9.3
environment:
- sdk: '>=2.3.0 <3.0.0'
+ sdk: '2.12.0 <3.0.0'
diff --git a/tools/VERSION b/tools/VERSION
index 6459dd6..70ba861 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 24
+PRERELEASE 25
PRERELEASE_PATCH 0
\ No newline at end of file