diff options
author | Yohann Roussel <yroussel@google.com> | 2015-02-26 12:12:29 +0100 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2015-03-09 11:51:13 +0100 |
commit | 20ef3af418a5acd49b202a5b9441127689a79508 (patch) | |
tree | 04559091d8f59dfe21ec3bf526e11bc85c4b124e | |
parent | 333ae04259121a4e8de25236509a658a347071ab (diff) | |
download | toolchain_jack-20ef3af418a5acd49b202a5b9441127689a79508.zip toolchain_jack-20ef3af418a5acd49b202a5b9441127689a79508.tar.gz toolchain_jack-20ef3af418a5acd49b202a5b9441127689a79508.tar.bz2 |
Handle input sources as a property
Change-Id: I91e3c26270f821741fa79f3d972e5b1454b00b0e
16 files changed, 82 insertions, 37 deletions
diff --git a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java index 7f8a360..1d52052 100644 --- a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java +++ b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java @@ -226,7 +226,7 @@ public class FileAccessErrorTest { new File(te.getSourceFolder(), "A.java")); Assert.fail(); - } catch (JackUserException e) { + } catch (PropertyIdException e) { // Failure is ok since source file is not readable Assert.assertTrue(e.getMessage().contains("A.java")); Assert.assertTrue(e.getMessage().contains("does not exist")); diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java index 963e6b9..70ef653 100644 --- a/jack/src/com/android/jack/Jack.java +++ b/jack/src/com/android/jack/Jack.java @@ -275,6 +275,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -712,14 +713,18 @@ public abstract class Jack { } } - - if (options.inputSources != null) { + Set<String> fileNamesToCompile = session.getInputFilter().getFileNamesToCompile(); + if (!fileNamesToCompile.isEmpty()) { JackBatchCompiler jbc = new JackBatchCompiler(session); Event event = tracer.start(JackEventType.ECJ_COMPILATION); - List<String> ecjArguments = options.getEcjArguments(); + List<String> ecjExtraArguments = options.getEcjExtraArguments(); + List<String> ecjArguments = new ArrayList<String>( + ecjExtraArguments.size() + fileNamesToCompile.size()); + ecjArguments.addAll(ecjExtraArguments); + ecjArguments.addAll(fileNamesToCompile); try { if (!jbc.compile(ecjArguments.toArray(new String[ecjArguments.size()]))) { diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java index 1d8cc01..5ed5104 100644 --- a/jack/src/com/android/jack/Options.java +++ b/jack/src/com/android/jack/Options.java @@ -44,6 +44,7 @@ import com.android.jack.util.filter.Filter; import com.android.sched.util.RunnableHooks; import com.android.sched.util.codec.DirectDirOutputVFSCodec; import com.android.sched.util.codec.DirectFSCodec; +import com.android.sched.util.codec.InputStreamOrDirectoryCodec; import com.android.sched.util.codec.ZipFSCodec; import com.android.sched.util.codec.ZipOutputVFSCodec; import com.android.sched.util.config.Config; @@ -60,6 +61,7 @@ import com.android.sched.util.config.id.ObjectId; import com.android.sched.util.config.id.PropertyId; import com.android.sched.util.config.id.ReflectFactoryPropertyId; import com.android.sched.util.file.Directory; +import com.android.sched.util.file.FileOrDirectory; import com.android.sched.util.file.FileOrDirectory.ChangePermission; import com.android.sched.util.file.FileOrDirectory.Existence; import com.android.sched.util.file.FileOrDirectory.Permission; @@ -309,6 +311,12 @@ public class Options { protected List<File> inputSources; @Nonnull + public static final ListPropertyId<FileOrDirectory> SOURCES = ListPropertyId.create( + "jack.source", "Sources to compile", "file-or-dir", new InputStreamOrDirectoryCodec()) + .on(File.pathSeparator) + .addDefaultValue(Collections.<FileOrDirectory>emptyList()); + + @Nonnull private List<String> ecjExtraArguments = new ArrayList<String>(); @Option(name = "-g", usage = "emit debug infos") @@ -523,6 +531,10 @@ public class Options { Joiner.on(File.pathSeparator).join(metaImport)); } + if (inputSources != null && !inputSources.isEmpty()) { + configBuilder.setString(SOURCES, Joiner.on(File.pathSeparator).join(inputSources)); + } + configBuilder.pushDefaultLocation(new StringLocation("proguard flags")); if (flags != null) { @@ -835,16 +847,8 @@ public class Options { } @Nonnull - public List<String> getEcjArguments() { - if (inputSources == null) { - return ecjExtraArguments; - } - - ArrayList<String> list = new ArrayList<String>(ecjExtraArguments); - for (File input : inputSources) { - list.add(input.getPath()); - } - return list; + List<String> getEcjExtraArguments() { + return ecjExtraArguments; } public void setProguardFlagsFile(@Nonnull List<File> proguardFlagsFiles) { diff --git a/jack/src/com/android/jack/frontend/java/JackBatchCompiler.java b/jack/src/com/android/jack/frontend/java/JackBatchCompiler.java index 0106851..424a7c3 100644 --- a/jack/src/com/android/jack/frontend/java/JackBatchCompiler.java +++ b/jack/src/com/android/jack/frontend/java/JackBatchCompiler.java @@ -40,7 +40,6 @@ import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Map; -import java.util.Set; import java.util.logging.Level; import javax.annotation.Nonnull; @@ -236,8 +235,6 @@ public class JackBatchCompiler extends Main { super.configure(argv); checkedClasspaths = new FileSystem.Classpath[] { new JAstClasspath("<jack-logical-entry>", session.getLookup(), null)}; - Set<String> fileNamesToCompile = session.getInputFilter().getFileNamesToCompile(); - filenames = fileNamesToCompile.toArray(new String[fileNamesToCompile.size()]); } @SuppressWarnings("rawtypes") diff --git a/jack/src/com/android/jack/incremental/CommonFilter.java b/jack/src/com/android/jack/incremental/CommonFilter.java index 390ff76..f4145c2 100644 --- a/jack/src/com/android/jack/incremental/CommonFilter.java +++ b/jack/src/com/android/jack/incremental/CommonFilter.java @@ -28,8 +28,10 @@ import com.android.jack.reporting.Reportable; import com.android.jack.reporting.ReportableException; import com.android.jack.reporting.Reporter.Severity; import com.android.sched.util.RunnableHooks; +import com.android.sched.util.config.Config; import com.android.sched.util.config.ThreadConfig; import com.android.sched.util.file.Directory; +import com.android.sched.util.file.FileOrDirectory; import com.android.sched.util.file.FileOrDirectory.ChangePermission; import com.android.sched.util.file.FileOrDirectory.Existence; import com.android.sched.util.file.FileOrDirectory.Permission; @@ -89,13 +91,14 @@ public abstract class CommonFilter { @Nonnull protected Set<String> getJavaFileNamesSpecifiedOnCommandLine(@Nonnull Options options) { + Config config = options.getConfig(); final String extension = ".java"; Set<String> javaFileNames = new HashSet<String>(); - for (File file : options.getInputSources()) { - if (file.isDirectory()) { - fillFiles(file, extension, javaFileNames); - } else if (file.getName().endsWith(extension)) { + for (FileOrDirectory file : config.get(Options.SOURCES)) { + if (file instanceof Directory) { + fillFiles(new File(file.getPath()), extension, javaFileNames); + } else if (file.getPath().endsWith(extension)) { javaFileNames.add(file.getPath()); } } diff --git a/sched/src/com/android/sched/util/codec/DirectFSCodec.java b/sched/src/com/android/sched/util/codec/DirectFSCodec.java index 78a69a7..7b6ab63 100644 --- a/sched/src/com/android/sched/util/codec/DirectFSCodec.java +++ b/sched/src/com/android/sched/util/codec/DirectFSCodec.java @@ -33,7 +33,7 @@ import javax.annotation.Nonnull; * This {@link StringCodec} is used to create an instance of {@link VFS} backed by a * filesystem directory. */ -public class DirectFSCodec extends FileOrDirCodec implements StringCodec<VFS> { +public class DirectFSCodec extends FileOrDirCodec<VFS> { public DirectFSCodec() { super(Existence.MUST_EXIST, Permission.READ | Permission.WRITE); diff --git a/sched/src/com/android/sched/util/codec/DirectoryCodec.java b/sched/src/com/android/sched/util/codec/DirectoryCodec.java index 0f48754..da7505e 100644 --- a/sched/src/com/android/sched/util/codec/DirectoryCodec.java +++ b/sched/src/com/android/sched/util/codec/DirectoryCodec.java @@ -30,8 +30,7 @@ import javax.annotation.Nonnull; /** * This {@link StringCodec} is used to create an instance of {@link Directory}. */ -public class DirectoryCodec extends FileOrDirCodec - implements StringCodec<Directory> { +public class DirectoryCodec extends FileOrDirCodec<Directory> { public DirectoryCodec(@Nonnull Existence existence, int permissions) { super(existence, permissions); diff --git a/sched/src/com/android/sched/util/codec/FileOrDirCodec.java b/sched/src/com/android/sched/util/codec/FileOrDirCodec.java index 84f8082..b1ce9c5 100644 --- a/sched/src/com/android/sched/util/codec/FileOrDirCodec.java +++ b/sched/src/com/android/sched/util/codec/FileOrDirCodec.java @@ -16,7 +16,6 @@ package com.android.sched.util.codec; -import com.android.sched.util.codec.Parser.ValueDescription; import com.android.sched.util.file.FileOrDirectory.ChangePermission; import com.android.sched.util.file.FileOrDirectory.Existence; import com.android.sched.util.file.FileOrDirectory.Permission; @@ -29,7 +28,7 @@ import javax.annotation.Nonnull; /** * Abstract class for a File or Directory {@link StringCodec}. */ -public abstract class FileOrDirCodec { +public abstract class FileOrDirCodec<T> implements StringCodec<T> { @Nonnull protected ChangePermission change = ChangePermission.NOCHANGE; protected final int permissions; @@ -102,6 +101,7 @@ public abstract class FileOrDirCodec { return sb.toString(); } + @Override @Nonnull public List<ValueDescription> getValueDescriptions() { return Collections.<ValueDescription> emptyList(); diff --git a/sched/src/com/android/sched/util/codec/InputOutputVFSCodec.java b/sched/src/com/android/sched/util/codec/InputOutputVFSCodec.java index 2720ff3..d99a281 100644 --- a/sched/src/com/android/sched/util/codec/InputOutputVFSCodec.java +++ b/sched/src/com/android/sched/util/codec/InputOutputVFSCodec.java @@ -28,8 +28,7 @@ import javax.annotation.Nonnull; /** * This {@link StringCodec} is used to create an instance of {@link InputOutputVFS}. */ -abstract class InputOutputVFSCodec extends FileOrDirCodec - implements StringCodec<InputOutputVFS> { +abstract class InputOutputVFSCodec extends FileOrDirCodec<InputOutputVFS> { public InputOutputVFSCodec(@Nonnull Existence existence) { super(existence, Permission.READ | Permission.WRITE); diff --git a/sched/src/com/android/sched/util/codec/InputStreamCodec.java b/sched/src/com/android/sched/util/codec/InputStreamCodec.java index de5c3fc..d0159d2 100644 --- a/sched/src/com/android/sched/util/codec/InputStreamCodec.java +++ b/sched/src/com/android/sched/util/codec/InputStreamCodec.java @@ -30,8 +30,7 @@ import javax.annotation.Nonnull; /** * This {@link InputStreamCodec} is used to create an instance of {@link InputStreamFile}. */ -public class InputStreamCodec extends StreamCodec - implements StringCodec<InputStreamFile> { +public class InputStreamCodec extends StreamCodec<InputStreamFile> { public InputStreamCodec() { super(Existence.MUST_EXIST, Permission.READ); } diff --git a/sched/src/com/android/sched/util/codec/InputStreamOrDirectoryCodec.java b/sched/src/com/android/sched/util/codec/InputStreamOrDirectoryCodec.java new file mode 100644 index 0000000..da77bb2 --- /dev/null +++ b/sched/src/com/android/sched/util/codec/InputStreamOrDirectoryCodec.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015 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.sched.util.codec; + +import com.android.sched.util.file.FileOrDirectory; +import com.android.sched.util.file.FileOrDirectory.Existence; +import com.android.sched.util.file.FileOrDirectory.Permission; + +import javax.annotation.Nonnull; + +/** + * This {@link StringCodec} is used to create an instance of {@link FileOrDirectory}. + * The file or directory must exists and be readable. + */ +public class InputStreamOrDirectoryCodec extends OrCodec<FileOrDirectory> { + @SuppressWarnings("unchecked") + public InputStreamOrDirectoryCodec() { + super(new InputStreamCodec(), new DirectoryCodec(Existence.MUST_EXIST, Permission.READ)); + } + + @Override + @Nonnull + public String formatValue(FileOrDirectory data) { + return data.getPath(); + } +}
\ No newline at end of file diff --git a/sched/src/com/android/sched/util/codec/InputVFSCodec.java b/sched/src/com/android/sched/util/codec/InputVFSCodec.java index 4406450..4cb6fc1 100644 --- a/sched/src/com/android/sched/util/codec/InputVFSCodec.java +++ b/sched/src/com/android/sched/util/codec/InputVFSCodec.java @@ -40,8 +40,7 @@ import javax.annotation.Nonnull; /** * This {@link StringCodec} is used to create an instance of {@link InputVFS}. */ -public class InputVFSCodec extends FileOrDirCodec - implements StringCodec<InputVFS> { +public class InputVFSCodec extends FileOrDirCodec<InputVFS> { @Nonnull private final Logger logger = LoggerFactory.getLogger(); diff --git a/sched/src/com/android/sched/util/codec/OutputStreamCodec.java b/sched/src/com/android/sched/util/codec/OutputStreamCodec.java index c642f7d..3a8a4a2 100644 --- a/sched/src/com/android/sched/util/codec/OutputStreamCodec.java +++ b/sched/src/com/android/sched/util/codec/OutputStreamCodec.java @@ -31,8 +31,7 @@ import javax.annotation.Nonnull; /** * This {@link OutputStreamCodec} is used to create an instance of {@link OutputStreamFile}. */ -public class OutputStreamCodec extends StreamCodec - implements StringCodec<OutputStreamFile> { +public class OutputStreamCodec extends StreamCodec<OutputStreamFile> { private boolean append = false; public OutputStreamCodec(@Nonnull Existence existence) { diff --git a/sched/src/com/android/sched/util/codec/OutputVFSCodec.java b/sched/src/com/android/sched/util/codec/OutputVFSCodec.java index 735170e..ab52156 100644 --- a/sched/src/com/android/sched/util/codec/OutputVFSCodec.java +++ b/sched/src/com/android/sched/util/codec/OutputVFSCodec.java @@ -28,7 +28,7 @@ import javax.annotation.Nonnull; /** * This {@link StringCodec} is used to create an instance of {@link OutputVFS}. */ -abstract class OutputVFSCodec extends FileOrDirCodec implements StringCodec<OutputVFS> { +abstract class OutputVFSCodec extends FileOrDirCodec<OutputVFS> { public OutputVFSCodec(@Nonnull Existence existence) { super(existence, Permission.READ | Permission.WRITE); diff --git a/sched/src/com/android/sched/util/codec/StreamCodec.java b/sched/src/com/android/sched/util/codec/StreamCodec.java index 4708796..788fa48 100644 --- a/sched/src/com/android/sched/util/codec/StreamCodec.java +++ b/sched/src/com/android/sched/util/codec/StreamCodec.java @@ -26,7 +26,7 @@ import javax.annotation.Nonnull; * This {@link StringCodec} is used to help the creation of an instance inherited from * {@link StreamFile}. */ -public abstract class StreamCodec extends FileOrDirCodec { +public abstract class StreamCodec<T> extends FileOrDirCodec<T> { @Nonnull protected static final String STANDARD_IO_NAME = "-"; @Nonnull @@ -42,6 +42,7 @@ public abstract class StreamCodec extends FileOrDirCodec { ((permissions & Permission.WRITE) != 0); } + @Override @Nonnull public String getUsage() { StringBuilder sb = new StringBuilder(); diff --git a/sched/src/com/android/sched/util/codec/ZipFSCodec.java b/sched/src/com/android/sched/util/codec/ZipFSCodec.java index 035a2e4..4aedfc3 100644 --- a/sched/src/com/android/sched/util/codec/ZipFSCodec.java +++ b/sched/src/com/android/sched/util/codec/ZipFSCodec.java @@ -34,7 +34,7 @@ import javax.annotation.Nonnull; * This {@link StringCodec} is used to create an instance of {@link VFS} backed by a * filesystem directory, which is then zipped when closed. */ -public class ZipFSCodec extends FileOrDirCodec implements StringCodec<VFS> { +public class ZipFSCodec extends FileOrDirCodec<VFS> { public ZipFSCodec(@Nonnull Existence existence) { super(existence, Permission.READ | Permission.WRITE); |