summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2014-11-14 09:38:56 +0100
committermikaelpeltier <mikaelpeltier@google.com>2014-11-17 17:27:54 +0100
commit2f5cdf7f3f2fcf407c6c46c2d55498728da0453b (patch)
treeb1af6d4cfc2d37b3e073abcce0af44dfc26e12c8
parent1cf6a3899617f508ed1b476d2eeb8464fa86e158 (diff)
downloadtoolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.zip
toolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.tar.gz
toolchain_jack-2f5cdf7f3f2fcf407c6c46c2d55498728da0453b.tar.bz2
Jack generates lib version 1.1
- All jayce files are into a folder jayce - All intermediates dex files are into a folder dex - All .jpp files are into a folder jpp - All resource files are into a folder rsc - Disable usage of dex from library when jarjar and obfuscation is enabled Change-Id: Id0f92b4519953a0bc41c76a55700a2c6f6ce5ec3
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/IrrelevantForTest.java (renamed from jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest.java)2
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1 (renamed from jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource1)0
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2 (renamed from jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource2)0
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/IrrelevantForTest2.java (renamed from jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest2.java)2
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1 (renamed from jack-tests/tests/com/android/jack/resource/test001/jack/Resource1)0
-rw-r--r--jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3 (renamed from jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource3)0
-rw-r--r--jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource11
-rw-r--r--jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource2 (renamed from jack-tests/tests/com/android/jack/resource/test001/jack/Resource2)0
-rw-r--r--jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource3 (renamed from jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource3)0
-rw-r--r--jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource4 (renamed from jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource4)0
-rw-r--r--jack/src/com/android/jack/Jack.java60
-rw-r--r--jack/src/com/android/jack/Options.java28
-rw-r--r--jack/src/com/android/jack/backend/ResourceWriter.java19
-rw-r--r--jack/src/com/android/jack/backend/dex/DexWritingTool.java52
-rw-r--r--jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java47
-rw-r--r--jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java27
-rw-r--r--jack/src/com/android/jack/backend/jayce/JayceFileImporter.java54
-rw-r--r--jack/src/com/android/jack/experimental/incremental/JackIncremental.java7
-rw-r--r--jack/src/com/android/jack/ir/ast/JSession.java28
-rw-r--r--jack/src/com/android/jack/jayce/FullPackageLoader.java2
-rw-r--r--jack/src/com/android/jack/jayce/JaycePackageLoader.java114
-rw-r--r--jack/src/com/android/jack/jayce/StructurePackageLoader.java2
-rw-r--r--jack/src/com/android/jack/library/CommonJackLibrary.java5
-rw-r--r--jack/src/com/android/jack/library/FileType.java61
-rw-r--r--jack/src/com/android/jack/library/InputLibrary.java5
-rw-r--r--jack/src/com/android/jack/library/JackLibraryFactory.java4
-rw-r--r--jack/src/com/android/jack/library/OutputLibrary.java4
-rw-r--r--jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java25
-rw-r--r--jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java21
-rw-r--r--jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java40
-rw-r--r--jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java22
-rw-r--r--jack/src/com/android/jack/library/v0001/Version.java4
-rw-r--r--jack/src/com/android/jack/preprocessor/PreProcessorApplier.java35
-rw-r--r--jack/src/com/android/jack/preprocessor/PreprocessorProperties.java28
-rw-r--r--jack/src/com/android/jack/resource/LibraryResourceWriter.java70
-rw-r--r--jack/src/com/android/jack/resource/ResourceOrMetaImporter.java23
-rw-r--r--jack/src/com/android/jack/resource/ResourceProperties.java27
-rw-r--r--jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java3
-rw-r--r--jack/tests/com/android/jack/ClasspathTest.java10
-rw-r--r--jack/tests/com/android/jack/FileConflictTest.java102
-rw-r--r--jack/tests/com/android/jack/ResourceTest.java197
-rw-r--r--jack/tests/com/android/jack/WithPhantomTest.java25
-rw-r--r--jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java26
-rw-r--r--jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java4
-rw-r--r--jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java4
-rw-r--r--jack/tests/com/android/jack/multidex/MultiDexTests.java39
-rw-r--r--sched/src/com/android/sched/vfs/VPath.java5
47 files changed, 798 insertions, 436 deletions
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest.java b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/IrrelevantForTest.java
index 509cb43..a25e9e8 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest.java
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/IrrelevantForTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.jack.fileconflict.test002.jack;
+package com.android.jack.fileconflict.test002.jack.lib1;
/**
* This class is irrelevant for the test, since what we test here is the handling of resources.
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1
index b98ccd9..b98ccd9 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource1
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource1
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource2 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2
index 1bcdbc0..1bcdbc0 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource2
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib1/rsc/Resource2
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest2.java b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/IrrelevantForTest2.java
index abfbf29..b44d31a 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/IrrelevantForTest2.java
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/IrrelevantForTest2.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.jack.fileconflict.test002.jack;
+package com.android.jack.fileconflict.test002.jack.lib2;
/**
* This class is irrelevant for the test, since what we test here is the handling of resources.
diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource1 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1
index b98ccd9..b98ccd9 100644
--- a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource1
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource1
diff --git a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource3 b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3
index d0da24e..d0da24e 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/test002/jack/Resource3
+++ b/jack-tests/tests/com/android/jack/fileconflict/test002/jack/lib2/rsc/Resource3
diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1
new file mode 100644
index 0000000..b98ccd9
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource1
@@ -0,0 +1 @@
+Res1
diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource2 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource2
index 1bcdbc0..1bcdbc0 100644
--- a/jack-tests/tests/com/android/jack/resource/test001/jack/Resource2
+++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/Resource2
diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource3 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource3
index d0da24e..d0da24e 100644
--- a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource3
+++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource3
diff --git a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource4 b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource4
index cf38257..cf38257 100644
--- a/jack-tests/tests/com/android/jack/resource/test001/jack/pack/Resource4
+++ b/jack-tests/tests/com/android/jack/resource/test001/jack/rsc/pack/Resource4
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index 5fcd0fd..50419a4 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -85,6 +85,7 @@ import com.android.jack.ir.sourceinfo.SourceInfoCreation;
import com.android.jack.jayce.JaycePackageLoader;
import com.android.jack.library.FileType;
import com.android.jack.library.InputJackLibrary;
+import com.android.jack.library.InputLibrary;
import com.android.jack.library.JackLibraryFactory;
import com.android.jack.library.LibraryReadingException;
import com.android.jack.library.LibraryWritingException;
@@ -103,6 +104,7 @@ import com.android.jack.optimizations.UseDefsChainsSimplifier;
import com.android.jack.preprocessor.PreProcessor;
import com.android.jack.preprocessor.PreProcessorApplier;
import com.android.jack.reporting.Reporter.Severity;
+import com.android.jack.resource.LibraryResourceWriter;
import com.android.jack.resource.ResourceImporter;
import com.android.jack.resource.ResourceReadingException;
import com.android.jack.scheduling.adapter.ExcludeTypeFromLibAdapter;
@@ -530,6 +532,9 @@ public abstract class Jack {
if (options.ecjArguments == null) {
request.addInitialTagsOrMarkers(getJackFormatInitialTagSet());
+ if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) {
+ request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet());
+ }
} else {
request.addInitialTagsOrMarkers(getJavaSourceInitialTagSet());
if (config.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) {
@@ -577,7 +582,8 @@ public abstract class Jack {
planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
typePlan.append(JayceSingleTypeWriter.class);
}
- } else if (options.ecjArguments == null) {
+ } else if (options.ecjArguments == null
+ && !targetProduction.contains(JayceFormatProduct.class)) {
assert targetProduction.contains(DexFileProduct.class);
fillJayceToDexPlan(options, planBuilder);
planBuilder.append(DexFileWriter.class);
@@ -591,7 +597,12 @@ public abstract class Jack {
}
if (features.contains(Resources.class)) {
- planBuilder.append(ResourceWriter.class);
+ if (targetProduction.contains(DexFileProduct.class)) {
+ planBuilder.append(ResourceWriter.class);
+ }
+ if (targetProduction.contains(JayceFormatProduct.class)) {
+ planBuilder.append(LibraryResourceWriter.class);
+ }
}
Plan<JSession> plan;
@@ -796,7 +807,7 @@ public abstract class Jack {
JaycePackageLoader rootPLoader =
factory.create(inputJackLibrary, session.getPhantomLookup());
session.getTopLevelPackage().addLoader(rootPLoader);
- session.addImportSource(vDir);
+ session.addImportedLibrary(inputJackLibrary);
} catch (IOException ioException) {
throw new LibraryReadingException(ioException);
} catch (LibraryException libException) {
@@ -814,10 +825,11 @@ public abstract class Jack {
for (final File jackFile : jackFiles) {
try {
InputRootVDir vDir = wrapAsVDir(jackFile, hooks);
+ InputJackLibrary inputJackLibrary = JackLibraryFactory.getInputLibrary(vDir);
JaycePackageLoader rootPLoader =
- factory.create(JackLibraryFactory.getInputLibrary(vDir), session.getPhantomLookup());
+ factory.create(inputJackLibrary, session.getPhantomLookup());
session.getTopLevelPackage().addLoader(rootPLoader);
- session.addClasspathSource(vDir);
+ session.addLibraryOnClasspath(inputJackLibrary);
} catch (IOException ioException) {
// Ignore bad entry
logger.log(Level.WARNING, "Bad classpath entry ignored: {0}", ioException.getMessage());
@@ -990,6 +1002,20 @@ public abstract class Jack {
ProductionSet productions = planBuilder.getRequest().getTargetProductions();
boolean hasSanityChecks = features.contains(SanityChecks.class);
+ // TODO(jack-team): Remove this hack
+ boolean preDexing = !getSession().getImportedLibraries().isEmpty();
+ for (InputLibrary il : getSession().getImportedLibraries()) {
+ if (!il.containsFileType(FileType.DEX)) {
+ preDexing = false;
+ }
+ }
+ if (features.contains(Jarjar.class) || features.contains(Obfuscation.class)) {
+ for (InputLibrary il : getSession().getImportedLibraries()) {
+ ((InputJackLibrary) il).fileTypes.remove(FileType.DEX);
+ }
+ }
+ logger.log(Level.INFO, "Jack pre-dexing is " + (preDexing ? "enabled" : "disabled"));
+
// Build the plan
if (hasSanityChecks) {
planBuilder.append(TypeDuplicateRemoverChecker.class);
@@ -1114,10 +1140,16 @@ public abstract class Jack {
methodPlan3.append(FieldInitMethodCallRemover.class);
}
typePlan4.append(FieldInitMethodRemover.class);
+ }
+
+ {
+ SubPlanBuilder<JDefinedClassOrInterface> typePlan =
+ planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
if (features.contains(JayceFileOutput.class)) {
- typePlan4.append(JayceSingleTypeWriter.class);
+ typePlan.append(JayceSingleTypeWriter.class);
}
}
+
if (features.contains(SourceFileRenaming.class)) {
planBuilder.append(SourceFileRenamer.class);
}
@@ -1250,8 +1282,13 @@ public abstract class Jack {
if (hasSanityChecks) {
typePlan5.append(TypeAstChecker.class);
}
+ }
+
+ {
+ SubPlanBuilder<JDefinedClassOrInterface> typePlan =
+ planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
if (productions.contains(IntermediateDexProduct.class)) {
- typePlan5.append(IntermediateDexPerTypeWriter.class);
+ typePlan.append(IntermediateDexPerTypeWriter.class);
}
}
@@ -1644,7 +1681,14 @@ public abstract class Jack {
if (hasSanityChecks) {
typePlan5.append(TypeAstChecker.class);
}
- typePlan5.append(IntermediateDexPerTypeWriter.class);
+ }
+
+ {
+ SubPlanBuilder<JDefinedClassOrInterface> typePlan =
+ planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
+ if (productions.contains(IntermediateDexProduct.class)) {
+ typePlan.append(IntermediateDexPerTypeWriter.class);
+ }
}
if (hasSanityChecks) {
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java
index d225e1e..4c9f571 100644
--- a/jack/src/com/android/jack/Options.java
+++ b/jack/src/com/android/jack/Options.java
@@ -217,10 +217,6 @@ public class Options {
@Option(name = "--output-jack", usage = "output jack library file", metaVar = "FILE")
protected File libraryOutZip = null;
- @Option(name = "--generate-intermediate-dexes",
- usage = "generate intermediate dex files per types along with jayce files")
- protected boolean generateIntermediateDex = false;
-
@Option(name = "--config-jarjar", usage = "use this jarjar rules file (default: none)",
metaVar = "FILE")
protected File jarjarRulesFile = null;
@@ -602,18 +598,14 @@ public class Options {
configBuilder.setString(LIBRARY_OUTPUT_ZIP, libraryOutZip.getAbsolutePath());
configBuilder.set(LIBRARY_OUTPUT_CONTAINER_TYPE, Container.ZIP);
configBuilder.set(GENERATE_JACK_LIBRARY, true);
- if (generateIntermediateDex) {
- configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
- configBuilder.set(INTERMEDIATE_DEX_DIR, null);
- }
+ configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
+ configBuilder.set(INTERMEDIATE_DEX_DIR, null);
} else if (libraryOutDir != null) {
configBuilder.setString(LIBRARY_OUTPUT_DIR, libraryOutDir.getAbsolutePath());
configBuilder.set(LIBRARY_OUTPUT_CONTAINER_TYPE, Container.DIR);
configBuilder.set(GENERATE_JACK_LIBRARY, true);
- if (generateIntermediateDex) {
- configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
- configBuilder.set(INTERMEDIATE_DEX_DIR, null);
- }
+ configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
+ configBuilder.set(INTERMEDIATE_DEX_DIR, null);
}
switch (multiDexKind) {
@@ -635,13 +627,17 @@ public class Options {
configBuilder.set(DEX_OUTPUT_CONTAINER_TYPE, Container.ZIP);
configBuilder.set(GENERATE_DEX_FILE, true);
configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
- configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks)));
+ if (libraryOutZip == null && libraryOutDir == null) {
+ configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks)));
+ }
} else if (out != null) {
configBuilder.setString(DEX_OUTPUT_DIR, out.getAbsolutePath());
configBuilder.set(DEX_OUTPUT_CONTAINER_TYPE, Container.DIR);
configBuilder.set(GENERATE_DEX_FILE, true);
configBuilder.set(GENERATE_INTERMEDIATE_DEX, true);
- configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks)));
+ if (libraryOutZip == null && libraryOutDir == null) {
+ configBuilder.set(INTERMEDIATE_DEX_DIR, new DirectDir(createTempDirForTypeDexFiles(hooks)));
+ }
}
configBuilder.set(FieldInitializerRemover.CLASS_AS_INITIALVALUE, !dxLegacy);
configBuilder.set(
@@ -868,6 +864,10 @@ public class Options {
return !disableAutomaticFullRebuild;
}
+ public void addResource(@Nonnull File resource) {
+ resImport.add(resource);
+ }
+
@Nonnull
private static Directory createTempDirForTypeDexFiles(
@Nonnull RunnableHooks hooks) {
diff --git a/jack/src/com/android/jack/backend/ResourceWriter.java b/jack/src/com/android/jack/backend/ResourceWriter.java
index 921e704..73205b1 100644
--- a/jack/src/com/android/jack/backend/ResourceWriter.java
+++ b/jack/src/com/android/jack/backend/ResourceWriter.java
@@ -50,21 +50,12 @@ public class ResourceWriter implements RunnableSchedulable<JSession> {
private final OutputVDir outputVDir;
{
- if (ThreadConfig.get(Options.GENERATE_JACK_LIBRARY).booleanValue()) {
- Container containerType = ThreadConfig.get(Options.LIBRARY_OUTPUT_CONTAINER_TYPE);
- if (containerType == Container.DIR) {
- outputVDir = ThreadConfig.get(Options.LIBRARY_OUTPUT_DIR);
- } else {
- outputVDir = ThreadConfig.get(Options.LIBRARY_OUTPUT_ZIP);
- }
+ assert ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue();
+ Container containerType = ThreadConfig.get(Options.DEX_OUTPUT_CONTAINER_TYPE);
+ if (containerType == Container.DIR) {
+ outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_DIR);
} else {
- assert ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue();
- Container containerType = ThreadConfig.get(Options.DEX_OUTPUT_CONTAINER_TYPE);
- if (containerType == Container.DIR) {
- outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_DIR);
- } else {
- outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_ZIP);
- }
+ outputVDir = ThreadConfig.get(Options.DEX_OUTPUT_ZIP);
}
}
diff --git a/jack/src/com/android/jack/backend/dex/DexWritingTool.java b/jack/src/com/android/jack/backend/dex/DexWritingTool.java
index a6a0fb1..96379c5 100644
--- a/jack/src/com/android/jack/backend/dex/DexWritingTool.java
+++ b/jack/src/com/android/jack/backend/dex/DexWritingTool.java
@@ -26,9 +26,8 @@ import com.android.jack.ir.ast.JDefinedClassOrInterface;
import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter;
import com.android.jack.library.FileType;
import com.android.jack.library.FileTypeDoesNotExistException;
-import com.android.jack.library.InputLibrary;
import com.android.jack.library.LibraryFormatException;
-import com.android.jack.library.TypeInInputLibraryLocation;
+import com.android.jack.library.OutputJackLibrary;
import com.android.jack.tools.merger.JackMerger;
import com.android.jack.tools.merger.MergingOverflowException;
import com.android.sched.util.config.ThreadConfig;
@@ -36,7 +35,6 @@ import com.android.sched.util.file.CannotCreateFileException;
import com.android.sched.util.file.CannotReadException;
import com.android.sched.util.file.NoSuchFileException;
import com.android.sched.util.file.NotFileOrDirectoryException;
-import com.android.sched.util.location.Location;
import com.android.sched.util.log.LoggerFactory;
import com.android.sched.vfs.InputRootVDir;
import com.android.sched.vfs.InputVFile;
@@ -48,7 +46,6 @@ import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
-import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nonnull;
@@ -124,28 +121,19 @@ public abstract class DexWritingTool {
protected void fillDexLists(@Nonnull List<InputVFile> mainDexList,
@Nonnull List<InputVFile> anyDexList) throws LibraryFormatException {
+ OutputJackLibrary jackOutputLibrary = Jack.getSession().getJackOutputLibrary();
+ boolean generateLibWithDex =
+ jackOutputLibrary != null && jackOutputLibrary.containsFileType(FileType.DEX);
+
for (JDefinedClassOrInterface type : Jack.getSession().getTypesToEmit()) {
try {
InputVFile inputVFile;
- Location loc = type.getLocation();
- if (loc instanceof TypeInInputLibraryLocation) {
- InputLibrary inputLibrary =
- ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary();
- if (inputLibrary.containsFileType(FileType.DEX)) {
- try {
- inputVFile = inputLibrary.getFile(FileType.DEX,
- new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
- } catch (FileTypeDoesNotExistException e) {
- logger.log(Level.SEVERE,
- "Library " + inputLibrary.getLocation().getDescription() + " is invalid",
- e);
- throw new LibraryFormatException(inputLibrary.getLocation());
- }
- } else {
- inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type));
- }
+ if (generateLibWithDex) {
+ assert jackOutputLibrary != null;
+ inputVFile = jackOutputLibrary.getFile(FileType.DEX,
+ new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
} else {
- inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type));
+ inputVFile = getIntermediateDexFile(type);
}
if (type.containsMarker(MainDexMarker.class)) {
@@ -153,6 +141,9 @@ public abstract class DexWritingTool {
} else {
anyDexList.add(inputVFile);
}
+ } catch (FileTypeDoesNotExistException e) {
+ // this was created by Jack, so this should not happen
+ throw new AssertionError(e);
} catch (NotFileOrDirectoryException e) {
// this was created by Jack, so this should not happen
throw new AssertionError(e);
@@ -162,4 +153,21 @@ public abstract class DexWritingTool {
}
}
}
+
+ @Nonnull
+ private InputVFile getIntermediateDexFile(@Nonnull JDefinedClassOrInterface type)
+ throws NotFileOrDirectoryException, NoSuchFileException, FileTypeDoesNotExistException {
+ InputVFile inputVFile = null;
+
+ // Intermediate dex files can be located into the intermediate dex dir or into a library
+ OutputJackLibrary jackOutputLibrary = Jack.getSession().getJackOutputLibrary();
+ if (jackOutputLibrary != null && jackOutputLibrary.containsFileType(FileType.DEX)) {
+ inputVFile = jackOutputLibrary.getFile(FileType.DEX,
+ new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
+ } else {
+ inputVFile = getIntermediateDexDir().getInputVFile(DexWriter.getFilePath(type));
+ }
+
+ return inputVFile;
+ }
}
diff --git a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java
index 1a9690e..b53effb 100644
--- a/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java
+++ b/jack/src/com/android/jack/backend/dex/IntermediateDexPerTypeWriter.java
@@ -26,6 +26,8 @@ import com.android.jack.experimental.incremental.JackIncremental;
import com.android.jack.ir.ast.JDefinedClassOrInterface;
import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter;
import com.android.jack.library.FileType;
+import com.android.jack.library.FileTypeDoesNotExistException;
+import com.android.jack.library.InputLibrary;
import com.android.jack.library.OutputLibrary;
import com.android.jack.library.TypeInInputLibraryLocation;
import com.android.jack.scheduling.marker.ClassDefItemMarker;
@@ -35,11 +37,15 @@ import com.android.sched.schedulable.Constraint;
import com.android.sched.schedulable.Produce;
import com.android.sched.schedulable.RunnableSchedulable;
import com.android.sched.util.config.ThreadConfig;
+import com.android.sched.util.location.Location;
+import com.android.sched.util.stream.ByteStreamSucker;
import com.android.sched.vfs.InputOutputVDir;
+import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.OutputVFile;
import com.android.sched.vfs.VPath;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
import javax.annotation.CheckForNull;
@@ -70,9 +76,43 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements
@Override
public void run(@Nonnull JDefinedClassOrInterface type) throws Exception {
- assert !(type.getLocation() instanceof TypeInInputLibraryLocation
- && ((TypeInInputLibraryLocation) type.getLocation()).getInputLibraryLocation()
- .getInputLibrary().containsFileType(FileType.DEX));
+ OutputVFile vFile;
+
+ Location loc = type.getLocation();
+ if (loc instanceof TypeInInputLibraryLocation) {
+ InputVFile in;
+ InputLibrary inputLibrary =
+ ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary();
+ if (inputLibrary.containsFileType(FileType.DEX)) {
+ try {
+ in = inputLibrary.getFile(FileType.DEX,
+ new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
+ } catch (FileTypeDoesNotExistException e) {
+ // this was created by Jack, so this should not happen
+ throw new AssertionError(e);
+ }
+
+ // incremental support will be updated and Intermediate_dex_dir usage was cleaned.
+ if (outputLibrary != null && !isIncrementalMode && intermediateDexDir == null) {
+ assert generateDexFile || intermediateDexDir == null;
+ vFile = outputLibrary.createFile(FileType.DEX,
+ new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
+ } else {
+ assert intermediateDexDir != null;
+ vFile = intermediateDexDir.createOutputVFile(getFilePath(type));
+ }
+
+ InputStream is = in.openRead();
+ OutputStream os = vFile.openWrite();
+ try {
+ new ByteStreamSucker(is, os, true).suck();
+ } finally {
+ is.close(); // is != null or check before
+ }
+
+ return;
+ }
+ }
ClassDefItemMarker cdiMarker = type.getMarker(ClassDefItemMarker.class);
assert cdiMarker != null;
@@ -81,7 +121,6 @@ public class IntermediateDexPerTypeWriter extends DexWriter implements
options.forceJumbo = forceJumbo;
DexFile typeDex = new DexFile(options);
typeDex.add(cdiMarker.getClassDefItem());
- OutputVFile vFile;
OutputStream outStream = null;
try {
// In incremental mode, intermediate dex output is managed by incremental wrapper that used
diff --git a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java
index da31d4f..e2eb115 100644
--- a/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java
+++ b/jack/src/com/android/jack/backend/dex/SingleDexWritingTool.java
@@ -16,18 +16,12 @@
package com.android.jack.backend.dex;
-import com.google.common.collect.Iterators;
-
import com.android.jack.Jack;
-import com.android.jack.ir.ast.JDefinedClassOrInterface;
import com.android.jack.library.FileType;
-import com.android.jack.library.InputLibrary;
import com.android.jack.library.OutputJackLibrary;
-import com.android.jack.library.TypeInInputLibraryLocation;
import com.android.jack.tools.merger.JackMerger;
import com.android.jack.tools.merger.MergingOverflowException;
import com.android.sched.util.codec.ImplementationName;
-import com.android.sched.util.location.Location;
import com.android.sched.vfs.InputOutputVFile;
import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVElement;
@@ -65,7 +59,6 @@ public class SingleDexWritingTool extends DexWritingTool {
inputVFileIt = dexList.iterator();
}
- inputVFileIt = getAllDexFilesFromLib(inputVFileIt);
while (inputVFileIt.hasNext()) {
try {
mergeDex(merger, inputVFileIt.next());
@@ -76,26 +69,6 @@ public class SingleDexWritingTool extends DexWritingTool {
finishMerge(merger, outputDex);
}
- private Iterator<InputVFile> getAllDexFilesFromLib(@Nonnull Iterator<InputVFile> inputVFileIt) {
- Iterator<InputVFile> newInputVFileIt = inputVFileIt;
- List<InputLibrary> librariesDone = new ArrayList<InputLibrary>();
- for (JDefinedClassOrInterface jdcoi : Jack.getSession().getTypesToEmit()) {
- Location loc = jdcoi.getLocation();
- if (loc instanceof TypeInInputLibraryLocation) {
- InputLibrary inputLibrary =
- ((TypeInInputLibraryLocation) loc).getInputLibraryLocation().getInputLibrary();
- if (!librariesDone.contains(inputLibrary)) {
- if (inputLibrary.containsFileType(FileType.DEX)) {
- newInputVFileIt =
- Iterators.concat(newInputVFileIt, inputLibrary.iterator(FileType.DEX));
- }
- librariesDone.add(inputLibrary);
- }
- }
- }
- return (newInputVFileIt);
- }
-
private void getAllDexFilesFromDir(@Nonnull InputVDir dexFileVDir,
@Nonnull List<InputVFile> dexFiles) {
for (InputVElement subFile : dexFileVDir.list()) {
diff --git a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java
index 698bdd4..d83c786 100644
--- a/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java
+++ b/jack/src/com/android/jack/backend/jayce/JayceFileImporter.java
@@ -27,7 +27,6 @@ import com.android.jack.ir.ast.Resource;
import com.android.jack.library.FileType;
import com.android.jack.library.InputJackLibrary;
import com.android.jack.library.InputLibrary;
-import com.android.jack.library.JackLibrary;
import com.android.jack.library.TypeInInputLibraryLocation;
import com.android.jack.lookup.JLookup;
import com.android.sched.util.HasDescription;
@@ -35,17 +34,18 @@ import com.android.sched.util.codec.EnumCodec;
import com.android.sched.util.config.HasKeyId;
import com.android.sched.util.config.ThreadConfig;
import com.android.sched.util.config.id.PropertyId;
+import com.android.sched.util.location.FileLocation;
import com.android.sched.util.location.Location;
+import com.android.sched.util.location.ZipLocation;
import com.android.sched.util.log.Event;
import com.android.sched.util.log.LoggerFactory;
import com.android.sched.util.log.Tracer;
import com.android.sched.util.log.TracerFactory;
import com.android.sched.vfs.InputRootVDir;
-import com.android.sched.vfs.InputVDir;
-import com.android.sched.vfs.InputVElement;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.VPath;
+import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -123,29 +123,42 @@ public class JayceFileImporter {
for (InputJackLibrary jackLibrary : jackLibraries) {
InputRootVDir libraryVDir = jackLibrary.getInputVDir();
logger.log(Level.FINE, "Importing {0}", libraryVDir.getLocation().getDescription());
- for (InputVElement subFile : libraryVDir.list()) {
- importJayceFile(jackLibrary, subFile, session, "");
+ Iterator<InputVFile> jayceFileIt = jackLibrary.iterator(FileType.JAYCE);
+ while (jayceFileIt.hasNext()) {
+ InputVFile jayceFile = jayceFileIt.next();
+ String name = getNameFromInputVFile(jackLibrary, jayceFile, FileType.JAYCE);
+ addImportedTypes(session, name, jackLibrary);
+ }
+
+ Iterator<InputVFile> rscFileIt = jackLibrary.iterator(FileType.RSC);
+ while (rscFileIt.hasNext()) {
+ InputVFile rscFile = rscFileIt.next();
+ String name = getNameFromInputVFile(jackLibrary, rscFile, FileType.RSC);
+ addImportedResource(rscFile, session, name);
}
}
}
- private void importJayceFile(@Nonnull InputLibrary inputLibrary,
- @Nonnull InputVElement element, @Nonnull JSession session, @Nonnull String currentPath)
- throws JPackageLookupException, TypeImportConflictException, ResourceImportConflictException,
- JTypeLookupException {
- String path = currentPath + element.getName();
- if (element.isVDir()) {
- for (InputVElement subFile : ((InputVDir) element).list()) {
- importJayceFile(inputLibrary, subFile, session, path + VPATH_SEPARATOR);
+ // TODO(jack-team): remove this hack
+ @Nonnull
+ private String getNameFromInputVFile(@Nonnull InputJackLibrary jackLibrary,
+ @Nonnull InputVFile jayceFile, @Nonnull FileType fileType) {
+ Location loc = jayceFile.getLocation();
+ String name;
+ if (loc instanceof ZipLocation) {
+ name = ((ZipLocation) jayceFile.getLocation()).getEntryName();
+ if (jackLibrary.getMajorVersion() != 0) {
+ name = name.substring(
+ fileType.getVPathPrefix().split().iterator().next().length() + 1);
}
} else {
- InputVFile file = (InputVFile) element;
- if (isJackFileName(file.getName())) {
- addImportedTypes(session, path, inputLibrary);
- } else {
- addImportedResource(file, session, path);
+ name = ((FileLocation) jayceFile.getLocation()).getPath();
+ if (jackLibrary.getMajorVersion() != 0) {
+ String prefix = fileType.getVPathPrefix().split().iterator().next() + '/';
+ name = name.substring(name.lastIndexOf(prefix) + prefix.length());
}
}
+ return name;
}
private void addImportedTypes(@Nonnull JSession session, @Nonnull String path,
@@ -189,11 +202,6 @@ public class JayceFileImporter {
private void addImportedResource(@Nonnull InputVFile file, @Nonnull JSession session,
@Nonnull String currentPath) throws ResourceImportConflictException {
VPath path = new VPath(currentPath, VPATH_SEPARATOR);
- // library.properties and dex files are not resources
- if (path.equals(JackLibrary.LIBRARY_PROPERTIES_VPATH) ||
- currentPath.endsWith(FileType.DEX.getFileExtension())) {
- return;
- }
Resource newResource = new Resource(path, file);
for (Resource existingResource : session.getResources()) {
if (existingResource.getPath().equals(path)) {
diff --git a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
index ff3f82c..91c51d1 100644
--- a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
+++ b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
@@ -563,8 +563,11 @@ public class JackIncremental extends CommandLine {
@Nonnull
protected static File getJackFile(@Nonnull String typeName) {
- return new File(jackFilesFolder, new VPath(typeName + JayceFileImporter.JAYCE_FILE_EXTENSION,
- fileSeparator).getPathAsString(File.separatorChar));
+ return new File(jackFilesFolder,
+ FileType.JAYCE.getPrefix()
+ + File.separatorChar
+ + new VPath(typeName + JayceFileImporter.JAYCE_FILE_EXTENSION, fileSeparator)
+ .getPathAsString(File.separatorChar));
}
@Nonnull
diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java
index e6a4575..e2d1429 100644
--- a/jack/src/com/android/jack/ir/ast/JSession.java
+++ b/jack/src/com/android/jack/ir/ast/JSession.java
@@ -24,6 +24,7 @@ import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.ir.sourceinfo.SourceInfoFactory;
import com.android.jack.library.FileType;
+import com.android.jack.library.InputLibrary;
import com.android.jack.library.OutputJackLibrary;
import com.android.jack.lookup.JNodeLookup;
import com.android.jack.lookup.JPhantomLookup;
@@ -36,7 +37,6 @@ import com.android.sched.transform.TransformRequest;
import com.android.sched.util.config.ThreadConfig;
import com.android.sched.util.log.Tracer;
import com.android.sched.util.log.TracerFactory;
-import com.android.sched.vfs.InputRootVDir;
import java.util.ArrayList;
import java.util.Collection;
@@ -96,10 +96,10 @@ public class JSession extends JNode {
private OutputJackLibrary jackOutputLibrary;
@Nonnull
- private final List<InputRootVDir> importSources = new ArrayList<InputRootVDir>(0);
+ private final List<InputLibrary> importedLibraries = new ArrayList<InputLibrary>(0);
@Nonnull
- private final List<InputRootVDir> classpathSources = new ArrayList<InputRootVDir>(0);
+ private final List<InputLibrary> librariesOnClasspath = new ArrayList<InputLibrary>(0);
public JSession() {
super(SourceInfo.UNKNOWN);
@@ -231,28 +231,28 @@ public class JSession extends JNode {
generatedBinaryKinds.add(fileType);
}
- public void addImportSource(@Nonnull InputRootVDir source) {
- importSources.add(source);
+ public void addImportedLibrary(@Nonnull InputLibrary source) {
+ importedLibraries.add(source);
}
@Nonnull
- public List<InputRootVDir> getImportSources() {
- return Jack.getUnmodifiableCollections().getUnmodifiableList(importSources);
+ public List<InputLibrary> getImportedLibraries() {
+ return Jack.getUnmodifiableCollections().getUnmodifiableList(importedLibraries);
}
- public void addClasspathSource(@Nonnull InputRootVDir source) {
- classpathSources.add(source);
+ public void addLibraryOnClasspath(@Nonnull InputLibrary source) {
+ librariesOnClasspath.add(source);
}
@Nonnull
- public List<InputRootVDir> getClasspathSources() {
- return Jack.getUnmodifiableCollections().getUnmodifiableList(classpathSources);
+ public List<InputLibrary> getLibraryOnClasspath() {
+ return Jack.getUnmodifiableCollections().getUnmodifiableList(librariesOnClasspath);
}
@Nonnull
- public Iterator<InputRootVDir> getPathSources() {
+ public Iterator<InputLibrary> getPathSources() {
return Iterators.concat(
- importSources.iterator(),
- classpathSources.iterator());
+ importedLibraries.iterator(),
+ librariesOnClasspath.iterator());
}
}
diff --git a/jack/src/com/android/jack/jayce/FullPackageLoader.java b/jack/src/com/android/jack/jayce/FullPackageLoader.java
index 5535427..cf3775e 100644
--- a/jack/src/com/android/jack/jayce/FullPackageLoader.java
+++ b/jack/src/com/android/jack/jayce/FullPackageLoader.java
@@ -27,6 +27,6 @@ class FullPackageLoader extends JaycePackageLoader {
public FullPackageLoader(@Nonnull InputJackLibrary inputJackLibrary,
@Nonnull JPhantomLookup lookup) {
- super(inputJackLibrary, inputJackLibrary.getInputVDir(), lookup, NodeLevel.FULL);
+ super(inputJackLibrary, null, lookup, NodeLevel.FULL);
}
}
diff --git a/jack/src/com/android/jack/jayce/JaycePackageLoader.java b/jack/src/com/android/jack/jayce/JaycePackageLoader.java
index 4505002..3c22e82 100644
--- a/jack/src/com/android/jack/jayce/JaycePackageLoader.java
+++ b/jack/src/com/android/jack/jayce/JaycePackageLoader.java
@@ -24,6 +24,8 @@ import com.android.jack.ir.ast.JDefinedClassOrInterface;
import com.android.jack.ir.ast.JPackage;
import com.android.jack.ir.ast.JPackageLookupException;
import com.android.jack.ir.ast.MissingJTypeLookupException;
+import com.android.jack.library.FileType;
+import com.android.jack.library.FileTypeDoesNotExistException;
import com.android.jack.library.HasInputLibrary;
import com.android.jack.library.InputJackLibrary;
import com.android.jack.library.InputLibrary;
@@ -33,15 +35,15 @@ import com.android.jack.lookup.JPhantomLookup;
import com.android.jack.reporting.Reporter.Severity;
import com.android.sched.util.location.Location;
import com.android.sched.util.log.LoggerFactory;
-import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVElement;
-import com.android.sched.vfs.InputVFile;
+import com.android.sched.vfs.VPath;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
/**
@@ -52,8 +54,8 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary {
@Nonnull
private static Logger logger = LoggerFactory.getLogger();
- @Nonnull
- private final InputVDir dir;
+ @CheckForNull
+ private final VPath packagePath;
@Nonnull
private final JPhantomLookup lookup;
@@ -64,47 +66,49 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary {
@Nonnull
private final InputJackLibrary inputJackLibrary;
- JaycePackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @Nonnull InputVDir dir,
+ JaycePackageLoader(@Nonnull InputJackLibrary inputJackLibrary, @CheckForNull VPath packagePath,
@Nonnull JPhantomLookup lookup, @Nonnull NodeLevel defaultLoadLevel) {
+ assert inputJackLibrary.containsFileType(FileType.JAYCE);
this.inputJackLibrary = inputJackLibrary;
- this.dir = dir;
+ this.packagePath = packagePath;
this.lookup = lookup;
this.defaultLoadLevel = defaultLoadLevel;
}
@Override
@Nonnull
- public JDefinedClassOrInterface loadClassOrInterface(
- @Nonnull JPackage loading, @Nonnull String simpleName) {
- for (InputVElement sub : dir.list()) {
- if (!sub.isVDir() && isJackFileNameOf(sub.getName(), simpleName)) {
- try {
- return new JayceClassOrInterfaceLoader(inputJackLibrary,
- loading,
- simpleName,
- (InputVFile) sub,
- lookup,
- defaultLoadLevel).load();
- } catch (LibraryException e) {
- LibraryReadingException reportable = new LibraryReadingException(e);
- Jack.getSession().getReporter().report(Severity.FATAL, reportable);
- throw new JackAbortException(reportable);
- }
- }
+ public JDefinedClassOrInterface loadClassOrInterface(@Nonnull JPackage loading,
+ @Nonnull String simpleName) {
+ VPath typePath = getPathFromPackage(simpleName);
+ try {
+ return new JayceClassOrInterfaceLoader(inputJackLibrary, loading, simpleName,
+ inputJackLibrary.getFile(FileType.JAYCE, typePath), lookup, defaultLoadLevel).load();
+ } catch (LibraryException e) {
+ LibraryReadingException reportable = new LibraryReadingException(e);
+ Jack.getSession().getReporter().report(Severity.FATAL, reportable);
+ throw new JackAbortException(reportable);
+ } catch (FileTypeDoesNotExistException e) {
+ throw new MissingJTypeLookupException(loading, simpleName);
}
- throw new MissingJTypeLookupException(loading, simpleName);
}
@Override
@Nonnull
public Collection<String> getSubClassNames(@Nonnull JPackage loading) {
List<String> subs = new ArrayList<String>();
- for (InputVElement sub : dir.list()) {
- String fileName = sub.getName();
- if (!sub.isVDir() && JayceFileImporter.isJackFileName(fileName)) {
- subs.add(
- fileName.substring(0, fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH));
+ try {
+ for (InputVElement sub : inputJackLibrary.getDir(FileType.JAYCE,
+ packagePath == null ? VPath.ROOT : packagePath).list()) {
+ String fileName = sub.getName();
+ if (!sub.isVDir() && JayceFileImporter.isJackFileName(fileName)) {
+ subs.add(fileName.substring(0, fileName.length()
+ - JayceFileImporter.JACK_EXTENSION_LENGTH));
+ }
}
+ } catch (FileTypeDoesNotExistException e) {
+ // It could not append if the library contain jayce files, and because package existence is
+ // checked at construction
+ throw new AssertionError();
}
return subs;
}
@@ -113,22 +117,32 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary {
@Override
public PackageLoader getLoaderForSubPackage(@Nonnull JPackage loading,
@Nonnull String simpleName) throws JPackageLookupException {
- for (InputVElement sub : dir.list()) {
- if (sub.isVDir() && sub.getName().equals(simpleName)) {
- return new JaycePackageLoader(inputJackLibrary, (InputVDir) sub, lookup, defaultLoadLevel);
- }
+ VPath subPackagePath = getPathFromPackage(simpleName);
+
+ try {
+ inputJackLibrary.getDir(FileType.JAYCE, subPackagePath);
+ } catch (FileTypeDoesNotExistException e) {
+ throw new JPackageLookupException(simpleName, loading);
}
- throw new JPackageLookupException(simpleName, loading);
+
+ return new JaycePackageLoader(inputJackLibrary, subPackagePath, lookup, defaultLoadLevel);
}
@Nonnull
@Override
public Collection<String> getSubPackageNames(@Nonnull JPackage loading) {
List<String> subs = new ArrayList<String>();
- for (InputVElement sub : dir.list()) {
- if (sub.isVDir()) {
- subs.add(sub.getName());
+ try {
+ for (InputVElement sub : inputJackLibrary.getDir(FileType.JAYCE,
+ packagePath == null ? VPath.ROOT : packagePath).list()) {
+ if (sub.isVDir()) {
+ subs.add(sub.getName());
+ }
}
+ } catch (FileTypeDoesNotExistException e) {
+ // It could not append if the library contain jayce files, and because package existence is
+ // checked at construction
+ throw new AssertionError();
}
return subs;
}
@@ -136,14 +150,12 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary {
@Override
@Nonnull
public Location getLocation(@Nonnull JPackage loaded) {
- return dir.getLocation();
- }
-
- private boolean isJackFileNameOf(@Nonnull String fileName, @Nonnull String typeName) {
- return (fileName.length() > JayceFileImporter.JACK_EXTENSION_LENGTH) && (fileName.substring(0,
- fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH).equals(typeName)) && (fileName
- .substring(fileName.length() - JayceFileImporter.JACK_EXTENSION_LENGTH).equalsIgnoreCase(
- JayceFileImporter.JAYCE_FILE_EXTENSION));
+ try {
+ return inputJackLibrary.getDir(FileType.JAYCE, packagePath == null ? VPath.ROOT : packagePath)
+ .getLocation();
+ } catch (FileTypeDoesNotExistException e) {
+ throw new AssertionError();
+ }
}
@Override
@@ -156,4 +168,16 @@ public class JaycePackageLoader implements PackageLoader, HasInputLibrary {
public InputLibrary getInputLibrary() {
return inputJackLibrary;
}
+
+ @Nonnull
+ private VPath getPathFromPackage(@Nonnull String simpleName) {
+ VPath typePath;
+ if (packagePath != null) {
+ typePath = packagePath.clone();
+ typePath.appendPath(new VPath(simpleName, '/'));
+ } else {
+ typePath = new VPath(simpleName, '/');
+ }
+ return typePath;
+ }
}
diff --git a/jack/src/com/android/jack/jayce/StructurePackageLoader.java b/jack/src/com/android/jack/jayce/StructurePackageLoader.java
index 76995ff..d3337ac 100644
--- a/jack/src/com/android/jack/jayce/StructurePackageLoader.java
+++ b/jack/src/com/android/jack/jayce/StructurePackageLoader.java
@@ -27,6 +27,6 @@ class StructurePackageLoader extends JaycePackageLoader {
public StructurePackageLoader(@Nonnull InputJackLibrary inputJackLibrary,
@Nonnull JPhantomLookup lookup) {
- super(inputJackLibrary, inputJackLibrary.getInputVDir(), lookup, NodeLevel.STRUCTURE);
+ super(inputJackLibrary, null, lookup, NodeLevel.STRUCTURE);
}
}
diff --git a/jack/src/com/android/jack/library/CommonJackLibrary.java b/jack/src/com/android/jack/library/CommonJackLibrary.java
index 1c48508..8010285 100644
--- a/jack/src/com/android/jack/library/CommonJackLibrary.java
+++ b/jack/src/com/android/jack/library/CommonJackLibrary.java
@@ -43,8 +43,9 @@ public abstract class CommonJackLibrary implements JackLibrary {
@Nonnull
protected final Properties libraryProperties;
+ // TODO(jack-team): Change it to private
@Nonnull
- private final Set<FileType> fileTypes = new HashSet<FileType>(2);
+ public final Set<FileType> fileTypes = new HashSet<FileType>(FileType.values().length);
public CommonJackLibrary(@Nonnull Properties libraryProperties) {
this.libraryProperties = libraryProperties;
@@ -87,7 +88,7 @@ public abstract class CommonJackLibrary implements JackLibrary {
protected void fillFileTypes() {
for (FileType ft : FileType.values()) {
try {
- String propertyName = ft.getPropertyName();
+ String propertyName = ft.getPropertyPrefix();
if (containsProperty(propertyName) && Boolean.parseBoolean(getProperty(propertyName))) {
fileTypes.add(ft);
}
diff --git a/jack/src/com/android/jack/library/FileType.java b/jack/src/com/android/jack/library/FileType.java
index 748cc15..041e851 100644
--- a/jack/src/com/android/jack/library/FileType.java
+++ b/jack/src/com/android/jack/library/FileType.java
@@ -18,7 +18,10 @@ package com.android.jack.library;
import com.android.jack.backend.dex.DexProperties;
import com.android.jack.jayce.JayceProperties;
+import com.android.jack.preprocessor.PreprocessorProperties;
+import com.android.jack.resource.ResourceProperties;
import com.android.sched.vfs.InputVFile;
+import com.android.sched.vfs.VPath;
import javax.annotation.Nonnull;
@@ -27,7 +30,7 @@ import javax.annotation.Nonnull;
* File types supported by jack library.
*/
public enum FileType {
- DEX("dex", ".dex") {
+ DEX("dex", DexProperties.KEY_DEX, ".dex") {
@Override
public String toString() {
return "dex";
@@ -35,22 +38,32 @@ public enum FileType {
@Override
public void check() throws LibraryFormatException {
}
+ },
+ JAYCE("jayce", JayceProperties.KEY_JAYCE, ".jayce") {
@Override
- public String getPropertyName() {
- return DexProperties.KEY_DEX;
+ public String toString() {
+ return "jayce";
+ }
+ @Override
+ public void check() throws LibraryFormatException {
}
},
- JAYCE("jayce", ".jayce") {
+ JPP("jpp", PreprocessorProperties.KEY_JPP, ".jpp") {
@Override
public String toString() {
- return "jayce";
+ return "java pre-processor";
}
@Override
public void check() throws LibraryFormatException {
}
+ },
+ RSC("rsc", ResourceProperties.KEY_RESOURCE, "") {
+ @Override
+ public String toString() {
+ return "resource";
+ }
@Override
- public String getPropertyName() {
- return JayceProperties.KEY_JAYCE;
+ public void check() throws LibraryFormatException {
}
};
@@ -60,19 +73,22 @@ public enum FileType {
@Nonnull
private final String prefix;
- private FileType(@Nonnull String prefix, @Nonnull String extension) {
- this.prefix = prefix;
+ @Nonnull
+ private final VPath vpathPrefix;
+
+ @Nonnull
+ private final String propertyPrefix;
+
+ private FileType(@Nonnull String vpathPrefix, @Nonnull String propertyPrefix,
+ @Nonnull String extension) {
+ this.prefix = vpathPrefix;
+ this.vpathPrefix = new VPath(vpathPrefix, '/');
+ this.propertyPrefix = propertyPrefix;
this.extension = extension;
}
public abstract void check() throws LibraryFormatException;
- /**
- * Get the name of a boolean property that specify if a library contains this file type.
- * @return The property name.
- */
- public abstract String getPropertyName();
-
public boolean isOfType(@Nonnull InputVFile v){
return (v.getName().endsWith(getFileExtension()));
}
@@ -83,6 +99,21 @@ public enum FileType {
}
@Nonnull
+ public String getPrefix() {
+ return prefix;
+ }
+
+ @Nonnull
+ public String getPropertyPrefix() {
+ return propertyPrefix;
+ }
+
+ @Nonnull
+ public VPath getVPathPrefix() {
+ return vpathPrefix;
+ }
+
+ @Nonnull
public static FileType getFileType(@Nonnull InputVFile v) throws UnsupportedFileTypeException {
for (FileType fileType : FileType.values()) {
if (fileType.isOfType(v)) {
diff --git a/jack/src/com/android/jack/library/InputLibrary.java b/jack/src/com/android/jack/library/InputLibrary.java
index a21f5dc..248647f 100644
--- a/jack/src/com/android/jack/library/InputLibrary.java
+++ b/jack/src/com/android/jack/library/InputLibrary.java
@@ -17,6 +17,7 @@
package com.android.jack.library;
import com.android.sched.vfs.InputRootVDir;
+import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.VPath;
@@ -43,6 +44,10 @@ public interface InputLibrary extends Library {
throws FileTypeDoesNotExistException;
@Nonnull
+ public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException;
+
+ @Nonnull
public Iterator<InputVFile> iterator(@Nonnull FileType fileType);
@Override
diff --git a/jack/src/com/android/jack/library/JackLibraryFactory.java b/jack/src/com/android/jack/library/JackLibraryFactory.java
index 962c0e4..9a7c694 100644
--- a/jack/src/com/android/jack/library/JackLibraryFactory.java
+++ b/jack/src/com/android/jack/library/JackLibraryFactory.java
@@ -58,8 +58,8 @@ public abstract class JackLibraryFactory {
InputJackLibrary inputJackLibrary = (InputJackLibrary) instantiateConstructorWithParameters(
vdir, "com.android.jack.library.v" + majorVersion + ".InputJackLibraryImpl",
- new Class[] {InputRootVDir.class, Properties.class}, new Object[] {vdir, libraryProperties},
- String.valueOf(majorVersion));
+ new Class[] {InputRootVDir.class, Properties.class},
+ new Object[] {vdir, libraryProperties}, String.valueOf(majorVersion));
return inputJackLibrary;
}
diff --git a/jack/src/com/android/jack/library/OutputLibrary.java b/jack/src/com/android/jack/library/OutputLibrary.java
index 9741b4d..22a9af2 100644
--- a/jack/src/com/android/jack/library/OutputLibrary.java
+++ b/jack/src/com/android/jack/library/OutputLibrary.java
@@ -45,4 +45,8 @@ public interface OutputLibrary extends Library {
@Nonnull
public Iterator<InputVFile> iterator(@Nonnull FileType fileType);
+
+ @Nonnull
+ public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException;
}
diff --git a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java
index f584b6a..9d57fec 100644
--- a/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0000/InputJackLibraryImpl.java
@@ -16,6 +16,8 @@
package com.android.jack.library.v0000;
+import com.google.common.collect.Iterators;
+
import com.android.jack.library.FileType;
import com.android.jack.library.FileTypeDoesNotExistException;
import com.android.jack.library.InputJackLibrary;
@@ -27,6 +29,7 @@ import com.android.sched.util.file.NoSuchFileException;
import com.android.sched.util.file.NotFileOrDirectoryException;
import com.android.sched.util.log.LoggerFactory;
import com.android.sched.vfs.InputRootVDir;
+import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.VPath;
@@ -97,8 +100,22 @@ public class InputJackLibraryImpl extends InputJackLibrary {
public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
throws FileTypeDoesNotExistException {
try {
- typePath.addSuffix(fileType.getFileExtension());
- return libraryVDir.getInputVFile(typePath);
+ VPath clonedPath = typePath.clone();
+ clonedPath.addSuffix(fileType.getFileExtension());
+ return libraryVDir.getInputVFile(clonedPath);
+ } catch (NotFileOrDirectoryException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ } catch (NoSuchFileException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ }
+ }
+
+ @Override
+ @Nonnull
+ public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException {
+ try {
+ return libraryVDir.getInputVDir(typePath);
} catch (NotFileOrDirectoryException e) {
throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
} catch (NoSuchFileException e) {
@@ -109,6 +126,10 @@ public class InputJackLibraryImpl extends InputJackLibrary {
@Override
@Nonnull
public Iterator<InputVFile> iterator(@Nonnull FileType fileType) {
+ if (!containsFileType(fileType)) {
+ return Iterators.emptyIterator();
+ }
+
List<InputVFile> inputVFiles = new ArrayList<InputVFile>();
fillFiles(libraryVDir, fileType, inputVFiles);
return inputVFiles.iterator();
diff --git a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java
index 2e8cc4f..7799a72 100644
--- a/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0000/OutputJackLibraryImpl.java
@@ -17,11 +17,14 @@
package com.android.jack.library.v0000;
import com.android.jack.library.FileType;
+import com.android.jack.library.FileTypeDoesNotExistException;
import com.android.jack.library.LibraryIOException;
import com.android.jack.library.OutputJackLibrary;
import com.android.jack.library.OutputLibrary;
import com.android.jack.library.OutputLibraryLocation;
import com.android.sched.util.file.CannotCreateFileException;
+import com.android.sched.util.file.NoSuchFileException;
+import com.android.sched.util.file.NotFileOrDirectoryException;
import com.android.sched.vfs.InputOutputVDir;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.OutputVFile;
@@ -84,7 +87,7 @@ public class OutputJackLibraryImpl extends OutputJackLibrary {
@Nonnull
public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
throws CannotCreateFileException {
- putProperty(fileType.getPropertyName(), String.valueOf(true));
+ putProperty(fileType.getPropertyPrefix(), String.valueOf(true));
addFileType(fileType);
typePath.addSuffix(fileType.getFileExtension());
return outputVDir.createOutputVFile(typePath);
@@ -130,4 +133,20 @@ public class OutputJackLibraryImpl extends OutputJackLibrary {
fillFiles(outputVDir, fileType, inputVFiles);
return inputVFiles.listIterator();
}
+
+ @Override
+ @Nonnull
+ public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException {
+ try {
+ VPath clonedPath = typePath.clone();
+ clonedPath.addSuffix(fileType.getFileExtension());
+ clonedPath.prependPath(fileType.getVPathPrefix());
+ return outputVDir.getInputVFile(clonedPath);
+ } catch (NotFileOrDirectoryException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ } catch (NoSuchFileException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ }
+ }
}
diff --git a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
index 9625ef9..129a494 100644
--- a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
@@ -16,6 +16,8 @@
package com.android.jack.library.v0001;
+import com.google.common.collect.Iterators;
+
import com.android.jack.library.FileType;
import com.android.jack.library.FileTypeDoesNotExistException;
import com.android.jack.library.InputJackLibrary;
@@ -27,6 +29,7 @@ import com.android.sched.util.file.NoSuchFileException;
import com.android.sched.util.file.NotFileOrDirectoryException;
import com.android.sched.util.log.LoggerFactory;
import com.android.sched.vfs.InputRootVDir;
+import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.VPath;
@@ -97,8 +100,26 @@ public class InputJackLibraryImpl extends InputJackLibrary {
public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
throws FileTypeDoesNotExistException {
try {
- typePath.addSuffix(fileType.getFileExtension());
- return libraryVDir.getInputVFile(typePath);
+ VPath clonedPath = typePath.clone();
+ clonedPath.addSuffix(fileType.getFileExtension());
+ clonedPath.prependPath(fileType.getVPathPrefix());
+ return libraryVDir.getInputVFile(clonedPath);
+ } catch (NotFileOrDirectoryException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ } catch (NoSuchFileException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ }
+ }
+
+
+ @Override
+ @Nonnull
+ public InputVDir getDir(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException {
+ try {
+ VPath clonedPath = typePath.clone();
+ clonedPath.prependPath(fileType.getVPathPrefix());
+ return libraryVDir.getInputVDir(clonedPath);
} catch (NotFileOrDirectoryException e) {
throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
} catch (NoSuchFileException e) {
@@ -109,8 +130,21 @@ public class InputJackLibraryImpl extends InputJackLibrary {
@Override
@Nonnull
public Iterator<InputVFile> iterator(@Nonnull FileType fileType) {
+ if (!containsFileType(fileType)) {
+ return Iterators.emptyIterator();
+ }
+
List<InputVFile> inputVFiles = new ArrayList<InputVFile>();
- fillFiles(libraryVDir, fileType, inputVFiles);
+ try {
+ fillFiles(libraryVDir.getInputVDir(fileType.getVPathPrefix()), fileType, inputVFiles);
+ } catch (NotFileOrDirectoryException e) {
+ throw new AssertionError(
+ getLocation().getDescription() + " is an invalid library: " + e.getMessage(), e);
+ } catch (NoSuchFileException e) {
+ throw new AssertionError(
+ getLocation().getDescription() + " is an invalid library: " + e.getMessage(), e);
+ }
+
return inputVFiles.listIterator();
}
diff --git a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java
index a16f76a..e5beea8 100644
--- a/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0001/OutputJackLibraryImpl.java
@@ -17,11 +17,14 @@
package com.android.jack.library.v0001;
import com.android.jack.library.FileType;
+import com.android.jack.library.FileTypeDoesNotExistException;
import com.android.jack.library.LibraryIOException;
import com.android.jack.library.OutputJackLibrary;
import com.android.jack.library.OutputLibrary;
import com.android.jack.library.OutputLibraryLocation;
import com.android.sched.util.file.CannotCreateFileException;
+import com.android.sched.util.file.NoSuchFileException;
+import com.android.sched.util.file.NotFileOrDirectoryException;
import com.android.sched.vfs.InputOutputVDir;
import com.android.sched.vfs.InputVFile;
import com.android.sched.vfs.OutputVFile;
@@ -85,9 +88,10 @@ public class OutputJackLibraryImpl extends OutputJackLibrary {
@Nonnull
public OutputVFile createFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
throws CannotCreateFileException {
- putProperty(fileType.getPropertyName(), String.valueOf(true));
+ putProperty(fileType.getPropertyPrefix(), String.valueOf(true));
addFileType(fileType);
typePath.addSuffix(fileType.getFileExtension());
+ typePath.prependPath(fileType.getVPathPrefix());
return outputVDir.createOutputVFile(typePath);
}
@@ -141,4 +145,20 @@ public class OutputJackLibraryImpl extends OutputJackLibrary {
fillFiles(outputVDir, fileType, inputVFiles);
return inputVFiles.listIterator();
}
+
+ @Override
+ @Nonnull
+ public InputVFile getFile(@Nonnull FileType fileType, @Nonnull VPath typePath)
+ throws FileTypeDoesNotExistException {
+ try {
+ VPath clonedPath = typePath.clone();
+ clonedPath.addSuffix(fileType.getFileExtension());
+ clonedPath.prependPath(fileType.getVPathPrefix());
+ return outputVDir.getInputVFile(clonedPath);
+ } catch (NotFileOrDirectoryException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ } catch (NoSuchFileException e) {
+ throw new FileTypeDoesNotExistException(getLocation(), typePath, fileType);
+ }
+ }
}
diff --git a/jack/src/com/android/jack/library/v0001/Version.java b/jack/src/com/android/jack/library/v0001/Version.java
index 9a57ef7..c193348 100644
--- a/jack/src/com/android/jack/library/v0001/Version.java
+++ b/jack/src/com/android/jack/library/v0001/Version.java
@@ -21,9 +21,9 @@ package com.android.jack.library.v0001;
*/
public class Version {
- public static final int MINOR_MIN = 0;
+ public static final int MINOR_MIN = 1;
- public static final int MINOR = 0;
+ public static final int MINOR = 1;
public static final int MAJOR = 1;
}
diff --git a/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java b/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java
index c1726dc..5b15ce1 100644
--- a/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java
+++ b/jack/src/com/android/jack/preprocessor/PreProcessorApplier.java
@@ -17,6 +17,8 @@
package com.android.jack.preprocessor;
import com.android.jack.ir.ast.JSession;
+import com.android.jack.library.FileType;
+import com.android.jack.library.InputLibrary;
import com.android.jack.transformations.request.TransformationRequest;
import com.android.sched.item.Description;
import com.android.sched.schedulable.RunnableSchedulable;
@@ -24,9 +26,6 @@ import com.android.sched.schedulable.Support;
import com.android.sched.util.config.ThreadConfig;
import com.android.sched.util.file.InputStreamFile;
import com.android.sched.util.log.LoggerFactory;
-import com.android.sched.vfs.InputRootVDir;
-import com.android.sched.vfs.InputVDir;
-import com.android.sched.vfs.InputVElement;
import com.android.sched.vfs.InputVFile;
import org.antlr.runtime.ANTLRInputStream;
@@ -72,25 +71,19 @@ public class PreProcessorApplier implements RunnableSchedulable<JSession> {
}
}
- for (Iterator<InputRootVDir> iter = session.getPathSources(); iter.hasNext();) {
- InputRootVDir dir = iter.next();
- for (InputVElement sub : dir.list()) {
- if (sub.getName().equals("JACK-INF") && sub.isVDir()) {
- for (InputVElement inf : ((InputVDir) sub).list()) {
- if (inf.getName().endsWith(".jpp") && !inf.isVDir()) {
- InputStream inputStream = ((InputVFile) inf).openRead();
- try {
- rules.addAll(parseRules(session, inputStream));
- } finally {
- try {
- inputStream.close();
- } catch (IOException e) {
- // nothing to handle for inputs
- }
- }
- }
+ for (Iterator<InputLibrary> iter = session.getPathSources(); iter.hasNext();) {
+ InputLibrary inputLibrary = iter.next();
+ Iterator<InputVFile> metaFileIt = inputLibrary.iterator(FileType.JPP);
+ while (metaFileIt.hasNext()) {
+ InputStream inputStream = metaFileIt.next().openRead();
+ try {
+ rules.addAll(parseRules(session, inputStream));
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // nothing to handle for inputs
}
- break;
}
}
}
diff --git a/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java b/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java
new file mode 100644
index 0000000..cef9b51
--- /dev/null
+++ b/jack/src/com/android/jack/preprocessor/PreprocessorProperties.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.preprocessor;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Properties related to preprocessor.
+ */
+public interface PreprocessorProperties {
+
+ @Nonnull
+ public static final String KEY_JPP = "jpp";
+}
diff --git a/jack/src/com/android/jack/resource/LibraryResourceWriter.java b/jack/src/com/android/jack/resource/LibraryResourceWriter.java
new file mode 100644
index 0000000..8930c09
--- /dev/null
+++ b/jack/src/com/android/jack/resource/LibraryResourceWriter.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.resource;
+
+import com.android.jack.ir.ast.JSession;
+import com.android.jack.ir.ast.Resource;
+import com.android.jack.library.FileType;
+import com.android.jack.library.OutputJackLibrary;
+import com.android.jack.scheduling.feature.Resources;
+import com.android.sched.item.Description;
+import com.android.sched.item.Name;
+import com.android.sched.schedulable.RunnableSchedulable;
+import com.android.sched.schedulable.Support;
+import com.android.sched.util.stream.ByteStreamSucker;
+import com.android.sched.vfs.InputVFile;
+import com.android.sched.vfs.OutputVFile;
+import com.android.sched.vfs.VPath;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Writer of resources.
+ */
+@Description("Writer of resources")
+@Name("LibraryResourceWriter")
+@Support(Resources.class)
+public class LibraryResourceWriter implements RunnableSchedulable<JSession> {
+
+ @Override
+ public void run(@Nonnull JSession session) throws Exception {
+ OutputJackLibrary ojl = session.getJackOutputLibrary();
+ List<Resource> resources = session.getResources();
+ for (Resource resource : resources) {
+ InputVFile inputFile = resource.getVFile();
+ VPath path = resource.getPath();
+ OutputVFile outputFile = ojl.createFile(FileType.RSC, path);
+ InputStream is = inputFile.openRead();
+ OutputStream os = outputFile.openWrite();
+ try {
+ ByteStreamSucker sucker = new ByteStreamSucker(is, os);
+ sucker.suck();
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (os != null) {
+ os.close();
+ }
+ }
+ }
+ }
+}
diff --git a/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java b/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java
index d85527e..1d64327 100644
--- a/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java
+++ b/jack/src/com/android/jack/resource/ResourceOrMetaImporter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ import com.android.sched.vfs.InputVDir;
import com.android.sched.vfs.InputVElement;
import com.android.sched.vfs.InputVFile;
+import java.util.Collection;
import java.util.List;
import javax.annotation.Nonnull;
@@ -42,20 +43,20 @@ public abstract class ResourceOrMetaImporter {
public void doImport(@Nonnull JSession session) {
for (InputVDir resourceDir : resourceDirs) {
- importResourceDirElement(resourceDir, session, "");
+ importResourceDirElement(resourceDir.list(), session, "");
}
}
- private void importResourceDirElement(
- @Nonnull InputVElement element, @Nonnull JSession session, @Nonnull String currentPath) {
- String path = currentPath + element.getName();
- if (element.isVDir()) {
- for (InputVElement subFile : ((InputVDir) element).list()) {
- importResourceDirElement(subFile, session, path + VPATH_SEPARATOR);
+ private void importResourceDirElement(@Nonnull Collection<? extends InputVElement> elements,
+ @Nonnull JSession session, @Nonnull String currentPath) {
+ for (InputVElement element : elements) {
+ String path = currentPath + element.getName();
+ if (element.isVDir()) {
+ importResourceDirElement(((InputVDir) element).list(), session, path + VPATH_SEPARATOR);
+ } else {
+ InputVFile file = (InputVFile) element;
+ addImportedResource(file, session, path);
}
- } else {
- InputVFile file = (InputVFile) element;
- addImportedResource(file, session, path);
}
}
diff --git a/jack/src/com/android/jack/resource/ResourceProperties.java b/jack/src/com/android/jack/resource/ResourceProperties.java
new file mode 100644
index 0000000..4b1761d
--- /dev/null
+++ b/jack/src/com/android/jack/resource/ResourceProperties.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.resource;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Properties related to resources.
+ */
+public interface ResourceProperties {
+ @Nonnull
+ public static final String KEY_RESOURCE = "rsc";
+}
diff --git a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java
index 51f004c..a1e05cf 100644
--- a/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java
+++ b/jack/src/com/android/jack/scheduling/adapter/ExcludeTypeFromLibWithBinaryAdapter.java
@@ -21,6 +21,7 @@ import com.google.common.collect.Iterators;
import com.android.jack.ir.ast.JDefinedClassOrInterface;
import com.android.jack.ir.ast.JSession;
+import com.android.jack.library.FileType;
import com.android.jack.library.InputLibrary;
import com.android.jack.library.TypeInInputLibraryLocation;
import com.android.sched.item.Description;
@@ -60,7 +61,7 @@ public class ExcludeTypeFromLibWithBinaryAdapter
if (location instanceof TypeInInputLibraryLocation) {
InputLibrary inputLibrary = ((TypeInInputLibraryLocation) location)
.getInputLibraryLocation().getInputLibrary();
- if (inputLibrary.getFileTypes().containsAll(session.getGeneratedFileTypes())) {
+ if (inputLibrary.containsFileType(FileType.DEX)) {
return false;
}
}
diff --git a/jack/tests/com/android/jack/ClasspathTest.java b/jack/tests/com/android/jack/ClasspathTest.java
index 324bff7..3870062 100644
--- a/jack/tests/com/android/jack/ClasspathTest.java
+++ b/jack/tests/com/android/jack/ClasspathTest.java
@@ -16,6 +16,8 @@
package com.android.jack;
+import com.android.jack.library.FileType;
+
import junit.framework.Assert;
import org.junit.BeforeClass;
@@ -112,10 +114,10 @@ public class ClasspathTest {
}
{
- // delete unused inner in classpath and check we can still compile with it
- boolean deleted =
- new File(libOut,
- "com/android/jack/classpath/test003/lib/HasInnersClasses$InnerToDelete.jayce")
+ // delete unused inner in classpath and check we can still compile with it
+ boolean deleted =
+ new File(libOut, FileType.JAYCE.getPrefix()
+ + "/com/android/jack/classpath/test003/lib/HasInnersClasses$InnerToDelete.jayce")
.delete();
Assert.assertTrue(deleted);
File testOut = TestTools.createTempDir("ClasspathTest", "test");
diff --git a/jack/tests/com/android/jack/FileConflictTest.java b/jack/tests/com/android/jack/FileConflictTest.java
index 1eb8d40..91f99fa 100644
--- a/jack/tests/com/android/jack/FileConflictTest.java
+++ b/jack/tests/com/android/jack/FileConflictTest.java
@@ -20,12 +20,14 @@ import com.android.jack.backend.jayce.ImportConflictException;
import com.android.jack.backend.jayce.JayceFileImporter;
import com.android.jack.backend.jayce.ResourceImportConflictException;
import com.android.jack.category.KnownBugs;
+import com.android.jack.library.FileType;
import com.android.jack.library.JackLibrary;
import com.android.sched.util.stream.ByteStreamSucker;
import junit.framework.Assert;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -55,15 +57,29 @@ public class FileConflictTest {
@Nonnull
private static final String COMMON_PATH_002 = "com/android/jack/fileconflict/test002/jack/";
@Nonnull
- private static final String JACK_FILE_PATH_1 = COMMON_PATH_001 + "MyClass.jayce";
+ private static final String JACK_FILE_PATH_1 =
+ FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.jayce";
@Nonnull
- private static final String JACK_FILE_PATH_2 = COMMON_PATH_001 + "MyClass2.jayce";
+ private static final String JACK_FILE_PATH_2 =
+ FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.jayce";
@Nonnull
- private static final String JACK_FILE_PATH_3 = COMMON_PATH_001 + "MyClass3.jayce";
+ private static final String JACK_FILE_PATH_3 =
+ FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.jayce";
@Nonnull
- private static final String JACK_FILE_PATH_002_1 = COMMON_PATH_002 + "IrrelevantForTest.jayce";
+ private static final String DEX_FILE_PATH_1 =
+ FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass.dex";
@Nonnull
- private static final String JACK_FILE_PATH_002_2 = COMMON_PATH_002 + "IrrelevantForTest2.jayce";
+ private static final String DEX_FILE_PATH_2 =
+ FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass2.dex";
+ @Nonnull
+ private static final String DEX_FILE_PATH_3 =
+ FileType.DEX.getPrefix() + "/" + COMMON_PATH_001 + "MyClass3.dex";
+ @Nonnull
+ private static final String JACK_FILE_PATH_002_1 =
+ FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest.jayce";
+ @Nonnull
+ private static final String JACK_FILE_PATH_002_2 =
+ FileType.JAYCE.getPrefix() + "/" + COMMON_PATH_002 + "IrrelevantForTest2.jayce";
@Nonnull
private static final String RESOURCE1_SHORTPATH = "Resource1";
@Nonnull
@@ -71,11 +87,14 @@ public class FileConflictTest {
@Nonnull
private static final String RESOURCE3_SHORTPATH = "Resource3";
@Nonnull
- private static final String RESOURCE1_LONGPATH = COMMON_PATH_002 + RESOURCE1_SHORTPATH;
+ private static final String RESOURCE1_LONGPATH = FileType.RSC.getPrefix() + "/"
+ + RESOURCE1_SHORTPATH;
@Nonnull
- private static final String RESOURCE2_LONGPATH = COMMON_PATH_002 + RESOURCE2_SHORTPATH;
+ private static final String RESOURCE2_LONGPATH = FileType.RSC.getPrefix() + "/"
+ + RESOURCE2_SHORTPATH;
@Nonnull
- private static final String RESOURCE3_LONGPATH = COMMON_PATH_002 + RESOURCE3_SHORTPATH;
+ private static final String RESOURCE3_LONGPATH = FileType.RSC.getPrefix() + "/"
+ + RESOURCE3_SHORTPATH;
@Nonnull
private static final File TEST001_DIR =
@@ -242,9 +261,15 @@ public class FileConflictTest {
TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */);
// get paths for Jack files
- String jackFilePath = "com/android/jack/fileconflict/test003/jack/MyClass.jayce";
+ String jackFilePath =
+ FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce";
File myClass1 = new File(tempJackFolder, jackFilePath);
+ // get paths for Dex files
+ String dexFilePath =
+ FileType.DEX.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.dex";
+ File myClass1Dex = new File(tempJackFolder, dexFilePath);
+
String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
File libProperties = new File(tempJackFolder, libPropName);
@@ -252,9 +277,11 @@ public class FileConflictTest {
File jackImport1 = TestTools.createTempDir("jackimport1", "dir");
copyFileToDir(libProperties, libPropName, jackImport1);
copyFileToDir(myClass1, jackFilePath, jackImport1);
+ copyFileToDir(myClass1Dex, dexFilePath, jackImport1);
// copy Jack file to output dir
copyFileToDir(myClass1, jackFilePath, jackOutput);
+ copyFileToDir(myClass1Dex, dexFilePath, jackOutput);
// run Jack on Jack dir
ProguardFlags flags = new ProguardFlags(new File(testSrcDir, "proguard.flags"));
@@ -272,6 +299,7 @@ public class FileConflictTest {
* @throws Exception
*/
@Test
+ @Ignore("Now jack generate library, a previous file can not exists")
public void test003b() throws Exception {
File jackOutput = TestTools.createTempDir("jackoutput", "dir");
@@ -282,7 +310,8 @@ public class FileConflictTest {
TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */);
// get paths for Jack files
- String jackFilePath = "com/android/jack/fileconflict/test003/jack/MyClass.jayce";
+ String jackFilePath =
+ FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test003/jack/MyClass.jayce";
File myClass1 = new File(tempJackFolder, jackFilePath);
String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
@@ -329,7 +358,8 @@ public class FileConflictTest {
TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */);
// get paths for Jack files
- String jackFilePath = "com/android/jack/fileconflict/test004/jack/MyClass.jayce";
+ String jackFilePath =
+ FileType.JAYCE.getPrefix() + "/com/android/jack/fileconflict/test004/jack/MyClass.jayce";
File myClass1 = new File(tempJackFolder, jackFilePath);
String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
@@ -374,6 +404,10 @@ public class FileConflictTest {
File myClass2 = new File(tempJackFolder, JACK_FILE_PATH_2);
File myClass3 = new File(tempJackFolder, JACK_FILE_PATH_3);
+ // get paths for dex files
+ File myClass1Dex = new File(tempJackFolder, DEX_FILE_PATH_1);
+ File myClass2Dex = new File(tempJackFolder, DEX_FILE_PATH_2);
+ File myClass3Dex = new File(tempJackFolder, DEX_FILE_PATH_3);
String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
File libProperties = new File(tempJackFolder, libPropName);
@@ -383,10 +417,14 @@ public class FileConflictTest {
File jackImport2 = TestTools.createTempDir("jackimport2", "dir");
copyFileToDir(libProperties, libPropName, jackImport1);
copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport1);
+ copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport1);
copyFileToDir(myClass2, JACK_FILE_PATH_2, jackImport1);
+ copyFileToDir(myClass2Dex, DEX_FILE_PATH_2, jackImport1);
copyFileToDir(libProperties, libPropName, jackImport2);
copyFileToDir(myClass1, JACK_FILE_PATH_1, jackImport2);
+ copyFileToDir(myClass1Dex, DEX_FILE_PATH_1, jackImport2);
copyFileToDir(myClass3, JACK_FILE_PATH_3, jackImport2);
+ copyFileToDir(myClass3Dex, DEX_FILE_PATH_3, jackImport2);
// run Jack on Jack dirs
ProguardFlags flags = new ProguardFlags(new File(TEST001_DIR, "proguard.flags"));
@@ -406,37 +444,23 @@ public class FileConflictTest {
private void runTest002(@Nonnull File jackOutput, boolean zip,
@CheckForNull String collisionPolicy) throws Exception {
// compile source files to a Jack dir
- File tempJackFolder = TestTools.createTempDir("jack", "dir");
- TestTools.compileSourceToJack(new Options(), TEST002_DIR,
- TestTools.getDefaultBootclasspathString(), tempJackFolder, false /* non-zipped */);
-
- // get paths for Jack files
- File myClass1 = new File(tempJackFolder, JACK_FILE_PATH_002_1);
- File myClass2 = new File(tempJackFolder, JACK_FILE_PATH_002_2);
-
- // get paths for resources
- File resource1 = new File(TEST002_DIR, RESOURCE1_SHORTPATH);
- File resource2 = new File(TEST002_DIR, RESOURCE2_SHORTPATH);
- File resource3 = new File(TEST002_DIR, RESOURCE3_SHORTPATH);
-
- String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
- File libProperties = new File(tempJackFolder, libPropName);
-
- // create Jack dirs to import
- File jackImport1 = TestTools.createTempDir("jackimport1", "dir");
- File jackImport2 = TestTools.createTempDir("jackimport2", "dir");
- copyFileToDir(libProperties, libPropName, jackImport1);
- copyFileToDir(myClass1, JACK_FILE_PATH_002_1, jackImport1);
- copyFileToDir(resource1, RESOURCE1_LONGPATH, jackImport1);
- copyFileToDir(resource2, RESOURCE2_LONGPATH, jackImport1);
- copyFileToDir(libProperties, libPropName, jackImport2);
- copyFileToDir(myClass2, JACK_FILE_PATH_002_2, jackImport2);
- copyFileToDir(resource2, RESOURCE1_LONGPATH, jackImport2);
- copyFileToDir(resource3, RESOURCE3_LONGPATH, jackImport2);
+ File jackImport1 = TestTools.createTempDir("jack", "dir");
+ Options options = new Options();
+ File lib1 = new File(TEST002_DIR, "lib1");
+ options.addResource(new File(lib1, "rsc"));
+ TestTools.compileSourceToJack(options, lib1, TestTools.getDefaultBootclasspathString(),
+ jackImport1, false /* non-zipped */);
+
+ File jackImport2 = TestTools.createTempDir("jack", "dir");
+ options = new Options();
+ File lib2 = new File(TEST002_DIR, "lib2");
+ options.addResource(new File(lib2, "rsc"));
+ TestTools.compileSourceToJack(options, lib2, TestTools.getDefaultBootclasspathString(),
+ jackImport2, false /* non-zipped */);
// run Jack on Jack dirs
ProguardFlags flags = new ProguardFlags(new File(TEST002_DIR, "proguard.flags"));
- Options options = new Options();
+ options = new Options();
List<File> jayceImports = new ArrayList<File>(2);
jayceImports.add(jackImport1);
jayceImports.add(jackImport2);
diff --git a/jack/tests/com/android/jack/ResourceTest.java b/jack/tests/com/android/jack/ResourceTest.java
index 1543542..b42ae80 100644
--- a/jack/tests/com/android/jack/ResourceTest.java
+++ b/jack/tests/com/android/jack/ResourceTest.java
@@ -17,7 +17,7 @@
package com.android.jack;
import com.android.jack.category.KnownBugs;
-import com.android.jack.library.JackLibrary;
+import com.android.jack.library.FileType;
import com.android.sched.util.stream.ByteStreamSucker;
import junit.framework.Assert;
@@ -37,7 +37,6 @@ import java.io.StringReader;
import java.util.Collections;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
-import java.util.zip.ZipOutputStream;
import javax.annotation.Nonnull;
@@ -49,7 +48,11 @@ public class ResourceTest {
@Nonnull
private static final String COMMON_PATH = "com/android/jack/resource/test001/jack/";
@Nonnull
- private static final String JACK_FILE_PATH = COMMON_PATH + "IrrelevantForTest.jayce";
+ private static final String JACK_FILE_PATH = FileType.JAYCE.getPrefix() + "/" + COMMON_PATH
+ + "IrrelevantForTest.jayce";
+ @Nonnull
+ private static final String DEX_FILE_PATH = FileType.DEX.getPrefix() + "/" + COMMON_PATH
+ + "IrrelevantForTest.dex";
@Nonnull
private static final String RESOURCE1_SHORTPATH = "Resource1";
@Nonnull
@@ -59,15 +62,6 @@ public class ResourceTest {
@Nonnull
private static final String RESOURCE4_SHORTPATH = "pack/Resource4";
@Nonnull
- private static final String RESOURCE1_LONGPATH = COMMON_PATH + RESOURCE1_SHORTPATH;
- @Nonnull
- private static final String RESOURCE2_LONGPATH = COMMON_PATH + RESOURCE2_SHORTPATH;
- @Nonnull
- private static final String RESOURCE3_LONGPATH = COMMON_PATH + RESOURCE3_SHORTPATH;
- @Nonnull
- private static final String RESOURCE4_LONGPATH = COMMON_PATH + RESOURCE4_SHORTPATH;
-
- @Nonnull
private static final File FILE =
TestTools.getJackTestsWithJackFolder("resource/test001");
@@ -86,10 +80,10 @@ public class ResourceTest {
TestTools.compileJackToDex(new Options(), jackAr, dexDir, false /* zipped */);
// check that resources are contained in dex dir
- checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false);
}
@Test
@@ -103,35 +97,31 @@ public class ResourceTest {
// check that resources are contained in dex archive
ZipFile zipFile = new ZipFile(dexAr);
- checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false);
}
@Test
public void testJackDirToDexArchive() throws Exception {
// compile source file to a Jack dir
File jackFolder = TestTools.createTempDir("tempjack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
jackFolder, false /* non-zipped */);
- // add resources to Jack dir
- copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder);
-
// compile Jack dir to dex archive
File dexAr = TestTools.createTempFile("resourcetestdex", ".zip");
TestTools.compileJackToDex(new Options(), jackFolder, dexAr, true /* zipped */);
// check that resources are contained in dex archive
ZipFile zipFile = new ZipFile(dexAr);
- checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false);
+ checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false);
}
@Test
@@ -151,25 +141,21 @@ public class ResourceTest {
// check that resources are contained in dex archive
ZipFile zipFile = new ZipFile(shrobbedJackAr);
- checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true);
}
@Test
public void testJackDirToJackArchive() throws Exception {
// compile source file to a Jack dir
File jackFolder = TestTools.createTempDir("tempjack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
jackFolder, false /* non-zipped */);
- // add resources to Jack dir
- copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder);
-
// run shrobbing from Jack dir to Jack archive
File shrobbedJackAr = TestTools.createTempFile("shrobbedJackAr", ".zip");
ProguardFlags flags = new ProguardFlags(new File(FILE, "proguard.flags"));
@@ -182,10 +168,10 @@ public class ResourceTest {
// check that resources are contained in Jack archive
ZipFile zipFile = new ZipFile(shrobbedJackAr);
- checkResourceContent(zipFile, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(zipFile, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(zipFile, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(zipFile, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromZip(zipFile, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true);
+ checkResourceContentFromZip(zipFile, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true);
}
@Test
@@ -204,25 +190,21 @@ public class ResourceTest {
false /* non-zipped */);
// check that resources are contained in Jack dir
- checkResourceContent(shrobbedJackDir, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(shrobbedJackDir, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(shrobbedJackDir, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(shrobbedJackDir, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true);
}
@Test
public void testJackDirToJackDir() throws Exception {
/// compile source file to a Jack dir
File jackFolder = TestTools.createTempDir("tempjack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
jackFolder, false /* non-zipped */);
- // add resources to Jack dir
- copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder);
-
// run shrobbing from Jack dir to Jack dir
File shrobbedJackDir = TestTools.createTempDir("shrobbedJack", "dir");
ProguardFlags flags = new ProguardFlags(new File(FILE, "proguard.flags"));
@@ -234,34 +216,30 @@ public class ResourceTest {
false /* non-zipped */);
// check that resources are contained in Jack dir
- checkResourceContent(shrobbedJackDir, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(shrobbedJackDir, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(shrobbedJackDir, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(shrobbedJackDir, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ true);
+ checkResourceContentFromDir(shrobbedJackDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ true);
}
@Test
public void testJackDirToDexDir() throws Exception {
// compile source file to a Jack dir
File jackFolder = TestTools.createTempDir("tempjack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
jackFolder, false /* non-zipped */);
- // add resources to Jack dir
- copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder);
-
// compile Jack dir to a dex dir
File dexDir = TestTools.createTempDir("resourcetestdex", "dir");
TestTools.compileJackToDex(new Options(), jackFolder, dexDir, false /* zipped */);
// check that resources are contained in dex dir
- checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false);
}
@Test
@@ -269,24 +247,20 @@ public class ResourceTest {
public void testJackToDexInSameDir() throws Exception {
// compile source file to a Jack dir
File jackFolder = TestTools.createTempDir("tempjack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
jackFolder, false /* non-zipped */);
- // add resources to Jack dir
- copyFileToDir(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, jackFolder);
- copyFileToDir(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, jackFolder);
-
// compile Jack dir to same dir
File dexDir = jackFolder;
TestTools.compileJackToDex(new Options(), jackFolder, dexDir, false /* zipped */);
// check that resources are contained in dex dir
- checkResourceContent(dexDir, RESOURCE1_LONGPATH, "Res1");
- checkResourceContent(dexDir, RESOURCE2_LONGPATH, "Res2");
- checkResourceContent(dexDir, RESOURCE3_LONGPATH, "Res3");
- checkResourceContent(dexDir, RESOURCE4_LONGPATH, "Res4");
+ checkResourceContentFromDir(dexDir, RESOURCE1_SHORTPATH, "Res1", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE2_SHORTPATH, "Res2", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE3_SHORTPATH, "Res3", /*isLib*/ false);
+ checkResourceContentFromDir(dexDir, RESOURCE4_SHORTPATH, "Res4", /*isLib*/ false);
}
@Test
@@ -330,37 +304,19 @@ public class ResourceTest {
@Nonnull
private File createJackArchiveWithResources() throws Exception {
// compile source file to a Jack file
- File tempJackFolder = TestTools.createTempDir("jack", "dir");
- TestTools.compileSourceToJack(new Options(), FILE, TestTools.getDefaultBootclasspathString(),
- tempJackFolder, false /* non-zipped */);
-
- // create Jack archive with resources
- File singleJackFile = new File(tempJackFolder, JACK_FILE_PATH);
+ //File tempJackFolder = TestTools.createTempDir("jack", "dir");
File jackAr = TestTools.createTempFile("resourcetestjack", ".zip");
- ZipOutputStream zos = null;
- try {
- zos = new ZipOutputStream(new FileOutputStream(jackAr));
-
- String libPropName = JackLibrary.LIBRARY_PROPERTIES_VPATH.getPathAsString('/');
- File libProperties = new File(tempJackFolder, libPropName);
+ Options options = new Options();
+ options.addResource(new File(FILE, "rsc"));
+ TestTools.compileSourceToJack(options, FILE, TestTools.getDefaultBootclasspathString(),
+ jackAr, true /* non-zipped */);
- copyFileToZip(libProperties, libPropName, zos);
- copyFileToZip(singleJackFile, JACK_FILE_PATH, zos);
- copyFileToZip(new File(FILE, RESOURCE1_SHORTPATH), RESOURCE1_LONGPATH, zos);
- copyFileToZip(new File(FILE, RESOURCE2_SHORTPATH), RESOURCE2_LONGPATH, zos);
- copyFileToZip(new File(FILE, RESOURCE3_SHORTPATH), RESOURCE3_LONGPATH, zos);
- copyFileToZip(new File(FILE, RESOURCE4_SHORTPATH), RESOURCE4_LONGPATH, zos);
- } finally {
- if (zos != null) {
- zos.close();
- }
- }
return jackAr;
}
- private void checkResourceContent(@Nonnull ZipFile zipFile, @Nonnull String entryName,
- @Nonnull String expectedContent) throws IOException {
- ZipEntry entry = zipFile.getEntry(entryName);
+ private void checkResourceContentFromZip(@Nonnull ZipFile zipFile, @Nonnull String entryName,
+ @Nonnull String expectedContent, boolean isLib) throws IOException {
+ ZipEntry entry = zipFile.getEntry((isLib ? FileType.RSC.getPrefix() + '/' : "") + entryName);
Assert.assertNotNull(entry);
BufferedReader candidateReader = null;
BufferedReader referenceReader = null;
@@ -379,10 +335,10 @@ public class ResourceTest {
}
}
- private void checkResourceContent(@Nonnull File dir, @Nonnull String path,
- @Nonnull String expectedContent) throws IOException {
+ private void checkResourceContentFromDir(@Nonnull File dir, @Nonnull String path,
+ @Nonnull String expectedContent, boolean isLib) throws IOException {
assert dir.isDirectory();
- File file = new File(dir, path);
+ File file = new File(isLib ? new File(dir, FileType.RSC.getPrefix()) : dir, path);
Assert.assertTrue(file.exists());
BufferedReader candidateReader = null;
BufferedReader referenceReader = null;
@@ -460,21 +416,4 @@ public class ResourceTest {
}
}
}
-
- private void copyFileToZip(@Nonnull File fileToCopy, @Nonnull String entryName,
- @Nonnull ZipOutputStream zos)
- throws IOException {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(fileToCopy);
- ZipEntry sourceEntry = new ZipEntry(entryName);
- zos.putNextEntry(sourceEntry);
- ByteStreamSucker sucker = new ByteStreamSucker(fis, zos);
- sucker.suck();
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
- }
}
diff --git a/jack/tests/com/android/jack/WithPhantomTest.java b/jack/tests/com/android/jack/WithPhantomTest.java
index 3affdad..1c19656 100644
--- a/jack/tests/com/android/jack/WithPhantomTest.java
+++ b/jack/tests/com/android/jack/WithPhantomTest.java
@@ -17,6 +17,7 @@
package com.android.jack;
import com.android.jack.category.KnownBugs;
+import com.android.jack.library.FileType;
import com.android.sched.util.collect.Lists;
import junit.framework.Assert;
@@ -52,8 +53,9 @@ public class WithPhantomTest {
TestTools.compileSourceToJack(new Options(),
TestTools.getJackTestsWithJackFolder(TEST001),
BOOTCLASSPATH, tempJackFolder, false /* non-zipped */);
- boolean deleted = new File(tempJackFolder,
- fixPath("com/android/jack/withphantom/test001/jack/A.jayce")).delete();
+ boolean deleted =
+ new File(tempJackFolder, FileType.JAYCE.getPrefix() + File.separatorChar
+ + fixPath("com/android/jack/withphantom/test001/jack/A.jayce")).delete();
Assert.assertTrue(deleted);
File testFolder = TestTools.getJackTestFolder(TEST001);
@@ -105,8 +107,13 @@ public class WithPhantomTest {
TestTools.compileSourceToJack(new Options(),
TestTools.getJackTestsWithJackFolder(TEST001),
BOOTCLASSPATH, tempJackFolder, false /* non-zipped */);
- boolean deleted = new File(tempJackFolder,
- fixPath("com/android/jack/withphantom/test001/jack/A$Inner1.jayce")).delete();
+ boolean deleted =
+ new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar
+ + "com/android/jack/withphantom/test001/jack/A$Inner1.jayce")).delete();
+ Assert.assertTrue(deleted);
+ deleted =
+ new File(tempJackFolder, fixPath(FileType.DEX.getPrefix() + File.separatorChar
+ + "com/android/jack/withphantom/test001/jack/A$Inner1.dex")).delete();
Assert.assertTrue(deleted);
File testFolder = TestTools.getJackTestFolder(TEST001);
@@ -159,8 +166,9 @@ public class WithPhantomTest {
TestTools.compileSourceToJack(new Options(),
TestTools.getJackTestsWithJackFolder(TEST002),
BOOTCLASSPATH, tempJackFolder, false /* non-zipped */);
- File[] inners = new File(tempJackFolder,
- fixPath("com/android/jack/withphantom/test002/jack/")).listFiles(new FilenameFilter() {
+ File[] inners =
+ new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar
+ + "com/android/jack/withphantom/test002/jack/")).listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.startsWith("A$");
@@ -192,8 +200,9 @@ public class WithPhantomTest {
TestTools.compileSourceToJack(new Options(),
TestTools.getJackTestsWithJackFolder(TEST002),
BOOTCLASSPATH, tempJackFolder, false /* non-zipped */);
- boolean deleted = new File(tempJackFolder,
- fixPath("com/android/jack/withphantom/test002/jack/A.jayce")).delete();
+ boolean deleted =
+ new File(tempJackFolder, fixPath(FileType.JAYCE.getPrefix() + File.separatorChar
+ + "com/android/jack/withphantom/test002/jack/A.jayce")).delete();
Assert.assertTrue(deleted);
File testFolder = TestTools.getJackTestFolder(TEST002);
diff --git a/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java b/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java
index 6db2b08..ff39378 100644
--- a/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java
+++ b/jack/tests/com/android/jack/errorhandling/JackFormatErrorTest.java
@@ -21,6 +21,7 @@ import com.android.jack.Main;
import com.android.jack.Options;
import com.android.jack.TestTools;
import com.android.jack.jayce.JayceProperties;
+import com.android.jack.library.FileType;
import com.android.jack.library.JackLibrary;
import com.android.jack.library.JackLibraryFactory;
import com.android.jack.library.LibraryFormatException;
@@ -53,13 +54,14 @@ public class JackFormatErrorTest {
public void testJackFormatError001() throws Exception {
TestingEnvironment ite = new TestingEnvironment();
- ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce", "jayce("
- + JackLibraryFactory.DEFAULT_MAJOR_VERSION + "." + Version.MINOR + ")Corrupted");
+ ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental",
+ "A.jayce", "jayce(" + JackLibraryFactory.DEFAULT_MAJOR_VERSION + "." + Version.MINOR
+ + ")Corrupted");
ite.addFile(ite.getJackFolder(), "", "jack.properties",
JackLibrary.KEY_LIB_EMITTER + "=unknown\n"
+ JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n"
- + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n"
- + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n"
+ + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n"
+ + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n"
+ JayceProperties.KEY_JAYCE + "=true\n"
+ JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=2\n"
+ JayceProperties.KEY_JAYCE_MINOR_VERSION + "=14\n");
@@ -97,13 +99,13 @@ public class JackFormatErrorTest {
public void testJackFormatError002() throws Exception {
TestingEnvironment ite = new TestingEnvironment();
- ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce",
- "jayce()");
+ ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental",
+ "A.jayce", "jayce()");
ite.addFile(ite.getJackFolder(), "", "jack.properties",
JackLibrary.KEY_LIB_EMITTER + "=unknown\n"
+ JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n"
- + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n"
- + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n"
+ + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n"
+ + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n"
+ JayceProperties.KEY_JAYCE + "=true\n"
+ JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=2\n"
+ JayceProperties.KEY_JAYCE_MINOR_VERSION + "=14\n");
@@ -140,13 +142,13 @@ public class JackFormatErrorTest {
public void testJackFormatError003() throws Exception {
TestingEnvironment ite = new TestingEnvironment();
- ite.addFile(ite.getJackFolder(), "jack.incremental", "A.jayce",
- "jayce()");
+ ite.addFile(new File(ite.getJackFolder(), FileType.JAYCE.getPrefix()), "jack.incremental",
+ "A.jayce", "jayce()");
ite.addFile(ite.getJackFolder(), "", "jack.properties",
JackLibrary.KEY_LIB_EMITTER + "=unknown\n"
+ JackLibrary.KEY_LIB_EMITTER_VERSION + "=0\n"
- + JackLibrary.KEY_LIB_MAJOR_VERSION + "=1\n"
- + JackLibrary.KEY_LIB_MINOR_VERSION + "=0\n"
+ + JackLibrary.KEY_LIB_MAJOR_VERSION + "=" + Version.MAJOR + "\n"
+ + JackLibrary.KEY_LIB_MINOR_VERSION + "=" + Version.MINOR + "\n"
+ JayceProperties.KEY_JAYCE + "=true\n"
+ JayceProperties.KEY_JAYCE_MAJOR_VERSION + "=0\n"
+ JayceProperties.KEY_JAYCE_MINOR_VERSION + "=0\n");
diff --git a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
index b697d1e..acd3cb3 100644
--- a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
+++ b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
@@ -110,7 +110,7 @@ public class DependenciesTest015 {
iteProg.incrementalBuildFromFolder(null /*classpath*/, Arrays.asList(iteLib.getJackFolder()));
iteProg.snapshotJackFilesModificationDate();
- Assert.assertEquals(1, iteProg.getJackFiles().size());
+ Assert.assertEquals(2, iteProg.getJackFiles().size());
DexBuffer db = new DexBuffer(new FileInputStream(iteProg.getDexFile()));
Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
@@ -126,7 +126,7 @@ public class DependenciesTest015 {
iteProg.incrementalBuildFromFolder(null, Arrays.asList(iteLib.getJackFolder()));
iteProg.snapshotJackFilesModificationDate();
- Assert.assertEquals(1, iteProg.getJackFiles().size());
+ Assert.assertEquals(3, iteProg.getJackFiles().size());
db = new DexBuffer(new FileInputStream(iteProg.getDexFile()));
Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
diff --git a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
index 608dde2..90c16b9 100644
--- a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
+++ b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
@@ -20,6 +20,7 @@ import com.android.jack.Options;
import com.android.jack.TestTools;
import com.android.jack.backend.dex.DexFileWriter;
import com.android.jack.backend.jayce.JayceFileImporter;
+import com.android.jack.library.FileType;
import com.android.jack.util.ExecuteFile;
import com.android.jack.util.NamingTools;
@@ -189,7 +190,8 @@ public class IncrementalTestingEnvironment extends TestTools {
if (previousDate == null || jackFile.lastModified() > previousDate.longValue()) {
String jackFileName = jackFile.getAbsolutePath();
String binaryTypeName = jackFileName.substring(0, jackFileName.indexOf(".jayce"));
- binaryTypeName = binaryTypeName.substring(jackFolder.getAbsolutePath().length() + 1);
+ binaryTypeName = binaryTypeName.substring((jackFolder.getAbsolutePath() + File.separatorChar
+ + FileType.JAYCE.getPrefix()).length() + 1);
fqnOfRebuiltTypes.add(binaryTypeName.replace(File.separatorChar,'.'));
}
}
diff --git a/jack/tests/com/android/jack/multidex/MultiDexTests.java b/jack/tests/com/android/jack/multidex/MultiDexTests.java
index bf53e86..2edbb0b 100644
--- a/jack/tests/com/android/jack/multidex/MultiDexTests.java
+++ b/jack/tests/com/android/jack/multidex/MultiDexTests.java
@@ -22,7 +22,9 @@ import com.android.jack.Options;
import com.android.jack.TestTools;
import com.android.jack.backend.dex.DexFileWriter;
import com.android.jack.backend.dex.MultiDexLegacy;
+import com.android.jack.library.FileType;
import com.android.jack.preprocessor.PreProcessor;
+import com.android.jack.preprocessor.PreprocessorProperties;
import com.android.jack.shrob.ListingComparator;
import com.android.jack.util.ExecuteFile;
@@ -35,8 +37,10 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.util.Properties;
import javax.annotation.Nonnull;
@@ -248,9 +252,38 @@ public class MultiDexTests {
TestTools.getJackTestFolder("multidex/fakelibrary"),
TestTools.getDefaultBootclasspathString() + File.pathSeparator + frameworks.getPath(),
library, false);
+
return library;
}
+ private static void setMetaIntoJackProperties(@Nonnull File library) throws IOException {
+ File jackProperties = new File(library, "jack.properties");
+ Properties libraryProperties = new Properties();
+ FileInputStream fis = null;
+ FileOutputStream fos = null;
+ try {
+ fis = new FileInputStream(jackProperties);
+ libraryProperties.load(fis);
+ } catch (IOException e) {
+ Assert.fail();
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
+ try {
+ fos = new FileOutputStream(jackProperties);
+ libraryProperties.put(PreprocessorProperties.KEY_JPP, "true");
+ libraryProperties.store(fos, "Library properties");
+ } catch (IOException e) {
+ Assert.fail();
+ } finally {
+ if (fos != null) {
+ fos.close();
+ }
+ }
+ }
+
@Test
public void legacyAppTest002a() throws Exception {
@@ -306,7 +339,8 @@ public class MultiDexTests {
File testFolder = TestTools.getJackTestsWithJackFolder("multidex/test002");
File autoLibrary = prepareLibrary(frameworks);
- File jackInf = new File(autoLibrary, "JACK-INF");
+ setMetaIntoJackProperties(autoLibrary);
+ File jackInf = new File(autoLibrary, FileType.JPP.getPrefix());
Assert.assertTrue(jackInf.mkdir());
Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp"));
@@ -387,7 +421,8 @@ public class MultiDexTests {
File testFolder = TestTools.getJackTestsWithJackFolder("multidex/test002");
File autoLibrary = prepareLibrary(frameworks);
- File jackInf = new File(autoLibrary, "JACK-INF");
+ setMetaIntoJackProperties(autoLibrary);
+ File jackInf = new File(autoLibrary, FileType.JPP.getPrefix());
Assert.assertTrue(jackInf.mkdir());
Files.copy(new File(testFolder,"config-001.jpp"), new File(jackInf, "config-001.jpp"));
diff --git a/sched/src/com/android/sched/vfs/VPath.java b/sched/src/com/android/sched/vfs/VPath.java
index 1988a91..e1ab723 100644
--- a/sched/src/com/android/sched/vfs/VPath.java
+++ b/sched/src/com/android/sched/vfs/VPath.java
@@ -29,6 +29,9 @@ import javax.annotation.Nonnull;
*/
public final class VPath implements Cloneable {
+ @Nonnull
+ public static final VPath ROOT = new VPath("", '/');
+
private static final char INTERNAL_SEPARATOR = '/';
@Nonnull
@@ -85,7 +88,7 @@ public final class VPath implements Cloneable {
}
@Override
- protected VPath clone() {
+ public VPath clone() {
// no need to clone path fragments, they should be immutable
@SuppressWarnings("unchecked")
ArrayList<VPathFragment> clonedList = (ArrayList<VPathFragment>) pathFragments.clone();