package org.jmlspecs.openjml.ext;
import org.jmlspecs.openjml.JmlTokenKind;
import org.jmlspecs.openjml.Utils;
import org.jmlspecs.openjml.JmlTree.JmlExpression;
import org.jmlspecs.openjml.JmlTree.JmlMethodInvocation;
import org.jmlspecs.openjml.esc.JmlAssertionAdder;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.comp.JmlAttr;
import com.sun.tools.javac.parser.ExpressionExtension;
import com.sun.tools.javac.parser.JmlParser;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCLiteral;
import com.sun.tools.javac.util.Context;
public class Key extends ExpressionExtension {
public Key(Context context) {
super(context);
}
static public JmlTokenKind[] tokens() { return new JmlTokenKind[]{
JmlTokenKind.BSKEY}; }
@Override
public void checkParse(JmlParser parser, JmlMethodInvocation e) {
checkOneArg(parser,e);
}
@Override
public Type typecheck(JmlAttr attr, JCExpression expr,
Env<AttrContext> env) {
return syms.booleanType;
}
@Override
public JCExpression assertion(JmlAssertionAdder adder, JCExpression that) {
JmlMethodInvocation expr = (JmlMethodInvocation)that;
boolean value = true;
for (JCExpression arg: expr.args) {
if (arg instanceof JCLiteral) {
String key = ((JCLiteral)arg).getValue().toString();
value = value && Utils.instance(context).commentKeys.contains(key);
}
}
return adder.treeutils.makeBooleanLiteral(that.pos,value);
}
}