Skip to content

Commit d0bfd00

Browse files
committed
WIP
1 parent 738b26f commit d0bfd00

File tree

5 files changed

+43
-18
lines changed

5 files changed

+43
-18
lines changed

src/compiler/binder.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,24 @@ namespace ts {
224224

225225
// Report errors every position with duplicate declaration
226226
// Report errors on previous encountered declarations
227-
let message = symbol.flags & SymbolFlags.BlockScopedVariable
227+
228+
// @todo(marty) Either add a type or use the ternary operator.
229+
let message: any;
230+
231+
if (symbol.name === "default") {
232+
// @todo(marty) Replace with Diagnostics.<something>
233+
message = { code: 2300, category: ts.DiagnosticCategory.Error, key: "'default' keyword used multiple times." };
234+
}
235+
else {
236+
message = symbol.flags & SymbolFlags.BlockScopedVariable
228237
? Diagnostics.Cannot_redeclare_block_scoped_variable_0
229238
: Diagnostics.Duplicate_identifier_0;
239+
}
240+
230241
forEach(symbol.declarations, declaration => {
231242
file.bindDiagnostics.push(createDiagnosticForNode(declaration.name || declaration, message, getDisplayName(declaration)));
232243
});
244+
233245
file.bindDiagnostics.push(createDiagnosticForNode(node.name || node, message, getDisplayName(node)));
234246

235247
symbol = createSymbol(SymbolFlags.None, name);

src/compiler/checker.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -11113,6 +11113,7 @@ namespace ts {
1111311113
// names and consistency of modifiers are verified when we check local symbol
1111411114
let isExportSymbolInsideModule = symbol.parent && symbol.parent.flags & SymbolFlags.Module;
1111511115
let duplicateFunctionDeclaration = false;
11116+
let multipleDefaultModifiers = false;
1111611117
let multipleConstructorImplementation = false;
1111711118
for (let current of declarations) {
1111811119
let node = <FunctionLikeDeclaration>current;
@@ -11141,7 +11142,12 @@ namespace ts {
1114111142
multipleConstructorImplementation = true;
1114211143
}
1114311144
else {
11144-
duplicateFunctionDeclaration = true;
11145+
if (symbol.name === "default") {
11146+
multipleDefaultModifiers = true;
11147+
}
11148+
else {
11149+
duplicateFunctionDeclaration = true;
11150+
}
1114511151
}
1114611152
}
1114711153
else if (!isExportSymbolInsideModule && previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) {
@@ -11177,6 +11183,13 @@ namespace ts {
1117711183
});
1117811184
}
1117911185

11186+
if (multipleDefaultModifiers) {
11187+
ts.forEach(declarations, function (declaration) {
11188+
// @todo Use diagnosticMessages.json
11189+
error(declaration.name, { code: 2300, category: ts.DiagnosticCategory.Error, key: "'default' keyword used for multiple functions." });
11190+
});
11191+
}
11192+
1118011193
// Abstract methods can't have an implementation -- in particular, they don't need one.
1118111194
if (!isExportSymbolInsideModule && lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body &&
1118211195
!(lastSeenNonAmbientDeclaration.flags & NodeFlags.Abstract) ) {

tests/baselines/reference/es6ImportNamedImportIdentifiersParsing.errors.txt

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(2,10): error TS2300: Duplicate identifier 'yield'.
22
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(2,23): error TS2307: Cannot find module 'somemodule'.
33
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,10): error TS1003: Identifier expected.
4-
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,10): error TS2300: Duplicate identifier 'default'.
4+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,10): error TS2300: 'default' keyword used multiple times.
55
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(3,25): error TS2307: Cannot find module 'somemodule'.
66
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,19): error TS1003: Identifier expected.
7-
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,19): error TS2300: Duplicate identifier 'default'.
7+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,19): error TS2300: 'default' keyword used multiple times.
88
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(4,34): error TS2307: Cannot find module 'somemodule'.
99
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(5,21): error TS2300: Duplicate identifier 'yield'.
1010
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(5,34): error TS2307: Cannot find module 'somemodule'.
1111
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,21): error TS1003: Identifier expected.
12-
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,21): error TS2300: Duplicate identifier 'default'.
12+
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,21): error TS2300: 'default' keyword used multiple times.
1313
tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,36): error TS2307: Cannot find module 'somemodule'.
1414

