blob: bd78eade8208892a908e483da06740ef26b535bb [file] [log] [blame]
/*
* 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;
}
}
}