162 Commits

Author SHA1 Message Date
atscott
cfed0c0cf1 fix(ivy): Support selector-less directive as base classes ()
Following , this adds support for directives without a selector to
Ivy.

PR Close 
2019-08-20 09:56:54 -07:00
Igor Minar
6ece7db37a build: TypeScript 3.5 upgrade ()
https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#typescript-35

PR Close 
2019-07-25 17:05:23 -07:00
JoostK
3a2b195a58 feat(ivy): translate type-check diagnostics to their original source ()
PR Close 
2019-07-25 16:36:32 -07:00
crisbeto
3d7303efc0 perf(ivy): avoid extra parameter in query instructions ()
Currently we always generate the `read` parameter for the view and content query instructions, however since most of the time the `read` parameter won't be set, we'll end up generating `null` which adds 5 bytes for each query when minified. These changes make it so that the `read` parameter only gets generated if it has a value.

PR Close 
2019-07-24 14:37:51 -07:00
Matias Niemelä
9c954ebc62 refactor(ivy): make styling instructions use the new styling algorithm ()
This commit is the final patch of the ivy styling algorithm refactor.
This patch swaps functionality from the old styling mechanism to the
new refactored code by changing the instruction code the compiler
generates and by pointing the runtime instruction code to the new
styling algorithm.

PR Close 
2019-07-19 16:40:40 -07:00
crisbeto
40d785f0a0 perf(ivy): avoid generating extra parameters for host property bindings ()
Currently we reuse the same instruction both for regular property bindings and property bindings on the `host`. The only difference between the two is that when it's on the host we shouldn't support inputs. We have an optional parameter called `nativeOnly` which is used to differentiate the two, however since `nativeOnly` is preceeded by another optional parameter (`sanitizer`), we have to generate two extra parameters for each host property bindings every time (e.g. `property('someProp', 'someValue', null, true)`).

These changes add a new instruction called `hostProperty` which avoids the need for the two parameters by removing `nativeOnly` which is always set and it allows us to omit `sanitizer` when it isn't being used.

These changes also remove the `nativeOnly` parameter from the `updateSyntheticHostBinding` instruction, because it's only generated for host elements which means that we can assume that its value will always be `true`.

PR Close 
2019-07-16 13:01:42 -04:00
Alex Rickabaugh
1cba5d42d1 fix(ivy): handle rooted resource paths correctly ()
Previously, resource paths beginning with '/' (aka "rooted" paths, which
are not actually absolute filesystem paths, but are relative to the
TypeScript project root directory) were not handled correctly. The leading
'/' was stripped and the path was resolved as if it was relative, but with
no containing file for context. This led to resources in different rootDirs
not being found.

Instead, such rooted paths are now resolved without TypeScript's help, by
checking each root directory. A test is added to this effect.

PR Close 
2019-07-11 11:42:33 -04:00
JoostK
eb6281f5b4 fix(ivy): include type parameter for ngBaseDef declaration ()
When a class uses Angular decorators such as `@Input`, `@Output` and
friends without an Angular class decorator, they are compiled into a
static `ngBaseDef` field on the class, with the TypeScript declaration
of the class being altered to declare the `ngBaseDef` field to be of type
`ɵɵBaseDef`. This type however requires a generic type parameter that
corresponds with the type of the class, however the compiler did not
provide this type parameter. As a result, compiling a program where such
invalid `ngBaseDef` declarations are present will result in compilation
errors.

This commit fixes the problem by providing the generic type parameter.

Fixes 

PR Close 
2019-07-02 11:06:46 -07:00
crisbeto
81332150aa perf(ivy): chain host binding instructions ()
Adds chaining to the `property`, `attribute` and `updateSyntheticHostBinding` instructions when they're used in a host binding.

This PR resolves FW-1404.

PR Close 
2019-06-28 09:26:20 -07:00
Pete Bacon Darwin
7186f9c016 refactor(ivy): implement a virtual file-system layer in ngtsc + ngcc ()
To improve cross platform support, all file access (and path manipulation)
is now done through a well known interface (`FileSystem`).

For testing a number of `MockFileSystem` implementations are provided.
These provide an in-memory file-system which emulates operating systems
like OS/X, Unix and Windows.