1515

@@ -24,14 +24,14 @@ tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,36): error TS23
2424
~~~~~~~
2525
!!! error TS1003: Identifier expected.
2626
~~~~~~~
27-
!!! error TS2300: Duplicate identifier 'default'.
27+
!!! error TS2300: 'default' keyword used multiple times.
2828
~~~~~~~~~~~~
2929
!!! error TS2307: Cannot find module 'somemodule'.
3030
import { yield as default } from "somemodule"; // error to use default as binding name
3131
~~~~~~~
3232
!!! error TS1003: Identifier expected.
3333
~~~~~~~
34-
!!! error TS2300: Duplicate identifier 'default'.
34+
!!! error TS2300: 'default' keyword used multiple times.
3535
~~~~~~~~~~~~
3636
!!! error TS2307: Cannot find module 'somemodule'.
3737
import { default as yield } from "somemodule"; // no error
@@ -43,6 +43,6 @@ tests/cases/compiler/es6ImportNamedImportIdentifiersParsing.ts(6,36): error TS23
4343
~~~~~~~
4444
!!! error TS1003: Identifier expected.
4545
~~~~~~~
46-
!!! error TS2300: Duplicate identifier 'default'.
46+
!!! error TS2300: 'default' keyword used multiple times.
4747
~~~~~~~~~~~~
4848
!!! error TS2307: Cannot find module 'somemodule'.

tests/baselines/reference/multipleDefaultExports01.errors.txt

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
tests/cases/conformance/es6/modules/m1.ts(2,22): error TS2300: Duplicate identifier 'foo'.
2-
tests/cases/conformance/es6/modules/m1.ts(6,25): error TS2300: Duplicate identifier 'bar'.
3-
tests/cases/conformance/es6/modules/m1.ts(11,1): error TS2300: Duplicate identifier 'default'.
1+
tests/cases/conformance/es6/modules/m1.ts(2,22): error TS2300: 'default' keyword used multiple times.
2+
tests/cases/conformance/es6/modules/m1.ts(6,25): error TS2300: 'default' keyword used multiple times.
3+
tests/cases/conformance/es6/modules/m1.ts(11,1): error TS2300: 'default' keyword used multiple times.
44
tests/cases/conformance/es6/modules/m2.ts(3,1): error TS2348: Value of type 'typeof foo' is not callable. Did you mean to include 'new'?
55

66

77
==== tests/cases/conformance/es6/modules/m1.ts (3 errors) ====
88

99
export default class foo {
1010
~~~
11-
!!! error TS2300: Duplicate identifier 'foo'.
11+
!!! error TS2300: 'default' keyword used multiple times.
1212

1313
}
1414

1515
export default function bar() {
1616
~~~
17-
!!! error TS2300: Duplicate identifier 'bar'.
17+
!!! error TS2300: 'default' keyword used multiple times.
1818

1919
}
2020

2121
var x = 10;
2222
export default x;
2323
~~~~~~~~~~~~~~~~~
24-
!!! error TS2300: Duplicate identifier 'default'.
24+
!!! error TS2300: 'default' keyword used multiple times.
2525

2626
==== tests/cases/conformance/es6/modules/m2.ts (1 errors) ====
2727
import Entity from "./m1"

tests/baselines/reference/multipleDefaultExports02.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
tests/cases/conformance/es6/modules/m1.ts(2,25): error TS2393: Duplicate function implementation.
2-
tests/cases/conformance/es6/modules/m1.ts(6,25): error TS2393: Duplicate function implementation.
1+
tests/cases/conformance/es6/modules/m1.ts(2,25): error TS2300: 'default' keyword used for multiple functions.
2+
tests/cases/conformance/es6/modules/m1.ts(6,25): error TS2300: 'default' keyword used for multiple functions.
33

44

55
==== tests/cases/conformance/es6/modules/m1.ts (2 errors) ====
66

77
export default function foo() {
88
~~~
9-
!!! error TS2393: Duplicate function implementation.
9+
!!! error TS2300: 'default' keyword used for multiple functions.
1010

1111
}
1212

1313
export default function bar() {
1414
~~~
15-
!!! error TS2393: Duplicate function implementation.
15+
!!! error TS2300: 'default' keyword used for multiple functions.
1616

1717
}
1818

0 commit comments

Comments
 (0)