diff options
author | Jean-Marie Henaff <jmhenaff@google.com> | 2015-12-22 09:16:49 +0100 |
---|---|---|
committer | Jean-Marie Henaff <jmhenaff@google.com> | 2016-01-08 18:37:56 +0100 |
commit | c8bf086e092fffe9893cb408e668bf72696230d1 (patch) | |
tree | 9736846b39d9276cd12e2a32de7283fed804922c | |
parent | 9a4b4398dd17bdf4df25ed95b8b720e61da3bc79 (diff) | |
download | toolchain_jack-c8bf086e092fffe9893cb408e668bf72696230d1.zip toolchain_jack-c8bf086e092fffe9893cb408e668bf72696230d1.tar.gz toolchain_jack-c8bf086e092fffe9893cb408e668bf72696230d1.tar.bz2 |
Make package renamer visit referenced types only
Package renamer used to visit all types in order to take into account
types on classpath so that references to these types get renamed in
types to emit.
This CL suggests to retrict the visit of classpath types to the one
referenced by types to emit.
Cherry picked from commit bf93bed4c38cfba155cbd607cdcff79607e8cbd7
and contains conflict resolutions.
(call to JLookup.removeType() has been replaced by Jlookup.clear())
Bug: 26080068
Change-Id: I18ea503833061af1be31afd6bc9d9f96ea52dd28
-rw-r--r-- | jack/src/com/android/jack/transformations/renamepackage/PackageRenamer.java | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/jack/src/com/android/jack/transformations/renamepackage/PackageRenamer.java b/jack/src/com/android/jack/transformations/renamepackage/PackageRenamer.java index fb8c4e7..eb4d3db 100644 --- a/jack/src/com/android/jack/transformations/renamepackage/PackageRenamer.java +++ b/jack/src/com/android/jack/transformations/renamepackage/PackageRenamer.java @@ -17,6 +17,7 @@ package com.android.jack.transformations.renamepackage; import com.android.jack.JackAbortException; +import com.android.jack.backend.dex.TypeReferenceCollector; import com.android.jack.ir.ast.JAbstractStringLiteral; import com.android.jack.ir.ast.JAnnotation; import com.android.jack.ir.ast.JDefinedClassOrInterface; @@ -25,6 +26,7 @@ import com.android.jack.ir.ast.JNode; import com.android.jack.ir.ast.JPackage; import com.android.jack.ir.ast.JSession; import com.android.jack.ir.ast.JStringLiteral; +import com.android.jack.ir.ast.JType; import com.android.jack.ir.ast.JVisitor; import com.android.jack.ir.ast.Resource; import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter; @@ -32,7 +34,6 @@ import com.android.jack.ir.formatter.TypeFormatter; import com.android.jack.lookup.JLookup; import com.android.jack.reporting.Reporter.Severity; import com.android.jack.transformations.Jarjar; -import com.android.jack.transformations.request.ChangeEnclosingPackage; import com.android.jack.transformations.request.Replace; import com.android.jack.transformations.request.TransformationRequest; import com.android.jack.util.NamingTools; @@ -55,6 +56,8 @@ import com.tonicsystems.jarjar.RulesFileParser; import com.tonicsystems.jarjar.Wildcard; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Stack; @@ -88,8 +91,6 @@ public class PackageRenamer implements RunnableSchedulable<JSession>{ @Nonnull private final PackageRemapper remapper; @Nonnull - private final TransformationRequest request; - @Nonnull private final Stack<JNode> transformationRequestRoot = new Stack<JNode>(); @Nonnull @@ -97,11 +98,9 @@ public class PackageRenamer implements RunnableSchedulable<JSession>{ @Nonnull private final TypeFormatter formatter = BinaryQualifiedNameFormatter.getFormatter(); - public Visitor(@Nonnull JLookup lookup, @Nonnull PackageRemapper remapper, - @Nonnull TransformationRequest request) { + public Visitor(@Nonnull JLookup lookup, @Nonnull PackageRemapper remapper) { this.lookup = lookup; this.remapper = remapper; - this.request = request; } @Override @@ -109,10 +108,11 @@ public class PackageRenamer implements RunnableSchedulable<JSession>{ String binaryName = remapper.mapValue(formatter.getName(type)); String simpleName = NamingTools.getSimpleClassNameFromBinaryName(binaryName); type.setName(simpleName); + type.getEnclosingPackage().remove(type); String packageName = NamingTools.getPackageNameFromBinaryName(binaryName); JPackage newPackage = lookup.getOrCreatePackage(packageName); - lookup.clear(); - request.append(new ChangeEnclosingPackage(type, newPackage)); + type.setEnclosingPackage(newPackage); + newPackage.addType(type); } @Override @@ -170,11 +170,21 @@ public class PackageRenamer implements RunnableSchedulable<JSession>{ List<Wildcard> wildcards = PatternElement.createWildcards(result); PackageRemapper remapper = new PackageRemapper(wildcards); - TransformationRequest tr = new TransformationRequest(session); + Collection<JDefinedClassOrInterface> typesToEmit = session.getTypesToEmit(); + + final Collection<JDefinedClassOrInterface> typesToVisit = + new HashSet<JDefinedClassOrInterface>(); - new Visitor(session.getLookup(), remapper, tr).accept(session.getTopLevelPackage()); + new TypeReferenceCollector() { + @Override + protected void collect(@Nonnull JType type) { + if (type instanceof JDefinedClassOrInterface) { + typesToVisit.add((JDefinedClassOrInterface) type); + } + } + }.accept(typesToEmit); - tr.commit(); + new Visitor(session.getLookup(), remapper).accept(typesToVisit); for (Resource res : session.getResources()) { String pathToTransform = res.getPath().getPathAsString('/'); |