-
-
Notifications
You must be signed in to change notification settings - Fork 166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make tuple and custom array declared as interface compatible #413
base: main
Are you sure you want to change the base?
Conversation
for type_arg in extend.type_args.as_ref() { | ||
for param in type_arg.to_owned().params { | ||
match param { | ||
Type::Array(array) => return Ok(Cow::Owned(Type::Array(array))), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried early return here to see what makes difference but it does not affect the result of ./scripts/test.sh arityAndOrderCompatibility
at all
Is ./scripts/test.sh arityAndOrderCompatibility
correct to test?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should add Type::Interface
to
stc/crates/stc_ts_file_analyzer/src/analyzer/assign/mod.rs
Lines 512 to 521 in d6dc481
Type::Conditional(..) | |
| Type::IndexedAccessType(..) | |
| Type::Alias(..) | |
| Type::Instance(..) | |
| Type::Intrinsic(..) | |
| Type::Mapped(..) | |
| Type::Operator(Operator { | |
op: TsTypeOperatorOp::KeyOf, | |
.. | |
}) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The command itself is correct
I made it to remove |
No, it's okay to split PRs. I'll review this PR once you undraft it. |
I'm trying to solve nested_assignment error in advance of undraft but cannot get which part is wrong yet. |
}) => { | ||
for extend in extends { | ||
let types = extend.to_owned().type_args.into_iter().flat_map(|cur| cur.params); | ||
let union_type = Type::new_union(*span, types); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It almost solved nest_assignment errors but not RegExpExecArray yet.
Could you give me any hint where to get RegExpExecArray type to return Array?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RegExpExecArray
is declared as
interface RegExpExecArray extends Array<string> {
index: number;
input: string;
}
So you need to check the type arguments of Array
4eecbee
to
370071b
Compare
Can you sign the CLA? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
for extend in extends { | ||
let types = extend.to_owned().type_args.into_iter().flat_map(|cur| cur.params); | ||
let union_type = Type::new_union(*span, types); | ||
if let box RExpr::Ident(ident) = &extend.expr { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should check for Type::Array
after using self.type_of_ts_entity_name
@@ -117,6 +116,22 @@ impl Analyzer<'_, '_> { | |||
| Type::EnumVariant(..) | |||
| Type::Param(_) | |||
| Type::Module(_) => return Ok(ty), | |||
Type::Interface(Interface { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this approach is wrong
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you mean we should add more condition here to decrease the range of match arm?
Or It is totally wrong location to implement?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I meant the latter
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you give any tips like where to start first?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think some match expressions should be added to
tracker, | ||
}) => { | ||
for parent in extends { | ||
let parent = self.type_of_ts_entity_name(parent.span(), &parent.expr, parent.type_args.as_deref())?; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A user can add methods to their own array type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And this does not handle tuple types correctly
metadata: InterfaceMetadata { common }, | ||
tracker, | ||
}) => { | ||
for parent in extends { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this logic is too naive
}) => { | ||
for parent in extends { | ||
let ty = self.type_of_ts_entity_name(parent.span(), &parent.expr, parent.type_args.as_deref())?; | ||
if let Type::Array(_) = &ty { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Checking for Type::Array
is not enough, and we should handle this by accessing iterating over properties
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
interface MyTuple extends Array<unknown> {
0: number
1: number
}
declare let a: MyTuple
declare let b: [number, number]
a = b // ok
b = a // error
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
interface MyTuple extends Array<any> {
0: number
1: number
}
declare let a: MyTuple
declare let b: [number, number]
a = b // ok
b = a // error
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As you can see, we can't rely on the type argument in extends Array<T>
{ | ||
println!("@@@\n{lkind:#?}:{rkind:#?}"); | ||
let diff = lkind == rkind; | ||
println!("@@@\n{diff}"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Is there any existing function to compare two KeywordType and return reasonable error?
- Do you think I'm going correct way?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- You can use
assign_with_opts(...)?
to do it - I think you should not reimplement whole logic here, but delegate to a recursive call to
assign_with_opts
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like we should keep logic here.
Otherwise, it breaks other tests
https://github.com/dudykr/stc/actions/runs/4110781244/jobs/7093929846
Adding more tests would be awsome. Thank you! |
Adding more tests would be awesome. Thank you! |
// x = z; // should get TS2322 but pass | ||
y = x; | ||
y = z; | ||
// z = x; // should pass but got TS2322 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
According to TS Playground,
It seems that x = z
and z = x
work in opposite directions.
Should I follow TS playground and fix it in this PR?
TSPlayground
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sunrabbit123
Thanks for the information.
So it looks like it does not need to be fixed, at least in this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
z = x
must be not emit 2322
x = z
must be emit 2322
I think the code is fine.
And it seems to be out of the conventional test case.
When I commented above, I thought it was an existing test case.
I'm sorry.
required_error: 874, | ||
matched_error: 1749, | ||
extra_error: 284, | ||
panic: 20, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you run check.sh agian?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I got thread 'conformance::types::uniqueSymbol::uniqueSymbolsDeclarations.ts' has overflowed its stack
Should i pass some option to avoid the overflow?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The way is simple
- Check that the code you wrote affects stackoverflow.
- If it does, insert some stackguards.
- if it doesn't, it's broken and you can report it in an issue
Thanks you
The following code detects the overflow and handles it.
let _stack = match stack::track(actual_span) {
Ok(v) => v,
Err(err) => {
// print_backtrace();
return Err(err.into());
}
};
|
@@ -33,3 +33,8 @@ var n3: [number, string] = z; | |||
var o1: [string, number] = x; | |||
var o2: [string, number] = y; | |||
var o3: [string, number] = y; | |||
|
|||
x = y; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please revert this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test file is copied from the official tsc conformance test suite, so we should not modify it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like this PR does not improve the test stats?
Description: Make tuple and custom array declared as interface compatible
BREAKING CHANGE:
Related issue (if exists): To resolve #216