commit | 530506a072a1c7d3d7a53a06e18896d879bf4451 | [log] [tgz] |
---|---|---|
author | Max Kim <mminkim89@gmail.com> | Wed May 03 23:12:53 2017 |
committer | GitHub <noreply@github.com> | Wed May 03 23:12:53 2017 |
tree | bc52a22ddfc3e1d59808508aa6298e9e485867b9 | |
parent | 4ac424839e8b3dc11afaf075e6625062148c68bc [diff] |
Summary integration sync (#288) * Sync to origin master * checkpoint * Initial ast integration - ranges not behaving properly * Minor bug fix * checkpoint * Tasks tests all passing * Checkpoint before error code fix * Tasks tests set back to 100% after introducing error codes * resolver_test midway checkpoint * Checkpoint * Full test coverage in analyzer. Server still left * All tests passing * Make paths explicit * Remove comments * Attributes now sorted by offset. Improves performance in auto completion * DOCTYPE now acceptable * Created separate Ast for top level document container * Refactored primary function in completion.dart * Minor code clean up * Fuzz tester bug fix * Revert try catch block * Rename exception codes after changes in angular_ast * Bug fix on [class. [style. [attr. bindings; range error * Allow spaces in msutaches * Autocompletion in text attribute value is now empty * Allow for plain [class] binding * Fixed update_deps.sh to work with angular_ast * Clean up deps and remove some unnecessary comments * Changed pubspec to pull from master * Defend against files hidden by generated files (#271) * Fix travis build. Fix sdk related errors (ContextRoot and IdeOptions). Clean up imports to remove unused * Travis sdk fix (#272) * Sync to origin master * Fix travis build. Fix sdk related errors (ContextRoot and IdeOptions). Clean up imports to remove unused * First round of quick fixes based on feedback * Tick to 8 (#277) * Sync to origin master * Fix travis build. Fix sdk related errors (ContextRoot and IdeOptions). Clean up imports to remove unused * Tick to 0.0.8 * remove comment * Error codes no longer use hard offsets; uses string instead * Track @Attribute annotated constructor parameters (#270) * Merged attribute generating logic to be agnostic of Element or template type. * Assert for indexOf added into test. Moved comments for clarity * Remove comment-blocked chunk * Resolve plain attributes -- in ranges, and strchecks for inputs. (#278) * Resolve plain attributes -- in ranges, and strchecks for inputs. Record resolved ranges for `x="y"` where `x` is an input or a constructor `@Attribute`. If its an input, check that strings are assignable to it. If not, give it its own error that hopefully explains the semi magical situation. * Track/typecheck std attrs Eventually we should * report errors for <a href="foo" [href]="bar"> * not suggest href after [href] has been used * not suggest [href] after href has been used * Changes based on feedback * Error codes added to hashmap so now show up. Fixed issue with <div template> causing crash * Changed pubspec to pull from master in angular_ast * Template parsing fix (#279) * Sync to origin master * Fix travis build. Fix sdk related errors (ContextRoot and IdeOptions). Clean up imports to remove unused * Fix issue that caused empty binding on template attribute to crash * Now ready: Priority angular analysis (#273) * Priority dart & html analysis * Starter class, await supplementing errors or they're added too late. * Report has work to analyze for priority requests * Don't await for requesting files, do have a cache busting option * Handle case of files being requested multiple times * Priority html requests, requires serving errors with line infos. * Report all html files for all dart contexts in one method, plus tests I think before we were getting a last-one-wins effect, where the last analyzed dart/html pair would cover up all the errors for every other dart/html pair. As such, I need to carefully test that this change doesn't introduce new false errors (from them being covered up before). But now with this, we can report html errors back for multiple contexts from a single method when that's requested. Next I just have to use that method on getErrors when we have multiple relationships tracked already. * Guess html/dart relationship when none exist, otherwise use what's known using isEmpty rather than == 0 * Get setterType by setter.parameters[0] instead of setter.variable.type (#283) Seems like in the precense of a getter, setter.variable.type is the getter type, not the setter's type. So use the first function argument instead. * Remove contextRoot, won't be required in master soon, and breaks dev (#284) * Disable global attr plaintext typechecking until #280 has a clear solution (#286) * Update test_reflective_loader, fix analyzer warnings&errors (#285) * Update test_reflective_loader, fix analyzer warnings&errors * Fix the single server test too, which prevents build errors * Use var instead of types in angular_driver_test * Add TODOs * Percentage use fix in style.width and style.height. Test cases added (#282) * Percentage use fix in style.width and style.height. Test cases added * Added more property names that use percentage
To provide information for DAS clients the server_plugin
plugin contributes several extensions.
errors
notifications for Dart and HTML files.templateUrl
to the corresponding HTML files.text
in inputs: const ['text: my-text']
.Build is currently broken as we are changing the analyzer plugin API to something more formal, reliable, and convenient. Only works with older versions of the SDK right now (1.22.0.dev.4), which is a royal pain to install with dependencies.
Download chrome depot tools, and clone this repository.
Then run
./tools/get_deps.sh cd server_plugin/bin ./make_snapshot
Back up sdk_path/snapshots/analysis_server.dart.snapshot
and replace it with server.snapshot
. Restart the dart analysis server by clicking the skull.
Check the pubspec.yaml in your project for transformers. They are not supported. You must manually add CORE_DIRECTIVES to your components right now for this plugin to work.
All regular dart errros (that is to say, errors defined purely by the dart language spec) are not shown in this list.
Bootstrapping | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
bootstrap(AppComponent, [MyService, provide(...)]); | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
Template syntax | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
<input [value]="firstName"> | :white_check_mark: soundness of expression, type of expression, existence of value on element or directive | :last_quarter_moon: in some editors | :x: | :x: |
<input bind-value="firstName"> | :white_check_mark: | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<div [attr.role]="myAriaRole"> | :last_quarter_moon: soundness of expression, but no other validation | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<div [class.extra-sparkle]="isDelightful"> | :white_check_mark: validity of clasname, soundness of expression, type of expression must be bool | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<div [style.width.px]="mySize"> | :waning_gibbous_moon: soundness of expression, css properties are generally checked but not against a dictionary, same for units, expression must type to int if units are present | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<button (click)="readRainbow($event)"> | :white_check_mark: in some editors; soundness of expression, type of $event , existence of output on component/element and DOM events which propagate can be tracked anywhere | :last_quarter_moon: in some editors | :x: | :x: |
<button on-click="readRainbow($event)"> | :white_check_mark | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<div title="Hello {{ponyName}}"> | :white_check_mark: in some editors; soundness of expression, matching mustache delimiters | :last_quarter_moon: in some editors | :x: | :x: |
<p>Hello {{ponyName}}</p> | :white_check_mark: in some editors; soundness of expression, matching mustache delimiters | :last_quarter_moon: in some editors | :x: | :x: |
<my-cmp></my-cmp> | :white_check_mark: in some editors; Existence of directive | :last_quarter_moon: in some editors | :x: | :x: |
<my-cmp [(title)]="name"> | :white_check_mark: soundness of expression, existence of title input and titleChange output on directive or component with proper type | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<video #movieplayer ...></video><button (click)="movieplayer.play()"> | :white_check_mark: in some editors; Type of new variable tracked and checked in other expressions | :last_quarter_moon: in some editors | :x: | :x: |
<video ref-movieplayer ...></video><button (click)="movieplayer.play()"> | :white_check_mark: in some editors | :last_quarter_moon: in some editors | :x: | :x: |
<p *myUnless="myExpression">...</p> | :white_check_mark: desugared to <template [myUnless]="myExpression"><p>... and checked from there | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
`Card No.: {{cardNumber | myCardNumberFormatter}}` | :x: Pipes are not typechecked yet | :x: | :x: |
Built-in directives | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
<section *ngIf="showSection"> | :white_check_mark: type checking, check for the star | :last_quarter_moon: in some editors; complete inside binding but binding not suggested | :x: | :x: |
<li *ngFor="let item of list"> | :white_check_mark: type checking and new var, check for the star, catch accidental usage of #item | :last_quarter_moon: in some editors; complete after of only | :x: | :x: |
<div [ngClass]="{active: isActive, disabled: isDisabled}"> | :warning: Requires quotes around key value strings to work | :last_quarter_moon: in some editors; | :x: | :x: |
Forms | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
<input [(ngModel)]="userName"> | :white_check_mark: | :last_quarter_moon: in some editors; completion inside binding but binding not suggested | :x: | :x: |
<form #myform="ngForm"> | :white_check_mark: if ngForm is not an exported directive | :last_quarter_moon: in some editors; completion of variable but ngForm not suggested | :x: | :x: |
Class decorators | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
@Component(...) class MyComponent {} | :white_check_mark: Validates directives list is all directives, that the template file exists, that a template is specified via string or URL but not both, requires a valid selector | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
@View(...) class MyComponent {} | :warning: Supported, requires @Directive or @Component , but doesn't catch ambigous cases such as templates defined in the @View as well as @Component | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
@Directive(...) class MyDirective {} | :white_check_mark: Validates directives list is all directives, that the template file exists, that a template is specified via string or URL but not both, requires a valid selector | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
@Pipe(...) class MyPipe {} | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
@Injectable() class MyService {} | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
Directive configuration | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
@Directive(property1: value1, ...) | :warning: deprecated, but supported | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
selector: '.cool-button:not(a)' | :white_check_mark: | :no_pedestrians: | :x: | :x: |
providers: [MyService, provide(...)] | :x: | :x: | :x: | :x: |
inputs: ['myprop', 'myprop2: byname'] | :white_check_mark: | :x: | :x: | :x: |
outputs: ['myprop', 'myprop2: byname'] | :white_check_mark: | :x: | :x: | :x: |
@Component extends @Directive, so the @Directive configuration applies to components as well
Component Configuration | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
viewProviders: [MyService, provide(...)] | :x: | :x: | :x: | :x: |
template: 'Hello {{name}}' | :white_check_mark: | :last_quarter_moon: in some editors | :x: | :x: |
templateUrl: 'my-component.html' | :white_check_mark: | :x: | :x: | :x: |
styles: ['.primary {color: red}'] | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
styleUrls: ['my-component.css'] | :x: | :x: | :x: | :x: |
directives: [MyDirective, MyComponent] | :white_check_mark: must be directives or lists of directives, configuration affects view errors | :x: | :x: | :x: |
pipes: [MyPipe, OtherPipe] | :x: | :x: | :x: | :x: |
Class field decorators for directives and components | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
@Input() myProperty; | :white_check_mark: | :no_pedestrians: | :x: | :x: |
@Input("name") myProperty; | :white_check_mark: | :no_pedestrians: | :x: | :x: |
@Output() myEvent = new EventEmitter(); | :white_check_mark: Subtype of Stream<T> required, streamed type determines $event type | :no_pedestrians: | :x: | :x: |
@Output("name") myEvent = new EventEmitter(); | :white_check_mark: | :no_pedestrians: | :x: | :x: |
@Attribute("name") String ctorArg | :white_check_mark: | :x: | :x: | :x: |
@HostBinding('[class.valid]') isValid; | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
@HostListener('click', ['$event']) onClick(e) {...} | :x: | :x: | :x: | :x: |
@ContentChild(myPredicate) myChildComponent; | :x: | :no_pedestrians: | :x: | :x: |
@ContentChildren(myPredicate) myChildComponents; | :x: | :no_pedestrians: | :x: | :x: |
@ViewChild(myPredicate) myChildComponent; | :x: | :no_pedestrians: | :x: | :x: |
@ViewChildren(myPredicate) myChildComponents; | :x: | :no_pedestrians: | :x: | :x: |
Transclusions | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
<ng-content></ng-content> | :white_check_mark: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
<my-comp>text content</my-comp> | :white_check_mark: | :x: | :x: | :x: |
<ng-content select="foo"></ng-content> | :white_check_mark: | :last_quarter_moon: in some editors | :x: | :x: |
<my-comp><foo></foo></my-comp> | :white_check_mark: | :last_quarter_moon: in some editors | :x: | :x: |
<ng-content select=".foo[bar]"></ng-content> | :white_check_mark: | :last_quarter_moon: in some editors | :x: | :x: |
<my-comp><div class="foo" bar></div></my-comp> | :white_check_mark: | :last_quarter_moon: in some editors | :x: | :x: |
Directive and component change detection and lifecycle hooks (implemented as class methods) | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
MyAppComponent(MyService myService, ...) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngOnChanges(changeRecord) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngOnInit() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngDoCheck() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngAfterContentInit() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngAfterContentChecked() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngAfterViewInit() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
ngAfterViewChecked() { ... } | :no_pedestrians: | :no_pedestrians: | :x: | :x: |
ngOnDestroy() { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
Dependency injection configuration | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
provide(MyService, useClass: MyMockService) | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
provide(MyService, useFactory: myFactory) | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
provide(MyValue, useValue: 41) | :x: | :no_pedestrians: | :no_pedestrians: | :x: |
Routing and navigation | Validation | Auto-Complete | Navigation | Refactoring |
---|---|---|---|---|
@RouteConfig(const [ const Route(...) ]) | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
<router-outlet></router-outlet> | :no_pedestrians: | :x: | :no_pedestrians: | :no_pedestrians: |
<a [routerLink]="[ '/MyCmp', {myParam: 'value' } ]"> | :question: | :x: | :no_pedestrians: | :no_pedestrians: |
@CanActivate(() => ...)class MyComponent() {} | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
routerOnActivate(nextInstruction, prevInstruction) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
routerCanReuse(nextInstruction, prevInstruction) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
routerOnReuse(nextInstruction, prevInstruction) { ... } | :x: | :x: | :no_pedestrians: | :no_pedestrians: |
routerCanDeactivate(nextInstruction, prevInstruction) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |
routerOnDeactivate(nextInstruction, prevInstruction) { ... } | :x: | :no_pedestrians: | :no_pedestrians: | :no_pedestrians: |