Files
sdk/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
T
Samir Jindel 3b2144fa93 [vm] Respect entry-point annotation on constructors during obfuscation.
Change-Id: Ia61d582fb6dd647b8fcab051b57ff08682076d9d
Cq-Include-Trybots: luci.dart.try:vm-kernel-optcounter-threshold-linux-release-x64-try, vm-kernel-precomp-linux-debug-x64-try, vm-kernel-precomp-linux-release-simarm-try, vm-kernel-precomp-linux-release-simarm64-try, vm-kernel-precomp-linux-release-x64-try, vm-kernel-precomp-mac-release-simarm64-try, vm-kernel-precomp-win-release-x64-try, vm-kernel-precomp-obfuscate-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/93225
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-02-14 20:18:19 +00:00

67 lines
2.0 KiB
Dart

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