Skip to content

Dart autocomplete should be giving precedence of variables that are inside the context, like variables and parameters #44273

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

Closed
shinayser opened this issue Nov 20, 2020 · 20 comments
Assignees
Labels
devexp-completion Issues with the analysis server's code completion feature legacy-area-analyzer Use area-devexp instead. P2 A bug or feature request we're likely to work on

Comments

@shinayser
Copy link

shinayser commented Nov 20, 2020

Hey guys! Thanks for creating such a wonderful language. However, the completion area could get a little more love.
It should be giving precedence of variables that are inside the context, like variables and parameters.

Check this pictures of me trying to get some auto-complete for the functions's parameter installation:

image

image

image

image

image

Really, this is a real pain and happens all the time. Varaibles with long names always fall on this problem and I have to fully type its name all the time.
If you guys need any kind of reports of logs just let me know!

@devoncarew
Copy link
Member

Thanks for the feedback; can you include the version of the dart sdk you're using?

@shinayser
Copy link
Author

Sorry I am away of the computer right now to check the version but it is the latest of the Flutter's stable branch.

@devoncarew
Copy link
Member

OK, if you could add the version when you're back at your computer that would be great. I'm assuming it'll be on or around Dart version 2.10.4.

@shinayser
Copy link
Author

OK, if you could add the version when you're back at your computer that would be great. I'm assuming it'll be on or around Dart version 2.10.4.

I just confirmed it is 2.10.4 . If you need anything else just ask.

@jodinathan
Copy link

I agree.
No matter if in VSCode or Intellij, autocomplete in Dart is not that good.

@esDotDev
Copy link

esDotDev commented Nov 21, 2020

Another really annoying one is when I'm filling out params for a method, it never tells me what it's expecting like I would get in C#. It just returns some seemingly random list of methods:
image

I always have to mouse-over, or click-into, the function in order to see what params it takes, and then keep the the types and the order in my mind as I code... it's quite annoying. Main offender here is with builder()'s in flutter, but it happens with any and all widgets really.

If we look at C# in Visual Studio, it very nicely shows me all the methods in the function, and also highlights the one I'm currently on:
image
This would be a great improvement to developer quality of life in dart.

C# goes one step further and filters overloaded method signatures and allows you to cycle through them, but dart is saved that complexity at least!
image

@shinayser
Copy link
Author

