// 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 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 visitConstructor(Constructor ctor) { _addIfEntryPoint(ctor.annotations, ctor.name.text, ctor); } @override visitProcedure(Procedure proc) { _addIfEntryPoint(proc.annotations, proc.name.text, proc); } @override visitField(Field field) { _addIfEntryPoint(field.annotations, field.name.text, field); } }