/**
* Copyright (c) 2016, The Envisage Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.frontend.typechecker.ext;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import abs.common.CompilerUtils;
import abs.frontend.analyser.AnnotationHelper;
import abs.frontend.analyser.ErrorMessage;
import abs.frontend.analyser.SemanticWarning;
import abs.frontend.analyser.TypeError;
import abs.frontend.ast.*;
public class HttpExportChecker extends DefaultTypeSystemExtension {
public HttpExportChecker(Model m) {
super(m);
}
private boolean isParameterUsableFromHTTP(ParamDecl param) {
if (param.getType().isBoolType()) return true;
if (param.getType().isStringType()) return true;
if (param.getType().isIntType()) return true;
return false;
}
@Override
public void checkInterfaceDecl(InterfaceDecl i) {
for (MethodSig ms : i.getBodyList()) {
if (ms.isHTTPCallable()) {
for (ParamDecl p : ms.getParamList()) {
if (!isParameterUsableFromHTTP(p)) {
errors.add(new TypeError(p, ErrorMessage.WRONG_HTTPCALLABLE, p.getName(), p.getType().getQualifiedName()));
}
}
}
}
}
@Override
public void checkDataTypeDecl(DataTypeDecl decl) {
for (DataConstructor c : decl.getDataConstructors()) {
Set<String> names = new HashSet<String>();
for (ConstructorArg ca : c.getConstructorArgs()) {
ASTNode arg = null;
String key = null;
abs.frontend.ast.List<Annotation> ann = ca.getTypeUse().getAnnotations();
PureExp keyann = CompilerUtils.getAnnotationValueFromName(ann, "ABS.StdLib.HTTPName");
if (keyann != null) {
if (!(keyann instanceof StringLiteral)) {
errors.add(new TypeError(keyann, ErrorMessage.WRONG_HTTPNAME, keyann.getType()));
} else {
key = ((StringLiteral)keyann).getContent();
arg = keyann;
}
}
if (ca.hasSelectorName() && key == null) {
key = ca.getSelectorName().toString();
arg = ca.getSelectorName();
}
if (key != null) {
if (names.contains(key)) {
errors.add(new SemanticWarning(arg, ErrorMessage.DUPLICATE_HTTPNAME, key));
} else {
names.add(key);
}
}
}
}
}
}