Seems that the label on this issue is wrong, it should be 'area-completion' since it is happening outside Intellij too (take a look on other issues like #43657) . Could you please take a look @franklinyow ?

@franklinyow
Copy link
Contributor

@srawlins Should this go to "area-analyzer"? Thanks!

@bwilkerson bwilkerson added devexp-completion Issues with the analysis server's code completion feature legacy-area-analyzer Use area-devexp instead. and removed area-intellij Tracking issues for the Dart IntelliJ plugin. labels Jan 7, 2021
@srawlins srawlins changed the title Dart autocomplete is a real pain Dart autocomplete should be giving precedence of variables that are inside the context, like variables and parameters Jan 12, 2021
@srawlins srawlins added the P3 A lower priority bug or feature request label Feb 3, 2021
@srawlins
Copy link
Member

@bwilkerson to confirm, but I am pretty sure this enhancement has been implemented. In minimal repros, I always get a local variable (like a parameter) at the top of the suggestions.

@scheglov
Copy link
Contributor

No, it has not.

image

As you can see, the local variable macroResults is not the first, there are imported classes before it. They all have the same relevance: 525. So, the order among them is random.

The completion request / response are:

1649726225971:Req:{"id"::"15504","method"::"completion.getSuggestions2","params"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/analyzer/lib/src/summary2/macro_application.dart","offset"::1457,"maxResults"::100,"completionCaseMatchingMode"::"FIRST_CHAR","completionMode"::"BASIC","invocationCount"::1},"clientRequestTime"::1649726225971}
1649726226039:Res:{"id"::"15504","result"::{"replacementOffset"::1451,"replacementLength"::6,"suggestions"::[{"kind"::"IDENTIFIER","relevance"::522,"completion"::"macroResults","selectionOffset"::12,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"element"::{"kind"::"LOCAL_VARIABLE","name"::"macroResults","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/analyzer/lib/src/summary2/macro_application.dart","offset"::1108,"length"::12,"startLine"::26,"startColumn"::9,"endLine"::26,"endColumn"::21},"flags"::0,"returnType"::"List<MacroExecutionResult>"},"returnType"::"List<MacroExecutionResult>"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.MacroExecutionResult","selectionOffset"::26,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"A summary of the results of running a macro in a given phase.","docComplete"::"A summary of the results of running a macro in a given phase.\n\nAll modifications are expressed in terms of library augmentation\ndeclarations.","element"::{"kind"::"CLASS","name"::"MacroExecutionResult","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart","offset"::9617,"length"::20,"startLine"::272,"startColumn"::16,"endLine"::272,"endColumn"::36},"flags"::1},"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.ResolvedIdentifier","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"A resolved [Identifier], this is used when creating augmentation libraries\nto qualify identifiers where needed.","docComplete"::"A resolved [Identifier], this is used when creating augmentation libraries\nto qualify identifiers where needed.","element"::{"kind"::"CLASS","name"::"ResolvedIdentifier","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart","offset"::7807,"length"::18,"startLine"::216,"startColumn"::7,"endLine"::216,"endColumn"::25},"flags"::0},"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor.dart"},{"kind"::"INVOCATION","relevance"::500,"completion"::"macro.ResolvedIdentifier","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"declaringType"::"ResolvedIdentifier","defaultArgumentListString"::"kind:: kind, name:: name, staticScope:: staticScope, uri:: uri","defaultArgumentListTextRanges"::[6,4,18,4,37,11,55,3],"element"::{"kind"::"CONSTRUCTOR","name"::"ResolvedIdentifier","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart","offset"::8492,"length"::18,"startLine"::237,"startColumn"::3,"endLine"::237,"endColumn"::21},"flags"::0,"parameters"::"({required IdentifierKind kind, required String name, required String? staticScope, required Uri? uri})","returnType"::"ResolvedIdentifier"},"returnType"::"ResolvedIdentifier","parameterNames"::["kind","name","staticScope","uri"],"parameterTypes"::["IdentifierKind","String","String?","Uri?"],"requiredParameterCount"::0,"hasNamedParameters"::true,"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.staticType","selectionOffset"::35,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"staticType","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3239,"length"::10,"startLine"::105,"startColumn"::3,"endLine"::105,"endColumn"::13},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.IdentifierResolver","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"Allows you to resolve arbitrary [Identifier]s.","docComplete"::"Allows you to resolve arbitrary [Identifier]s.\n\nThis class will likely disappear entirely once we have a different\nmechanism.","element"::{"kind"::"CLASS","name"::"IdentifierResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart","offset"::524,"length"::18,"startLine"::15,"startColumn"::16,"endLine"::15,"endColumn"::34},"flags"::1},"libraryUri"::"package::_fe_analyzer_shared/src/macros/api.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.RemoteInstance","selectionOffset"::20,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"Base class for types that need to be able to be traced back to a specific\ninstance on the server side.","docComplete"::"Base class for types that need to be able to be traced back to a specific\ninstance on the server side.","element"::{"kind"::"CLASS","name"::"RemoteInstance","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::1021,"length"::14,"startLine"::28,"startColumn"::16,"endLine"::28,"endColumn"::30},"flags"::1},"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.RemoteInstanceImpl","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"A remote instance which is just a pointer to some server side instance of\na generic object.","docComplete"::"A remote instance which is just a pointer to some server side instance of\na generic object.\n\nThe wrapped object is not serialized.","element"::{"kind"::"CLASS","name"::"RemoteInstanceImpl","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2594,"length"::18,"startLine"::76,"startColumn"::7,"endLine"::76,"endColumn"::25},"flags"::0},"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.TypeResolver","selectionOffset"::18,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"The interface used to create [StaticType] instances, which are used to\nexamine type relationships.","docComplete"::"The interface used to create [StaticType] instances, which are used to\nexamine type relationships.\n\nThis api is only available to the declaration and definition phases of\nmacro expansion.","element"::{"kind"::"CLASS","name"::"TypeResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart","offset"::1632,"length"::12,"startLine"::40,"startColumn"::16,"endLine"::40,"endColumn"::28},"flags"::1},"libraryUri"::"package::_fe_analyzer_shared/src/macros/api.dart"},{"kind"::"INVOCATION","relevance"::500,"completion"::"macro.RemoteInstanceImpl","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"declaringType"::"RemoteInstanceImpl","defaultArgumentListString"::"id:: id, kind:: kind","defaultArgumentListTextRanges"::[4,2,14,4],"element"::{"kind"::"CONSTRUCTOR","name"::"RemoteInstanceImpl","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2794,"length"::18,"startLine"::83,"startColumn"::3,"endLine"::83,"endColumn"::21},"flags"::0,"parameters"::"({required int id, required RemoteInstanceKind kind, Object? instance})","returnType"::"RemoteInstanceImpl"},"returnType"::"RemoteInstanceImpl","parameterNames"::["id","instance","kind"],"parameterTypes"::["int","Object?","RemoteInstanceKind"],"requiredParameterCount"::0,"hasNamedParameters"::true,"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind","selectionOffset"::24,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","element"::{"kind"::"ENUM","name"::"RemoteInstanceKind","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2932,"length"::18,"startLine"::91,"startColumn"::6,"endLine"::91,"endColumn"::24},"flags"::0},"libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.identifierResolver","selectionOffset"::43,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"identifierResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3105,"length"::18,"startLine"::99,"startColumn"::3,"endLine"::99,"endColumn"::21},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.typeResolver","selectionOffset"::37,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"typeResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3305,"length"::12,"startLine"::108,"startColumn"::3,"endLine"::108,"endColumn"::15},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::525,"completion"::"macro.TypeDeclarationResolver","selectionOffset"::29,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"The interface used by [Macro]s to resolve any [Identifier]s pointing to\ntypes to their type declarations.","docComplete"::"The interface used by [Macro]s to resolve any [Identifier]s pointing to\ntypes to their type declarations.\n\nOnly available in the definition phase of macro expansion.","element"::{"kind"::"CLASS","name"::"TypeDeclarationResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart","offset"::4591,"length"::23,"startLine"::109,"startColumn"::16,"endLine"::109,"endColumn"::39},"flags"::1},"libraryUri"::"package::_fe_analyzer_shared/src/macros/api.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.typeDeclarationResolver","selectionOffset"::48,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"typeDeclarationResolver","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3321,"length"::23,"startLine"::109,"startColumn"::3,"endLine"::109,"endColumn"::26},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.namedStaticType","selectionOffset"::40,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"namedStaticType","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3127,"length"::15,"startLine"::100,"startColumn"::3,"endLine"::100,"endColumn"::18},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.classDeclaration","selectionOffset"::41,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"classDeclaration","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2955,"length"::16,"startLine"::92,"startColumn"::3,"endLine"::92,"endColumn"::19},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.classIntrospector","selectionOffset"::42,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"classIntrospector","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2975,"length"::17,"startLine"::93,"startColumn"::3,"endLine"::93,"endColumn"::20},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.constructorDeclaration","selectionOffset"::47,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"constructorDeclaration","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::2996,"length"::22,"startLine"::94,"startColumn"::3,"endLine"::94,"endColumn"::25},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"},{"kind"::"IDENTIFIER","relevance"::500,"completion"::"macro.RemoteInstanceKind.typeAliasDeclaration","selectionOffset"::45,"selectionLength"::0,"isDeprecated"::false,"isPotential"::false,"docSummary"::"","docComplete"::"","declaringType"::"RemoteInstanceKind","element"::{"kind"::"ENUM_CONSTANT","name"::"typeAliasDeclaration","location"::{"file"::"/Users/scheglov/Source/Dart/sdk.git/sdk/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart","offset"::3253,"length"::20,"startLine"::106,"startColumn"::3,"endLine"::106,"endColumn"::23},"flags"::10,"returnType"::"RemoteInstanceKind"},"returnType"::"RemoteInstanceKind","libraryUri"::"package::_fe_analyzer_shared/src/macros/executor/remote_instance.dart"}],"isIncomplete"::false}}