The current file system is always available via the static method,
`FileSystem.getFileSystem()`. This is also used by a number of static
methods on `AbsoluteFsPath` and `PathSegment`, to avoid having to pass
`FileSystem` objects around all the time. The result of this is that one
must be careful to ensure that the file-system has been initialized before
using any of these static methods. To prevent this happening accidentally
the current file system always starts out as an instance of `InvalidFileSystem`,
which will throw an error if any of its methods are called.

You can set the current file-system by calling `FileSystem.setFileSystem()`.
During testing you can call the helper function `initMockFileSystem(os)`
which takes a string name of the OS to emulate, and will also monkey-patch
aspects of the TypeScript library to ensure that TS is also using the
current file-system.

Finally there is the `NgtscCompilerHost` to be used for any TypeScript
compilation, which uses a given file-system.

All tests that interact with the file-system should be tested against each
of the mock file-systems. A series of helpers have been provided to support
such tests:

* `runInEachFileSystem()` - wrap your tests in this helper to run all the
wrapped tests in each of the mock file-systems.
* `addTestFilesToFileSystem()` - use this to add files and their contents
to the mock file system for testing.
* `loadTestFilesFromDisk()` - use this to load a mirror image of files on
disk into the in-memory mock file-system.
* `loadFakeCore()` - use this to load a fake version of `@angular/core`
into the mock file-system.

All ngcc and ngtsc source and tests now use this virtual file-system setup.

PR Close 
2019-06-25 16:25:24 -07:00
Andrew Kushnir
2aba485118 refactor(ivy): use FatalDiagnosticError to throw more descriptive errors while extracting queries information ()
Prior to this commit, the logic to extract query information from class fields used an instance of regular Error class to throw an error. As a result, some useful information (like reference to a specific field) was missing. Replacing Error class with FatalDiagnosticError one makes the error more verbose that should simplify debugging.

PR Close 
2019-06-25 10:23:24 -07:00
JoostK
75ac724842 fix(ivy): quote dots in directive inputs and outputs ()
A temporary check is in place to determine whether a key in an object
literal needs to be quoted during emit. Previously, only the presence of
a dash caused a key to become quoted, this however is not sufficient for
@angular/flex-layout to compile properly as it has dots in its inputs.

This commit extends the check to also use quotes when a dot is present.

Fixes 

PR Close 
2019-06-19 17:57:13 -07:00
Ben Lesh
d1df0a94d4 refactor(ivy): remove ɵɵelementProperty instruction ()
- Removes ɵɵelementProperty instruction
- Updates tests that were using it
- NOTE: There is one test under `render3/integration_spec.ts` that is commented out, and needs to be reviewed. Basically, I could not find a good why to test what it was doing, because it was doing things that I am not sure we could generate in an acceptance test.

PR Close 
2019-06-05 09:04:43 -07:00
Andrew Kushnir
7a0f8ac36c fix(ivy): generate explicit type annotation for NgModuleFactory calls in ngfactories ()
Prior to this commit there were no explicit types setup for NgModuleFactory calls in ngfactories, so TypeScript inferred the type based on a given call. In some cases (when generic types were used for Components/Directives) that turned out to be problematic, so we add explicit typing for NgModuleFactory calls.

PR Close 
2019-05-30 15:09:56 -04:00
Ben Lesh
dd0815095f feat(ivy): add ɵɵtextInterpolateX instructions ()
- `ɵɵtextBinding(..., ɵɵinterpolationX())` instructions will now just be `ɵɵtextInterpolate(...)` instructions

PR Close 
2019-05-29 12:38:58 -04:00
Kara Erickson
214ae0ea4c test(compiler): update examples and compiler tests ()
PR Close 
2019-05-23 10:31:32 -07:00
Ben Lesh
988afad2af refactor(ivy): generate new ɵɵattribute instruction in host bindings ()
PR Close 
2019-05-22 16:30:29 -07:00
Ben Lesh
d7eaae6f22 refactor(ivy): Move instructions back to ɵɵ ()
There is an encoding issue with using delta `Δ`, where the browser will attempt to detect the file encoding if the character set is not explicitly declared on a `<script/>` tag, and Chrome will find the `Δ` character and decide it is window-1252 encoding, which misinterprets the `Δ` character to be some other character that is not a valid JS identifier character

So back to the frog eyes we go.

```
    __
   /ɵɵ\
  ( -- ) - I am ineffable. I am forever.
 _/    \_
/  \  /  \
==  ==  ==
```

