// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library fasta.analyzer;

import 'package:analyzer/analyzer.dart' show
    AstNode;

import 'package:analyzer/dart/element/element.dart' show
    LocalElement;

import 'package:kernel/analyzer/ast_from_analyzer.dart' show
    ExpressionScope;

import 'package:kernel/ast.dart' show
    Library,
    TreeNode;

import '../builder/scope.dart' show
    Scope;

import '../kernel/kernel_builder.dart' show
    Builder,
    KernelFormalParameterBuilder;

import 'element_store.dart' show
    ElementStore;

export 'ast_builder.dart' show
    AstBuilder;

export 'element_store.dart' show
    ElementStore;

TreeNode toKernel(AstNode node, ElementStore store, Library library,
    Scope scope) {
  ExpressionScope expressionScope = new ExpressionScope(store, library);
  scope.local.forEach((String name, Builder builder) {
    if (builder is KernelFormalParameterBuilder) {
      LocalElement local = store[builder];
      assert(local != null);
      assert(builder.declaration != null);
      expressionScope.localVariables[local] = builder.declaration;
    }
  });
  return expressionScope.buildStatement(node);
}