@scheglov
Copy link
Contributor

scheglov commented Apr 12, 2022

Or, for much smaller example:
image

void f() {
  var StringLiteral = '';
  Str^
}

@scheglov scheglov reopened this Apr 12, 2022
@srawlins
Copy link
Member

For your minimal repro, in VS Code, I get StringLiteral as the top result. ☹️ . Annoying that we have to separate issues by IDE.

Since you reference the completion request/response, is VS Code probably re-ordering in my example, to the way we want? But if we re-order properly in analysis_server, maybe we will also get this good order in IntelliJ?

@DanTup
Copy link
Collaborator

DanTup commented Apr 12, 2022

For your minimal repro, in VS Code, I get StringLiteral as the top result. ☹️

VS Code re-ranks completions whenever there is a prefix typed (see microsoft/vscode#79516 (comment)). The theory is that because it filters the results client-side (using a fuzzy match), the rankings provided by the server might be based on without filtering, so might not be as good as it can compute taking into account the prefix (including caps for camel case, etc.).

is VS Code probably re-ordering in my example, to the way we want?

In this case it may be what you want, though it can often go the other way ☹️. It's ranking is based entirely on the text, since it doesn't have anything else (like typing information, whether a symbol is local or not, or even whether it's in-scope versus something that would add a new import). It doesn't seem like something that will change, though there is an issue the was kept open about allowing some kind of type hints (microsoft/vscode#127516).

@scheglov
Copy link
Contributor

AFAIK IntelliJ resorts completion suggestions according their relevance field.

This also represents some loss of information from DAS to IntelliJ. We tried to sort in DAS according to fuzzy matching score (and by relevance as a secondary component), cut, and return in this order, but because we don't change relevance in DAS for now, it get resorted without taking fuzzy scope into account.

@bwilkerson
Copy link
Member

Sounds like we really need to include the fuzzy matching score in the relevance computation, pending further exploration of the value of relevance scores in general. I still hope to put together an experiment to measure the relative value of other relevance features compared to fuzzy matching.

@jacob314
Copy link
Member

jacob314 commented Feb 7, 2024

Raising to P2 as this is a significant productivity hit when trying to complete variables in the context.

@jacob314 jacob314 added P2 A bug or feature request we're likely to work on and removed P3 A lower priority bug or feature request labels Feb 7, 2024
@scheglov scheglov self-assigned this Mar 5, 2024
@scheglov
Copy link
Contributor

scheglov commented Mar 5, 2024

Using the distance from the completion location to the local variable was fixed 444ad4d.
The fix was heavily based on the localVariableDistance() that @bwilkerson implemented a few years ago.

The distance to for formal parameters is not implemented yet.
I will take a look.

@scheglov
Copy link
Contributor

scheglov commented Mar 5, 2024

https://dart-review.googlesource.com/c/sdk/+/355821

copybara-service bot pushed a commit that referenced this issue Mar 5, 2024
… non-locals.

Bug: #44273
Change-Id: I1c8d488d46f23e3e781dcefd05f6788f43e62654
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/355821
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
@scheglov
Copy link
Contributor

scheglov commented Mar 6, 2024

Some refactoring before adding more nodes and tests.
https://dart-review.googlesource.com/c/sdk/+/355888

@scheglov
Copy link
Contributor

scheglov commented Mar 7, 2024

Added more tests in 692624b.
Now I believe that it works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
devexp-completion Issues with the analysis server's code completion feature legacy-area-analyzer Use area-devexp instead. P2 A bug or feature request we're likely to work on
Projects
None yet
Development

No branches or pull requests

10 participants