PR Close 
2019-05-20 16:37:47 -07:00
Pete Bacon Darwin
eda09e69ea fix(ivy): ngtsc - do not wrap arguments unnecessarily ()
Previously we defensively wrapped expressions in case they ran afoul of
precedence rules. For example, it would be easy to create the TS AST structure
Call(Ternary(a, b, c)), but might result in printed code of:

```
a ? b : c()
```

Whereas the actual structure we meant to generate is:

```
(a ? b : c)()
```

However the TypeScript renderer appears to be clever enough to provide
parenthesis as necessary.

This commit removes these defensive paraenthesis in the cases of binary
and ternary operations.

FW-1273

PR Close 
2019-05-17 09:55:46 -07:00
Ben Lesh
cf86ed7b29 refactor(ivy): migrate ɵɵ prefix back to Δ ()
Now that issues are resolved with Closure compiler, we can move back to our desired prefix of `Δ`.

PR Close 
2019-05-14 16:52:15 -07:00
Kristiyan Kostadinov
f74373f2dd fix(ivy): align NgModule registration timing with ViewEngine ()
Currently in Ivy `NgModule` registration happens when the class is declared, however this is inconsistent with ViewEngine and requires extra generated code. These changes remove the generated code for `registerModuleFactory`, pass the id through to the `ngModuleDef` and do the module registration inside `NgModuleFactory.create`.

This PR resolves FW-1285.

PR Close 
2019-05-13 11:13:25 -07:00
Matias Niemelä
d8665e639b refactor(ivy): drop element prefixes for all styling-related instructions ()
This is the final patch to migrate the Angular styling code to have a
smaller instruction set in preparation for the runtime refactor. All
styling-related instructions now work both in template and hostBindings
functions and do not use `element` as a prefix for their names:

BEFORE:
  elementStyling()
  elementStyleProp()
  elementClassProp()
  elementStyleMap()
  elementClassMap()
  elementStylingApply()

AFTER:
  styling()
  styleProp()
  classProp()
  styleMap()
  classMap()
  stylingApply()

PR Close 
2019-05-08 15:33:39 -07:00
Matias Niemelä
c016e2c4ec refactor(ivy): migrate all host-specific styling instructions to element-level styling instructions ()
This patch removes all host-specific styling instructions in favor of
using element-level instructions instead. Because of the previous
patches that made sure `select(n)` worked between styling calls, all
host level instructions are not needed anymore. This patch changes each
of those instruction calls to use any of the `elementStyling*`,
`elementStyle*` and `elementClass*` styling instructions instead.

PR Close 
2019-05-08 14:54:44 -07:00
Kristiyan Kostadinov
68ff2cc323 fix(ivy): host bindings and listeners not being inherited from undecorated classes ()
Fixes `HostBinding` and `HostListener` declarations not being inherited from base classes that don't have an Angular decorator.

This PR resolves FW-1275.

PR Close 
2019-04-29 13:35:14 -07:00
Andrew Kushnir
aaf8145c48 fix(ivy): support module.id as @NgModule's "id" field value ()
Prior to this commit, the check that verifies correct "id" field type was too strict and didn't allow `module.id` as @NgModule's "id" field value. This change adds a special handling for `module.id` and uses it as id of @NgModule if specified.

PR Close 
2019-04-23 14:50:58 -07:00
Ben Lesh
0f9230d018 feat(ivy): generate ɵɵproperty in host bindings ()
PR Close 
2019-04-22 17:30:17 -07:00
Alex Rickabaugh
0df719a461 feat(ivy): register NgModules with ids when compiled with AOT ()
This commit adds registration of AOT compiled NgModules that have 'id'
properties set in their metadata. Such modules have a call to
registerNgModuleType() emitted as part of compilation.

The JIT behavior of this code is already in place.

This is required for module loading systems (such as g3) which rely on
getModuleFactory().

PR Close 
2019-04-19 11:12:21 -07:00
Alex Rickabaugh
4229b41057 test(ivy): replace ɵ with escape code ()
PR Close 
2019-04-19 11:12:20 -07:00
JoostK
83291f01b0 fix(ivy): let ngtsc unwrap expressions when resolving forwardRef ()
Previously, ngtsc would fail to resolve `forwardRef` calls if they
contained additional parenthesis or casts. This commit changes the
behavior to first unwrap the AST nodes to see past such insignificant
nodes, resolving the issue.

