blob: b4eeab70170f072a713f95a24a361946db358cc5 [file] [log] [blame]
// 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);
}
}