Skip to content

Commit 4b4d68c

Browse files
committed
Forbid duplicate static class and/or namespace members
This isn't fully TS compatible, but refactors targeting internal names, scoping, merging, etc. are needed to become more compatible. For instance, if namespace members had unique separators in internal names, then a non-exported namespace member would override a static class member, assuming the names are the same. Note that this change doesn't prevent the compiler from attempting to compile the duplicate global, and hence the previous commit is needed for this to work fully. Barely fixes AssemblyScript#2793.
1 parent 89b49f0 commit 4b4d68c

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

src/program.ts

+18-2
Original file line numberDiff line numberDiff line change
@@ -5058,15 +5058,31 @@ function tryMerge(older: Element, newer: Element): DeclaredElement | null {
50585058

50595059
/** Copies the members of `src` to `dest`. */
50605060
function copyMembers(src: Element, dest: Element): void {
5061+
let program = src.program;
5062+
assert(program == dest.program);
5063+
50615064
let srcMembers = src.members;
50625065
if (srcMembers) {
50635066
let destMembers = dest.members;
50645067
if (!destMembers) dest.members = destMembers = new Map();
50655068
// TODO: for (let [memberName, member] of srcMembers) {
50665069
for (let _keys = Map_keys(srcMembers), i = 0, k = _keys.length; i < k; ++i) {
50675070
let memberName = unchecked(_keys[i]);
5068-
let member = assert(srcMembers.get(memberName));
5069-
destMembers.set(memberName, member);
5071+
let srcMember = assert(srcMembers.get(memberName));
5072+
// This isn't TS compatible in every case, but the logic involved in
5073+
// merging, scoping, and making internal names is not currently able to
5074+
// handle duplicates well.
5075+
if (destMembers.has(memberName)) {
5076+
let destMember = assert(destMembers.get(memberName));
5077+
program.errorRelated(
5078+
DiagnosticCode.Duplicate_identifier_0,
5079+
srcMember.declaration.name.range, destMember.declaration.name.range,
5080+
memberName
5081+
);
5082+
continue;
5083+
}
5084+
5085+
destMembers.set(memberName, srcMember);
50705086
}
50715087
}
50725088
}

tests/compiler/issues/2793.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"stderr": [
3+
"Duplicate identifier 'bar'.",
4+
"in issues/2793.ts(8,14)",
5+
"in issues/2793.ts(2,10)",
6+
"Duplicate identifier 'baz'.",
7+
"in issues/2793.ts(9,7)",
8+
"in issues/2793.ts(3,10)",
9+
"Duplicate identifier 'qux'.",
10+
"in issues/2793.ts(10,14)",
11+
"in issues/2793.ts(4,18)"
12+
]
13+
}

tests/compiler/issues/2793.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Foo {
2+
static bar: i32 = 2; // errors in TS
3+
static baz: i32 = 2; // does not error in TS
4+
private static qux: i32 = 2; // errors in TS
5+
}
6+
7+
namespace Foo {
8+
export let bar: i32 = 1;
9+
let baz: string = "baz";
10+
export let qux: i32 = 1;
11+
let hi: i32 = 1;
12+
}

0 commit comments

Comments
 (0)