| // 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 |
| 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); |
| } |
| } |