188 lines
5.7 KiB
Java
188 lines
5.7 KiB
Java
|
/*
|
||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||
|
*
|
||
|
* This code is free software; you can redistribute it and/or modify it
|
||
|
* under the terms of the GNU General Public License version 2 only, as
|
||
|
* published by the Free Software Foundation.
|
||
|
*
|
||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||
|
* accompanied this code).
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License version
|
||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||
|
*
|
||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||
|
* or visit www.oracle.com if you need additional information or have any
|
||
|
* questions.
|
||
|
*/
|
||
|
|
||
|
package compiler.compilercontrol.share.scenario;
|
||
|
|
||
|
import compiler.compilercontrol.share.JSONFile;
|
||
|
import compiler.compilercontrol.share.method.MethodDescriptor;
|
||
|
|
||
|
/**
|
||
|
* Simple directive file writer.
|
||
|
*/
|
||
|
public class DirectiveWriter implements AutoCloseable {
|
||
|
private final JSONFile jsonFile;
|
||
|
|
||
|
/**
|
||
|
* Builds directive file for the given name
|
||
|
*
|
||
|
* @param fileName name the file to be created
|
||
|
*/
|
||
|
public DirectiveWriter(String fileName) {
|
||
|
jsonFile = new JSONFile(fileName);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits match block with a given methods
|
||
|
*
|
||
|
* @param methods methods used for the match
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter match(String... methods) {
|
||
|
if (jsonFile.getElement() == null) {
|
||
|
write(JSONFile.Element.ARRAY);
|
||
|
}
|
||
|
write(JSONFile.Element.OBJECT);
|
||
|
write(JSONFile.Element.PAIR, "match");
|
||
|
writeMethods(methods);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits match block with a given methods
|
||
|
*
|
||
|
* @param methodDescriptors method descriptors used for the match
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter match(MethodDescriptor... methodDescriptors) {
|
||
|
String[] methods = new String[methodDescriptors.length];
|
||
|
for (int i = 0; i < methodDescriptors.length; i++) {
|
||
|
methods[i] = methodDescriptors[i].getString();
|
||
|
}
|
||
|
match(methods);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits inline block with a given methods to be inlined or not.
|
||
|
* Each method should be prepended with + or - to show if it should be
|
||
|
* inlined or not.
|
||
|
*
|
||
|
* @param methods methods used for the inline
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter inline(String... methods) {
|
||
|
write(JSONFile.Element.PAIR, "inline");
|
||
|
writeMethods(methods);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
private void writeMethods(String[] methods) {
|
||
|
if (methods.length == 0) {
|
||
|
throw new IllegalArgumentException("ERROR: empty methods array");
|
||
|
}
|
||
|
if (methods.length > 1) {
|
||
|
write(JSONFile.Element.ARRAY);
|
||
|
for (String method : methods) {
|
||
|
write(JSONFile.Element.VALUE, "\"" + method + "\"");
|
||
|
}
|
||
|
end(); // ends array
|
||
|
} else {
|
||
|
write(JSONFile.Element.VALUE, "\"" + methods[0] + "\"");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits compiler blocks that makes current match to be excluded or not
|
||
|
* from compilation with specified compiler
|
||
|
*
|
||
|
* @param compiler compiler to be excluded or null, for all
|
||
|
* @param exclude shows if compiler should be disabled for this match
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter excludeCompile(Scenario.Compiler compiler,
|
||
|
boolean exclude) {
|
||
|
if (compiler != null) {
|
||
|
emitCompiler(compiler);
|
||
|
option(Option.EXCLUDE, exclude);
|
||
|
end();
|
||
|
} else {
|
||
|
for (Scenario.Compiler comp : Scenario.Compiler.values()) {
|
||
|
emitCompiler(comp);
|
||
|
option(Option.EXCLUDE, exclude);
|
||
|
end(); // end compiler block
|
||
|
}
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits compiler directive block
|
||
|
*
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter emitCompiler(Scenario.Compiler compiler) {
|
||
|
write(JSONFile.Element.PAIR, compiler.name);
|
||
|
write(JSONFile.Element.OBJECT);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void close() {
|
||
|
jsonFile.close();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Ends current object element. It could be either a
|
||
|
* c1 or c2 block, or a whole match block
|
||
|
*
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter end() {
|
||
|
jsonFile.end();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
public DirectiveWriter write(JSONFile.Element element, String... value) {
|
||
|
jsonFile.write(element, value);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emits directive option with a given value
|
||
|
*
|
||
|
* @param option directive to be set
|
||
|
* @param value value of the directive
|
||
|
* @return this DirectiveWriter instance
|
||
|
*/
|
||
|
public DirectiveWriter option(Option option, Object value) {
|
||
|
write(JSONFile.Element.PAIR, option.string);
|
||
|
write(JSONFile.Element.VALUE, String.valueOf(value));
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Directive option list
|
||
|
*/
|
||
|
public enum Option {
|
||
|
PRINT_ASSEMBLY("PrintAssembly"),
|
||
|
LOG("Log"),
|
||
|
EXCLUDE("Exclude");
|
||
|
|
||
|
public final String string;
|
||
|
|
||
|
private Option(String directive) {
|
||
|
this.string = directive;
|
||
|
}
|
||
|
}
|
||
|
}
|