Skip to content

Commit 28b8c1e

Browse files
authored
Emitted ReadonlyArrays as Dart Lists (dart-archive#53)
1 parent 1ee7f74 commit 28b8c1e

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

lib/dart_libraries_for_browser_types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,7 @@ const STDLIB_TYPE_REPLACEMENTS = new Map(Object.entries({
954954

955955
'Date': 'DateTime',
956956
'Array': 'List',
957+
'ReadonlyArray': 'List',
957958
'ArrayBuffer': 'ByteBuffer',
958959
// 'Promise': 'Future', // TODO(jacobr): add back once we unify Promise and
959960
// Future.

lib/facade_converter.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,9 @@ export class FacadeConverter extends base.TranspilerBase {
321321
types: ReadonlyArray<ts.TypeNode>, options: TypeDisplayOptions, seperator?: string): string {
322322
seperator = seperator || ',';
323323
let that = this;
324+
if (!types) {
325+
return '';
326+
}
324327
return types
325328
.map((type) => {
326329
return that.generateDartTypeName(type, addInsideTypeArgument(options));
@@ -416,6 +419,12 @@ export class FacadeConverter extends base.TranspilerBase {
416419
// Function may be used as a type but not in other cases
417420
name = 'Function';
418421
break;
422+
case 'ReadonlyArray':
423+
name =
424+
this.generateDartName(node.typeName, setTypeArguments(options, node.typeArguments));
425+
comment = 'ReadonlyArray<' +
426+
this.generateTypeList(node.typeArguments, addInsideComment(options)) + '>';
427+
break;
419428
case 'Partial':
420429
// Partial<X> is currently the same as X since all types are nullable in Dart
421430
name = this.generateDartTypeName(node.typeArguments[0]);

test/facade_converter_test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ abstract class DSVParsedArray<T> implements List<T> {
173173
}`);
174174
});
175175

176+
177+
it('translates readonly array façades', () => {
178+
expectWithTypes('declare const a : ReadonlyArray<number>;').to.equal(`@JS()
179+
external List<num> /*ReadonlyArray<num>*/ get a;`);
180+
expectWithTypes('function f() : ReadonlyArray<string> {}').to.equal(`@JS()
181+
external List<String> /*ReadonlyArray<String>*/ f();`);
182+
});
183+
176184
describe('error detection', () => {
177185
it('supports imports', () => {
178186
expectWithTypes(`import {X} from "other";\nlet x:X;`).to.equal(`import "other.dart" show X;

0 commit comments

Comments
 (0)