message: refactor(compiler-cli): Return symbols for all matching outputs
  This commit ensures that the template type checker returns symbols for
  all outputs if a template output listener binds to more than one.
  PR Close
diff: @@ -173,21 +173,20 @@ export class SymbolBuilder {
  // * _t1.addEventListener(handler);
  // Even with strict null checks disabled, we still produce the access as a separate statement
  // so that it can be found here.
  - const outputFieldAccess = findFirstMatchingNode(
  + const outputFieldAccesses = findAllMatchingNodes(
  this.typeCheckBlock, {withSpan: eventBinding.keySpan, filter: isAccessExpression});
  - if (outputFieldAccess === null) {
  - return null;
  - }
  + const bindings: BindingSymbol[] = [];
  + for (const outputFieldAccess of outputFieldAccesses) {
  const consumer = this.templateData.boundTarget.getConsumerOfBinding(eventBinding);
  if (consumer === null) {
  - return null;
  + continue;
  }
  if (consumer instanceof TmplAstTemplate || consumer instanceof TmplAstElement) {
  if (!ts.isPropertyAccessExpression(outputFieldAccess) ||
  outputFieldAccess.name.text !== 'addEventListener') {
  - return null;
  + continue;
  }
  const addEventListener = outputFieldAccess.name;
  @@ -197,49 +196,49 @@ export class SymbolBuilder {
  const target = this.getSymbol(consumer);
  if (target === null || tsSymbol === undefined) {
  - return null;
  + continue;
  }
  - return {
  - kind: SymbolKind.Output,
  - bindings: [{
  + bindings.push({
  kind: SymbolKind.Binding,
  tsSymbol,
  tsType,
  target,
  shimLocation: {shimPath: this.shimPath, positionInShimFile},
  - }],
  - };
  + });
  } else {
  if (!ts.isElementAccessExpression(outputFieldAccess)) {
  - return null;
  + continue;
  }
  const tsSymbol =
  this.getTypeChecker().getSymbolAtLocation(outputFieldAccess.argumentExpression);
  if (tsSymbol === undefined) {
  - return null;
  + continue;
  }
  const target = this.getDirectiveSymbolForAccessExpression(outputFieldAccess, consumer);
  if (target === null) {
  - return null;
  + continue;
  }
  const positionInShimFile = this.getShimPositionForNode(outputFieldAccess);
  const tsType = this.getTypeChecker().getTypeAtLocation(outputFieldAccess);
  - return {
  - kind: SymbolKind.Output,
  - bindings: [{
  + bindings.push({
  kind: SymbolKind.Binding,
  tsSymbol,
  tsType,
  target,
  shimLocation: {shimPath: this.shimPath, positionInShimFile},
  - }],
  - };
  + });
  }
  }
  + if (bindings.length === 0) {
  + return null;
  + }
  +
  + return {kind: SymbolKind.Output, bindings};
  + }
  private getSymbolOfInputBinding(binding: TmplAstBoundAttribute|
  TmplAstTextAttribute): InputBindingSymbol|DomBindingSymbol|null {
  