// Copyright (c) 2018, 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 vm.transformations.obfuscation_prohibitions_annotator;

import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart' show CoreTypes;

import '../metadata/obfuscation_prohibitions.dart';
import 'pragma.dart';

void transformComponent(Component component, CoreTypes coreTypes) {
  final repo = new ObfuscationProhibitionsMetadataRepository();
  component.addMetadataRepository(repo);
  final visitor =
      ObfuscationProhibitionsVisitor(ConstantPragmaAnnotationParser(coreTypes));
  visitor.visitComponent(component);
  repo.mapping[component] = visitor.metadata;
}

class ObfuscationProhibitionsVisitor extends RecursiveVisitor {
  final PragmaAnnotationParser parser;
  final metadata = ObfuscationProhibitionsMetadata();

  ObfuscationProhibitionsVisitor(this.parser);

  void _addIfEntryPoint(
      List<Expression> annotations, String name, TreeNode node) {
    for (var ann in annotations) {
      ParsedPragma pragma = parser.parsePragma(ann);
      if (pragma is ParsedEntryPointPragma) {
        metadata.protectedNames.add(name);
        if (node is Field) {
          metadata.protectedNames.add(name + "=");
        }
        final parent = node.parent;
        if (parent is Class) {
          metadata.protectedNames.add(parent.name);
        }
        break;
      }
    }
  }

  @override
  visitClass(Class klass) {
    _addIfEntryPoint(klass.annotations, klass.name, klass);
    klass.visitChildren(this);
  }

  @override
  visitProcedure(Procedure proc) {
    _addIfEntryPoint(proc.annotations, proc.name.name, proc);
  }

  @override
  visitField(Field field) {
    _addIfEntryPoint(field.annotations, field.name.name, field);
  }
}
