Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion tslang/lib/TypeScript/MLIRGenAccessCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,14 @@ namespace mlirgen
MLIRNamespaceGuard ng(currentNamespace);
currentNamespace = namespaceInfo;

return mlirGen(location, name, genContext);
// `ns.value` names the namespace's member: look there before the local scope,
// which resolved it to a local variable `value` of the calling function.
if (auto member = resolveIdentifierInNamespace(location, name, genContext))
{
return member;
}

return V(mlirGen(location, name, genContext));
})
.Case<mlir_ts::ClassStorageType>([&](auto classStorageType) {
LLVM_DEBUG(llvm::dbgs() << "\n\t...field: \t" << cl.getName(););
Expand Down
3 changes: 3 additions & 0 deletions tslang/test/tester/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,7 @@ tslang_add_test(NAME test-compile-00-namespace-import COMMAND test-runner "${PRO
tslang_add_test(NAME test-compile-00-namespace-globals COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns4.ts")
tslang_add_test(NAME test-compile-00-namespace-class COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns5.ts")
tslang_add_test(NAME test-compile-00-namespace-bug COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns_bug.ts")
tslang_add_test(NAME test-compile-00-namespace-member-shadowed COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns_member_shadowed.ts")
tslang_add_test(NAME test-compile-00-interface-class COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface.ts")
tslang_add_test(NAME test-compile-00-interface-class-2 COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface2.ts")
tslang_add_test(NAME test-compile-00-interface-object COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_object.ts")
Expand Down Expand Up @@ -1102,6 +1103,7 @@ tslang_add_test(NAME test-jit-00-namespace-import COMMAND test-runner -jit "${PR
tslang_add_test(NAME test-jit-00-namespace-globals COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns4.ts")
tslang_add_test(NAME test-jit-00-namespace-class COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns5.ts")
tslang_add_test(NAME test-jit-00-namespace-bug COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns_bug.ts")
tslang_add_test(NAME test-jit-00-namespace-member-shadowed COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00ns_member_shadowed.ts")
tslang_add_test(NAME test-jit-00-interface-class COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface.ts")
tslang_add_test(NAME test-jit-00-interface-class-2 COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface2.ts")
tslang_add_test(NAME test-jit-00-interface-object COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00interface_object.ts")
Expand Down Expand Up @@ -1974,6 +1976,7 @@ set(TSLANG_CORPUS
00ns3.ts
00ns4.ts
00ns5.ts
00ns_member_shadowed.ts
00numbers.ts
00object_accessor.ts
00object_annotated_method_extends_interface_multilevel.ts
Expand Down
41 changes: 41 additions & 0 deletions tslang/test/tester/tests/00ns_member_shadowed.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// regression test: `ns.name` is the namespace's member, whatever a local of the same name is.
//
// bug found and fixed: a local `const value = ns.value()`, then `ns.value()` further down the same
// function: the qualified name resolved to the local, which isn't callable ("not a function to
// call").

namespace ns {
export function value(): int {
return 42;
}

export const k = 7;

export namespace inner {
export function value(): int {
return 9;
}
}
}

function main() {
const value = ns.value();
assert(value == 42);
assert(ns.value() == 42);

const k = ns.k + 1;
assert(k == 8);
assert(ns.k == 7);

const inner = 3;
assert(ns.inner.value() == 9);
assert(inner == 3);

{
// a local named as the namespace is the local
const ns = { value: () => 5 };
assert(ns.value() == 5);
}

print("done.");
}
Loading