Fixes 

PR Close 
2019-04-17 12:52:34 -07:00
Alex Rickabaugh
b0578061ce refactor(ivy): use ɵɵ instead of Δ for now ()
The `Δ` caused issue with other infrastructure, and we are temporarily
changing it to `ɵɵ`.

This commit also patches ts_api_guardian_test and AIO to understand `ɵɵ`.

PR Close 
2019-04-11 16:27:56 -07:00
Olivier Combe
91c7b451d5 feat(ivy): support i18n without closure ()
So far using runtime i18n with ivy meant that you needed to use Closure and `goog.getMsg` (or a polyfill). This PR changes the compiler to output both closure & non-closure code, while the unused option will be tree-shaken by minifiers.
This means that if you use the Angular CLI with ivy and load a translations file, you can use i18n and the application will not throw at runtime.
For now it will not translate your application, but at least you can try ivy without having to remove all of your i18n code and configuration.
PR Close 
2019-04-11 08:28:45 -07:00
Ben Lesh
138ca5a246 refactor(ivy): prefix all generated instructions ()
- Updates all instructions to be prefixed with the Greek delta symbol

PR Close 
2019-04-10 12:11:40 -07:00
JoostK
60afe88bcc feat(ivy): do not emit empty providers/imports for defineInjector ()
The defineInjector function specifies its providers and imports array to
be optional, so if no providers/imports are present these keys may be
omitted. This commit updates the compiler to only generate the keys when
necessary.

PR Close 
2019-04-02 16:03:54 -07:00
JoostK
2d372f48db feat(ivy): exclude declarations from injector imports ()
Prior to this change, a module's imports and exports would be used verbatim
as an injectors' imports. This is detrimental for tree-shaking, as a
module's exports could reference declarations that would then prevent such
declarations from being eligible for tree-shaking.

Since an injector actually only needs NgModule references as its imports,
we may safely filter out any declarations from the list of module exports.
This makes them eligible for tree-shaking once again.

PR Close 
2019-04-02 16:03:54 -07:00
JoostK
45c6360e5a feat(ivy): emit module scope metadata using pure function call ()
Prior to this change, all module metadata would be included in the
`defineNgModule` call that is set as the `ngModuleDef` field of module
types. Part of the metadata is scope information like declarations,
imports and exports that is used for computing the transitive module
scope in JIT environments, preventing those references from being
tree-shaken for production builds.

This change moves the metadata for scope computations to a pure function
call that patches the scope references onto the module type. Because the
function is marked pure, it may be tree-shaken out during production builds
such that references to declarations and exports are dropped, which in turn
allows for tree-shaken any declaration that is not otherwise referenced.

Fixes , FW-1035

PR Close 
2019-04-02 16:03:54 -07:00
Pete Bacon Darwin
63013f1aeb fix(ivy): support finding the import of namespace-imported identifiers ()
Currently there is no support in ngtsc for imports of the form:

```
import * as core from `@angular/core`

export function forRoot(): core.ModuleWithProviders;
```

This commit modifies the `ReflectionHost.getImportOfIdentifier(id)`
method, so that it supports this kind of return type.

PR Close 
2019-04-01 16:06:14 -07:00
Alex Rickabaugh
3e569767e3 fix(ivy): avoid remote scoping if it's not actually required ()
Currently, ngtsc decides to use remote scoping if the compilation of a
component may create a cyclic import. This happens if there are two
components in a scope (say, A and B) and A directly uses B. During
compilation of B ngtsc will then note that if B were to use A, a cycle would
be generated, and so it will opt to use remote scoping for B.

ngtsc already uses the R3TargetBinder to correctly track the imports that
are actually required, for future cycle tracking. This commit expands that
usage to not trigger remote scoping unless B actually does consume A in its
template.

PR Close 
2019-04-01 15:13:35 -07:00
Paul Gschwendtner
1e5a818719 fix(ivy): ngtsc is unable to detect flat module entry-point on windows ()
Currently when building an Angular project with `ngtsc`
and `flatModuleOutFile` enabled, the Ngtsc build will fail
if there are multiple source files as root file names.

Ngtsc and NGC currently determine the entry-point for multiple
root file names by looking for files ending with `/index.ts`.

