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
14 changes: 9 additions & 5 deletions tslang/lib/TypeScript/MLIRGenImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -2717,10 +2717,14 @@ class MLIRGenImpl
return mlir::StringRef(ss.str()).copy(stringAllocator);
}

mlir::StringRef getParameterGenericTypeName(std::string name) {
mlir::StringRef typeParamNamePtr;
// The type an untyped parameter makes its function generic in. It is named after the function
// too (its position): named after the parameter alone, the `x` of an arrow inside another arrow
// with an `x` had the outer one's type, so instantiating the outer arrow bound the inner one's
// type as well, and the inner arrow could no longer be instantiated.
mlir::StringRef getParameterGenericTypeName(std::string name, SignatureDeclarationBase signatureDeclarationBase) {
auto pos = signatureDeclarationBase->pos.textPos > 0 ? signatureDeclarationBase->pos.textPos : signatureDeclarationBase->pos.pos;
std::stringstream ss;
ss << "TGenParam_" << name;
ss << "TGenParam_" << name << "_" << pos;
return mlir::StringRef(ss.str()).copy(stringAllocator);
}

Expand Down Expand Up @@ -10727,7 +10731,7 @@ class MLIRGenImpl
namePtr = getArgumentName(index);
}

auto typeParamNamePtr = getParameterGenericTypeName(namePtr.str());
auto typeParamNamePtr = getParameterGenericTypeName(namePtr.str(), signatureDeclarationBase);
auto &typeParameters = signatureDeclarationBase->typeParameters;
auto found = std::find_if(typeParameters.begin(), typeParameters.end(),
[&](auto &paramItem) { return MLIRHelper::getName( paramItem->name) == typeParamNamePtr; });
Expand Down Expand Up @@ -10802,7 +10806,7 @@ class MLIRGenImpl
namePtr = getArgumentName(index);
}

auto typeParamNamePtr = getParameterGenericTypeName(namePtr.str());
auto typeParamNamePtr = getParameterGenericTypeName(namePtr.str(), signatureDeclarationBase);
auto typeParam = std::make_shared<TypeParameterDOM>(typeParamNamePtr.str());
auto result = zipTypeParameterWithArgument(
location, genContext.typeParamsWithArgs, typeParam, type, false, genContext);
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 @@ -292,6 +292,7 @@ tslang_add_test(NAME test-compile-00-funcs-generic-typeof COMMAND test-runner "$
tslang_add_test(NAME test-compile-00-funcs-generic-arrow COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_generic_arrow.ts")
tslang_add_test(NAME test-compile-00-funcs-generic-iterator COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_generic_iterator.ts")
tslang_add_test(NAME test-compile-00-funcs-typeless-function-as-generic COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_typeless_function_as_generic.ts")
tslang_add_test(NAME test-compile-00-nested-implicit-generics COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00nested_implicit_generics.ts")
tslang_add_test(NAME test-compile-01-funcs-generic-iterator COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/01funcs_generic_iterator.ts")
tslang_add_test(NAME test-compile-02-funcs-generic-iterator COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/02funcs_generic_iterator.ts")
tslang_add_test(NAME test-compile-00-funcs-typed-generic-iterator COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_typed_generic_iterator.ts")
Expand Down Expand Up @@ -810,6 +811,7 @@ tslang_add_test(NAME test-jit-01-funcs-generic COMMAND test-runner -jit "${PROJE
tslang_add_test(NAME test-jit-00-funcs-generic-typeof COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_generic_with_typeof.ts")
tslang_add_test(NAME test-jit-00-funcs-generic-arrow COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_generic_arrow.ts")
tslang_add_test(NAME test-jit-00-funcs-typeless-function-as-generic COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_typeless_function_as_generic.ts")
tslang_add_test(NAME test-jit-00-nested-implicit-generics COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00nested_implicit_generics.ts")
tslang_add_test(NAME test-jit-00-funcs-generic-iterator COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00funcs_generic_iterator.ts")
tslang_add_test(NAME test-jit-01-funcs-generic-iterator COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/01funcs_generic_iterator.ts")
tslang_add_test(NAME test-jit-02-funcs-generic-iterator COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/02funcs_generic_iterator.ts")
Expand Down Expand Up @@ -1831,6 +1833,7 @@ set(TSLANG_CORPUS
00funcs_nesting.ts
00funcs_typed_generic_iterator.ts
00funcs_typeless_function_as_generic.ts
00nested_implicit_generics.ts
00funcs_vararg.ts
00function_overloads.ts
00gc_allocations_distinct.ts
Expand Down
43 changes: 43 additions & 0 deletions tslang/test/tester/tests/00nested_implicit_generics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// An arrow with an untyped parameter inside another one with a parameter of the same name, which
// captures a variable of the function around both, failed to compile: "can't instantiate function
// ... not all generic types can be identified". Each untyped parameter makes its arrow generic in
// a type named after the parameter, so the inner `x`'s type had the same name as the outer `x`'s,
// and instantiating the outer arrow bound the inner one's type too.

function render(screenWidth: number, screenHeight: number) {
const getPoint = (x, y) => {
const recenterX = x => (x - (screenWidth / 2.0)) / 2.0 / screenWidth;
const recenterY = y => -(y - (screenHeight / 2.0)) / 2.0 / screenHeight;
return recenterX(x) + recenterY(y);
};

assert(getPoint(512, 384) == 0, "getPoint(512, 384)");
assert(getPoint(1024, 768) == 0, "getPoint(1024, 768)");
const v = getPoint(300, 200);
assert(v - 0.016276 < 0.0001 && v - 0.016276 > -0.0001, "getPoint(300, 200)");
}

function untypedOuter(w, h) {
const add = (x, y) => {
const shift = x => x + w;
return shift(x) + y + h;
};

return add(1, 2);
}

function sameNameNoCapture() {
const outer = (x) => {
const inner = x => x * 2;
return inner(x) + 1;
};

return outer(5);
}

function main() {
render(1024, 768);
assert(untypedOuter(10, 100) == 113, "untypedOuter");
assert(sameNameNoCapture() == 11, "sameNameNoCapture");
print("done.");
}
Loading