Go to file
Alex Rickabaugh 423b39e216 feat(ivy): use fileNameToModuleName to emit imports when it's available (#28523)
The ultimate goal of this commit is to make use of fileNameToModuleName to
get the module specifier to use when generating an import, when that API is
available in the CompilerHost that ngtsc is created with.

As part of getting there, the way in which ngtsc tracks references and
generates import module specifiers is refactored considerably. References
are tracked with the Reference class, and previously ngtsc had several
different kinds of Reference. An AbsoluteReference represented a declaration
which needed to be imported via an absolute module specifier tracked in the
AbsoluteReference, and a RelativeReference represented a declaration from
the local program, imported via relative path or referred to directly by
identifier if possible. Thus, how to refer to a particular declaration was
encoded into the Reference type _at the time of creation of the Reference_.

This commit refactors that logic and reduces Reference to a single class
with no subclasses. A Reference represents a node being referenced, plus
context about how the node was located. This context includes a
"bestGuessOwningModule", the compiler's best guess at which absolute
module specifier has defined this reference. For example, if the compiler
arrives at the declaration of CommonModule via an import to @angular/common,
then any references obtained from CommonModule (e.g. NgIf) will also be
considered to be owned by @angular/common.

A ReferenceEmitter class and accompanying ReferenceEmitStrategy interface
are introduced. To produce an Expression referring to a given Reference'd
node, the ReferenceEmitter consults a sequence of ReferenceEmitStrategy
implementations.

Several different strategies are defined:

- LocalIdentifierStrategy: use local ts.Identifiers if available.
- AbsoluteModuleStrategy: if the Reference has a bestGuessOwningModule,
  import the node via an absolute import from that module specifier.
- LogicalProjectStrategy: if the Reference is in the logical project
  (is under the project rootDirs), import the node via a relative import.
- FileToModuleStrategy: use a FileToModuleHost to generate the module
  specifier by which to import the node.

Depending on the availability of fileNameToModuleName in the CompilerHost,
then, a different collection of these strategies is used for compilation.

PR Close #28523
2019-02-13 19:13:11 -08:00
.buildkite ci: update buildkite provision instructions (#28273) 2019-02-07 12:36:27 -08:00
.circleci build: remove legacy e2e tests job (#28645) 2019-02-13 12:15:02 -08:00
.github ci: add all required statuses to the requiredStatuses list for angular-robot (#28613) 2019-02-08 09:20:28 -08:00
.vscode build: show no warning for large git repos (#28055) 2019-02-12 20:58:27 -08:00
aio fix(docs-infra): fix filtering in run-example-e2e.js (#28663) 2019-02-13 12:04:51 -08:00
docs docs: update merge label meaning (#28574) 2019-02-08 09:21:04 -08:00
integration build(bazel): update to rules_nodejs 0.18.6 (#28699) 2019-02-13 12:13:08 -08:00
modules build: remove legacy e2e tests job (#28645) 2019-02-13 12:15:02 -08:00
packages feat(ivy): use fileNameToModuleName to emit imports when it's available (#28523) 2019-02-13 19:13:11 -08:00
scripts build: remove legacy e2e tests job (#28645) 2019-02-13 12:15:02 -08:00
third_party build: fix web_worker playground examples using external resources (#28562) 2019-02-13 12:01:54 -08:00
tools test(ivy): enable passing Material tests (#28687) 2019-02-13 12:12:45 -08:00
.bazelignore build: update to rules_typescript 0.23.2 and rules_nodejs 0.16.8 (#28532) 2019-02-05 16:55:43 -05:00
.bazelrc build(bazel): update to bazel 0.22.0 and turn on --incompatible_strict_action_env flag (#28404) 2019-01-28 11:48:41 -08:00
.clang-format feat(tooling): Add a .clang-format for automated JavaScript formatting. 2015-04-02 08:44:34 -07:00
.editorconfig build: use https link to editorconfig.org in .editorconfig (#27664) 2018-12-18 09:30:09 -08:00
.gitattributes chore: force lf EOL for ts files (#11143) 2016-08-29 12:41:58 -07:00
.gitignore build: update and unify gitignore (#28316) 2019-01-23 10:55:21 -08:00
.mailmap build: add a Git .mailmap with my new name (#19550) 2017-10-09 14:35:30 -07:00
.nvmrc build: update .nvmrc file to correct node version (#25992) 2018-09-18 13:11:58 -07:00
BUILD.bazel build: load angular.js minified output in upgrade tests (#27711) 2018-12-18 09:29:27 -08:00
CHANGELOG.md release: cut the v8.0.0-beta.3 release 2019-02-05 20:02:00 -08:00
CODE_OF_CONDUCT.md docs: fix community tab in GitHub by copying CoC 2018-02-27 19:02:30 -08:00
CONTRIBUTING.md build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00
LICENSE build: bump year (#27880) 2019-01-11 11:15:59 -08:00
README.md docs: update link for CircleCI badge to point workflow 2019-02-07 14:14:59 -08:00
WORKSPACE build(bazel): update to rules_nodejs 0.18.6 (#28699) 2019-02-13 12:13:08 -08:00
browser-providers.conf.js build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00
gulpfile.js build: `gulp format` only changed lines by default (#28411) 2019-02-04 16:49:16 -05:00
index.bzl style: format .bzl files with buildifier (#23544) 2018-08-08 13:12:07 -07:00
karma-js.conf.js ci: move local and saucelabs unit tests to circle (#27937) 2019-01-07 15:35:09 -08:00
package.json build: fix web_worker playground examples using external resources (#28562) 2019-02-13 12:01:54 -08:00
protractor-perf.conf.js build: remove legacy e2e tests job (#28645) 2019-02-13 12:15:02 -08:00
shims_for_IE.js Revert "refactor: add license header to JS files & format files (#12035)" 2016-10-04 14:06:41 -07:00
test-events.js fix(platform-browser): run BLACK_LISTED_EVENTS outside of ngZone (#18993) 2017-09-05 15:33:22 -05:00
test-main.js refactor(core): remove withBody from public testing API (#25171) 2018-07-31 15:09:32 -07:00
tslint.json style: tslint enforces no debugger statements left behind (#25532) 2018-08-16 16:00:22 -07:00
yarn.lock build: fix web_worker playground examples using external resources (#28562) 2019-02-13 12:01:54 -08:00
yarn.lock.readme.md build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00

README.md

CircleCI BrowserStack Status Join the chat at https://gitter.im/angular/angular npm version

Angular

Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScript and other languages.

Quickstart

Get started in 5 minutes.

Changelog

Learn about the latest improvements.

Want to help?

Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for contributing and then check out one of our issues in the hotlist: community-help.