This functionality is technically deprecated, but still supported
and currently breaks on Windows as the root file names are not
guaranteed to be normalized POSIX-like paths.

In order to make this logic more reliable in the future, this commit
also switches the shim generators and entry-point logic to the branded
path types. This ensures that we don't break this in the future.

PR Close 
2019-03-27 13:46:37 -07:00
JoostK
9eb8274991 fix(ivy): emit generic type arguments in Pipe metadata ()
Previously, only directives and services with generic type parameters
would emit `any` as generic type when emitting Ivy metadata into .d.ts
files. Pipes can also have generic type parameters but did not emit
`any` for all type parameters, resulting in the omission of those
parameters which causes compilation errors.

This commit adds support for pipes with generic type arguments and emits
`any` as generic type in the Ivy metadata.

Fixes 

PR Close 
2019-03-20 16:11:22 -04:00
Matias Niemelä
8714daf276 fix(ivy): introduce host-specific styling instructions ()
This patch is the first of a few patches which separates the
styling logic between template bindings (e.g. <div [style])
from host bindings (e.g. @HostBinding('style')). This patch
in particular introduces a series of host-specific styling
instructions and changes the existing set of template styling
instructions not to accept directives. The underyling code (which
communicates with the styling algorithm) still works as it did
before.

This PR also separates the styling instruction code into a separate
file and moves over all other instructions into an dedicated
instructions directory.

PR Close 
2019-03-19 16:33:39 -04:00
Alex Rickabaugh
ae4a86e3b5 fix(ivy): don't track identifiers of ffr-resolved references ()
This fix is for a bug in the ngtsc PartialEvaluator, which statically
evaluates expressions.

Sometimes, evaluating a reference requires resolving a function which is
declared in another module, and thus no function body is available. To
support this case, the PartialEvaluator has the concept of a foreign
function resolver.

This allows the interpretation of expressions like:

const router = RouterModule.forRoot([]);

even though the definition of the 'forRoot' function has no body. In
ngtsc today, this will be resolved to a Reference to RouterModule itself,
via the ModuleWithProviders foreign function resolver.

However, the PartialEvaluator also associates any Identifiers in the path
of this resolution with the Reference. This is done so that if the user
writes

const x = imported.y;

'x' can be generated as a local identifier instead of adding an import for
'y'.

This was at the heart of a bug. In the above case with 'router', the
PartialEvaluator added the identifier 'router' to the Reference generated
(through FFR) to RouterModule.

This is not correct. References that result from FFR expressions may not
have the same value at runtime as they do at compile time (indeed, this is
not the case for ModuleWithProviders). The Reference generated via FFR is
"synthetic" in the sense that it's constructed based on a useful
interpretation of the code, not an accurate representation of the runtime
value. Therefore, it may not be legal to refer to the Reference via the
'router' identifier.

This commit adds the ability to mark such a Reference as 'synthetic', which
allows the PartialEvaluator to not add the 'router' identifier down the
line. Tests are included for both the PartialEvaluator itself as well as the
resultant buggy behavior in ngtsc overall.

PR Close 
2019-03-19 01:10:17 -04:00
Kristiyan Kostadinov
0ffa2f2e73 fix(ivy): unable to inherit view queries into component from directive ()
Fixes components not being able to inherit their view queries from a directive.

This PR resolves FW-1146.

PR Close 
2019-03-13 17:12:14 -04:00
Igor Minar
75748d6044 feat: add support for TypeScript 3.3 (and drop older versions) ()
https://blogs.msdn.microsoft.com/typescript/2019/01/31/announcing-typescript-3-3/

BREAKING CHANGE: TypeScript 3.1 and 3.2 are no longer supported.

Please update your TypeScript version to 3.3

PR Close 
2019-03-13 10:38:37 -07:00
Alex Rickabaugh
73da2792c9 fix(ivy): properly compile NgModules with forward referenced types ()
Previously, ngtsc would resolve forward references while evaluating the
bootstrap, declaration, imports, and exports fields of NgModule types.
However, when generating the resulting ngModuleDef, the forward nature of
these references was not taken into consideration, and so the generated JS
code would incorrectly reference types not yet declared.

This commit fixes this issue by introducing function closures in the
NgModuleDef type, similarly to how NgComponentDef uses them for forward
declarations of its directives and pipes arrays. ngtsc will then generate
closures when required, and the runtime will unwrap them if present.

PR Close 
2019-03-12 18:26:42 -07:00
Alex Rickabaugh
ccb70e1c64 fix(ivy): reuse default imports in type-to-value references ()
This fixes an issue with commit b6f6b117. In this commit, default imports
processed in a type-to-value conversion were recorded as non-local imports
with a '*' name, and the ImportManager generated a new default import for
them. When transpiled to ES2015 modules, this resulted in the following
correct code:

import i3 from './module';

// somewhere in the file, a value reference of i3:
{type: i3}

However, when the AST with this synthetic import and reference was
transpiled to non-ES2015 modules (for example, to commonjs) an issue
appeared:

var module_1 = require('./module');
{type: i3}

TypeScript renames the imported identifier from i3 to module_1, but doesn't
substitute later references to i3. This is because the import and reference
are both synthetic, and never went through the TypeScript AST step of
"binding" which associates the reference to its import. This association is
important during emit when the identifiers might change.

Synthetic (transformer-added) imports will never be bound properly. The only
possible solution is to reuse the user's original import and the identifier
from it, which will be properly downleveled. The issue with this approach
(which prompted the fix in b6f6b117) is that if the import is only used in a
type position, TypeScript will mark it for deletion in the generated JS,
even though additional non-type usages are added in the transformer. This
again would leave a dangling import.

To work around this, it's necessary for the compiler to keep track of
identifiers that it emits which came from default imports, and tell TS not
to remove those imports during transpilation. A `DefaultImportTracker` class
is implemented to perform this tracking. It implements a
`DefaultImportRecorder` interface, which is used to record two significant
pieces of information:

* when a WrappedNodeExpr is generated which refers to a default imported
  value, the ts.Identifier is associated to the ts.ImportDeclaration via
  the recorder.
* when that WrappedNodeExpr is later emitted as part of the statement /
  expression translators, the fact that the ts.Identifier was used is
  also recorded.

Combined, this tracking gives the `DefaultImportTracker` enough information
to implement another TS transformer, which can recognize default imports
which were used in the output of the Ivy transform and can prevent them
from being elided. This is done by creating a new ts.ImportDeclaration for
the imports with the same ts.ImportClause. A test verifies that this works.

PR Close 
2019-03-12 18:02:08 -07:00
Andrew Kushnir
fe76494759 fix(ivy): use default selector for Components if selector is empty ()
Prior to this change default selector for Components was not applied in case selector is missing or defined as an empty string. This update aligns this behavior between Ivy and VE: now default selector is used for Components when it's needed. Directives with empty selector are not allowed and trigger a compile-time error in both Ivy and VE.

PR Close 
2019-03-12 14:09:46 -07:00
Andrew Kushnir
1d88c2bb81 fix(ivy): handle aliased Angular decorators ()
Prior to this change the code didn't take into account the fact that decorators can be aliases while importing into a script. As a result, these decorators were not recognized by Angular and various failures happened because of that. Now we take aliases into account and resolve decorator name properly.

PR Close 
2019-03-11 11:20:41 -07:00
Alex Rickabaugh
49dccf4bfc fix(ivy): process separate declarations and exports for summaries ()
ngsummary files were generated with an export for each class declaration.
However, some Angular code declares classes (class Foo) and exports them
(export {Foo}) separately, which was causing incomplete summary files.

This commit expands the set of symbol names for which summary exports will
be generated, fixing this issue.

PR Close 
2019-03-08 16:11:32 -08:00
Alex Rickabaugh
3a6ba00286 fix(ivy): escape all required characters in reexport aliases ()
Previously, the compiler did not escape . or $, and this was causing issues
in google3. Now these characters are escaped.

PR Close 
2019-03-08 16:10:57 -08:00
Alex Rickabaugh
b6f6b1178f fix(ivy): generate type references to a default import ()
This commit refactors and expands ngtsc's support for generating imports of
values from imports of types (this is used for example when importing a
class referenced in a type annotation in a constructor).

Previously, this logic handled "import {Foo} from" and "import * as foo
from" style imports, but failed on imports of default values ("import
Foo from"). This commit moves the type-to-value logic to a separate file and
expands it to cover the default import case. Doing this also required
augmenting the ImportManager to track default as well as non-default import
generation. The APIs were made a little cleaner at the same time.

PR Close 
2019-03-08 11:57:08 -08:00